Last active
October 23, 2018 09:11
-
-
Save yihyang/a838a2da249cadfec39f741dbe668c12 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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