2015-08-03 13:09:07 +01:00
|
|
|
require "resource"
|
|
|
|
require "metafiles"
|
2015-11-17 16:49:55 +05:30
|
|
|
|
|
|
|
module DiskUsageExtension
|
|
|
|
def disk_usage
|
|
|
|
return @disk_usage if @disk_usage
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2015-11-17 16:49:55 +05:30
|
|
|
compute_disk_usage
|
|
|
|
@disk_usage
|
|
|
|
end
|
|
|
|
|
|
|
|
def file_count
|
|
|
|
return @file_count if @file_count
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2015-11-17 16:49:55 +05:30
|
|
|
compute_disk_usage
|
|
|
|
@file_count
|
|
|
|
end
|
|
|
|
|
|
|
|
def abv
|
|
|
|
out = ""
|
|
|
|
compute_disk_usage
|
|
|
|
out << "#{number_readable(@file_count)} files, " if @file_count > 1
|
2016-09-11 17:53:00 +01:00
|
|
|
out << disk_usage_readable(@disk_usage).to_s
|
2015-11-17 16:49:55 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def compute_disk_usage
|
2018-08-10 04:11:54 +02:00
|
|
|
if symlink? && !exist?
|
|
|
|
@file_count = 1
|
|
|
|
@disk_usage = 0
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
2017-01-06 08:50:20 +00:00
|
|
|
path = if symlink?
|
|
|
|
resolved_path
|
|
|
|
else
|
|
|
|
self
|
|
|
|
end
|
|
|
|
|
|
|
|
if path.directory?
|
2016-04-01 11:08:29 +08:00
|
|
|
scanned_files = Set.new
|
2015-12-30 16:27:15 +08:00
|
|
|
@file_count = 0
|
|
|
|
@disk_usage = 0
|
2017-01-06 08:50:20 +00:00
|
|
|
path.find do |f|
|
2016-04-01 11:08:29 +08:00
|
|
|
if f.directory?
|
|
|
|
@disk_usage += f.lstat.size
|
|
|
|
else
|
|
|
|
@file_count += 1 if f.basename.to_s != ".DS_Store"
|
|
|
|
# use Pathname#lstat instead of Pathname#stat to get info of symlink itself.
|
|
|
|
stat = f.lstat
|
|
|
|
file_id = [stat.dev, stat.ino]
|
|
|
|
# count hardlinks only once.
|
|
|
|
unless scanned_files.include?(file_id)
|
|
|
|
@disk_usage += stat.size
|
|
|
|
scanned_files.add(file_id)
|
|
|
|
end
|
2015-11-17 16:49:55 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
else
|
|
|
|
@file_count = 1
|
2017-01-06 08:50:20 +00:00
|
|
|
@disk_usage = path.lstat.size
|
2015-11-17 16:49:55 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2009-07-31 02:51:17 +01:00
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# Homebrew extends Ruby's `Pathname` to make our code more readable.
|
2017-08-22 10:31:21 +00:00
|
|
|
# @see https://ruby-doc.org/stdlib-1.8.7/libdoc/pathname/rdoc/Pathname.html Ruby's Pathname API
|
2009-07-31 02:51:17 +01:00
|
|
|
class Pathname
|
2015-11-17 16:49:55 +05:30
|
|
|
include DiskUsageExtension
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2018-11-02 17:18:07 +00:00
|
|
|
BOTTLE_EXTNAME_RX = /(\.[a-z0-9_]+\.bottle\.(\d+\.)?tar\.gz)$/.freeze
|
2012-07-05 20:29:31 -05:00
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# Moves a file from the original location to the {Pathname}'s.
|
2015-08-03 13:09:07 +01:00
|
|
|
def install(*sources)
|
2012-02-09 18:43:47 -08:00
|
|
|
sources.each do |src|
|
|
|
|
case src
|
2013-08-06 19:52:58 -07:00
|
|
|
when Resource
|
|
|
|
src.stage(self)
|
2013-09-17 21:25:43 -05:00
|
|
|
when Resource::Partial
|
|
|
|
src.resource.stage { install(*src.files) }
|
2012-02-09 18:43:47 -08:00
|
|
|
when Array
|
2012-03-30 22:34:42 -07:00
|
|
|
if src.empty?
|
2012-03-30 23:02:32 -07:00
|
|
|
opoo "tried to install empty array to #{self}"
|
2016-09-21 09:58:26 +02:00
|
|
|
break
|
2012-03-30 22:34:42 -07:00
|
|
|
end
|
2015-03-23 21:03:55 -04:00
|
|
|
src.each { |s| install_p(s, File.basename(s)) }
|
2012-02-09 18:43:47 -08:00
|
|
|
when Hash
|
2012-03-30 22:34:42 -07:00
|
|
|
if src.empty?
|
2012-03-30 23:02:32 -07:00
|
|
|
opoo "tried to install empty hash to #{self}"
|
2016-09-21 09:58:26 +02:00
|
|
|
break
|
2012-03-30 22:34:42 -07:00
|
|
|
end
|
2015-03-23 21:03:55 -04:00
|
|
|
src.each { |s, new_basename| install_p(s, new_basename) }
|
2012-02-09 18:43:47 -08:00
|
|
|
else
|
2015-03-23 21:03:55 -04:00
|
|
|
install_p(src, File.basename(src))
|
2012-02-09 18:43:47 -08:00
|
|
|
end
|
2009-07-31 02:51:17 +01:00
|
|
|
end
|
|
|
|
end
|
2010-02-19 13:13:42 +00:00
|
|
|
|
2015-03-23 21:03:55 -04:00
|
|
|
def install_p(src, new_basename)
|
2014-07-10 21:26:54 -05:00
|
|
|
raise Errno::ENOENT, src.to_s unless File.symlink?(src) || File.exist?(src)
|
|
|
|
|
2015-03-26 22:22:45 -04:00
|
|
|
src = Pathname(src)
|
|
|
|
dst = join(new_basename)
|
2013-10-06 22:04:46 +01:00
|
|
|
dst = yield(src, dst) if block_given?
|
2016-03-07 15:11:00 +00:00
|
|
|
return unless dst
|
2013-10-06 22:04:46 +01:00
|
|
|
|
2010-02-19 13:13:42 +00:00
|
|
|
mkpath
|
2014-07-10 15:39:55 -05:00
|
|
|
|
|
|
|
# Use FileUtils.mv over File.rename to handle filesystem boundaries. If src
|
|
|
|
# is a symlink, and its target is moved first, FileUtils.mv will fail:
|
|
|
|
# https://bugs.ruby-lang.org/issues/7707
|
|
|
|
# In that case, use the system "mv" command.
|
2015-03-26 22:22:45 -04:00
|
|
|
if src.symlink?
|
2015-08-03 13:09:07 +01:00
|
|
|
raise unless Kernel.system "mv", src, dst
|
2010-02-19 13:13:42 +00:00
|
|
|
else
|
|
|
|
FileUtils.mv src, dst
|
|
|
|
end
|
|
|
|
end
|
2015-03-24 21:08:12 -04:00
|
|
|
private :install_p
|
2010-02-19 13:13:42 +00:00
|
|
|
|
2012-02-12 10:36:16 -08:00
|
|
|
# Creates symlinks to sources in this folder.
|
2015-08-03 13:09:07 +01:00
|
|
|
def install_symlink(*sources)
|
2012-02-12 10:36:16 -08:00
|
|
|
sources.each do |src|
|
|
|
|
case src
|
|
|
|
when Array
|
2015-03-24 21:05:34 -04:00
|
|
|
src.each { |s| install_symlink_p(s, File.basename(s)) }
|
2012-02-12 10:36:16 -08:00
|
|
|
when Hash
|
2015-03-24 21:05:34 -04:00
|
|
|
src.each { |s, new_basename| install_symlink_p(s, new_basename) }
|
2012-02-12 10:36:16 -08:00
|
|
|
else
|
2015-03-24 21:05:34 -04:00
|
|
|
install_symlink_p(src, File.basename(src))
|
2012-02-12 10:36:16 -08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-03-24 21:05:34 -04:00
|
|
|
def install_symlink_p(src, new_basename)
|
2014-03-19 15:56:51 -05:00
|
|
|
src = Pathname(src).expand_path(self)
|
2015-03-24 21:05:34 -04:00
|
|
|
dst = join(new_basename)
|
2012-02-12 10:36:16 -08:00
|
|
|
mkpath
|
2015-03-24 21:05:34 -04:00
|
|
|
FileUtils.ln_sf(src.relative_path_from(dst.parent), dst)
|
2012-02-12 10:36:16 -08:00
|
|
|
end
|
2015-03-24 21:08:12 -04:00
|
|
|
private :install_symlink_p
|
2012-02-12 10:36:16 -08:00
|
|
|
|
2018-07-09 15:29:40 +01:00
|
|
|
# @private
|
|
|
|
alias old_write write
|
2015-08-29 10:56:24 +01:00
|
|
|
|
2018-10-18 21:42:43 -04:00
|
|
|
# We assume this pathname object is a file, obviously
|
2014-06-17 09:31:31 -05:00
|
|
|
def write(content, *open_args)
|
2015-08-03 13:09:07 +01:00
|
|
|
raise "Will not overwrite #{self}" if exist?
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2009-08-31 22:34:42 -06:00
|
|
|
dirname.mkpath
|
2014-06-17 09:31:31 -05:00
|
|
|
open("w", *open_args) { |f| f.write(content) }
|
2009-08-31 22:34:42 -06:00
|
|
|
end
|
2009-07-31 02:51:17 +01:00
|
|
|
|
2016-02-16 16:34:51 +00:00
|
|
|
# Only appends to a file that is already created.
|
|
|
|
def append_lines(content, *open_args)
|
|
|
|
raise "Cannot append file that doesn't exist: #{self}" unless exist?
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2016-02-16 16:34:51 +00:00
|
|
|
open("a", *open_args) { |f| f.puts(content) }
|
|
|
|
end
|
|
|
|
|
2018-10-01 10:40:36 +02:00
|
|
|
# NOTE: This always overwrites.
|
2015-08-03 13:09:07 +01:00
|
|
|
def atomic_write(content)
|
2018-11-22 23:37:57 +01:00
|
|
|
File.atomic_write(self) do |file|
|
|
|
|
file.write(content)
|
2014-11-09 18:17:10 -06:00
|
|
|
end
|
2014-03-22 10:20:39 -05:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2015-08-03 13:09:07 +01:00
|
|
|
def cp_path_sub(pattern, replacement)
|
2016-09-11 17:53:00 +01:00
|
|
|
raise "#{self} does not exist" unless exist?
|
2013-10-05 20:29:02 +01:00
|
|
|
|
2015-03-26 22:22:45 -04:00
|
|
|
dst = sub(pattern, replacement)
|
2013-10-05 20:29:02 +01:00
|
|
|
|
2015-03-26 22:22:45 -04:00
|
|
|
raise "#{self} is the same file as #{dst}" if self == dst
|
2013-10-05 20:29:02 +01:00
|
|
|
|
2015-03-26 22:22:45 -04:00
|
|
|
if directory?
|
|
|
|
dst.mkpath
|
|
|
|
else
|
|
|
|
dst.dirname.mkpath
|
|
|
|
dst = yield(self, dst) if block_given?
|
|
|
|
FileUtils.cp(self, dst)
|
2013-10-05 20:29:02 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2016-09-23 18:13:48 +02:00
|
|
|
alias extname_old extname
|
2015-08-29 10:56:24 +01:00
|
|
|
|
2018-10-18 21:42:43 -04:00
|
|
|
# Extended to support common double extensions
|
2015-08-03 13:09:07 +01:00
|
|
|
def extname(path = to_s)
|
2018-08-10 00:54:03 +02:00
|
|
|
basename = File.basename(path)
|
|
|
|
|
|
|
|
bottle_ext = basename[BOTTLE_EXTNAME_RX, 1]
|
2016-08-23 02:36:21 +02:00
|
|
|
return bottle_ext if bottle_ext
|
2018-08-10 00:54:03 +02:00
|
|
|
|
|
|
|
archive_ext = basename[/(\.(tar|cpio|pax)\.(gz|bz2|lz|xz|Z))\Z/, 1]
|
2016-08-23 02:36:21 +02:00
|
|
|
return archive_ext if archive_ext
|
2018-08-10 00:54:03 +02:00
|
|
|
|
|
|
|
# Don't treat version numbers as extname.
|
2018-09-29 10:32:18 +02:00
|
|
|
return "" if basename.match?(/\b\d+\.\d+[^\.]*\Z/) && !basename.end_with?(".7z")
|
2018-08-10 00:54:03 +02:00
|
|
|
|
|
|
|
File.extname(basename)
|
2009-07-31 02:51:17 +01:00
|
|
|
end
|
|
|
|
|
2018-10-18 21:42:43 -04:00
|
|
|
# For filetypes we support, basename without extension
|
2009-07-31 02:51:17 +01:00
|
|
|
def stem
|
2013-04-20 13:48:49 -05:00
|
|
|
File.basename((path = to_s), extname(path))
|
2009-07-31 02:51:17 +01:00
|
|
|
end
|
|
|
|
|
2009-08-10 16:48:30 +01:00
|
|
|
# I don't trust the children.length == 0 check particularly, not to mention
|
|
|
|
# it is slow to enumerate the whole directory just to see if it is empty,
|
|
|
|
# instead rely on good ol' libc and the filesystem
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2009-08-10 16:48:30 +01:00
|
|
|
def rmdir_if_possible
|
|
|
|
rmdir
|
2009-09-02 14:31:28 +01:00
|
|
|
true
|
2013-04-27 15:21:05 -05:00
|
|
|
rescue Errno::ENOTEMPTY
|
2017-06-01 16:06:51 +02:00
|
|
|
if (ds_store = join(".DS_Store")).exist? && children.length == 1
|
2013-04-27 15:21:05 -05:00
|
|
|
ds_store.unlink
|
2012-11-11 11:39:09 -08:00
|
|
|
retry
|
2013-04-27 15:21:05 -05:00
|
|
|
else
|
|
|
|
false
|
2012-11-11 11:39:09 -08:00
|
|
|
end
|
2018-01-19 14:06:22 -08:00
|
|
|
rescue Errno::EACCES, Errno::ENOENT, Errno::EBUSY
|
2009-09-02 14:31:28 +01:00
|
|
|
false
|
2009-08-10 16:48:30 +01:00
|
|
|
end
|
2012-01-22 22:12:39 +01:00
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2009-07-31 02:51:17 +01:00
|
|
|
def version
|
2015-08-03 13:09:07 +01:00
|
|
|
require "version"
|
2016-03-31 17:08:00 +08:00
|
|
|
Version.parse(basename)
|
2009-07-31 02:51:17 +01:00
|
|
|
end
|
2012-01-22 22:12:39 +01:00
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2012-05-25 23:44:11 -05:00
|
|
|
def text_executable?
|
2016-09-11 17:53:00 +01:00
|
|
|
/^#!\s*\S+/ =~ open("r") { |f| f.read(1024) }
|
2012-05-25 23:44:11 -05:00
|
|
|
end
|
|
|
|
|
2013-10-14 22:05:30 -05:00
|
|
|
def sha256
|
2015-08-03 13:09:07 +01:00
|
|
|
require "digest/sha2"
|
2018-07-06 22:54:54 +02:00
|
|
|
Digest::SHA256.file(self).hexdigest
|
2009-12-30 18:56:46 +00:00
|
|
|
end
|
2012-06-18 19:58:35 -05:00
|
|
|
|
2015-08-03 13:09:07 +01:00
|
|
|
def verify_checksum(expected)
|
|
|
|
raise ChecksumMissingError if expected.nil? || expected.empty?
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2012-06-18 19:58:35 -05:00
|
|
|
actual = Checksum.new(expected.hash_type, send(expected.hash_type).downcase)
|
2014-02-18 13:27:35 -05:00
|
|
|
raise ChecksumMismatchError.new(self, expected, actual) unless expected == actual
|
2012-06-18 19:58:35 -05:00
|
|
|
end
|
2009-12-30 18:56:46 +00:00
|
|
|
|
2018-07-09 15:29:40 +01:00
|
|
|
alias to_str to_s
|
2010-02-27 12:29:45 +00:00
|
|
|
|
|
|
|
def cd
|
2017-02-22 07:19:16 +01:00
|
|
|
Dir.chdir(self) { yield self }
|
2010-02-27 12:29:45 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def subdirs
|
2015-08-03 13:09:07 +01:00
|
|
|
children.select(&:directory?)
|
2010-02-27 12:29:45 +00:00
|
|
|
end
|
2010-06-14 11:56:27 -07:00
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2010-07-25 12:07:35 -07:00
|
|
|
def resolved_path
|
2017-06-01 16:06:51 +02:00
|
|
|
symlink? ? dirname.join(readlink) : self
|
2010-07-25 12:07:35 -07:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2010-06-14 11:56:27 -07:00
|
|
|
def resolved_path_exists?
|
2013-07-13 16:38:30 -05:00
|
|
|
link = readlink
|
|
|
|
rescue ArgumentError
|
|
|
|
# The link target contains NUL bytes
|
|
|
|
false
|
|
|
|
else
|
2017-06-01 16:06:51 +02:00
|
|
|
dirname.join(link).exist?
|
2010-06-14 11:56:27 -07:00
|
|
|
end
|
2010-08-08 09:13:27 -07:00
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2014-04-21 09:40:23 -05:00
|
|
|
def make_relative_symlink(src)
|
2014-03-27 18:39:54 -05:00
|
|
|
dirname.mkpath
|
2014-04-21 09:40:23 -05:00
|
|
|
File.symlink(src.relative_path_from(dirname), self)
|
2010-08-15 17:17:26 -07:00
|
|
|
end
|
2010-09-12 21:52:30 +01:00
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2010-05-10 01:10:49 +01:00
|
|
|
def ensure_writable
|
2011-06-16 17:38:52 +01:00
|
|
|
saved_perms = nil
|
2012-07-28 11:36:08 -07:00
|
|
|
unless writable_real?
|
2011-06-16 17:38:52 +01:00
|
|
|
saved_perms = stat.mode
|
2017-11-07 14:18:25 -06:00
|
|
|
FileUtils.chmod "u+rw", to_path
|
2010-05-10 01:10:49 +01:00
|
|
|
end
|
|
|
|
yield
|
|
|
|
ensure
|
|
|
|
chmod saved_perms if saved_perms
|
|
|
|
end
|
2012-01-21 00:51:20 +01:00
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2012-01-21 00:51:20 +01:00
|
|
|
def install_info
|
2014-04-14 21:32:31 -05:00
|
|
|
quiet_system "/usr/bin/install-info", "--quiet", to_s, "#{dirname}/dir"
|
2012-01-21 00:51:20 +01:00
|
|
|
end
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2012-01-21 00:51:20 +01:00
|
|
|
def uninstall_info
|
2014-04-14 21:32:31 -05:00
|
|
|
quiet_system "/usr/bin/install-info", "--delete", "--quiet", to_s, "#{dirname}/dir"
|
2012-01-21 00:51:20 +01:00
|
|
|
end
|
2012-03-02 20:28:54 +00:00
|
|
|
|
2012-08-07 11:16:45 -07:00
|
|
|
# Writes an exec script in this folder for each target pathname
|
2015-08-03 13:09:07 +01:00
|
|
|
def write_exec_script(*targets)
|
2013-06-20 16:18:01 -05:00
|
|
|
targets.flatten!
|
2012-08-07 11:16:45 -07:00
|
|
|
if targets.empty?
|
2013-07-22 10:57:51 -07:00
|
|
|
opoo "tried to write exec scripts to #{self} for an empty list of targets"
|
2013-12-12 08:21:22 -08:00
|
|
|
return
|
2012-08-07 11:16:45 -07:00
|
|
|
end
|
2014-06-17 21:41:22 -05:00
|
|
|
mkpath
|
2012-08-07 11:16:45 -07:00
|
|
|
targets.each do |target|
|
|
|
|
target = Pathname.new(target) # allow pathnames or strings
|
2018-07-18 09:45:05 +00:00
|
|
|
join(target.basename).write <<~SH
|
2013-12-12 08:21:22 -08:00
|
|
|
#!/bin/bash
|
|
|
|
exec "#{target}" "$@"
|
2018-07-11 15:17:40 +02:00
|
|
|
SH
|
2012-08-07 11:16:45 -07:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-01-04 12:49:38 +00:00
|
|
|
# Writes an exec script that sets environment variables
|
2015-08-03 13:09:07 +01:00
|
|
|
def write_env_script(target, env)
|
|
|
|
env_export = ""
|
|
|
|
env.each { |key, value| env_export += "#{key}=\"#{value}\" " }
|
2014-06-17 21:44:13 -05:00
|
|
|
dirname.mkpath
|
2018-07-11 15:17:40 +02:00
|
|
|
write <<~SH
|
2017-10-15 02:28:32 +02:00
|
|
|
#!/bin/bash
|
|
|
|
#{env_export}exec "#{target}" "$@"
|
2018-07-11 15:17:40 +02:00
|
|
|
SH
|
2014-01-04 12:49:38 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
# Writes a wrapper env script and moves all files to the dst
|
2015-08-03 13:09:07 +01:00
|
|
|
def env_script_all_files(dst, env)
|
2014-01-04 12:49:38 +00:00
|
|
|
dst.mkpath
|
2014-05-31 23:53:46 -05:00
|
|
|
Pathname.glob("#{self}/*") do |file|
|
2015-02-25 18:10:03 +08:00
|
|
|
next if file.directory?
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2015-03-23 21:01:50 -04:00
|
|
|
dst.install(file)
|
2017-06-01 16:06:51 +02:00
|
|
|
new_file = dst.join(file.basename)
|
2014-01-04 12:49:38 +00:00
|
|
|
file.write_env_script(new_file, env)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-10-18 21:42:43 -04:00
|
|
|
# Writes an exec script that invokes a Java jar
|
2018-02-09 20:57:06 -05:00
|
|
|
def write_jar_script(target_jar, script_name, java_opts = "", java_version: nil)
|
2014-06-17 21:41:49 -05:00
|
|
|
mkpath
|
2018-02-09 20:57:06 -05:00
|
|
|
java_home = if java_version
|
2018-11-27 11:52:30 -08:00
|
|
|
"JAVA_HOME=\"#{Language::Java.java_home_shell(java_version)}\" "
|
2018-02-09 20:57:06 -05:00
|
|
|
end
|
2018-07-11 15:17:40 +02:00
|
|
|
join(script_name).write <<~SH
|
2013-12-12 08:21:22 -08:00
|
|
|
#!/bin/bash
|
2018-02-09 20:57:06 -05:00
|
|
|
#{java_home}exec java #{java_opts} -jar #{target_jar} "$@"
|
2018-07-11 15:17:40 +02:00
|
|
|
SH
|
2012-08-07 11:16:45 -07:00
|
|
|
end
|
|
|
|
|
2015-08-03 13:09:07 +01:00
|
|
|
def install_metafiles(from = Pathname.pwd)
|
2014-06-07 17:52:11 -05:00
|
|
|
Pathname(from).children.each do |p|
|
2012-11-11 10:45:58 -08:00
|
|
|
next if p.directory?
|
2014-06-07 23:40:26 -05:00
|
|
|
next unless Metafiles.copy?(p.basename.to_s)
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2012-11-11 10:45:58 -08:00
|
|
|
# Some software symlinks these files (see help2man.rb)
|
|
|
|
filename = p.resolved_path
|
2012-11-12 20:56:05 -08:00
|
|
|
# Some software links metafiles together, so by the time we iterate to one of them
|
|
|
|
# we may have already moved it. libxml2's COPYING and Copyright are affected by this.
|
|
|
|
next unless filename.exist?
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2012-11-11 10:45:58 -08:00
|
|
|
filename.chmod 0644
|
2014-06-07 17:52:11 -05:00
|
|
|
install(filename)
|
2012-11-11 10:45:58 -08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-02-24 17:44:18 +09:00
|
|
|
def ds_store?
|
|
|
|
basename.to_s == ".DS_Store"
|
|
|
|
end
|
|
|
|
|
2016-08-23 02:36:21 +02:00
|
|
|
# https://bugs.ruby-lang.org/issues/9915
|
2016-08-18 14:35:39 +08:00
|
|
|
if RUBY_VERSION == "2.0.0"
|
2014-06-08 20:00:52 -05:00
|
|
|
prepend Module.new {
|
|
|
|
def inspect
|
2014-06-08 20:04:16 -05:00
|
|
|
super.force_encoding(@path.encoding)
|
2014-06-08 20:00:52 -05:00
|
|
|
end
|
|
|
|
}
|
2013-04-14 21:50:57 -05:00
|
|
|
end
|
2017-12-01 16:43:00 -08:00
|
|
|
|
2018-04-25 12:08:33 +01:00
|
|
|
def binary_executable?
|
|
|
|
false
|
|
|
|
end
|
|
|
|
|
2017-12-01 16:43:00 -08:00
|
|
|
def mach_o_bundle?
|
|
|
|
false
|
|
|
|
end
|
2018-04-25 12:08:33 +01:00
|
|
|
|
|
|
|
def dylib?
|
|
|
|
false
|
|
|
|
end
|
2009-07-31 02:51:17 +01:00
|
|
|
end
|
2009-08-10 16:48:30 +01:00
|
|
|
|
2017-11-07 14:18:25 -06:00
|
|
|
require "extend/os/pathname"
|
|
|
|
|
2015-08-29 10:56:24 +01:00
|
|
|
# @private
|
2009-08-10 16:48:30 +01:00
|
|
|
module ObserverPathnameExtension
|
2013-08-09 21:09:48 -05:00
|
|
|
class << self
|
|
|
|
attr_accessor :n, :d
|
|
|
|
|
|
|
|
def reset_counts!
|
|
|
|
@n = @d = 0
|
2015-09-30 13:49:47 +08:00
|
|
|
@put_verbose_trimmed_warning = false
|
2013-08-09 21:09:48 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def total
|
|
|
|
n + d
|
|
|
|
end
|
|
|
|
|
|
|
|
def counts
|
|
|
|
[n, d]
|
|
|
|
end
|
2015-09-30 13:49:47 +08:00
|
|
|
|
|
|
|
MAXIMUM_VERBOSE_OUTPUT = 100
|
|
|
|
|
|
|
|
def verbose?
|
2018-01-03 11:01:23 -08:00
|
|
|
return ARGV.verbose? unless ENV["CI"]
|
2015-09-30 13:49:47 +08:00
|
|
|
return false unless ARGV.verbose?
|
|
|
|
|
|
|
|
if total < MAXIMUM_VERBOSE_OUTPUT
|
|
|
|
true
|
|
|
|
else
|
|
|
|
unless @put_verbose_trimmed_warning
|
|
|
|
puts "Only the first #{MAXIMUM_VERBOSE_OUTPUT} operations were output."
|
|
|
|
@put_verbose_trimmed_warning = true
|
|
|
|
end
|
|
|
|
false
|
|
|
|
end
|
|
|
|
end
|
2013-08-09 21:09:48 -05:00
|
|
|
end
|
|
|
|
|
2009-08-10 16:48:30 +01:00
|
|
|
def unlink
|
|
|
|
super
|
2015-09-30 13:49:47 +08:00
|
|
|
puts "rm #{self}" if ObserverPathnameExtension.verbose?
|
2013-08-09 21:09:48 -05:00
|
|
|
ObserverPathnameExtension.n += 1
|
2009-08-10 16:48:30 +01:00
|
|
|
end
|
2015-08-03 13:09:07 +01:00
|
|
|
|
2016-05-15 13:07:58 +02:00
|
|
|
def mkpath
|
|
|
|
super
|
|
|
|
puts "mkdir -p #{self}" if ObserverPathnameExtension.verbose?
|
|
|
|
end
|
|
|
|
|
2009-08-10 16:48:30 +01:00
|
|
|
def rmdir
|
|
|
|
super
|
2015-09-30 13:49:47 +08:00
|
|
|
puts "rmdir #{self}" if ObserverPathnameExtension.verbose?
|
2013-08-09 21:09:48 -05:00
|
|
|
ObserverPathnameExtension.d += 1
|
2009-08-10 16:48:30 +01:00
|
|
|
end
|
2015-08-03 13:09:07 +01:00
|
|
|
|
|
|
|
def make_relative_symlink(src)
|
2010-08-15 17:17:26 -07:00
|
|
|
super
|
2015-09-30 13:49:47 +08:00
|
|
|
puts "ln -s #{src.relative_path_from(dirname)} #{basename}" if ObserverPathnameExtension.verbose?
|
2013-08-09 21:09:48 -05:00
|
|
|
ObserverPathnameExtension.n += 1
|
2009-08-10 16:48:30 +01:00
|
|
|
end
|
2015-08-03 13:09:07 +01:00
|
|
|
|
2012-01-21 00:51:20 +01:00
|
|
|
def install_info
|
|
|
|
super
|
2015-09-30 13:49:47 +08:00
|
|
|
puts "info #{self}" if ObserverPathnameExtension.verbose?
|
2012-01-21 00:51:20 +01:00
|
|
|
end
|
2015-08-03 13:09:07 +01:00
|
|
|
|
2012-01-21 00:51:20 +01:00
|
|
|
def uninstall_info
|
|
|
|
super
|
2015-09-30 13:49:47 +08:00
|
|
|
puts "uninfo #{self}" if ObserverPathnameExtension.verbose?
|
2012-01-21 00:51:20 +01:00
|
|
|
end
|
2009-08-10 16:48:30 +01:00
|
|
|
end
|