Project

General

Profile

Backport #3164 » data.txt

paranormal (paranormal dev), 04/18/2010 06:41 PM

 
desc "Open this repo's master branch in a web browser."
command :home do |user|
if helper.project
homepage = helper.homepage_for(user || helper.owner, 'master')
homepage.gsub!(%r{/tree/master$}, '')
helper.open homepage
end
end

desc "Automatically set configuration info, or pass args to specify."
usage "github config [my_username] [my_repo_name]"
command :config do |user, repo|
user ||= ENV['USER']
repo ||= File.basename(FileUtils.pwd)
git "config --global github.user #{user}"
git "config github.repo #{repo}"
puts "Configured with github.user #{user}, github.repo #{repo}"
end

desc "Open this repo in a web browser."
usage "github browse [user] [branch]"
command :browse do |user, branch|
if helper.project
# if one arg given, treat it as a branch name
# unless it maches user/branch, then split it
# if two args given, treat as user branch
# if no args given, use defaults
user, branch = user.split("/", 2) if branch.nil? unless user.nil?
branch = user and user = nil if branch.nil?
user ||= helper.branch_user
branch ||= helper.branch_name
helper.open helper.homepage_for(user, branch)
end
end

desc 'Open the given user/project in a web browser'
usage 'github open [user/project]'
command :open do |arg|
helper.open "http://github.com/#{arg}"
end

desc "Info about this project."
command :info do
puts "== Info for #{helper.project}"
puts "You are #{helper.owner}"
puts "Currently tracking:"
helper.tracking.sort { |(a,),(b,)| a == helper.origin ? -1 : b == helper.origin ? 1 : a.to_s <=> b.to_s }.each do |(name,user_or_url)|
puts " - #{user_or_url} (as #{name})"
end
end

desc "Track another user's repository."
usage "github track remote [user]"
usage "github track remote [user/repo]"
usage "github track [user]"
usage "github track [user/repo]"
flags :private => "Use git@github.com: instead of git://github.com/."
flags :ssh => 'Equivalent to --private'
command :track do |remote, user|
# track remote user
# track remote user/repo
# track user
# track user/repo
user, remote = remote, nil if user.nil?
die "Specify a user to track" if user.nil?
user, repo = user.split("/", 2)
die "Already tracking #{user}" if helper.tracking?(user)
repo = @helper.project if repo.nil?
repo.chomp!(".git")
remote ||= user

if options[:private] || options[:ssh]
git "remote add #{remote} #{helper.private_url_for_user_and_repo(user, repo)}"
else
git "remote add #{remote} #{helper.public_url_for_user_and_repo(user, repo)}"
end
end

desc "Fetch all refs from a user"
command :fetch_all do |user|
GitHub.invoke(:track, user) unless helper.tracking?(user)
git "fetch #{user}"
end

desc "Fetch from a remote to a local branch."
command :fetch do |user, branch|
die "Specify a user to pull from" if user.nil?
user, branch = user.split("/", 2) if branch.nil?
branch ||= 'master'
GitHub.invoke(:track, user) unless helper.tracking?(user)

die "Unknown branch (#{branch}) specified" unless helper.remote_branch?(user, branch)
die "Unable to switch branches, your current branch has uncommitted changes" if helper.branch_dirty?

puts "Fetching #{user}/#{branch}"
git "fetch #{user} #{branch}:refs/remotes/#{user}/#{branch}"
git "update-ref refs/heads/#{user}/#{branch} refs/remotes/#{user}/#{branch}"
git_exec "checkout #{user}/#{branch}"
end

desc "Pull from a remote."
usage "github pull [user] [branch]"
flags :merge => "Automatically merge remote's changes into your master."
command :pull do |user, branch|
die "Specify a user to pull from" if user.nil?
user, branch = user.split("/", 2) if branch.nil?

if !helper.network_members(user, {}).include?(user)
git_exec "#{helper.argv.join(' ')}".strip
return
end

branch ||= 'master'
GitHub.invoke(:track, user) unless helper.tracking?(user)

die "Unable to switch branches, your current branch has uncommitted changes" if helper.branch_dirty?

if options[:merge]
git_exec "pull #{user} #{branch}"
else
puts "Switching to #{user}-#{branch}"
git "fetch #{user}"
git_exec "checkout -b #{user}/#{branch} #{user}/#{branch}"
end
end

