| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-07 17:49:07 -05:00
										 |  |  | require "metafiles" | 
					
						
							| 
									
										
										
										
											2015-06-20 22:48:45 +08:00
										 |  |  | require "formula" | 
					
						
							| 
									
										
										
										
											2019-04-17 18:25:08 +09:00
										 |  |  | require "cli/parser" | 
					
						
							| 
									
										
										
										
											2014-06-07 17:49:07 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-18 22:41:47 -05:00
										 |  |  | module Homebrew | 
					
						
							| 
									
										
										
										
											2016-09-26 01:44:51 +02:00
										 |  |  |   module_function | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-11 19:56:53 +05:30
										 |  |  |   def list_args | 
					
						
							|  |  |  |     Homebrew::CLI::Parser.new do | 
					
						
							|  |  |  |       usage_banner <<~EOS | 
					
						
							| 
									
										
										
										
											2019-08-06 14:17:17 -04:00
										 |  |  |         `list`, `ls` [<options>] [<formula>] | 
					
						
							| 
									
										
										
										
											2018-11-11 19:56:53 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  |         List all installed formulae. | 
					
						
							| 
									
										
										
										
											2019-08-19 22:44:50 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-30 18:52:02 +00:00
										 |  |  |         If <formula> is provided, summarise the paths within its current keg. | 
					
						
							| 
									
										
										
										
											2018-11-11 19:56:53 +05:30
										 |  |  |       EOS | 
					
						
							|  |  |  |       switch "--full-name", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              description: "Print formulae with fully-qualified names. If `--full-name` is not "\ | 
					
						
							| 
									
										
										
										
											2019-08-06 14:20:27 -04:00
										 |  |  |                           "passed, other options (i.e. `-1`, `-l`, `-r` and `-t`) are passed to `ls`(1) "\ | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |                           "which produces the actual output." | 
					
						
							| 
									
										
										
										
											2018-11-11 19:56:53 +05:30
										 |  |  |       switch "--unbrewed", | 
					
						
							| 
									
										
										
										
											2019-08-20 00:04:14 -04:00
										 |  |  |              description: "List files in Homebrew's prefix not installed by Homebrew." | 
					
						
							| 
									
										
										
										
											2018-11-11 19:56:53 +05:30
										 |  |  |       switch "--versions", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              description: "Show the version number for installed formulae, or only the specified "\ | 
					
						
							| 
									
										
										
										
											2019-08-20 00:04:14 -04:00
										 |  |  |                           "formulae if <formula> are provided." | 
					
						
							| 
									
										
										
										
											2018-11-11 19:56:53 +05:30
										 |  |  |       switch "--multiple", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              depends_on:  "--versions", | 
					
						
							|  |  |  |              description: "Only show formulae with multiple versions installed." | 
					
						
							| 
									
										
										
										
											2018-11-11 19:56:53 +05:30
										 |  |  |       switch "--pinned", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              description: "Show the versions of pinned formulae, or only the specified (pinned) "\ | 
					
						
							| 
									
										
										
										
											2019-08-20 00:04:14 -04:00
										 |  |  |                           "formulae if <formula> are provided. See also `pin`, `unpin`." | 
					
						
							| 
									
										
										
										
											2018-05-29 18:45:46 +01:00
										 |  |  |       # passed through to ls | 
					
						
							| 
									
										
										
										
											2018-11-11 19:56:53 +05:30
										 |  |  |       switch "-1", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              description: "Force output to be one entry per line. " \ | 
					
						
							|  |  |  |                           "This is the default when output is not to a terminal." | 
					
						
							| 
									
										
										
										
											2018-11-11 19:56:53 +05:30
										 |  |  |       switch "-l", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              description: "List in long format. If the output is to a terminal, "\ | 
					
						
							| 
									
										
										
										
											2019-08-20 00:04:14 -04:00
										 |  |  |                           "a total sum for all the file sizes is printed before the long listing." | 
					
						
							| 
									
										
										
										
											2018-11-11 19:56:53 +05:30
										 |  |  |       switch "-r", | 
					
						
							| 
									
										
										
										
											2019-08-20 00:04:14 -04:00
										 |  |  |              description: "Reverse the order of the sort to list the oldest entries first." | 
					
						
							| 
									
										
										
										
											2018-11-24 11:23:14 +00:00
										 |  |  |       switch "-t", | 
					
						
							| 
									
										
										
										
											2019-08-20 00:04:14 -04:00
										 |  |  |              description: "Sort by time modified, listing most recently modified first." | 
					
						
							| 
									
										
										
										
											2018-11-11 19:56:53 +05:30
										 |  |  |       switch :verbose | 
					
						
							|  |  |  |       switch :debug | 
					
						
							| 
									
										
										
										
											2018-04-13 03:02:47 -05:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2018-11-11 19:56:53 +05:30
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def list | 
					
						
							|  |  |  |     list_args.parse | 
					
						
							| 
									
										
										
										
											2018-04-13 03:02:47 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-27 21:15:20 +00:00
										 |  |  |     return list_unbrewed if args.unbrewed? | 
					
						
							| 
									
										
										
										
											2012-08-28 10:59:46 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Unbrewed uses the PREFIX, which will exist | 
					
						
							|  |  |  |     # Things below use the CELLAR, which doesn't until the first formula is installed. | 
					
						
							| 
									
										
										
										
											2015-02-03 20:26:57 -05:00
										 |  |  |     unless HOMEBREW_CELLAR.exist? | 
					
						
							| 
									
										
										
										
											2019-12-15 23:50:01 +05:30
										 |  |  |       raise NoSuchKegError, Hombrew.args.named.first if Homebrew.args.named.present? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-03 20:26:57 -05:00
										 |  |  |       return | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2012-08-28 10:52:51 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-05 18:40:01 +05:30
										 |  |  |     if args.pinned? || args.versions? | 
					
						
							| 
									
										
										
										
											2014-09-06 19:12:03 -07:00
										 |  |  |       filtered_list | 
					
						
							| 
									
										
										
										
											2019-12-15 23:50:01 +05:30
										 |  |  |     elsif Homebrew.args.named.blank? | 
					
						
							| 
									
										
										
										
											2018-05-05 18:40:01 +05:30
										 |  |  |       if args.full_name? | 
					
						
							| 
									
										
										
										
											2017-10-18 18:27:42 -04:00
										 |  |  |         full_names = Formula.installed.map(&:full_name).sort(&tap_and_name_comparison) | 
					
						
							| 
									
										
										
										
											2016-10-02 07:57:21 +02:00
										 |  |  |         return if full_names.empty? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-02 20:39:43 +02:00
										 |  |  |         puts Formatter.columns(full_names) | 
					
						
							| 
									
										
										
										
											2015-06-20 22:48:45 +08:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |         ENV["CLICOLOR"] = nil | 
					
						
							| 
									
										
										
										
											2019-09-25 14:21:06 +05:30
										 |  |  |         safe_system "ls", *Homebrew.args.passthrough << HOMEBREW_CELLAR | 
					
						
							| 
									
										
										
										
											2015-06-20 22:48:45 +08:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2018-05-05 18:40:01 +05:30
										 |  |  |     elsif args.verbose? || !$stdout.tty? | 
					
						
							| 
									
										
										
										
											2019-10-20 21:00:05 -04:00
										 |  |  |       system_command! "find", args: Homebrew.args.kegs.map(&:to_s) + %w[-not -type d -print], print_stdout: true | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2019-10-20 21:00:05 -04:00
										 |  |  |       Homebrew.args.kegs.each { |keg| PrettyListing.new keg } | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2012-08-28 10:59:46 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-10 10:24:57 +01:00
										 |  |  |   UNBREWED_EXCLUDE_FILES = %w[.DS_Store].freeze | 
					
						
							| 
									
										
										
										
											2013-07-31 15:18:37 -05:00
										 |  |  |   UNBREWED_EXCLUDE_PATHS = %w[
 | 
					
						
							| 
									
										
										
										
											2016-02-23 11:55:36 -08:00
										 |  |  |     .github/* | 
					
						
							| 
									
										
										
										
											2013-07-31 15:18:37 -05:00
										 |  |  |     bin/brew | 
					
						
							| 
									
										
										
										
											2016-09-19 19:59:57 +01:00
										 |  |  |     completions/zsh/_brew | 
					
						
							|  |  |  |     docs/* | 
					
						
							| 
									
										
										
										
											2013-07-31 15:18:37 -05:00
										 |  |  |     lib/gdk-pixbuf-2.0/* | 
					
						
							|  |  |  |     lib/gio/* | 
					
						
							|  |  |  |     lib/node_modules/* | 
					
						
							|  |  |  |     lib/python[23].[0-9]/* | 
					
						
							| 
									
										
										
										
											2015-04-06 03:41:24 +01:00
										 |  |  |     lib/pypy/* | 
					
						
							|  |  |  |     lib/pypy3/* | 
					
						
							| 
									
										
										
										
											2016-01-06 08:41:11 +01:00
										 |  |  |     lib/ruby/gems/[12].* | 
					
						
							|  |  |  |     lib/ruby/site_ruby/[12].* | 
					
						
							|  |  |  |     lib/ruby/vendor_ruby/[12].* | 
					
						
							| 
									
										
										
										
											2016-09-19 19:59:57 +01:00
										 |  |  |     manpages/brew.1
 | 
					
						
							| 
									
										
										
										
											2016-09-30 18:22:53 -05:00
										 |  |  |     manpages/brew-cask.1
 | 
					
						
							| 
									
										
										
										
											2015-04-06 03:41:24 +01:00
										 |  |  |     share/pypy/* | 
					
						
							|  |  |  |     share/pypy3/* | 
					
						
							| 
									
										
										
										
											2013-07-31 15:18:37 -05:00
										 |  |  |     share/info/dir | 
					
						
							|  |  |  |     share/man/whatis | 
					
						
							| 
									
										
										
										
											2016-09-10 10:24:57 +01:00
										 |  |  |   ].freeze | 
					
						
							| 
									
										
										
										
											2013-07-31 15:18:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-28 10:59:46 -07:00
										 |  |  |   def list_unbrewed | 
					
						
							| 
									
										
										
										
											2013-07-31 15:18:37 -05:00
										 |  |  |     dirs  = HOMEBREW_PREFIX.subdirs.map { |dir| dir.basename.to_s } | 
					
						
							| 
									
										
										
										
											2012-08-28 10:59:46 -07:00
										 |  |  |     dirs -= %w[Library Cellar .git] | 
					
						
							| 
									
										
										
										
											2012-11-10 11:26:47 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-06 08:38:44 +01:00
										 |  |  |     # Exclude cache, logs, and repository, if they are located under the prefix. | 
					
						
							|  |  |  |     [HOMEBREW_CACHE, HOMEBREW_LOGS, HOMEBREW_REPOSITORY].each do |dir| | 
					
						
							|  |  |  |       dirs.delete dir.relative_path_from(HOMEBREW_PREFIX).to_s | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     dirs.delete "etc" | 
					
						
							|  |  |  |     dirs.delete "var" | 
					
						
							| 
									
										
										
										
											2012-11-12 09:56:45 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-13 03:02:47 -05:00
										 |  |  |     arguments = dirs.sort + %w[-type f (] | 
					
						
							|  |  |  |     arguments.concat UNBREWED_EXCLUDE_FILES.flat_map { |f| %W[! -name #{f}] } | 
					
						
							|  |  |  |     arguments.concat UNBREWED_EXCLUDE_PATHS.flat_map { |d| %W[! -path #{d}] } | 
					
						
							|  |  |  |     arguments.concat %w[)] | 
					
						
							| 
									
										
										
										
											2012-11-10 11:26:47 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-28 10:59:46 -07:00
										 |  |  |     cd HOMEBREW_PREFIX | 
					
						
							| 
									
										
										
										
											2019-03-27 21:15:20 +00:00
										 |  |  |     safe_system "find", *arguments | 
					
						
							| 
									
										
										
										
											2012-08-28 10:59:46 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-06 19:12:03 -07:00
										 |  |  |   def filtered_list | 
					
						
							| 
									
										
										
										
											2019-12-15 23:50:01 +05:30
										 |  |  |     names = if Homebrew.args.named.blank? | 
					
						
							| 
									
										
										
										
											2015-08-13 20:35:22 +08:00
										 |  |  |       Formula.racks | 
					
						
							| 
									
										
										
										
											2012-08-28 10:59:46 -07:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2019-12-15 23:50:01 +05:30
										 |  |  |       racks = Homebrew.args.named.map { |n| Formulary.to_rack(n) } | 
					
						
							| 
									
										
										
										
											2016-10-02 12:18:07 +03:00
										 |  |  |       racks.select do |rack| | 
					
						
							|  |  |  |         Homebrew.failed = true unless rack.exist? | 
					
						
							|  |  |  |         rack.exist? | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2012-08-28 10:59:46 -07:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2018-05-05 18:40:01 +05:30
										 |  |  |     if args.pinned? | 
					
						
							| 
									
										
										
										
											2014-09-06 19:12:03 -07:00
										 |  |  |       pinned_versions = {} | 
					
						
							| 
									
										
										
										
											2017-11-07 12:35:40 +10:00
										 |  |  |       names.sort.each do |d| | 
					
						
							| 
									
										
										
										
											2016-09-15 18:28:42 +01:00
										 |  |  |         keg_pin = (HOMEBREW_PINNED_KEGS/d.basename.to_s) | 
					
						
							| 
									
										
										
										
											2019-02-19 13:11:32 +00:00
										 |  |  |         pinned_versions[d] = keg_pin.readlink.basename.to_s if keg_pin.exist? || keg_pin.symlink? | 
					
						
							| 
									
										
										
										
											2014-09-06 19:12:03 -07:00
										 |  |  |       end | 
					
						
							|  |  |  |       pinned_versions.each do |d, version| | 
					
						
							| 
									
										
										
										
											2018-05-05 18:40:01 +05:30
										 |  |  |         puts d.basename.to_s.concat(args.versions? ? " #{version}" : "") | 
					
						
							| 
									
										
										
										
											2014-09-06 19:12:03 -07:00
										 |  |  |       end | 
					
						
							|  |  |  |     else # --versions without --pinned | 
					
						
							| 
									
										
										
										
											2017-11-06 19:31:57 +10:00
										 |  |  |       names.sort.each do |d| | 
					
						
							| 
									
										
										
										
											2014-09-06 19:12:03 -07:00
										 |  |  |         versions = d.subdirs.map { |pn| pn.basename.to_s } | 
					
						
							| 
									
										
										
										
											2018-05-05 18:40:01 +05:30
										 |  |  |         next if args.multiple? && versions.length < 2
 | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-01 16:06:51 +02:00
										 |  |  |         puts "#{d.basename} #{versions * " "}" | 
					
						
							| 
									
										
										
										
											2014-09-06 19:12:03 -07:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2013-03-11 16:41:08 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class PrettyListing | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def initialize(path) | 
					
						
							| 
									
										
										
										
											2014-07-01 13:32:53 -05:00
										 |  |  |     Pathname.new(path).children.sort_by { |p| p.to_s.downcase }.each do |pn| | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |       case pn.basename.to_s | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       when "bin", "sbin" | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |         pn.find { |pnn| puts pnn unless pnn.directory? } | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       when "lib" | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |         print_dir pn do |pnn| | 
					
						
							|  |  |  |           # dylibs have multiple symlinks and we don't care about them | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |           (pnn.extname == ".dylib" || pnn.extname == ".pc") && !pnn.symlink? | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2016-09-20 14:42:29 -07:00
										 |  |  |       when ".brew" | 
					
						
							| 
									
										
										
										
											2016-11-13 23:37:51 +01:00
										 |  |  |         next # Ignore .brew | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |       else | 
					
						
							|  |  |  |         if pn.directory? | 
					
						
							|  |  |  |           if pn.symlink? | 
					
						
							|  |  |  |             puts "#{pn} -> #{pn.readlink}" | 
					
						
							|  |  |  |           else | 
					
						
							|  |  |  |             print_dir pn | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2014-06-07 17:49:07 -05:00
										 |  |  |         elsif Metafiles.list?(pn.basename.to_s) | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |           puts pn | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def print_dir(root) | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |     dirs = [] | 
					
						
							|  |  |  |     remaining_root_files = [] | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     other = "" | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     root.children.sort.each do |pn| | 
					
						
							|  |  |  |       if pn.directory? | 
					
						
							|  |  |  |         dirs << pn | 
					
						
							| 
									
										
										
										
											2015-08-06 15:45:52 +08:00
										 |  |  |       elsif block_given? && yield(pn) | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |         puts pn | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |         other = "other " | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |         remaining_root_files << pn unless pn.basename.to_s == ".DS_Store" | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     dirs.each do |d| | 
					
						
							|  |  |  |       files = [] | 
					
						
							|  |  |  |       d.find { |pn| files << pn unless pn.directory? } | 
					
						
							|  |  |  |       print_remaining_files files, d | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     print_remaining_files remaining_root_files, root, other | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def print_remaining_files(files, root, other = "") | 
					
						
							| 
									
										
										
										
											2016-11-13 23:37:51 +01:00
										 |  |  |     if files.length == 1
 | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |       puts files | 
					
						
							| 
									
										
										
										
											2016-11-13 23:37:51 +01:00
										 |  |  |     elsif files.length > 1
 | 
					
						
							| 
									
										
										
										
											2010-09-11 20:22:54 +01:00
										 |  |  |       puts "#{root}/ (#{files.length} #{other}files)" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |