This repository has been archived by the owner. It is now read-only.
Permalink
Browse files

New Formula: GeoCouch

Couchbase GeoCouch augments CouchDB 1.2 to create GeoCouch 1.2.  This GeoCouch
formula depends directly on the CouchDB formula and its Cellar.

For convenience, this formula provides launchctl support file (geocouch.plist).
For simplicity's sake, RunAtLoad and KeepAlive are set to 'false'.  For
always-on server operation, set them to 'true'.

Support for 'git checkout develop' for installation of latest branch.

All tests work (except rev_stemming which seems flakey, and can eventually work
with retries).

-=-  Latest Revision:

Reworked to avoid/minimize uninstall surprises.

Many small improvements, and several "big" ones, including the move of geocouch
build files from couchdb Cellar into geocouch Cellar.  This change reduces the
mixing of geocouch into couchdb, helps meet homebrew standards, and eases
uninstallation.  The caveat documentation reflects this change in an update to
the ERL_FLAGS instructions.

The geocouch.ini file still hooks into couchdb initialization directory by
necessity.  The uninstall caveat documentation now specifies how to remove the
geocouch.ini file for uninstall.

The tests still hook into the couchdb test directory by necessity.  The
uninstall caveat documentation now recommends uninstalling both geocouch and
couchdb (to remove any dangling geocouch tests from couchdb's couch_tests.js
file) and then reinstall couchdb fresh.

A variety of cleanups were applied along the way.

In sum, as mentioned before, since geocouch is a superset of couchdb,
uninstalling geocouch should be rare and unnecessary.  But in the interests of
least surprise, these changes minimize uninstall complications in the rare case
someone chooses to keep couchdb while uninstalling geocouch.

Perhaps some changes to couchdb will make a modular approach possible in the
future, but for now I believe this approach is practical and avoids unpleasant
surprises.

Simplified head command.

Cleanup, and organize geocouch tests into subfolder of couchdb tests.

Closes #11659.

Signed-off-by: Charlie Sharpsteen <source@sharpsteen.net>
  • Loading branch information...
1 parent 903c228 commit cdbfe9f111fb437c65e5a1aef54b771164af4f17 @wonk wonk committed with Sharpie Apr 15, 2012
Showing with 158 additions and 0 deletions.
  1. +158 −0 Library/Formula/geocouch.rb
View
@@ -0,0 +1,158 @@
+require 'formula'
+
+class Geocouch < Formula
+ homepage 'https://github.com/couchbase/geocouch'
+ head 'https://github.com/couchbase/geocouch.git', :tag => 'couchdb1.2.x'
+ url 'https://github.com/couchbase/geocouch/zipball/couchdb1.2.x'
+ md5 'af82d325bdf0a93d7a98bc650fc926b9'
+
+ devel do
+ url 'https://github.com/couchbase/geocouch.git', :tag => 'master'
+ version '1.3.x'
+ end
+
+ def couchdb_share
+ HOMEBREW_PREFIX/'share/couchdb'
+ end
+ def geocouch_share
+ HOMEBREW_PREFIX/'share/geocouch'
+ end
+
+ # Leverage generic couchdb.rb formula for couchdb (and therefore geocouch)
+ # dependencies.
+ depends_on 'couchdb'
+
+ # GeoCouch currently supports couch_version(s) 1.1.x and 1.2.x (other
+ # versions at your own risk). This formula supports GeoCouch 1.2.0 on top
+ # of Apache couchdb 1.2.0.
+ def install
+ # Grab couchdb 1.2.x.
+ couchdb_dir = buildpath/'couchdb-src'
+ couchdb = Formula.factory 'couchdb'
+ couchdb.brew { couchdb_dir.install Dir[ '*'] }
+ ENV[ 'COUCH_SRC'] = couchdb_dir/"src/couchdb"
+
+ # Build geocouch.
+ system "make"
+
+ # Install geocouch build files.
+ (share/'geocouch').mkpath
+ rm_rf share/'geocouch/build/'
+ (share/'geocouch').install Dir[ 'build']
+
+ # Install geocouch.plist for launchctl support.
+ (share/'geocouch').install Dir[ couchdb_dir/'etc/launchd/org.apache.couchdb.plist.tpl.in']
+ mv share/'geocouch/org.apache.couchdb.plist.tpl.in', share/'geocouch/geocouch.plist'
+ inreplace (share/'geocouch/geocouch.plist'), '<string>org.apache.couchdb</string>', \
+ '<string>geocouch</string>'
+ inreplace (share/'geocouch/geocouch.plist'), '<key>HOME</key>', <<-EOS.lstrip.chop
+ <key>ERL_FLAGS</key>
+ <string>-pa #{geocouch_share}/build</string>
+ <key>HOME</key>
+ EOS
+ inreplace (share/'geocouch/geocouch.plist'), '%bindir%/%couchdb_command_name%', \
+ HOMEBREW_PREFIX/'bin/couchdb'
+ # Turn off RunAtLoad and KeepAlive (to simplify experience for first-timers).
+ inreplace (share/'geocouch/geocouch.plist'), '<true/>', \
+ '<false/>'
+ (share/'geocouch/geocouch.plist').chmod 0644
+
+ # Install geocouch.ini into couchdb.
+ (etc/'couchdb/default.d').install Dir[ '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(/^.*\/(.*)$/, 'loadTest("\1");' + "\n") }
+ system "(echo; echo '//REPLACE_ME') >> '#{couchdb_share}/www/script/couch_tests.js'"
+ inreplace (couchdb_share/'www/script/couch_tests.js'), /^\/\/REPLACE_ME$/, \
+ "// GeoCouch Tests...\n#{test_lines}// ...GeoCouch Tests\n"
+ end
+
+ def test
+ puts <<-EOS.undent
+ To test geocouch, start `couchdb` (with appropriate geocouch ERL_FLAGS)
+ in a terminal and then:
+
+ curl http://127.0.0.1:5984/
+
+ The reply should look like:
+
+ {"couchdb":"Welcome","version":"1.2.0"}
+
+ For more thorough testing, use your browser to visit:
+
+ http://127.0.0.1:5984/_utils/couch_tests.html?script/couch_tests.js
+
+ and press the "Run All" button.
+ EOS
+ 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}/build" 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}/build"
+ couchdb
+
+ Alternately, prepare launchctl to start/stop geocouch as follows:
+
+ /bin/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:
+
+ /bin/rm /usr/local/etc/couchdb/default.d/geocouch.ini
@adamv

adamv Jun 22, 2012

Contributor

rm don't need full path, should reference HOMEBREW_PREFIX for the ini file.

@Sharpie

Sharpie Jun 23, 2012

Contributor

Thanks for the catch, fixed in 229890a.

+ 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

0 comments on commit cdbfe9f

Please sign in to comment.