diff --git a/Library/Homebrew/dev-cmd/create.rb b/Library/Homebrew/dev-cmd/create.rb index 72db5fdfd5..310a21846b 100644 --- a/Library/Homebrew/dev-cmd/create.rb +++ b/Library/Homebrew/dev-cmd/create.rb @@ -172,13 +172,12 @@ module Homebrew fetch: !args.no_fetch?, head: args.HEAD?, ) - if fc.name.blank? - stem = Pathname.new(args.named.first).stem.rpartition("=").last - print "Formula name [#{stem}]: " - fc.name = __gets || stem - end - fc.parse_url + # ask for confirmation if name wasn't passed explicitly + if args.set_name.blank? + print "Formula name [#{fc.name}]: " + fc.name = __gets || fc.name + end fc.verify diff --git a/Library/Homebrew/formula_creator.rb b/Library/Homebrew/formula_creator.rb index 4ddaa8874b..12519fe756 100644 --- a/Library/Homebrew/formula_creator.rb +++ b/Library/Homebrew/formula_creator.rb @@ -31,24 +31,36 @@ module Homebrew raise TapUnavailableError, @tap.name unless @tap.installed? end - def parse_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 + def self.name_from_url(url) + stem = Pathname.new(url).stem + # special cases first + if stem.start_with? "index.cgi" + # gitweb URLs e.g. http://www.codesrc.com/gitweb/index.cgi?p=libzipper.git;a=summary + stem.rpartition("=").last + elsif url =~ %r{github\.com/\S+/(\S+)/(archive|releases)/} + # e.g. https://github.com/stella-emu/stella/releases/download/6.7/stella-6.7-src.tar.xz + Regexp.last_match(1) + else + # e.g. http://digit-labs.org/files/tools/synscan/releases/synscan-5.02.tar.gz + pathver = Version.parse(stem).to_s + stem.sub(/[-_.]?#{Regexp.escape(pathver)}$/, "") end + end + + def parse_url + @name = FormulaCreator.name_from_url(@url) if @name.blank? + odebug "name_from_url: #{@name}" @version = Version.detect(@url) if @version.nil? + + case @url + when %r{github\.com/(\S+)/(\S+)\.git} + @user = Regexp.last_match(1) + @head = true + @github = true + when %r{github\.com/(\S+)/(\S+)/(archive|releases)/} + @user = Regexp.last_match(1) + @github = true + end end def write_formula! diff --git a/Library/Homebrew/test/formula_creator_spec.rb b/Library/Homebrew/test/formula_creator_spec.rb new file mode 100644 index 0000000000..9c48392949 --- /dev/null +++ b/Library/Homebrew/test/formula_creator_spec.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +require "formula_creator" + +describe Homebrew::FormulaCreator do + it "gets name from GitHub archive URL" do + t = described_class.name_from_url("https://github.com/abitrolly/lapce/archive/v0.3.0.tar.gz") + expect(t).to eq("lapce") + end + + it "gets name from gitweb URL" do + t = described_class.name_from_url("http://www.codesrc.com/gitweb/index.cgi?p=libzipper.git;a=summary") + expect(t).to eq("libzipper") + end + + it "gets name from GitHub repo URL" do + t = described_class.name_from_url("https://github.com/abitrolly/lapce.git") + expect(t).to eq("lapce") + end + + it "gets name from GitHub download URL" do + t = described_class.name_from_url("https://github.com/stella-emu/stella/releases/download/6.7/stella-6.7-src.tar.xz") + expect(t).to eq("stella") + end + + it "gets name from generic tarball URL" do + t = described_class.name_from_url("http://digit-labs.org/files/tools/synscan/releases/synscan-5.02.tar.gz") + expect(t).to eq("synscan") + end +end