From e12295849da2aac67cb7266f165a054a0a0ca5b7 Mon Sep 17 00:00:00 2001
From: Colin Dean <git@cad.cx>
Date: Sun, 6 Jul 2014 11:41:03 -0400
Subject: [PATCH] Adds JSON output to `outdated` command

After some musing on brunophilipe/Cakebrew#71, I thought it would
be useful to let Cakebrew and other tools grab the outdated formulae
version information using a method more elegant than regex.

Closes Homebrew/homebrew#30693.

Signed-off-by: Jack Nagel <jacknagel@gmail.com>
---
 Library/Contributions/brew_bash_completion.sh |  2 +-
 Library/Homebrew/cmd/outdated.rb              | 38 +++++++++++++++----
 Library/Homebrew/manpages/brew.1.md           |  5 ++-
 share/man/man1/brew.1                         |  5 ++-
 4 files changed, 39 insertions(+), 11 deletions(-)

diff --git a/Library/Contributions/brew_bash_completion.sh b/Library/Contributions/brew_bash_completion.sh
index 9068ac0c74..75ecf2b136 100644
--- a/Library/Contributions/brew_bash_completion.sh
+++ b/Library/Contributions/brew_bash_completion.sh
@@ -395,7 +395,7 @@ _brew_outdated ()
     local cur="${COMP_WORDS[COMP_CWORD]}"
     case "$cur" in
     --*)
-        __brewcomp "--quiet"
+        __brewcomp "--quiet --json=v1"
         return
         ;;
     esac
diff --git a/Library/Homebrew/cmd/outdated.rb b/Library/Homebrew/cmd/outdated.rb
index 6ae5254e55..10fa369533 100644
--- a/Library/Homebrew/cmd/outdated.rb
+++ b/Library/Homebrew/cmd/outdated.rb
@@ -3,14 +3,10 @@ require 'keg'
 
 module Homebrew
   def outdated
-    formulae = ARGV.resolved_formulae.any? ? ARGV.resolved_formulae : Formula.installed
-
-    outdated = outdated_brews(formulae) do |f, versions|
-      if ($stdout.tty? || ARGV.verbose?) && !ARGV.flag?("--quiet")
-        puts "#{f.full_name} (#{versions*', '} < #{f.pkg_version})"
-      else
-        puts f.full_name
-      end
+    if ARGV.json == "v1"
+      outdated = print_outdated_json
+    else
+      outdated = print_outdated
     end
     Homebrew.failed = ARGV.resolved_formulae.any? && outdated.any?
   end
@@ -37,4 +33,30 @@ module Homebrew
       end
     end.compact
   end
+
+  def formulae_to_check
+    ARGV.resolved_formulae.any? ? ARGV.resolved_formulae : Formula.installed
+  end
+
+  def print_outdated
+    outdated_brews(formulae_to_check) do |f, versions|
+      if ($stdout.tty? || ARGV.verbose?) && !ARGV.flag?("--quiet")
+        puts "#{f.full_name} (#{versions*', '} < #{f.pkg_version})"
+      else
+        puts f.full_name
+      end
+    end
+  end
+
+  def print_outdated_json
+    json = []
+    outdated = outdated_brews(formulae_to_check) do |f, versions|
+      json << {:name => f.name,
+               :installed_versions => versions.collect(&:to_s),
+               :current_version => f.pkg_version.to_s}
+    end
+    puts Utils::JSON.dump(json)
+
+    outdated
+  end
 end
diff --git a/Library/Homebrew/manpages/brew.1.md b/Library/Homebrew/manpages/brew.1.md
index 4b3ef93f59..8ba9c66e9d 100644
--- a/Library/Homebrew/manpages/brew.1.md
+++ b/Library/Homebrew/manpages/brew.1.md
@@ -296,7 +296,7 @@ Note that these flags should only appear after a command.
 
     If `--installed` is passed, show options for all installed formulae.
 
-  * `outdated [--quiet|--verbose]`:
+  * `outdated [--quiet | --verbose | --json=v1 ]`:
     Show formulae that have an updated version available.
 
     By default, version information is displayed in interactive shells, and
@@ -307,6 +307,9 @@ Note that these flags should only appear after a command.
 
     If `--verbose` is passed, display detailed version information.
 
+    If `--json=<version>` is passed, the output will be in JSON format. The only
+    valid version is `v1`.
+
   * `pin` <formulae>:
     Pin the specified <formulae>, preventing them from being upgraded when
     issuing the `brew upgrade --all` command. See also `unpin`.
diff --git a/share/man/man1/brew.1 b/share/man/man1/brew.1
index b91e6dec75..5a85119691 100644
--- a/share/man/man1/brew.1
+++ b/share/man/man1/brew.1
@@ -290,7 +290,7 @@ If \fB\-\-all\fR is passed, show options for all formulae\.
 If \fB\-\-installed\fR is passed, show options for all installed formulae\.
 .
 .IP "\(bu" 4
-\fBoutdated [\-\-quiet|\-\-verbose]\fR: Show formulae that have an updated version available\.
+\fBoutdated [\-\-quiet | \-\-verbose | \-\-json=v1 ]\fR: Show formulae that have an updated version available\.
 .
 .IP
 By default, version information is displayed in interactive shells, and suppressed otherwise\.
@@ -301,6 +301,9 @@ If \fB\-\-quiet\fR is passed, list only the names of outdated brews (takes prece
 .IP
 If \fB\-\-verbose\fR is passed, display detailed version information\.
 .
+.IP
+If \fB\-\-json=<version>\fR is passed, the output will be in JSON format\. The only valid version is \fBv1\fR\.
+.
 .IP "\(bu" 4
 \fBpin\fR \fIformulae\fR: Pin the specified \fIformulae\fR, preventing them from being upgraded when issuing the \fBbrew upgrade \-\-all\fR command\. See also \fBunpin\fR\.
 .
-- 
GitLab