secpick 2.14 KB
Newer Older
1
#!/usr/bin/env ruby
James Lopez's avatar
James Lopez committed
2 3 4
# frozen_string_literal: false

require 'active_support/core_ext/object/to_query'
5 6 7 8 9 10 11
require 'optparse'
require 'open3'
require 'rainbow/refinement'
using Rainbow

BRANCH_PREFIX = 'security'.freeze
REMOTE = 'dev'.freeze
James Lopez's avatar
James Lopez committed
12
NEW_MR_URL = 'https://dev.gitlab.org/gitlab/gitlabhq/merge_requests/new'.freeze
13 14 15 16 17 18 19 20 21

options = { version: nil, branch: nil, sha: nil }

parser = OptionParser.new do |opts|
  opts.banner = "Usage: #{$0} [options]"
  opts.on('-v', '--version 10.0', 'Version') do |version|
    options[:version] = version&.tr('.', '-')
  end

22
  opts.on('-b', '--branch security-fix-branch', 'Original branch name (optional, defaults to current)') do |branch|
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
    options[:branch] = branch
  end

  opts.on('-s', '--sha abcd', 'SHA to cherry pick') do |sha|
    options[:sha] = sha
  end

  opts.on('-h', '--help', 'Displays Help') do
    puts opts

    exit
  end
end

parser.parse!

39 40
options[:branch] ||= `git rev-parse --abbrev-ref HEAD`

41 42 43
abort("Missing options. Use #{$0} --help to see the list of options available".red) if options.values.include?(nil)
abort("Wrong version format #{options[:version].bold}".red) unless options[:version] =~ /\A\d*\-\d*\Z/

44 45 46
ee = File.exist?('./CHANGELOG-EE.md')
original_branch = options[:branch].strip
branch = "#{original_branch}-#{options[:version]}"
47 48
branch.prepend("#{BRANCH_PREFIX}-") unless branch.start_with?("#{BRANCH_PREFIX}-")
branch = branch.freeze
49 50 51
stable_branch = "#{BRANCH_PREFIX}-#{options[:version]}".tap do |name|
  name << "-ee" if ee
end.freeze
52

53
command = "git fetch #{REMOTE} #{stable_branch} && git checkout #{stable_branch} && git pull #{REMOTE} #{stable_branch} && git checkout -B #{branch} && git cherry-pick #{options[:sha]} && git push #{REMOTE} #{branch} && git checkout #{original_branch}"
54

James Lopez's avatar
James Lopez committed
55
stdin, stdout, stderr, wait_thr = Open3.popen3(command)
56 57 58

puts stdout.read&.green
puts stderr.read&.red
James Lopez's avatar
James Lopez committed
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75

if wait_thr.value.success?
  params = {
    merge_request: {
      source_branch: branch,
      target_branch: stable_branch,
      title: "WIP: [#{options[:version].tr('-', '.')}] ",
      description: '/label ~security'
    }
  }

  puts "#{NEW_MR_URL}?#{params.to_query}".blue
end

stdin.close
stdout.close
stderr.close