From 8c13fc2a2979165cc7d2a3fcedbbd3b4fe6c3a69 Mon Sep 17 00:00:00 2001 From: Andrew Janke Date: Wed, 20 Apr 2016 01:02:43 -0400 Subject: [PATCH] Fold geocouch in to couchdb formula Fixes issues with couchdb/geocouch's installation model not working with Homebrew sandboxing. Closes #436 Fixes #471 Closes #475. Signed-off-by: Andrew Janke --- Formula/couchdb.rb | 126 ++++++++++++++++++++++++++++++++++++--- Formula/geocouch.rb | 140 -------------------------------------------- 2 files changed, 118 insertions(+), 148 deletions(-) delete mode 100644 Formula/geocouch.rb diff --git a/Formula/couchdb.rb b/Formula/couchdb.rb index a740510067b8c..73d8556559c30 100644 --- a/Formula/couchdb.rb +++ b/Formula/couchdb.rb @@ -14,9 +14,8 @@ class Couchdb < Formula bottle do cellar :any - sha256 "b08d92fea3d5ff8fb8da3fb19778615c224a3841d48bc3a37c519c5b84e7b7a6" => :el_capitan - sha256 "922be8a18ea5b71553171bb859b563349917aaf39346f87f076f6f201ac03ed5" => :yosemite - sha256 "fb4f49968be99783e1e0777c4dc44c387467976bb8c81771d7a151c278996b8b" => :mavericks + revision 1 + sha256 "cc3f64e80e56d1c3d12907e85b9c4070da8d409aeb949aaef406a0f09a57298e" => :mavericks end head do @@ -30,11 +29,18 @@ class Couchdb < Formula depends_on "help2man" => :build end + option "with-geocouch", "Build with GeoCouch spatial index extension" + depends_on "spidermonkey" depends_on "icu4c" depends_on "erlang" depends_on "curl" if MacOS.version <= :leopard + resource "geocouch" do + url "https://github.com/couchbase/geocouch/archive/couchdb1.3.x.tar.gz" + sha256 "1bad2275756e2f03151d7b2706c089b3059736130612de279d879db91d4b21e7" + end + def install # CouchDB >=1.3.0 supports vendor names and versioning # in the welcome message @@ -60,15 +66,63 @@ def install system "make" system "make", "install" + install_geocouch if build.with? "geocouch" + # Use our plist instead to avoid faffing with a new system user. (prefix/"Library/LaunchDaemons/org.apache.couchdb.plist").delete (lib/"couchdb/bin/couchjs").chmod 0755 - (var/"lib/couchdb").mkpath - (var/"log/couchdb").mkpath - (var/"run/couchdb").mkpath + end + + def geocouch_share + share/"couchdb-geocouch" + end + + def install_geocouch + resource("geocouch").stage(buildpath/"geocouch") + ENV["COUCH_SRC"]="#{buildpath}/src/couchdb" + cd "geocouch" do + system "make" + + linked_geocouch_share = (HOMEBREW_PREFIX/"share/couchdb-geocouch") + geocouch_share.mkpath + geocouch_share.install "ebin" + # Install geocouch.plist for launchctl support. + geocouch_plist = geocouch_share/"geocouch.plist" + cp buildpath/"etc/launchd/org.apache.couchdb.plist.tpl.in", geocouch_plist + geocouch_plist.chmod 0644 + inreplace geocouch_plist, "org.apache.couchdb", \ + "geocouch" + inreplace geocouch_plist, "HOME", <<-EOS.lstrip.chop + ERL_FLAGS + -pa #{linked_geocouch_share}/ebin + HOME + EOS + inreplace geocouch_plist, "%bindir%/%couchdb_command_name%", \ + HOMEBREW_PREFIX/"bin/couchdb" + # Turn off RunAtLoad and KeepAlive (to simplify experience for first-timers) + inreplace geocouch_plist, "RunAtLoad\n ", + "RunAtLoad\n " + inreplace geocouch_plist, "KeepAlive\n ", + "KeepAlive\n " + # Install geocouch.ini into couchdb. + (etc/"couchdb/default.d").install "etc/couchdb/default.d/geocouch.ini" + + # Install tests into couchdb. + test_files = Dir["share/www/script/test/*.js"] + (pkgshare/"www/script/test").install test_files + # Complete the install by referencing the geocouch tests in couch_tests.js + # (which runs the tests). + test_lines = ["// GeoCouch Tests..."] + test_lines.concat(test_files.map { |file| file.gsub(%r{^.*\/(.*)$}, 'loadTest("\1");') }) + test_lines << "// ...GeoCouch Tests" + (pkgshare/"www/script/couch_tests.js").append_lines test_lines + end end def post_install + (var/"lib/couchdb").mkpath + (var/"log/couchdb").mkpath + (var/"run/couchdb").mkpath # default.ini is owned by CouchDB and marked not user-editable # and must be overwritten to ensure correct operation. if (etc/"couchdb/default.ini.default").exist? @@ -78,13 +132,68 @@ def post_install end end - def caveats; <<-EOS.undent + def caveats + str = <<-EOS.undent To test CouchDB run: curl http://127.0.0.1:5984/ The reply should look like: {"couchdb":"Welcome","uuid":"....","version":"#{version}","vendor":{"version":"#{version}-1","name":"Homebrew"}} EOS + str += "\n#{geocouch_caveats}" if build.with? "geocouch" + str + end + + def geocouch_caveats; <<-EOS.undent + GeoCouch Caveats: + + FYI: geocouch installs as an extension of couchdb, so couchdb effectively + becomes geocouch. However, you can use couchdb normally (using geocouch + extensions optionally). NB: one exception: the couchdb test suite now + includes several geocouch tests. + + To start geocouch manually and verify any geocouch version information (-V), + + ERL_FLAGS="-pa #{geocouch_share}/ebin" couchdb -V + + For general convenience, export your ERL_FLAGS (erlang flags, above) in + your login shell, and then start geocouch: + + export ERL_FLAGS="-pa #{geocouch_share}/ebin" + couchdb + + Alternately, prepare launchctl to start/stop geocouch as follows: + + cp #{geocouch_share}/geocouch.plist ~/Library/LaunchAgents + chmod 0644 ~/Library/LaunchAgents/geocouch.plist + + launchctl load ~/Library/LaunchAgents/geocouch.plist + + Then start, check status of, and stop geocouch with the following three + commands. + + launchctl start geocouch + launchctl list geocouch + launchctl stop geocouch + + Finally, access, test, and configure your new geocouch with: + + http://127.0.0.1:5984 + http://127.0.0.1:5984/_utils/couch_tests.html?script/couch_tests.js + http://127.0.0.1:5984/_utils + + And... relax. + + -=- + + To uninstall geocouch from your couchdb installation, uninstall couchdb + and re-install it without the '--with-geocouch' option. + + brew uninstall couchdb + brew install couchdb + + To see these instructions again, just run 'brew info couchdb'. + EOS end plist_options :manual => "couchdb" @@ -120,12 +229,13 @@ def plist; <<-EOS.undent inreplace "#{testpath}/couchdb/default.ini", "/usr/local/var", testpath/"var" pid = fork do + ENV["ERL_LIBS"] = geocouch_share if build.with? "geocouch" exec "#{bin}/couchdb -A #{testpath}/couchdb" end sleep 2 begin - assert_match /Homebrew/, shell_output("curl localhost:5984") + assert_match /Homebrew/, shell_output("curl -# localhost:5984") ensure Process.kill("SIGINT", pid) Process.wait(pid) diff --git a/Formula/geocouch.rb b/Formula/geocouch.rb deleted file mode 100644 index 0849e8c49c7f7..0000000000000 --- a/Formula/geocouch.rb +++ /dev/null @@ -1,140 +0,0 @@ -class Geocouch < Formula - desc "Spatial index for CouchDB" - homepage "https://github.com/couchbase/geocouch" - url "https://github.com/couchbase/geocouch/archive/couchdb1.3.x.tar.gz" - version "1.3.0" - sha256 "0f678b5b79f5385c5c11349b662bb897047c72e8056dfb19f0f1e484d9348953" - - head "https://github.com/couchbase/geocouch.git" - - bottle do - cellar :any - sha256 "ca0c35c820bd58fb23f703a61494b732d7cd3d5887741483f5b6cbbe3eb5f383" => :mavericks - sha256 "f0e0fcd810819820dad6f1eb005b2ed58aa3d953d25507292b68b6c16d6394f4" => :mountain_lion - sha256 "3405263e277d08749e771506555bdd5353d4b4c09e1aab155bcb94f0f1ee0c04" => :lion - end - - depends_on "couchdb" - depends_on "erlang" => :build - - def couchdb_share - HOMEBREW_PREFIX/"share/couchdb" - end - - def geocouch_share - HOMEBREW_PREFIX/"share/geocouch" - end - - # GeoCouch currently supports couch_version(s) 1.1.x and 1.2.x (other - # versions at your own risk). This formula supports GeoCouch 1.3.0 on top - # of Apache couchdb 1.3.0. - def install - couchdb_dir = buildpath/"couchdb-src" - Formula["couchdb"].brew { couchdb_dir.install Dir["*"] } - ENV["COUCH_SRC"] = couchdb_dir/"src/couchdb" - - # Build geocouch. - system "make" - - # Install geocouch build files. - pkgshare.mkpath - rm_rf pkgshare/"ebin/" - pkgshare.install "ebin" - - # Install geocouch.plist for launchctl support. - pkgshare.install couchdb_dir/"etc/launchd/org.apache.couchdb.plist.tpl.in" - mv pkgshare/"org.apache.couchdb.plist.tpl.in", pkgshare/"geocouch.plist" - inreplace (pkgshare/"geocouch.plist"), "org.apache.couchdb", \ - "geocouch" - inreplace (pkgshare/"geocouch.plist"), "HOME", <<-EOS.lstrip.chop - ERL_FLAGS - -pa #{geocouch_share}/ebin - HOME - EOS - inreplace (pkgshare/"geocouch.plist"), "%bindir%/%couchdb_command_name%", \ - HOMEBREW_PREFIX/"bin/couchdb" - # Turn off RunAtLoad and KeepAlive (to simplify experience for first-timers). - inreplace (pkgshare/"geocouch.plist"), "", \ - "" - (pkgshare/"geocouch.plist").chmod 0644 - - # Install geocouch.ini into couchdb. - (etc/"couchdb/default.d").install "etc/couchdb/default.d/geocouch.ini" - - # Install tests into couchdb. - test_files = Dir["share/www/script/test/*.js"] - # Normal recipe "should" read: - # (share/'couchdb/www/script/test/').install test_files - # which would symlink geocouch tests into the couchdb share. But couchdb - # seems to sandbox its web-readable files to the share/couchdb/www branch, - # and symlinks outside of that folder seem to violate couchdb's - # requirements. Consequently, we have to install geocouch tests directly - # inside the share/couchdb/www branch and not symlink them from the - # geocouch share branch (i.e., outside the couchdb sandbox). So for - # clarity sake, install/partition all the geocouch tests together into a - # tidy subfolder, and symlink them into place in the normal couchdb tests - # folder. - rm_rf (couchdb_share/"www/script/test/geocouch") - (couchdb_share/"www/script/test/geocouch").mkpath - (couchdb_share/"www/script/test/geocouch").install test_files - Dir[(couchdb_share/"www/script/test/geocouch/*.js")].each \ - { |geotest| system "cd #{couchdb_share/"www/script/test"}; ln -s geocouch/#{File.basename(geotest)} ." } - # Complete the install by referencing the geocouch tests in couch_tests.js - # (which runs the tests). - test_lines = test_files.map { |testline| testline.gsub(%r{^.*\/(.*)$}, 'loadTest("\1");' + "\n") } - system "(echo; echo '//REPLACE_ME') >> '#{couchdb_share}/www/script/couch_tests.js'" - inreplace (couchdb_share/"www/script/couch_tests.js"), %r{^\/\/REPLACE_ME$}, \ - "// GeoCouch Tests...\n#{test_lines}// ...GeoCouch Tests\n" - end - - def caveats; <<-EOS.undent - FYI: geocouch installs as an extension of couchdb, so couchdb effectively - becomes geocouch. However, you can use couchdb normally (using geocouch - extensions optionally). NB: one exception: the couchdb test suite now - includes several geocouch tests. - - To start geocouch manually and verify any geocouch version information (-V), - - ERL_FLAGS="-pa #{geocouch_share}/ebin" couchdb -V - - For general convenience, export your ERL_FLAGS (erlang flags, above) in - your login shell, and then start geocouch: - - export ERL_FLAGS="-pa #{geocouch_share}/ebin" - couchdb - - Alternately, prepare launchctl to start/stop geocouch as follows: - - cp #{geocouch_share}/geocouch.plist ~/Library/LaunchAgents - chmod 0644 ~/Library/LaunchAgents/geocouch.plist - - launchctl load ~/Library/LaunchAgents/geocouch.plist - - Then start, check status of, and stop geocouch with the following three - commands. - - launchctl start geocouch - launchctl list geocouch - launchctl stop geocouch - - Finally, access, test, and configure your new geocouch with: - - http://127.0.0.1:5984 - http://127.0.0.1:5984/_utils/couch_tests.html?script/couch_tests.js - http://127.0.0.1:5984/_utils - - And... relax. - - -=- - - One last thing: to uninstall geocouch from your couchdb installation: - - rm #{HOMEBREW_PREFIX}/etc/couchdb/default.d/geocouch.ini - unset ERL_FLAGS - brew uninstall geocouch couchdb; brew install couchdb - - and restart your couchdb. (To see the uninstall instructions again, just - run 'brew info geocouch'.) - EOS - end -end