diff --git a/Formula/r/readline.rb b/Formula/r/readline.rb new file mode 100644 index 00000000000..dce78f4a8f9 --- /dev/null +++ b/Formula/r/readline.rb @@ -0,0 +1,104 @@ +class Readline < Formula + desc "Library for command-line editing" + homepage "https://tiswww.case.edu/php/chet/readline/rltop.html" + url "https://ftp.gnu.org/gnu/readline/readline-8.2.tar.gz" + mirror "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz" + version "8.2.13" + sha256 "3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" + license "GPL-3.0-or-later" + + %w[ + 001 bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7 + 002 e06503822c62f7bc0d9f387d4c78c09e0ce56e53872011363c74786c7cd4c053 + 003 24f587ba46b46ed2b1868ccaf9947504feba154bb8faabd4adaea63ef7e6acb0 + 004 79572eeaeb82afdc6869d7ad4cba9d4f519b1218070e17fa90bbecd49bd525ac + 005 622ba387dae5c185afb4b9b20634804e5f6c1c6e5e87ebee7c35a8f065114c99 + 006 c7b45ff8c0d24d81482e6e0677e81563d13c74241f7b86c4de00d239bc81f5a1 + 007 5911a5b980d7900aabdbee483f86dab7056851e6400efb002776a0a4a1bab6f6 + 008 a177edc9d8c9f82e8c19d0630ab351f3fd1b201d655a1ddb5d51c4cee197b26a + 009 3d9885e692e1998523fd5c61f558cecd2aafd67a07bd3bfe1d7ad5a31777a116 + 010 758e2ec65a0c214cfe6161f5cde3c5af4377c67d820ea01d13de3ca165f67b4c + 011 e0013d907f3a9e6482cc0934de1bd82ee3c3c4fd07a9646aa9899af237544dd7 + 012 6c8adf8ed4a2ca629f7fd11301ed6293a6248c9da0c674f86217df715efccbd3 + 013 1ea434957d6ec3a7b61763f1f3552dad0ebdd6754d65888b5cd6d80db3a788a8 + ].each_slice(2) do |p, checksum| + patch :p0 do + url "https://ftp.gnu.org/gnu/readline/readline-8.2-patches/readline82-#{p}" + mirror "https://ftpmirror.gnu.org/readline/readline-8.2-patches/readline82-#{p}" + sha256 checksum + end + end + + # We're not using `url :stable` here because we need `url` to be a string + # when we use it in the `strategy` block. + livecheck do + url :stable + regex(/href=.*?readline[._-]v?(\d+(?:\.\d+)+)\.t/i) + strategy :gnu do |page, regex| + # Match versions from files + versions = page.scan(regex) + .flatten + .uniq + .map { |v| Version.new(v) } + .sort + next versions if versions.blank? + + # Assume the last-sorted version is newest + newest_version = versions.last + + # Simply return the found versions if there isn't a patches directory + # for the "newest" version + patches_directory = page.match(%r{href=.*?(readline[._-]v?#{newest_version.major_minor}[._-]patches/?)["' >]}i) + next versions if patches_directory.blank? + + # Fetch the page for the patches directory + patches_page = Homebrew::Livecheck::Strategy.page_content( + "https://ftp.gnu.org/gnu/readline/#{patches_directory[1]}", + ) + next versions if patches_page[:content].blank? + + # Generate additional major.minor.patch versions from the patch files in + # the directory and add those to the versions array + patches_page[:content].scan(/href=.*?readline[._-]?v?\d+(?:\.\d+)*[._-]0*(\d+)["' >]/i).each do |match| + versions << "#{newest_version.major_minor}.#{match[0]}" + end + + versions + end + end + + bottle do + root_url "https://github.com/gromgit/homebrew-core-aarch64_linux/releases/download/readline-8.2.13" + sha256 cellar: :any_skip_relocation, aarch64_linux: "e99275c523d1a8b4a61303bab92aefdb1d9054f8e5b82f7a327b698e096292ce" + end + + keg_only :shadowed_by_macos, "macOS provides BSD libedit" + + uses_from_macos "ncurses" + + def install + system "./configure", "--prefix=#{prefix}", "--with-curses" + # FIXME: Setting `SHLIB_LIBS` should not be needed, but, on Linux, + # many dependents expect readline to link with ncurses and + # are broken without it. Readline should be agnostic about + # the terminfo library on Linux. + system "make", "install", "SHLIB_LIBS=-lcurses" + end + + test do + (testpath/"test.c").write <<~EOS + #include + #include + #include + + int main() + { + printf("%s\\n", readline("test> ")); + return 0; + } + EOS + + system ENV.cc, "-L", lib, "test.c", "-L#{lib}", "-lreadline", "-o", "test" + assert_equal "test> Hello, World!\nHello, World!", pipe_output("./test", "Hello, World!\n").strip + end +end