Class: Bintray

Inherits:
Object
  • Object
show all
Defined in:
brew/Library/Homebrew/bintray.rb

Defined Under Namespace

Classes: Error

Constant Summary collapse

API_URL =
"https://api.bintray.com"

Instance Method Summary collapse

Constructor Details

#initialize(user: ENV["HOMEBREW_BINTRAY_USER"], key: ENV["HOMEBREW_BINTRAY_KEY"], org: "homebrew", clear: true) ⇒ Bintray

Returns a new instance of Bintray.

Raises:



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'brew/Library/Homebrew/bintray.rb', line 16

def initialize(user: ENV["HOMEBREW_BINTRAY_USER"], key: ENV["HOMEBREW_BINTRAY_KEY"], org: "homebrew", clear: true)
  @bintray_user = user
  @bintray_key = key
  @bintray_org = org

  if !@bintray_user || !@bintray_key
    unless Homebrew.args.dry_run?
      raise UsageError, "Missing HOMEBREW_BINTRAY_USER or HOMEBREW_BINTRAY_KEY variables!"
    end
  end

  raise UsageError, "Must set a Bintray organisation!" unless @bintray_org

  ENV["HOMEBREW_FORCE_HOMEBREW_ON_LINUX"] = "1" if @bintray_org == "homebrew" && !OS.mac?

  ENV.delete "HOMEBREW_BINTRAY_KEY" if clear
end

Instance Method Details

#create_package(repo:, package:, **extra_data_args) ⇒ Object



59
60
61
62
63
64
65
# File 'brew/Library/Homebrew/bintray.rb', line 59

def create_package(repo:, package:, **extra_data_args)
  url = "#{API_URL}/packages/#{@bintray_org}/#{repo}"
  data = { name: package, public_download_numbers: true }
  data[:public_stats] = official_org?
  data.merge! extra_data_args
  open_api url, "--header", "Content-Type: application/json", "--request", "POST", "--data", data.to_json
end

#file_published?(repo:, remote_file:) ⇒ Boolean

Returns:

  • (Boolean)


84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'brew/Library/Homebrew/bintray.rb', line 84

def file_published?(repo:, remote_file:)
  url = "https://dl.bintray.com/#{@bintray_org}/#{repo}/#{remote_file}"
  begin
    curl "--fail", "--silent", "--head", "--output", "/dev/null", url
  rescue ErrorDuringExecution => e
    stderr = e.output
              .select { |type,| type == :stderr }
              .map { |_, line| line }
              .join
    raise if e.status.exitstatus != 22 && !stderr.include?("404 Not Found")

    false
  else
    true
  end
end

#inspectObject



12
13
14
# File 'brew/Library/Homebrew/bintray.rb', line 12

def inspect
  "#<Bintray: user=#{@bintray_user} org=#{@bintray_org} key=***>"
end

#official_org?(org: @bintray_org) ⇒ Boolean

Returns:

  • (Boolean)


55
56
57
# File 'brew/Library/Homebrew/bintray.rb', line 55

def official_org?(org: @bintray_org)
  %w[homebrew linuxbrew].include? org
end

#open_api(url, *extra_curl_args, auth: true) ⇒ Object



34
35
36
37
38
39
40
41
# File 'brew/Library/Homebrew/bintray.rb', line 34

def open_api(url, *extra_curl_args, auth: true)
  args = extra_curl_args
  args += ["--user", "#{@bintray_user}:#{@bintray_key}"] if auth
  args += ["--output", "/dev/null"] unless Homebrew.args.verbose?
  curl(*args, url,
       show_output: Homebrew.args.verbose?,
       secrets:     @bintray_key)
end

#package_exists?(repo:, package:) ⇒ Boolean

Returns:

  • (Boolean)


67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'brew/Library/Homebrew/bintray.rb', line 67

def package_exists?(repo:, package:)
  url = "#{API_URL}/packages/#{@bintray_org}/#{repo}/#{package}"
  begin
    open_api url, "--fail", "--silent", auth: false
  rescue ErrorDuringExecution => e
    stderr = e.output
              .select { |type,| type == :stderr }
              .map { |_, line| line }
              .join
    raise if e.status.exitstatus != 22 && !stderr.include?("404 Not Found")

    false
  else
    true
  end
end

#publish(repo:, package:, version:) ⇒ Object



50
51
52
53
# File 'brew/Library/Homebrew/bintray.rb', line 50

def publish(repo:, package:, version:)
  url = "#{API_URL}/content/#{@bintray_org}/#{repo}/#{package}/#{version}/publish"
  open_api url, "--request", "POST"
end

#upload(local_file, repo:, package:, version:, remote_file:, sha256: nil) ⇒ Object



43
44
45
46
47
48
# File 'brew/Library/Homebrew/bintray.rb', line 43

def upload(local_file, repo:, package:, version:, remote_file:, sha256: nil)
  url = "#{API_URL}/content/#{@bintray_org}/#{repo}/#{package}/#{version}/#{remote_file}"
  args = ["--upload-file", local_file]
  args += ["--header", "X-Checksum-Sha2: #{sha256}"] unless sha256.blank?
  open_api url, *args
end

#upload_bottle_json(json_files, publish_package: false) ⇒ Object



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# File 'brew/Library/Homebrew/bintray.rb', line 101

def upload_bottle_json(json_files, publish_package: false)
  bottles_hash = json_files.reduce({}) do |hash, json_file|
    hash.deep_merge(JSON.parse(IO.read(json_file)))
  end

  formula_packaged = {}

  bottles_hash.each do |formula_name, bottle_hash|
    version = ERB::Util.url_encode(bottle_hash["formula"]["pkg_version"])
    bintray_package = bottle_hash["bintray"]["package"]
    bintray_repo = bottle_hash["bintray"]["repository"]

    bottle_hash["bottle"]["tags"].each do |_tag, tag_hash|
      filename = tag_hash["filename"] # URL encoded in Bottle::Filename#bintray
      sha256 = tag_hash["sha256"]

      odebug "Checking remote file #{@bintray_org}/#{bintray_repo}/#{filename}"
      if file_published? repo: bintray_repo, remote_file: filename
        raise Error, <<~EOS
          #{filename} is already published.
          Please remove it manually from:
            https://bintray.com/#{@bintray_org}/#{bintray_repo}/#{bintray_package}/view#files
          Or run:
            curl -X DELETE -u $HOMEBREW_BINTRAY_USER:$HOMEBREW_BINTRAY_KEY \\
            https://api.bintray.com/content/#{@bintray_org}/#{bintray_repo}/#{filename}
        EOS
      end

      if !formula_packaged[formula_name] && !package_exists?(repo: bintray_repo, package: bintray_package)
        odebug "Creating package #{@bintray_org}/#{bintray_repo}/#{bintray_package}"
        create_package repo: bintray_repo, package: bintray_package
        formula_packaged[formula_name] = true
      end

      odebug "Uploading #{@bintray_org}/#{bintray_repo}/#{bintray_package}/#{version}/#{filename}"
      upload(tag_hash["local_filename"],
             repo:        bintray_repo,
             package:     bintray_package,
             version:     version,
             remote_file: filename,
             sha256:      sha256)
    end
    if publish_package
      odebug "Publishing #{@bintray_org}/#{bintray_repo}/#{bintray_package}/#{version}"
      publish repo: bintray_repo, package: bintray_package, version: version
    end
  end
end