aboutsummaryrefslogtreecommitdiffstats
path: root/Library
diff options
context:
space:
mode:
Diffstat (limited to 'Library')
-rwxr-xr-xLibrary/Contributions/examples/brew-unpack.rb53
1 files changed, 53 insertions, 0 deletions
diff --git a/Library/Contributions/examples/brew-unpack.rb b/Library/Contributions/examples/brew-unpack.rb
new file mode 100755
index 000000000..ab3438d1a
--- /dev/null
+++ b/Library/Contributions/examples/brew-unpack.rb
@@ -0,0 +1,53 @@
+require 'formula'
+
+module Homebrew extend self
+ def unpack
+ unpack_usage = <<-EOS
+Usage: brew unpack [--destdir=path/to/extract/in] <formulae ...>
+
+Unpack formulae source code for inspection.
+
+Formulae archives will be extracted to subfolders inside the current working
+directory or a directory specified by `--destdir`.
+ EOS
+
+ if ARGV.empty?
+ puts unpack_usage
+ exit 0
+ end
+
+ formulae = ARGV.named
+ raise FormulaUnspecifiedError if formulae.empty?
+
+ unpack_dir = ARGV.options_only.select {|o| o.start_with? "--destdir="}
+ if unpack_dir.empty?
+ unpack_dir = Pathname.new Dir.getwd
+ else
+ unpack_dir = Pathname.new(unpack_dir.first.split('=')[1]).realpath
+ unpack_dir.mkpath unless unpack_dir.exist?
+ end
+ raise "Cannot write to #{unpack_dir}" unless unpack_dir.writable?
+
+ formulae.each do |f|
+ f = Formula.factory(f)
+
+ unless f.downloader.kind_of? CurlDownloadStrategy
+ stage_dir = unpack_dir + [f.name, f.version].join('-')
+ stage_dir.mkpath unless stage_dir.exist?
+ else
+ stage_dir = unpack_dir
+ end
+
+ # Can't use a do block here without DownloadStrategy do blocks throwing:
+ # warning: conflicting chdir during another chdir block
+ Dir.chdir stage_dir
+ f.downloader.fetch
+ f.downloader.stage
+ Dir.chdir unpack_dir
+ end
+ end
+end
+
+# Here is the actual code that gets run when `brew` loads this external
+# command.
+Homebrew.unpack