desc "Clone a repo. Uses ssh if current user is "
usage "github clone [user] [repo] [dir]"
flags :ssh => "Clone using the git@github.com style url."
flags :search => "Search for [user|repo] and clone selected repository"
command :clone do |user, repo, dir|
die "Specify a user to pull from" if user.nil?
if options[:search]
query = [user, repo, dir].compact.join(" ")
data = JSON.parse(open("http://github.com/api/v1/json/search/#{URI.escape query}").read)
if (repos = data['repositories']) && !repos.nil? && repos.length > 0
repo_list = repos.map do |r|
{ "name" => "#{r['username']}/#{r['name']}", "description" => r['description'] }
end
formatted_list = helper.format_list(repo_list).split("\n")
if user_repo = GitHub::UI.display_select_list(formatted_list)
user, repo = user_repo.strip.split('/', 2)
end
end
die "Perhaps try another search" unless user && repo
end

if user.include?('/') && !user.include?('@') && !user.include?(':')
die "Expected user/repo dir, given extra argument" if dir
(user, repo), dir = [user.split('/', 2), repo]
end

if repo
if options[:ssh] || current_user?(user)
git_exec "clone git@github.com:#{user}/#{repo}.git" + (dir ? " #{dir}" : "")
else
git_exec "clone git://github.com/#{user}/#{repo}.git" + (dir ? " #{dir}" : "")
end
else
git_exec "#{helper.argv.join(' ')}".strip
end
end

desc "Generate the text for a pull request."
usage "github pull-request [user] [branch]"
command :'pull-request' do |user, branch|
if helper.project
die "Specify a user for the pull request" if user.nil?
user, branch = user.split('/', 2) if branch.nil?
branch ||= 'master'
GitHub.invoke(:track, user) unless helper.tracking?(user)

git_exec "request-pull #{user}/#{branch} #{helper.origin}"
end
end

desc "Create a new, empty GitHub repository"
usage "github create [repo]"
flags :markdown => 'Create README.markdown'
flags :mdown => 'Create README.mdown'
flags :textile => 'Create README.textile'
flags :rdoc => 'Create README.rdoc'
flags :rst => 'Create README.rst'
flags :private => 'Create private repository'
command :create do |repo|
sh "curl -F 'repository[name]=#{repo}' -F 'repository[public]=#{!options[:private]}' -F 'login=#{github_user}' -F 'token=#{github_token}' http://github.com/repositories"
mkdir repo
cd repo
git "init"
extension = options.keys.first
touch extension ? "README.#{extension}" : "README"
git "add *"
git "commit -m 'First commit!'"
git "remote add origin git@github.com:#{github_user}/#{repo}.git"
git_exec "push origin master"
end

desc "Forks a GitHub repository"
usage "github fork"
usage "github fork [user]/[repo]"
command :fork do |user, repo|
if repo.nil?
if user
user, repo = user.split('/')
else
unless helper.remotes.empty?
is_repo = true
user = helper.owner
repo = helper.project
else
die "Specify a user/project to fork, or run from within a repo"
end
end
end

sh "curl -F 'login=#{github_user}' -F 'token=#{github_token}' http://github.com/#{user}/#{repo}/fork"

url = "git@github.com:#{github_user}/#{repo}.git"
if is_repo
git "config remote.origin.url #{url}"
puts "#{user}/#{repo} forked"
else
puts "Giving GitHub a moment to create the fork..."
sleep 3
git_exec "clone #{url}"
end
end

desc "Create a new GitHub repository from the current local repository"
flags :private => 'Create private repository'
command :'create-from-local' do
cwd = sh "pwd"
repo = File.basename(cwd)
is_repo = !git("status").match(/fatal/)
raise "Not a git repository. Use gh create instead" unless is_repo
sh "curl -F 'repository[name]=#{repo}' -F 'repository[public]=#{!options[:private].inspect}' -F 'login=#{github_user}' -F 'token=#{github_token}' http://github.com/repositories"
git "remote add origin git@github.com:#{github_user}/#{repo}.git"
git_exec "push origin master"
end

desc "Search GitHub for the given repository name."
usage "github search [query]"
command :search do |query|
die "Usage: github search [query]" if query.nil?
data = JSON.parse(open("http://github.com/api/v1/json/search/#{URI.escape query}").read)
if (repos = data['repositories']) && !repos.nil? && repos.length > 0
puts repos.map { |r| "#{r['username']}/#{r['name']}"}.sort.uniq
else
puts "No results found"
end
end
(2-2/2)