2016-12-19 21:51:57 +01:00
|
|
|
#: * `create` <URL> [`--autotools`|`--cmake`|`--meson`] [`--no-fetch`] [`--set-name` <name>] [`--set-version` <version>] [`--tap` <user>`/`<repo>]:
|
2016-04-08 16:28:43 +02:00
|
|
|
#: Generate a formula for the downloadable file at <URL> and open it in the editor.
|
|
|
|
#: Homebrew will attempt to automatically derive the formula name
|
|
|
|
#: and version, but if it fails, you'll have to make your own template. The `wget`
|
|
|
|
#: formula serves as a simple example. For the complete API have a look at
|
2017-02-25 17:37:57 -05:00
|
|
|
#: <http://www.rubydoc.info/github/Homebrew/brew/master/Formula>.
|
2016-04-08 16:28:43 +02:00
|
|
|
#:
|
|
|
|
#: If `--autotools` is passed, create a basic template for an Autotools-style build.
|
|
|
|
#: If `--cmake` is passed, create a basic template for a CMake-style build.
|
2016-12-19 21:51:57 +01:00
|
|
|
#: If `--meson` is passed, create a basic template for a Meson-style build.
|
2016-04-08 16:28:43 +02:00
|
|
|
#:
|
|
|
|
#: If `--no-fetch` is passed, Homebrew will not download <URL> to the cache and
|
2017-04-18 08:22:37 +01:00
|
|
|
#: will thus not add the SHA256 to the formula for you. It will also not check
|
|
|
|
#: the GitHub API for GitHub projects (to fill out the description and homepage).
|
2016-04-08 16:28:43 +02:00
|
|
|
#:
|
|
|
|
#: The options `--set-name` and `--set-version` each take an argument and allow
|
|
|
|
#: you to explicitly set the name and version of the package you are creating.
|
2016-06-23 23:23:41 -07:00
|
|
|
#:
|
|
|
|
#: The option `--tap` takes a tap as its argument and generates the formula in
|
|
|
|
#: the specified tap.
|
2016-04-08 16:28:43 +02:00
|
|
|
|
2015-08-03 13:09:07 +01:00
|
|
|
require "formula"
|
2018-06-03 15:28:48 +05:30
|
|
|
require "formula_creator"
|
2017-03-18 17:02:08 +02:00
|
|
|
require "missing_formula"
|
2018-06-03 01:15:28 +05:30
|
|
|
require "cli_parser"
|
2010-09-11 20:22:54 +01:00
|
|
|
|
2014-06-18 22:41:47 -05:00
|
|
|
module Homebrew
|
2016-09-26 01:44:51 +02:00
|
|
|
module_function
|
|
|
|
|
2012-08-22 19:42:01 -07:00
|
|
|
# Create a formula from a tarball URL
|
2010-09-11 20:22:54 +01:00
|
|
|
def create
|
2018-06-03 01:15:28 +05:30
|
|
|
Homebrew::CLI::Parser.parse do
|
|
|
|
switch "--autotools"
|
|
|
|
switch "--cmake"
|
|
|
|
switch "--meson"
|
|
|
|
switch "--no-fetch"
|
|
|
|
switch "--HEAD"
|
|
|
|
switch :force
|
|
|
|
switch :verbose
|
|
|
|
switch :debug
|
|
|
|
flag "--set-name="
|
|
|
|
flag "--set-version="
|
2018-06-03 15:28:48 +05:30
|
|
|
flag "--tap="
|
2018-06-03 01:15:28 +05:30
|
|
|
end
|
2012-08-22 19:42:01 -07:00
|
|
|
raise UsageError if ARGV.named.empty?
|
|
|
|
|
|
|
|
# Ensure that the cache exists so we can fetch the tarball
|
|
|
|
HOMEBREW_CACHE.mkpath
|
|
|
|
|
|
|
|
url = ARGV.named.first # Pull the first (and only) url from ARGV
|
|
|
|
|
2018-06-03 01:15:28 +05:30
|
|
|
version = args.set_version
|
|
|
|
name = args.set_name
|
|
|
|
tap = args.tap
|
2012-08-22 19:42:01 -07:00
|
|
|
|
|
|
|
fc = FormulaCreator.new
|
|
|
|
fc.name = name
|
|
|
|
fc.version = version
|
2016-06-23 23:23:41 -07:00
|
|
|
fc.tap = Tap.fetch(tap || "homebrew/core")
|
|
|
|
raise TapUnavailableError, tap unless fc.tap.installed?
|
2012-08-22 19:42:01 -07:00
|
|
|
fc.url = url
|
|
|
|
|
2018-06-03 01:15:28 +05:30
|
|
|
fc.mode = if args.cmake?
|
2012-08-22 19:42:01 -07:00
|
|
|
:cmake
|
2018-06-03 01:15:28 +05:30
|
|
|
elsif args.autotools?
|
2012-08-22 19:42:01 -07:00
|
|
|
:autotools
|
2018-06-03 01:15:28 +05:30
|
|
|
elsif args.meson?
|
2016-12-19 21:51:57 +01:00
|
|
|
:meson
|
2012-08-22 19:42:01 -07:00
|
|
|
end
|
|
|
|
|
2014-07-17 19:40:44 -05:00
|
|
|
if fc.name.nil? || fc.name.strip.empty?
|
|
|
|
stem = Pathname.new(url).stem
|
|
|
|
print "Formula name [#{stem}]: "
|
|
|
|
fc.name = __gets || stem
|
2016-06-23 23:23:41 -07:00
|
|
|
fc.update_path
|
2012-08-22 19:42:01 -07:00
|
|
|
end
|
|
|
|
|
|
|
|
# Don't allow blacklisted formula, or names that shadow aliases,
|
|
|
|
# unless --force is specified.
|
2018-06-03 01:15:28 +05:30
|
|
|
unless args.force?
|
2018-04-14 01:39:00 +02:00
|
|
|
if reason = MissingFormula.blacklisted_reason(fc.name)
|
2018-09-02 16:15:09 +01:00
|
|
|
raise <<~EOS
|
|
|
|
#{fc.name} is blacklisted for creation.
|
|
|
|
#{reason}
|
|
|
|
If you really want to create this formula use --force.
|
|
|
|
EOS
|
2012-08-22 19:42:01 -07:00
|
|
|
end
|
|
|
|
|
|
|
|
if Formula.aliases.include? fc.name
|
2014-06-22 15:00:15 -05:00
|
|
|
realname = Formulary.canonical_name(fc.name)
|
2017-10-15 02:28:32 +02:00
|
|
|
raise <<~EOS
|
2012-08-22 19:42:01 -07:00
|
|
|
The formula #{realname} is already aliased to #{fc.name}
|
|
|
|
Please check that you are not creating a duplicate.
|
|
|
|
To force creation use --force.
|
2018-06-06 23:34:19 -04:00
|
|
|
EOS
|
2010-09-11 20:22:54 +01:00
|
|
|
end
|
|
|
|
end
|
2012-08-22 19:42:01 -07:00
|
|
|
|
|
|
|
fc.generate!
|
|
|
|
|
2016-08-02 10:59:39 +01:00
|
|
|
puts "Please `brew audit --new-formula #{fc.name}` before submitting, thanks."
|
2012-08-22 19:42:01 -07:00
|
|
|
exec_editor fc.path
|
2010-09-11 20:22:54 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def __gets
|
|
|
|
gots = $stdin.gets.chomp
|
2016-09-11 17:41:51 +01:00
|
|
|
gots.empty? ? nil : gots
|
2010-09-11 20:22:54 +01:00
|
|
|
end
|
|
|
|
end
|