Remove use of bash

This commit is contained in:
kiendang 2019-03-19 14:07:50 +08:00
parent 00f74902d4
commit 028b8b408d
5 changed files with 37 additions and 81 deletions

View File

@ -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

View File

@ -1,5 +1,5 @@
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

View File

@ -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)

View File

@ -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.

View File

@ -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