Skip to content

Instantly share code, notes, and snippets.

@kokizzu
Created December 13, 2019 11:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kokizzu/f8a09e8f9eaafb970b62d099634d912d to your computer and use it in GitHub Desktop.
Save kokizzu/f8a09e8f9eaafb970b62d099634d912d to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
require 'json'
require 'ap'
username = 'kokizzu'
repos = []
repos_len = 0
page = 1
loop do
ap "Fetch API users/#{username}/repos page #{page}"
repos_str = `curl -s https://api.github.com/users/#{username}/repos?page=#{page}&per_page=100`
repos += JSON.parse(repos_str)
puts "Total: #{repos.length}"
break if repos_len == repos.length
repos_len = repos.length
page += 1
end
pwd = Dir.pwd
no = 0
repos.each do |repo|
no += 1
Dir.chdir pwd
ssh_url = repo['ssh_url']
dirname = ssh_url.split('/').pop
dirname = dirname.chomp '.git'
unless File.exists? dirname
ap "#{no}/#{repos.length} Clone #{ssh_url}"
puts `git clone --depth 1 #{ssh_url}`
end
Dir.chdir dirname
remote = `git remote -v`
unless remote.include? 'upstream'
ap "#{no}/#{repos.length} Fetch API repos/#{username}/#{dirname}"
git = `curl -s https://api.github.com/repos/#{username}/#{dirname}`
git = JSON.parse(git)
upstream = git['parent']['clone_url'] rescue ''
ap "Pulling forked changes.."
puts `git pull`
ap "Adding upstream.. #{upstream}"
puts `git remote add upstream #{upstream}` if upstream != ''
end
remote = `git remote -v`
if remote.include? 'upstream'
ap "Fetch upstream.. #{dirname}"
puts `git fetch upstream`
ap "Checkout master.. #{dirname}"
puts `git checkout master`
ap "Merge upstream/master.. #{dirname}"
puts `git merge upstream/master`
ap "Push origin master.. #{dirname}"
puts `git push origin master`
end
ap "Garbage Collect"
puts `git gc`
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment