Skip to content

Instantly share code, notes, and snippets.

@yihyang
Last active October 23, 2018 09:11
Show Gist options
  • Select an option

  • Save yihyang/a838a2da249cadfec39f741dbe668c12 to your computer and use it in GitHub Desktop.

Select an option

Save yihyang/a838a2da249cadfec39f741dbe668c12 to your computer and use it in GitHub Desktop.
require 'byebug'
require 'json'
require 'logger'
require 'octokit'
username = 'x'
github_token = 'x'
organization_name = 'x'
@log = Logger.new('log.txt')
def print_and_log(string)
puts string
@log.debug string
end
labels = [
{"name": "New Feature", "color": "ccffcc"},
{"name": "Bugfix", "color": "ffe6e6"},
{"name": "Chore", "color": "cceeff"},
{"name": "Epic", "color": "3399ff"},
{"name": "Work In Progress", "color": "ff9900"},
{"name": "Do Not Merge", "color": "d73a4a"}
]
def delete_all_labels(client:, repo_name:)
labels = client.labels(repo_name).map(&:to_h)
labels.each do |label|
result = client.delete_label! repo_name, label[:name]
print_and_log "Remove #{label[:name]} from #{repo_name}: #{result[:attrs]}"
end
end
def add_new_labels_if_not_exists(client:, repo_name:, labels:, existing_labels:)
labels.each do |label|
updated_label = false
existing_labels.each do |existing_label|
break if updated_label
if existing_label.downcase == label[:name].downcase
begin
result = client.update_label(repo_name, label[:name], color: label[:color], name: label[:name])
print_and_log "Updating #{label[:name]} (#{label[:color]}) on #{repo_name}: #{result[:attrs]}"
rescue StandardError => e
print_and_log e
print_and_log "Error while trying to update #{label[:name]} (#{label[:color]}) to #{repo_name}"
end
updated_label = true
end
end
unless updated_label
begin
result = client.add_label(repo_name, label[:name], label[:color])
print_and_log "Adding #{label[:name]} (#{label[:color]}) to #{repo_name}: #{result[:attrs]}"
rescue StandardError => e
print_and_log e
print_and_log "Error while trying to add #{label[:name]} (#{label[:color]}) to #{repo_name}"
end
end
end
end
def map_all_repo_names(repos:)
repos.map do |x|
full_repo_name = x[:attrs][:full_name]
end
end
def map_all_repos(client:, organization_name:)
result = []
repos = client.org_repos(organization_name)
result += map_all_repo_names(repos: repos)
last_response = client.last_response
print_and_log "Current repo length: #{result.length}"
until last_response.rels[:next].nil?
last_response = last_response.rels[:next].get
result += map_all_repo_names(repos: last_response.data)
print_and_log "Current repo length: #{result.length}"
end
result
end
def map_labels(labels:)
labels.map do |x|
x[:attrs][:name]
end
end
def get_existing_labels(client:, repo_name:)
result = []
labels = client.labels repo_name
result += map_labels(labels: labels)
last_response = client.last_response
print_and_log "Current label length: #{result.length}"
until last_response.rels[:next].nil?
last_response = last_response.rels[:next].get
result += map_labels(labels: last_response.data)
print_and_log "Current label length: #{result.length}"
end
result
end
client = Octokit::Client.new(access_token: github_token)
all_repo_names = map_all_repos(client: client, organization_name: organization_name)
all_repo_names.each_with_index.map do |repo_name, index|
print_and_log "Current processing #{repo_name}"
print_and_log "Processing #{index} / #{all_repo_names.length}"
existing_labels = get_existing_labels client: client, repo_name: repo_name
add_new_labels_if_not_exists client: client, repo_name: repo_name, labels: labels, existing_labels: existing_labels
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment