homebrew_automation 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7857fc3a55cf794b0138e422f94c7ca6d259ba9cca51df74c46a07c2986231bb
4
- data.tar.gz: d2c5d3a431e0983dafbd8d3504bfea58b6e2c4673272260f18a69ffba8fe3d76
3
+ metadata.gz: a8f714b1824002b10ec76bb31f58b61e18a78c998d0464fef5a434516fbb3d2e
4
+ data.tar.gz: 221d5a56b7832045fc66b3eb173da08e62e18e94d55d83581e660b6e3a6cf18c
5
5
  SHA512:
6
- metadata.gz: 8a6ee4421b0b4a460b6cd6fc818b1e72952fdd1e0d17522cb1ec0787d28e66b05dbfae92bd21638c68a7a1a2c305a4fe52c4ff2dec52a0e35883836311879371
7
- data.tar.gz: e0c4ae780bc69a17951f9d248a0b29e99a03f06f2f2343332f11d5693d343ab182fd18549a3f8cf3dcfc3d99efb2a080efba81fb25ab10e0b0243874ccc3bac3
6
+ metadata.gz: 3dabc4291c10fd6810e6a36bcd1a8336e1e69ea10c8e6d2deb81f3c3afc353caa4e16d09f54fdbbeac6870c351093863190bdfbfc85aa6a4608e37abdecef0a9
7
+ data.tar.gz: da1f8b49b4b5d6e28acbfcbddc89aa10bf4223889378ab8158f73e4de653680d7f026622304577c98b0d63d43a7fd513132f04e63fbc9ac8afaab05864c1fbe3
@@ -9,6 +9,14 @@ module HomebrewAutomation
9
9
  class Bottle
10
10
 
11
11
  class Error < StandardError
12
+
13
+ attr_reader :original
14
+
15
+ def initialize(msg, original:)
16
+ @original = original
17
+ super(msg)
18
+ end
19
+
12
20
  end
13
21
 
14
22
  # @param tap_name [String] For use with +brew tap+
@@ -46,9 +54,8 @@ module HomebrewAutomation
46
54
  # @yieldparam contents [String] The data of the binary Bottle tarball, as if
47
55
  # read via {File#read}
48
56
  # @return [NilClass]
49
- # @raise [Error]
50
57
  def build!(&block)
51
- raise Error, "Bottle#build! expects a block" unless block
58
+ raise StandardError, "Bottle#build! expects a block" unless block
52
59
  call_brew! do
53
60
  json_str = @bottle_finder.read_json!
54
61
  (minus_minus, filename) = parse_for_tarball_path(json_str)
@@ -91,21 +98,28 @@ module HomebrewAutomation
91
98
  # @return [Tuple<String, String>] +[minus_minus, filename]+
92
99
  def parse_for_tarball_path(json_str)
93
100
  begin
94
- focus = JSON.parse(json_str)
101
+ json = JSON.parse(json_str)
102
+ focus = json
95
103
  [fully_qualified_formula_name, 'bottle', 'tags', @os_name].each do |key|
96
104
  focus = focus[key]
97
105
  if focus.nil?
98
- raise BottleError.new "unexpected JSON structure, couldn't find key: #{key}"
106
+ raise Error.new(
107
+ "unexpected JSON structure, couldn't find key: #{key}",
108
+ original: json)
99
109
  end
100
110
  end
101
111
  # https://github.com/Homebrew/brew/pull/4612
102
112
  minus_minus, filename = focus['local_filename'], focus['filename']
103
113
  if minus_minus.nil? || filename.nil?
104
- raise BottleError.new "unexpected JSON structure, couldn't find both `local_filename` and `filename` keys: #{minus_minus.inspect}, #{filename.inspect}"
114
+ raise Error.new(
115
+ "unexpected JSON structure, couldn't find both `local_filename` and `filename` keys: #{minus_minus.inspect}, #{filename.inspect}",
116
+ original: json)
105
117
  end
106
118
  [minus_minus, filename]
107
119
  rescue JSON::ParserError => e
108
- raise BottleError.new "error parsing JSON: #{e}"
120
+ raise Error.new(
121
+ "error parsing JSON: #{e}",
122
+ original: json_str)
109
123
  end
110
124
  end
111
125
 
@@ -7,6 +7,9 @@ module HomebrewAutomation
7
7
  class Error < StandardError
8
8
  end
9
9
 
10
+ class OlderVersionAlreadyInstalled < StandardError
11
+ end
12
+
10
13
  # +brew tap "$name" "$url"+
11
14
  #
12
15
  # @param name [String]
@@ -28,6 +31,8 @@ module HomebrewAutomation
28
31
  # @param fully_qualified_formula_name [String]
29
32
  def self.install!(opts, fully_qualified_formula_name)
30
33
  checked('brew', 'install', *opts, fully_qualified_formula_name)
34
+ rescue Error
35
+ raise OlderVersionAlreadyInstalled
31
36
  end
32
37
 
33
38
  # +brew bottle [opts] "$fully_qualified_formula_name"+
@@ -41,7 +46,7 @@ module HomebrewAutomation
41
46
  private_class_method def self.checked(*args)
42
47
  result = system(*args)
43
48
  unless result
44
- raise BrewError.new("Command failed: #{args}")
49
+ raise Error.new(args.join(' '))
45
50
  end
46
51
  result
47
52
  end
@@ -35,6 +35,7 @@ class HomebrewAutomation::CLI::WorkflowCommands < Thor
35
35
  git,
36
36
  formula_name,
37
37
  bintray_version,
38
+ logger,
38
39
  keep_tap_repo: options[:keep_tap_repo],
39
40
  keep_homebrew_tmp: options[:keep_brew_tmp])
40
41
  end
@@ -71,7 +72,7 @@ class HomebrewAutomation::CLI::WorkflowCommands < Thor
71
72
  end
72
73
 
73
74
  def git
74
- HomebrewAutomation::Git
75
+ HomebrewAutomation::Git.new
75
76
  end
76
77
 
77
78
  # DOC: default values here
@@ -98,4 +99,8 @@ class HomebrewAutomation::CLI::WorkflowCommands < Thor
98
99
  HomebrewAutomation::Workflow.new
99
100
  end
100
101
 
102
+ def logger
103
+ HomebrewAutomation::Logger.new
104
+ end
105
+
101
106
  end
@@ -9,106 +9,88 @@ module HomebrewAutomation
9
9
  class Error < StandardError
10
10
  end
11
11
 
12
- class << self
13
-
14
- # Set Git user's name and email
15
- #
16
- # Reads environment variables:
17
- # - TRAVIS_GIT_USER_NAME
18
- # - TRAVIS_GIT_USER_EMAIL
19
- #
20
- # If either env var is not set, do nothing.
21
- #
22
- # @return [NilClass]
23
- def config!
24
- name = ENV['TRAVIS_GIT_USER_NAME']
25
- email = ENV['TRAVIS_GIT_USER_EMAIL']
26
- if name && email
27
- raise_unless 'git', 'config', '--global', 'user.name', name
28
- raise_unless 'git', 'config', '--global', 'user.email', email
29
- end
12
+ # Set Git user's name and email
13
+ #
14
+ # Reads environment variables:
15
+ # - TRAVIS_GIT_USER_NAME
16
+ # - TRAVIS_GIT_USER_EMAIL
17
+ #
18
+ # If either env var is not set, do nothing.
19
+ #
20
+ # @return [NilClass]
21
+ def config!
22
+ name = ENV['TRAVIS_GIT_USER_NAME']
23
+ email = ENV['TRAVIS_GIT_USER_EMAIL']
24
+ if name && email
25
+ raise_unless 'git', 'config', '--global', 'user.name', name
26
+ raise_unless 'git', 'config', '--global', 'user.email', email
30
27
  end
28
+ end
31
29
 
32
- # Just +git clone+ the given URL
33
- #
34
- # @param url [String] git-friendly URL; could be filesystem path
35
- # @param dir [String] optionally specify target dir name
36
- # @return [NilClass]
37
- def clone!(url, dir: nil)
38
- if dir
39
- raise_unless 'git', 'clone', url, dir
40
- else
41
- raise_unless 'git', 'clone', url
42
- end
30
+ # Just +git clone+ the given URL
31
+ #
32
+ # @param url [String] git-friendly URL; could be filesystem path
33
+ # @param dir [String] optionally specify target dir name
34
+ # @return [NilClass]
35
+ def clone!(url, dir: nil)
36
+ if dir
37
+ raise_unless 'git', 'clone', url, dir
38
+ else
39
+ raise_unless 'git', 'clone', url
43
40
  end
41
+ end
44
42
 
45
- # Like {#clone!} , but allows you to do something inside
46
- # the newly cloned directory, pushd-style.
47
- #
48
- # @see clone!
49
- # @param url [String]
50
- # @param dir [String]
51
- # @param keep_dir [Boolean]
52
- # @yieldparam dir [String] name of freshly cloned dir
53
- # @yieldreturn [a] anything
54
- # @return [a]
55
- def with_clone!(url, dir, keep_dir: false, &block)
56
- begin
57
- clone! url, dir: dir
58
- if block
59
- Dir.chdir dir do
60
- block.call(File.realpath '.')
61
- end
62
- else
63
- puts "Strange, you're calling Git#with_clone! without a block."
43
+ # Like {#clone!} , but allows you to do something inside
44
+ # the newly cloned directory, pushd-style.
45
+ #
46
+ # @see clone!
47
+ # @param url [String]
48
+ # @param dir [String]
49
+ # @param keep_dir [Boolean]
50
+ # @yieldparam dir [String] name of freshly cloned dir
51
+ # @yieldreturn [a] anything
52
+ # @return [a]
53
+ def with_clone!(url, dir, keep_dir: false, &block)
54
+ begin
55
+ clone! url, dir: dir
56
+ if block
57
+ Dir.chdir dir do
58
+ block.call(File.realpath '.')
64
59
  end
65
- nil
66
- ensure
67
- FileUtils.remove_dir(dir) unless keep_dir
60
+ else
61
+ puts "Strange, you're calling Git#with_clone! without a block."
68
62
  end
63
+ nil
64
+ ensure
65
+ FileUtils.remove_dir(dir) unless keep_dir
69
66
  end
67
+ end
70
68
 
71
- # +git commit --allow-empty -am "$msg"+
72
- #
73
- # @param msg [String] Git commit message
74
- # @return [NilClass]
75
- def commit_am!(msg)
76
- raise_unless 'git', 'commit', '--allow-empty', '-am', msg
77
- end
78
-
79
- # Just +git push+
80
- #
81
- # @return [NilClass]
82
- def push!
83
- raise_unless 'git', 'push'
84
- end
69
+ # +git commit --allow-empty -am "$msg"+
70
+ #
71
+ # @param msg [String] Git commit message
72
+ # @return [NilClass]
73
+ def commit_am!(msg)
74
+ raise_unless 'git', 'commit', '--allow-empty', '-am', msg
75
+ end
85
76
 
86
- private
77
+ # Just +git push+
78
+ #
79
+ # @return [NilClass]
80
+ def push!
81
+ raise_unless 'git', 'push'
82
+ end
87
83
 
88
- def raise_unless(*args)
89
- begin
90
- result = system(*args)
91
- unless result
92
- raise Error, "Git command failed: #{args}"
93
- end
94
- result
95
- end
96
- end
84
+ private
97
85
 
98
- # Impure
99
- def complain_unless(*args)
86
+ def raise_unless(*args)
87
+ begin
100
88
  result = system(*args)
101
89
  unless result
102
- puts "Git command errored: #{args}"
103
- puts caller
90
+ raise Error, args.join(' ')
104
91
  end
105
92
  result
106
93
  end
107
-
108
- def silently(*args)
109
- system(*args)
110
- end
111
-
112
94
  end
113
95
 
114
96
  end
@@ -0,0 +1,38 @@
1
+
2
+ require 'time'
3
+
4
+ module HomebrewAutomation
5
+
6
+ # Help you see which parts of STDOUT came from HomebrewAutomation
7
+ class Logger
8
+
9
+ def info!(msg)
10
+ puts(bold(green("homebrew_automation.rb [info] (#{DateTime.now}): ")) + msg)
11
+ end
12
+
13
+ def error!(msg)
14
+ puts(red("homebrew_automation.rb [error] (#{DateTime.now}): ") + msg)
15
+ end
16
+
17
+ private
18
+
19
+ # https://stackoverflow.com/questions/1489183/colorized-ruby-output
20
+ def coloured(colour, msg)
21
+ "\e[#{colour}m#{msg}\e[0m"
22
+ end
23
+
24
+ def green(x)
25
+ coloured(32, x)
26
+ end
27
+
28
+ def red(x)
29
+ coloured(31, x)
30
+ end
31
+
32
+ def bold(x)
33
+ "\e[1m#{x}\e[22m"
34
+ end
35
+
36
+ end
37
+
38
+ end
@@ -2,6 +2,6 @@
2
2
  module HomebrewAutomation
3
3
 
4
4
  # Yep.
5
- VERSION = '0.1.6'
5
+ VERSION = '0.1.7'
6
6
 
7
7
  end
@@ -17,6 +17,7 @@ module HomebrewAutomation
17
17
  # @param tap [Tap]
18
18
  # @param formula_name [String] the name of the formula in the Tap
19
19
  # @param bversion [Bintray::Version]
20
+ # @param logger [HomebrewAutomation::Logger]
20
21
  #
21
22
  # @param mac_os [Class] the MacOS class
22
23
  # @param bottle [Class] the Bottle class
@@ -29,16 +30,25 @@ module HomebrewAutomation
29
30
  git,
30
31
  formula_name,
31
32
  bversion,
33
+ logger,
32
34
  mac_os: MacOS,
33
35
  bottle: Bottle,
34
36
  keep_tap_repo: false,
35
37
  keep_homebrew_tmp: false)
38
+ logger.info!(
39
+ "Hello, this is HomebrewAutomation! I will now build your Formula and upload the " \
40
+ "bottles to Bintray.")
36
41
  os_name = mac_os.identify_version!
42
+ logger.info!("First let's clone your Tap repo to see the Formula.")
37
43
  git.with_clone!(tap.url, tap.repo, keep_dir: keep_tap_repo) do |cloned_dir|
38
44
  tap.on_formula! formula_name do |formula|
39
45
  formula.put_sdist(sdist.url, sdist.sha256)
40
46
  end
41
47
  git.commit_am! "Throwaway commit; just for building bottles"
