package App::gh::Command::Fork; use warnings; use strict; use base qw(App::gh::Command); use App::gh::Utils; =head1 NAME App::gh::Command::Fork - fork current repository. =head1 DESCRIPTION =head1 USAGE =pod curl -F 'login=schacon' -F 'token=XXX' http://github.com/api/v2/yaml/repos/fork/dim/retrospectiva $VAR1 = { 'repository' => { 'has_downloads' => bless( do{\(my $o = 1)}, 'JSON::XS::Boolean' ), 'owner' => 'c9s', 'has_issues' => bless( do{\(my $o = 0)}, 'JSON::XS::Boolean' ), 'name' => 'AnyMQ', 'private' => $VAR1->{'repository'}{'has_issues'}, 'has_wiki' => $VAR1->{'repository'}{'has_downloads'}, 'pushed_at' => '2010/04/06 00:40:45 -0700', 'description' => 'Simple message queue based on AnyEvent', 'watchers' => 1, 'forks' => 0, 'homepage' => '', 'created_at' => '2010/07/21 06:08:11 -0700', 'fork' => $VAR1->{'repository'}{'has_downloads'}, 'url' => 'http://github.com/c9s/AnyMQ', 'open_issues' => 0 } }; =cut sub options { ( "verbose" => "verbose", "ssh" => "protocol_ssh", # git@github.com:c9s/repo.git "http" => "protocol_http", # http://github.com/c9s/repo.git "https" => "protocol_https", # https://github.com/c9s/repo.git "git|ro" => "protocol_git" # git://github.com/c9s/repo.git ) } sub run { my $self=shift; my $user; my $repo; if (@_) { $user = shift; #copied from Github::Fork::Parent if ($user && $user=~m{^(?:\Qgit://github.com/\E|git\@github\.com:\E|\Qhttp://github.com/\E)([^/]+)/([^/]+)(?:\.git)?$}) { ($user,$repo)=($1,$2); } elsif( $user && $user =~ /\// ) { ($user,$repo) = split /\//,$user; } else { $repo = shift; } } my $gh_id = App::gh->config->github_id; my $gh_token = App::gh->config->github_token; unless( $gh_id && $gh_token ) { die "Github authtoken not found. Can not fork repository.\n"; } unless ( $repo ) { # detect .git directory if ( -e ".git/config" ) { my $config = App::gh->config->current(); for my $remote ( values %{ $config->{remote} } ) { # git://github.com/miyagawa/Tatsumaki.git # http://github.com/miyagawa/Tatsumaki.git if ( $remote->{url} =~ m{(?:git|https?)://github.com/(.*?)/(.*?)\.git} || $remote->{url} =~ m{git\@github.com:(.*?)/(.*?)\.git} ) { die unless( $1 || $2 ); ($user,$repo) = ( $1 , $2 ); _info "Found GitHub repository of $user/$repo"; my $_remotes = qx(git remote | grep @{[ $gh_id ]}); if( $_remotes ) { die "Remote @{[ $gh_id ]} exists.\n"; } my $remote_uri; if ( $self->{protocol_https} ) { $remote_uri = qq( https://@{[ $gh_id ]}\@github.com/@{[ $gh_id ]}/$repo.git); } else { $remote_uri = qq( git\@github.com:@{[ $gh_id ]}/$repo.git); }; _info "Adding remote '@{[ $gh_id ]}' => $remote_uri"; # url = git@github.com:c9s/App-gh.git my $cmd = qq( git remote add @{[ $gh_id ]} $remote_uri); _debug $cmd; qx($cmd); _info "Remote added."; } } } } _info "Forking..."; my $data = App::gh->api->fork($user , $repo); use Data::Dumper; _debug Dumper( $data ); _info "Repository forked:"; App::gh::Utils->print_repo_info($data->{repository}); # $data = $data->{repository}; # print " Name: " . $data->{name} . "\n"; # print " Description: " . $data->{description} . "\n"; # print " Owner: " . $data->{owner} . "\n"; # print " Watchers: " . $data->{watchers} . "\n"; # print " Created at: " . $data->{created_at} . "\n"; # print " Pushed at: " . $data->{pushed_at} . "\n"; # print " Fork: " . $data->{'fork'} . "\n"; # print " URL: " . $data->{url} . "\n"; # print " Homepage: " . ($data->{homepage}||'') . "\n"; } 1;