class PullRequestBuilder::ObsPullRequestPackage

Constants

PullRequest

Attributes

logger[RW]
obs_package_name[RW]
obs_project_name[RW]
obs_project_name_prefix[RW]
obs_project_pr_name[RW]
osc[RW]
pull_request[RW]
template_directory[RW]

Public Class Methods

all(logger, obs_project_name_prefix, osc = OSC.new) click to toggle source
# File lib/pull_request_builder/obs_pull_request_package.rb, line 10
def self.all(logger, obs_project_name_prefix, osc = OSC.new)
  result = osc.search_project(obs_project_name_prefix)
  xml = Nokogiri::XML(result)
  xml.xpath('//project').map do |project|
    pull_request_number = project.attribute('name').to_s.split('-').last.to_i
    ObsPullRequestPackage.new(pull_request: PullRequest.new(pull_request_number), logger: logger)
  end
end

Public Instance Methods

==(other) click to toggle source
# File lib/pull_request_builder/obs_pull_request_package.rb, line 23
def ==(other)
  pull_request.number == other.pull_request.number
end
commit_sha() click to toggle source
# File lib/pull_request_builder/obs_pull_request_package.rb, line 39
def commit_sha
  pull_request.head.sha
end
create() click to toggle source
# File lib/pull_request_builder/obs_pull_request_package.rb, line 68
def create
  if last_commited_sha == commit_sha
    logger.info('Pull request did not change, skipping ...')
    return
  end
  create_project
  create_package
  copy_files
end
delete() click to toggle source
# File lib/pull_request_builder/obs_pull_request_package.rb, line 19
def delete
  osc.delete_project("source/#{obs_project_name}")
end
eql?(other) click to toggle source
# File lib/pull_request_builder/obs_pull_request_package.rb, line 27
def eql?(other)
  pull_request.number.eql(other.pull_request.number)
end
hash() click to toggle source
# File lib/pull_request_builder/obs_pull_request_package.rb, line 31
def hash
  pull_request.number.hash
end
last_commited_sha() click to toggle source
# File lib/pull_request_builder/obs_pull_request_package.rb, line 58
def last_commited_sha
  # if its a new PR, get_history will fail with a 404 and we have to ignore it

  result = osc.get_history("#{obs_project_pr_name}/#{obs_package_name}")
  node = Nokogiri::XML(result).root
  node.xpath('.//revision/comment').last.content
rescue StandardError, Cheetah::ExecutionFailed
  ''
end
merge_sha() click to toggle source
# File lib/pull_request_builder/obs_pull_request_package.rb, line 43
def merge_sha
  # github test merge commit
  pull_request.merge_commit_sha
end
pull_request_number() click to toggle source
# File lib/pull_request_builder/obs_pull_request_package.rb, line 35
def pull_request_number
  pull_request.number
end
url() click to toggle source

TODO address must be configurable

# File lib/pull_request_builder/obs_pull_request_package.rb, line 54
def url
  "https://build.opensuse.org/package/show/#{obs_project_pr_name}/#{obs_package_name}"
end

Private Instance Methods

copy_files() click to toggle source
# File lib/pull_request_builder/obs_pull_request_package.rb, line 137
def copy_files
  Dir.mktmpdir do |dir|
    osc.checkout(File.join(obs_project_name, obs_package_name), File.join(dir, 'template'))
    osc.checkout(File.join(obs_project_pr_name, obs_package_name), File.join(dir, obs_project_pr_name))
    copy_package_files(dir)
    osc.add_remove(File.join(dir, obs_project_pr_name))
    osc.commit(File.join(dir, obs_project_pr_name), commit_sha)
  end
end
copy_package_files(dir) click to toggle source
# File lib/pull_request_builder/obs_pull_request_package.rb, line 147
def copy_package_files(dir)
  Dir.entries("#{dir}/template").reject { |name| name.start_with?('.') }.each do |file|
    path = File.join(dir, 'template', file)
    target_path = File.join(dir, obs_project_pr_name, file)
    if file == '_service'
      copy_service_file(path, target_path)
    else
      FileUtils.cp path, target_path
    end
  end
end
copy_service_file(path, target_path) click to toggle source
# File lib/pull_request_builder/obs_pull_request_package.rb, line 159
def copy_service_file(path, target_path)
  File.open(target_path, 'w') do |f|
    f.write(service_file(path))
  end
end
create_package() click to toggle source

TODO package name should be configurable

# File lib/pull_request_builder/obs_pull_request_package.rb, line 129
def create_package
  send_meta_file("#{obs_package_name}-meta", operation: :pkg)
end
create_project() click to toggle source
# File lib/pull_request_builder/obs_pull_request_package.rb, line 102
def create_project
  send_meta_file("#{pull_request_number}-meta", operation: :prj)
end
new_package_template() click to toggle source
# File lib/pull_request_builder/obs_pull_request_package.rb, line 133
def new_package_template
  PackageTemplate.new(package_name = obs_package_name).to_xml
end
osc_meta(tmpfile, operation) click to toggle source
# File lib/pull_request_builder/obs_pull_request_package.rb, line 91
def osc_meta(tmpfile, operation)
  case operation
  when :prj
    osc.meta_prj(obs_project_pr_name, tmpfile.path)
  when :pkg
    osc.meta_pkg(obs_project_pr_name, obs_package_name, tmpfile.path)
  else
    raise ArgumentError, "#{operation} not vaild"
  end
end
package_meta() click to toggle source
# File lib/pull_request_builder/obs_pull_request_package.rb, line 106
def package_meta
  PackageTemplate.new(obs_package_name, obs_project_pr_name).to_xml
end
project_meta() click to toggle source
# File lib/pull_request_builder/obs_pull_request_package.rb, line 110
def project_meta
  ProjectMeta.new(obs_project_pr_name, project_title, repositories_to_build).to_xml
end
project_title() click to toggle source
# File lib/pull_request_builder/obs_pull_request_package.rb, line 114
def project_title
  pull_request.html_url
end
repositories_to_build() click to toggle source

TODO make it configurable

# File lib/pull_request_builder/obs_pull_request_package.rb, line 120
def repositories_to_build
  [
    OpenStruct.new(name: 'SLE_15', path: 'OBS:Server:Unstable', arches: ['x86_64']),
    OpenStruct.new(name: 'SLE_12_SP4', path: 'OBS:Server:Unstable', arches: ['x86_64'])
  ]
end
send_meta_file(filename, operation: :prj) click to toggle source
# File lib/pull_request_builder/obs_pull_request_package.rb, line 80
def send_meta_file(filename, operation: :prj)
  tmp_meta_file = Tempfile.open(filename)
  begin
    tmp_meta_file.puts(operation == :prj ? project_meta : package_meta)
    tmp_meta_file.close
    osc_meta(tmp_meta_file, operation)
  ensure
    tmp_meta_file.unlink
  end
end
service_file(path) click to toggle source
# File lib/pull_request_builder/obs_pull_request_package.rb, line 165
def service_file(path)
  content = File.read(path)
  xml = Nokogiri::XML(content)
  node = xml.root.at_xpath(".//param[@name='revision']")
  node.content = merge_sha
  xml.to_s
end