48
+ logger.info!(
49
+ "I've updated the Formula file in our local Tap clone, and we're ready "\
50
+ "to start building the Bottle. This could take a long time if your Formula "\
51
+ "is slow to compile.")
42
52
  bot = bottle.new(
43
53
  'homebrew-automation/tmp-tap',
44
54
  cloned_dir,
@@ -49,14 +59,40 @@ module HomebrewAutomation
49
59
  # Bintray auto-creates Versions on file-upload.
50
60
  # Re-creating an existing Version results in a 409.
51
61
  #bversion.create!
62
+ logger.info!("Bottle built! Let me now upload the Bottle tarball to Bintray.")
52
63
  begin
53
64
  bversion.upload_file!(filename, contents)
54
65
  rescue Bintray::Version::FileAlreadyExists
55
- puts "A file with the same name as the one you're uploading already exits on Bintray"
66
+ logger.info!("A file with the same name as the one we're uploading already exits on Bintray.")
56
67
  end
57
68
  end
58
69
  bot
59
70
  end
71
+ logger.info!("All done!")
72
+ rescue HomebrewAutomation::Bottle::Error => e
73
+ logger.error!([
74
+ "Something went wrong in a Bottle: " + e.message,
75
+ "Original JSON:",
76
+ e.original,
77
+ "Backtrace:",
78
+ e.backtrace.join("\n")
79
+ ].join("\n"))
80
+ rescue HomebrewAutomation::Bottle::OlderVersionAlreadyInstalled => e
81
+ logger.error!([
82
+ "An older version of the Formula is already installed on your system. " \
83
+ "Please either manually uninstall or upgrade it, then try again.",
84
+ e.to_s,
85
+ "Caused by: #{e.cause}",
86
+ (e.cause ? e.cause.backtrace.join("\n") : '')
87
+ ].join("\n"))
88
+ rescue HomebrewAutomation::Brew::Error => e
89
+ logger.error!(
90
+ "Something went wrong in this Homebrew command: " +
91
+ e.message + "\n" + e.backtrace.join("\n"))
92
+ rescue HomebrewAutomation::Git::Error => e
93
+ logger.error!(
94
+ "Something went wrong in this Git command: " +
95
+ e.message + "\n" + e.backtrace.join("\n"))
60
96
  end
61
97
 
62
98
  # Gather and publish bottles.
@@ -70,10 +106,19 @@ module HomebrewAutomation
70
106
  # @param tap [Tap]
71
107
  # @param formula_name [String] the name of the formula in the Tap
72
108
  # @param bversion [Bintray::Version]
109
+ # @param logger [HomebrewAutomation::Logger]
73
110
  # @return [NilClass]
74
- def gather_and_publish_bottles!(sdist, tap, formula_name, bversion)
111
+ def gather_and_publish_bottles!(sdist, tap, formula_name, bversion, logger)
112
+ logger.info!(
113
+ "Hello, this is HomebrewAutomation! I will browse through your Bintray to " \
114
+ "see if there may be Bottles built earlier for your Formula, and update your " \
115
+ "Tap to refer to them.")
116
+ logger.info!(
117
+ "I will also update the source tarball of your Formula in your Tap, " \
118
+ "effectively releasing a new version of your Formula.")
75
119
  git.with_clone!(tap.url, tap.repo) do
76
120
  tap.on_formula! formula_name do |formula|
121
+ logger.info!("Let's see if any files on your Bintray look like Bottles.")
77
122
  bottles = bversion.gather_bottles
78
123
  bottles.reduce(
79
124
  formula.
@@ -85,9 +130,10 @@ module HomebrewAutomation
85
130
  end
86
131
  git.config!
87
132
  git.commit_am! "Add bottles for #{formula_name}@#{bversion.version_name}"
133
+ logger.info!("I've refered to the Bottles I found in this new commit. Let's push to your Tap!")
88
134
  git.push!
89
135
  end
90
- nil
136
+ logger.info!("All done!")
91
137
  end
92
138
 
93
139
  end
@@ -5,6 +5,7 @@ require_relative 'homebrew_automation/bintray.rb'
5
5
  require_relative 'homebrew_automation/bottle.rb'
6
6
  require_relative 'homebrew_automation/formula.rb'
7
7
  require_relative 'homebrew_automation/git.rb'
8
+ require_relative 'homebrew_automation/logger.rb'
8
9
  require_relative 'homebrew_automation/mac_os.rb'
9
10
  require_relative 'homebrew_automation/source_dist.rb'
10
11
  require_relative 'homebrew_automation/tap.rb'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: homebrew_automation
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - easoncxz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-10 00:00:00.000000000 Z
11
+ date: 2019-10-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -156,6 +156,7 @@ files:
156
156
  - lib/homebrew_automation/cli/workflow_commands.rb
157
157
  - lib/homebrew_automation/formula.rb
158
158
  - lib/homebrew_automation/git.rb
159
+ - lib/homebrew_automation/logger.rb
159
160
  - lib/homebrew_automation/mac_os.rb
160
161
  - lib/homebrew_automation/source_dist.rb
161
162
  - lib/homebrew_automation/tap.rb