From 6afd15ae00930ccc846c33c5ed597c163004ec25 Mon Sep 17 00:00:00 2001 From: Anatoli Babenia Date: Fri, 1 Dec 2023 19:19:43 +0000 Subject: [PATCH] create: Fix getting name from GitHub archives `brew create https://github.com/lapce/lapce/archive/v0.3.0.tar.gz` was getting the wrong name 'v3.0.0' from the URL Co-authored-by: Mike McQuaid --- Library/Homebrew/dev-cmd/create.rb | 11 +++-- Library/Homebrew/formula_creator.rb | 44 ++++++++++++------- Library/Homebrew/test/formula_creator_spec.rb | 30 +++++++++++++ 3 files changed, 63 insertions(+), 22 deletions(-) create mode 100644 Library/Homebrew/test/formula_creator_spec.rb diff --git a/Library/Homebrew/dev-cmd/create.rb b/Library/Homebrew/dev-cmd/create.rb index 72db5fdfd5b89..310a21846b2e6 100644 --- a/Library/Homebrew/dev-cmd/create.rb +++ b/Library/Homebrew/dev-cmd/create.rb @@ -172,13 +172,12 @@ def create_formula(args:) 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 4ddaa8874b438..12519fe7569ad 100644 --- a/Library/Homebrew/formula_creator.rb +++ b/Library/Homebrew/formula_creator.rb @@ -31,24 +31,36 @@ def verify 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 0000000000000..9c48392949028 --- /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