diff --git a/Library/Homebrew/dev-cmd/create.rb b/Library/Homebrew/dev-cmd/create.rb index a46601b019..33ba1821e9 100644 --- a/Library/Homebrew/dev-cmd/create.rb +++ b/Library/Homebrew/dev-cmd/create.rb @@ -20,10 +20,9 @@ #: the specified tap. require "formula" +require "formula_creator" require "missing_formula" require "cli_parser" -require "digest" -require "erb" module Homebrew module_function @@ -41,7 +40,7 @@ module Homebrew switch :debug flag "--set-name=" flag "--set-version=" - flag "--tag=" + flag "--tap=" end raise UsageError if ARGV.named.empty? @@ -103,153 +102,4 @@ module Homebrew gots = $stdin.gets.chomp gots.empty? ? nil : gots end - - class FormulaCreator - attr_reader :url, :sha256, :desc, :homepage - attr_accessor :name, :version, :tap, :path, :mode - - def url=(url) - @url = url - path = Pathname.new(url) - if @name.nil? - case url - when %r{github\.com/(\S+)/(\S+)\.git} - @user = Regexp.last_match(1) - @name = Regexp.last_match(2) - @head = true - @github = true - when %r{github\.com/(\S+)/(\S+)/(archive|releases)/} - @user = Regexp.last_match(1) - @name = Regexp.last_match(2) - @github = true - else - @name = path.basename.to_s[/(.*?)[-_.]?#{Regexp.escape(path.version.to_s)}/, 1] - end - end - update_path - if @version - @version = Version.create(@version) - else - @version = Version.detect(url, {}) - end - end - - def update_path - return if @name.nil? || @tap.nil? - @path = Formulary.path "#{@tap}/#{@name}" - end - - def fetch? - !Homebrew.args.no_fetch? - end - - def head? - @head || Homebrew.args.head? - end - - def generate! - raise "#{path} already exists" if path.exist? - - if version.nil? || version.null? - opoo "Version cannot be determined from URL." - puts "You'll need to add an explicit 'version' to the formula." - elsif fetch? - unless head? - r = Resource.new - r.url(url) - r.version(version) - r.owner = self - @sha256 = r.fetch.sha256 if r.download_strategy == CurlDownloadStrategy - end - - if @user && @name - begin - metadata = GitHub.repository(@user, @name) - @desc = metadata["description"] - @homepage = metadata["homepage"] - rescue GitHub::HTTPNotFoundError - # If there was no repository found assume the network connection is at - # fault rather than the input URL. - nil - end - end - end - - path.write ERB.new(template, nil, ">").result(binding) - end - - def template - <<~EOS - # Documentation: https://docs.brew.sh/Formula-Cookbook - # http://www.rubydoc.info/github/Homebrew/brew/master/Formula - # PLEASE REMOVE ALL GENERATED COMMENTS BEFORE SUBMITTING YOUR PULL REQUEST! - class #{Formulary.class_s(name)} < Formula - desc "#{desc}" - homepage "#{homepage}" - <% if head? %> - head "#{url}" - <% else %> - url "#{url}" - <% unless version.nil? or version.detected_from_url? %> - version "#{version}" - <% end %> - sha256 "#{sha256}" - <% end %> - <% if mode == :cmake %> - depends_on "cmake" => :build - <% elsif mode == :meson %> - depends_on "meson-internal" => :build - depends_on "ninja" => :build - depends_on "python" => :build - <% elsif mode.nil? %> - # depends_on "cmake" => :build - <% end %> - - def install - # ENV.deparallelize # if your formula fails when building in parallel - <% if mode == :cmake %> - system "cmake", ".", *std_cmake_args - <% elsif mode == :autotools %> - # Remove unrecognized options if warned by configure - system "./configure", "--disable-debug", - "--disable-dependency-tracking", - "--disable-silent-rules", - "--prefix=\#{prefix}" - <% elsif mode == :meson %> - ENV.refurbish_args - - mkdir "build" do - system "meson", "--prefix=\#{prefix}", ".." - system "ninja" - system "ninja", "install" - end - <% else %> - # Remove unrecognized options if warned by configure - system "./configure", "--disable-debug", - "--disable-dependency-tracking", - "--disable-silent-rules", - "--prefix=\#{prefix}" - # system "cmake", ".", *std_cmake_args - <% end %> - <% if mode != :meson %> - system "make", "install" # if this fails, try separate make/make install steps - <% end %> - end - - test do - # `test do` will create, run in and delete a temporary directory. - # - # This test will fail and we won't accept that! For Homebrew/homebrew-core - # this will need to be a test that verifies the functionality of the - # software. Run the test with `brew test #{name}`. Options passed - # to `brew install` such as `--HEAD` also need to be provided to `brew test`. - # - # The installed folder is not in the path, so use the entire path to any - # executables being tested: `system "\#{bin}/program", "do", "something"`. - system "false" - end - end - EOS - end - end end diff --git a/Library/Homebrew/formula_creator.rb b/Library/Homebrew/formula_creator.rb new file mode 100644 index 0000000000..d3d7494949 --- /dev/null +++ b/Library/Homebrew/formula_creator.rb @@ -0,0 +1,153 @@ +require "digest" +require "erb" + +module Homebrew + class FormulaCreator + attr_reader :url, :sha256, :desc, :homepage + attr_accessor :name, :version, :tap, :path, :mode + + def url=(url) + @url = url + path = Pathname.new(url) + if @name.nil? + case url + when %r{github\.com/(\S+)/(\S+)\.git} + @user = Regexp.last_match(1) + @name = Regexp.last_match(2) + @head = true + @github = true + when %r{github\.com/(\S+)/(\S+)/(archive|releases)/} + @user = Regexp.last_match(1) + @name = Regexp.last_match(2) + @github = true + else + @name = path.basename.to_s[/(.*?)[-_.]?#{Regexp.escape(path.version.to_s)}/, 1] + end + end + update_path + if @version + @version = Version.create(@version) + else + @version = Version.detect(url, {}) + end + end + + def update_path + return if @name.nil? || @tap.nil? + @path = Formulary.path "#{@tap}/#{@name}" + end + + def fetch? + !Homebrew.args.no_fetch? + end + + def head? + @head || Homebrew.args.HEAD? + end + + def generate! + raise "#{path} already exists" if path.exist? + + if version.nil? || version.null? + opoo "Version cannot be determined from URL." + puts "You'll need to add an explicit 'version' to the formula." + elsif fetch? + unless head? + r = Resource.new + r.url(url) + r.version(version) + r.owner = self + @sha256 = r.fetch.sha256 if r.download_strategy == CurlDownloadStrategy + end + + if @user && @name + begin + metadata = GitHub.repository(@user, @name) + @desc = metadata["description"] + @homepage = metadata["homepage"] + rescue GitHub::HTTPNotFoundError + # If there was no repository found assume the network connection is at + # fault rather than the input URL. + nil + end + end + end + + path.write ERB.new(template, nil, ">").result(binding) + end + + def template + <<~EOS + # Documentation: https://docs.brew.sh/Formula-Cookbook + # http://www.rubydoc.info/github/Homebrew/brew/master/Formula + # PLEASE REMOVE ALL GENERATED COMMENTS BEFORE SUBMITTING YOUR PULL REQUEST! + class #{Formulary.class_s(name)} < Formula + desc "#{desc}" + homepage "#{homepage}" + <% if head? %> + head "#{url}" + <% else %> + url "#{url}" + <% unless version.nil? or version.detected_from_url? %> + version "#{version}" + <% end %> + sha256 "#{sha256}" + <% end %> + <% if mode == :cmake %> + depends_on "cmake" => :build + <% elsif mode == :meson %> + depends_on "meson-internal" => :build + depends_on "ninja" => :build + depends_on "python" => :build + <% elsif mode.nil? %> + # depends_on "cmake" => :build + <% end %> + + def install + # ENV.deparallelize # if your formula fails when building in parallel + <% if mode == :cmake %> + system "cmake", ".", *std_cmake_args + <% elsif mode == :autotools %> + # Remove unrecognized options if warned by configure + system "./configure", "--disable-debug", + "--disable-dependency-tracking", + "--disable-silent-rules", + "--prefix=\#{prefix}" + <% elsif mode == :meson %> + ENV.refurbish_args + + mkdir "build" do + system "meson", "--prefix=\#{prefix}", ".." + system "ninja" + system "ninja", "install" + end + <% else %> + # Remove unrecognized options if warned by configure + system "./configure", "--disable-debug", + "--disable-dependency-tracking", + "--disable-silent-rules", + "--prefix=\#{prefix}" + # system "cmake", ".", *std_cmake_args + <% end %> + <% if mode != :meson %> + system "make", "install" # if this fails, try separate make/make install steps + <% end %> + end + + test do + # `test do` will create, run in and delete a temporary directory. + # + # This test will fail and we won't accept that! For Homebrew/homebrew-core + # this will need to be a test that verifies the functionality of the + # software. Run the test with `brew test #{name}`. Options passed + # to `brew install` such as `--HEAD` also need to be provided to `brew test`. + # + # The installed folder is not in the path, so use the entire path to any + # executables being tested: `system "\#{bin}/program", "do", "something"`. + system "false" + end + end + EOS + end + end +end