Skip to content
Snippets Groups Projects
Commit 028b8b40 authored by kiendang's avatar kiendang
Browse files

Remove use of bash

parent 00f74902
No related branches found
No related tags found
No related merge requests found
......@@ -81,7 +81,8 @@ module Homebrew
Look through repository history to find the most recent version of <formula> and
create a copy in <tap>`/Formula/`<formula>`@`<version>`.rb`. If the tap is not
installed yet, attempt to install/clone the tap before continuing.
installed yet, attempt to install/clone the tap before continuing. To extract
a <formula> from a tap that is not homebrew/core use <user>/<repo>/<formula>.
EOS
flag "--version=",
......@@ -112,7 +113,12 @@ module Homebrew
destination_tap.install unless destination_tap.installed?
repo = source_tap.path
pattern = source_tap.core_tap? ? repo/"Formula/#{name}.rb" : repo/"{,**/}#{name}.rb"
pattern = if source_tap.core_tap?
[repo/"Formula/#{name}.rb"]
else
# A formula can technically live in the root directory of a tap or in any of its subdirectories
[repo/"#{name}.rb", repo/"**/#{name}.rb"]
end
if args.version
ohai "Searching repository history"
......@@ -138,6 +144,7 @@ module Homebrew
end
odie "Could not find #{name}! The formula or version may not have existed." if test_formula.nil?
else
# Search in the root directory of <repo> as well as recursively in all of its subdirectories
files = Dir[repo/"{,**/}"].map do |dir|
Pathname.glob(["#{dir}/#{name}.rb"]).find(&:file?)
end.compact
......
describe "brew extract", :integration_test do
it "retrieves the specified version of formula from core tap, defaulting to most recent" do
it "retrieves the specified version of formula, defaulting to most recent" do
path = Tap::TAP_DIRECTORY/"homebrew/homebrew-foo"
(path/"Formula").mkpath
target = Tap.from_path(path)
......@@ -29,69 +29,4 @@ describe "brew extract", :integration_test do
expect(Formulary.factory(path/"Formula/testball@0.1.rb").version).to be == "0.1"
end
it "retrieves the specified version of formula from a tap other than core, defaulting to most recent" do
destination = Tap::TAP_DIRECTORY/"homebrew/homebrew-foo"
(destination/"Formula").mkpath
destination_tap = Tap.from_path(destination)
source = Tap::TAP_DIRECTORY/"homebrew/homebrew-bar"
source.mkpath
source_tap = Tap.from_path(source)
tarball = if OS.linux?
TEST_FIXTURE_DIR/"tarballs/testball-0.1-linux.tbz"
else
TEST_FIXTURE_DIR/"tarballs/testball-0.1.tbz"
end
content = <<~RUBY
desc "Some test"
homepage "https://brew.sh/testball"
url "file://#{tarball}"
sha256 "#{tarball.sha256}"
option "with-foo", "Build with foo"
def install
(prefix/"foo"/"test").write("test") if build.with? "foo"
prefix.install Dir["*"]
(buildpath/"test.c").write \
"#include <stdio.h>\\nint main(){return printf(\\"test\\");}"
bin.mkpath
system ENV.cc, "test.c", "-o", bin/"test"
end
RUBY
formula_file = source_tap.path/"testball.rb"
formula_file.write <<~RUBY
class Testball < Formula
#{content}
end
RUBY
source_tap.path.cd do
system "git", "init"
system "git", "add", "--all"
system "git", "commit", "-m", "testball 0.1"
contents = File.read(formula_file)
contents.gsub!("testball-0.1", "testball-0.2")
File.write(formula_file, contents)
system "git", "add", "--all"
system "git", "commit", "-m", "testball 0.2"
end
expect { brew "extract", "homebrew/bar/testball", destination_tap.name }
.to be_a_success
expect(destination/"Formula/testball@0.2.rb").to exist
expect(Formulary.factory(destination/"Formula/testball@0.2.rb").version).to be == "0.2"
expect { brew "extract", "homebrew/bar/testball", destination_tap.name, "--version=0.1" }
.to be_a_success
expect(destination/"Formula/testball@0.1.rb").to exist
expect(Formulary.factory(destination/"Formula/testball@0.1.rb").version).to be == "0.1"
end
end
......@@ -4,7 +4,11 @@ module Git
module_function
def last_revision_commit_of_file(repo, file, before_commit: nil)
args = [before_commit.nil? ? "--skip=1" : before_commit.split("..").first]
args = if before_commit.nil?
["--skip=1"]
else
[before_commit.split("..").first]
end
out, = Open3.capture3(
HOMEBREW_SHIMS_PATH/"scm/git", "-C", repo,
......@@ -14,17 +18,26 @@ module Git
out.chomp
end
def last_revision_commit_of_files(repo, file, before_commit: nil)
args = [before_commit.nil? ? "--skip=1" : before_commit.split("..").first]
def last_revision_commit_of_files(repo, files, before_commit: nil)
args = if before_commit.nil?
["--skip=1"]
else
[before_commit.split("..").first]
end
cmd = [
HOMEBREW_SHIMS_PATH/"scm/git", "-C", repo,
"log", "--format=%h", "--abbrev=7", "--max-count=1", "--name-only",
*args, "--", file
]
out, = Open3.capture3("/bin/bash", "-c", cmd.join(" "))
rev, *files = out.chomp.split(/\n/).reject(&:empty?)
[rev, files]
# git log output format:
# <commit_hash>
# <file_path1>
# <file_path2>
# ...
# return [<commit_hash>, [file_path1, file_path2, ...]]
out, = Open3.capture3(
HOMEBREW_SHIMS_PATH/"scm/git", "-C", repo, "log",
"--pretty=format:%h", "--abbrev=7", "--max-count=1",
"--diff-filter=d", "--name-only", *args, "--", *files
)
rev, *paths = out.chomp.split(/\n/).reject(&:empty?)
[rev, paths]
end
def last_revision_of_file(repo, file, before_commit: nil)
......
......@@ -785,7 +785,8 @@ Homebrew repository for editing if no *`formula`* is provided.
Look through repository history to find the most recent version of *`formula`* and
create a copy in *`tap`*`/Formula/`*`formula`*`@`*`version`*`.rb`. If the tap is not
installed yet, attempt to install/clone the tap before continuing.
installed yet, attempt to install/clone the tap before continuing. To extract a
*`formula`* from a tap that is not homebrew/core use *`user`*/*`repo`*/*`formula`*.
* `--version`:
Extract the provided *`version`* of *`formula`* instead of the most recent.
......
......@@ -985,7 +985,7 @@ Generate the new formula in the provided tap, specified as \fIuser\fR\fB/\fR\fIr
Open a formula in the editor set by \fBEDITOR\fR or \fBHOMEBREW_EDITOR\fR, or open the Homebrew repository for editing if no \fIformula\fR is provided\.
.
.SS "\fBextract\fR [\fIoptions\fR] \fIformula\fR \fItap\fR"
Look through repository history to find the most recent version of \fIformula\fR and create a copy in \fItap\fR\fB/Formula/\fR\fIformula\fR\fB@\fR\fIversion\fR\fB\.rb\fR\. If the tap is not installed yet, attempt to install/clone the tap before continuing\.
Look through repository history to find the most recent version of \fIformula\fR and create a copy in \fItap\fR\fB/Formula/\fR\fIformula\fR\fB@\fR\fIversion\fR\fB\.rb\fR\. If the tap is not installed yet, attempt to install/clone the tap before continuing\. To extract a \fIformula\fR from a tap that is not homebrew/core use \fIuser\fR/\fIrepo\fR/\fIformula\fR\.
.
.TP
\fB\-\-version\fR
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment