GitHub PullRequestReviewCommentEvent at 2014-08-21 16:48:53
Repository: Bindle
Actor: amishpatel1994
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/CloudBindle/Bindle/pulls/comments/16551320","id":16551320,"diff_hunk":"@@ -0,0 +1,202 @@\n+BEGIN {push @INC, '~/perl5/lib/perl5'};\n+BEGIN {push @INC, '~/perl5/man/man3'};\n+use common::sense;\n+use Getopt::Long;\n+use IPC::System::Simple;\n+use Config::Simple;\n+use autodie;\n+use Data::Dumper;\n+use HTML::Manipulator::Document;\n+use FileHandle;\n+use Net::OpenSSH;\n+use FindBin qw($Bin);\n+use lib \"$Bin/../lib\";\n+use tests;\n+use launch;\n+use parser;\n+use threads;\n+use File::Spec;\n+\n+\n+my $config_paths = \"\";\n+my $html_doc = HTML::Manipulator::Document->from_file('tester/template.html');\n+my $help = 0;\n+my $destroy_clusters = 0;\n+my $exit_code = 0;\n+GetOptions (\"use-config-paths=s\" => \\$config_paths,\n+            \"destroy-clusters\" => \\$destroy_clusters,\n+            \"help\" => \\$help);\n+if ($help){\n+    die \"\\n--------------------------------------------------------------------------------\\nUSAGE: \\n\\t --use-config-paths <bindle_config file paths> Note: Pass in a list of bindle config paths relative to the bindle directory separated by comma(Ex. tester/bindle_configs/aws.cfg,tester/bindle_configs/vcloud.cfg\\n\\t--destory-clusters Note: Using this ensures that the clusters will be destroyed after the testing is finished. You should still check the web console to make sure that the clusters do get deleted. \\n\\t --help\\n--------------------------------------------------------------------------------\\n\";\n+}\n+\n+my %cfg_path_files = ();\n+my @config_path_files = split(/,/,$config_paths);\n+\n+# hash to determine which config file to replace in the bindle folder\n+for my $config_path (@config_path_files){\n+    my $val = \"\";\n+    if ($config_path =~ /openstack/){\n+        $val = \"os\";\n+    }\n+    elsif ($config_path =~ /aws/){\n+        $val = \"aws\";\n+    }\n+    elsif ($config_path =~ /vcloud/){\n+        $val = \"vcloud\";\n+    }\n+    $cfg_path_files{\"$config_path\"} = $val;\n+}\n+\n+# if ~/.bindle/test_framework_configs/ doesn't exist, \n+# then tranfer all the .cfg files over from test/config_templates\n+my $abs_path = `readlink -f ~/.bindle/`;\n+$abs_path = (split(/\\n/,$abs_path))[0];\n+my $rel_path = File::Spec->abs2rel($abs_path,'.');\n+if (not -e \"$rel_path/test_framework_configs\"){\n+    system(\"rsync -r config/* ~/.bindle/\");    \n+    system(\"rsync -r tester/config_templates/* ~/.bindle/test_framework_configs\"); \n+    die \"Copied the test_framework configs to ~/.bindle/test_framework_configs. Please fill in the desired config files and try again!\";\n+}\n+\n+# removes known_hosts because this causes issues with Net::OpenSSH\n+system(\"rm -r ~/.ssh/known_hosts\");\n+\n+# goes through each environments and launches clusters and single node instances\n+while (my ($key,$value) = each(%cfg_path_files)){\n+\n+    # copy over the bindle configs from tester folder to bindle folder\n+    system(\"cp $key ~/.bindle/$value.cfg\");\n+\n+    # get the relative path of config file\n+    my $rel_path = parser->get_rel_path(\"~/.bindle/$value.cfg\");    \n+\n+    # read in the cluster information from config file\n+    my $config_file = new Config::Simple(\"$rel_path\");\n+    \n+    # lauch the clusters\n+    my $test_results = launch_clusters($config_file,$key);    \n+    say \"All the clusters have been launched and tested for $value! \\nNow, generating an html document to show the test results!\";\n+    if ($test_results =~ /FAIL/){\n+        $exit_code = 1;\n+    }\n+    \n+    # record test results in html file\n+    $html_doc = parser->set_test_result($html_doc,$key,$test_results);\n+    say \"Test results have been generated for $value!\";\n+    \n+    # destroy the clusters used for testing\n+    if ($destroy_clusters){\n+        say \"Destroying all the clusters for $value!\";\n+        my $cluster_blocks = parser->get_cluster_dirs($config_file);\n+        launch->destroy_clusters($cluster_blocks);\n+    }\n+}\n+\n+# get all the commit SHA's for the repos if they exist (Bindle, seqware-bag, and pancancer-bag)\n+my $commit_SHAs = parser->get_latest_commits();\n+$html_doc->replace(\"other-info\" => { _content => $commit_SHAs});\n+\n+$html_doc->save_as('tester/results.html');\n+say \"FINISHED: Saved the results to html page!\";\n+exit $exit_code;\n+\n+\n+\n+\n+\n+\n+\n+\n+# SUBROUTINES\n+\n+sub launch_clusters{\n+    my ($cfg_file,$env_file) = @_;\n+    my $result = \"\";\n+    my $platform = $cfg_file->param('platform.type');\n+    my $number_of_clusters = $cfg_file->param('platform.number_of_clusters');\n+    my $number_of_single_nodes = $cfg_file->param('platform.number_of_single_node_clusters');\n+    $platform = 'openstack' if ($platform eq 'OS');\n+    \n+    say \"--------------------------------------------------------------------------------\";\n+    my $environment = $cfg_file->param('platform.env');\n+    say \"\\tSTARTING TO LAUNCH ALL CLUSTERS FOR $environment\";\n+    say \"--------------------------------------------------------------------------------\";\n+    # launch all the cluster blocks from a particular config file(ex. aws)\n+    $result .= launch_cluster_threads($number_of_clusters, $number_of_single_nodes, $platform,$cfg_file,$env_file,$result); \n+    say \"--------------------------------------------------------------------------------\";\n+    say \"\\tLAUNCHED ALL CLUSTERS FOR $environment\";\n+    say \"--------------------------------------------------------------------------------\";\n+\n+    return $result;\n+}\n+\n+\n+sub launch_cluster_threads{\n+    my ($number_of_clusters,$number_of_nodes,$platform,$cfg_file,$env_file,$result) = @_;\n+    \n+    my %threads;\n+    \n+    # create threads for all the multi-node cluster blocks \n+    for (my $i = 1; $i <= $number_of_clusters; $i += 1){\n+         say \"STARTING A THREAD TO LAUNCH CLUSTERS FOR $env_file,cluster$i\";\n+         my $cluster_name = \"cluster$i\";\n+         my $thr = threads->create(\\&launch_one_cluster,$number_of_clusters,$platform,$cfg_file,$env_file,$result,$cluster_name);\n+         $threads{\"cluster$i\"} = $thr;\n+         sleep 60;\n+    }\n+\n+    # create threads for all the single-node cluster blocks \n+    for (my $i = 1; $i <= $number_of_nodes; $i += 1){\n+        my $node_name = \"singlenode$i\";\n+        say \"STARTING A THREAD TO LAUNCH SINGLE NODE CLUSTERS FRO $env_file, singlenode$i\";\n+        my $thr = threads->create(\\&launch_one_cluster,$number_of_nodes,$platform,$cfg_file,$env_file,$result,$node_name);\n+        $threads{\"$node_name\"} = $thr;\n+        sleep 60;\n+    }\n+    say \" ALL LAUNCH THREADS STARTED\";\n+    print Dumper(%threads);\n+\n+    # join all the threads to produce a result for a particular config file(aws.cfg)\n+    while (my ($key,$value) = each(%threads)){\n+        $result .= $value->join();\n+    }\n+\n+    say \"ALL LAUNCH THREADS COMPLETED FOR $env_file\";\n+    return $result;\n+}\n+\n+\n+sub launch_one_cluster{\n+        my ($number_of_clusters,$platform,$cfg_file,$env_file,$result,$cluster_name) = @_;\n+        my $working_dir = $cfg_file->param(\"$cluster_name.target_directory\");\n+        my $seq_version = $cfg_file->param(\"platform.seqware_version\");\n+        my $bwa_version = $cfg_file->param(\"platform.bwa_workflow_version\");\n+        system(\"mkdir $working_dir\");\n+        \n+        # launch the cluster via bindle\n+        system(\"perl bin/launcher/launch_cluster.pl --use-$platform --use-default-config --launch-cluster $cluster_name >> $working_dir/cluster.log\");","path":"tester/bin/bindle_test_framework.pl","position":178,"original_position":178,"commit_id":"7981aca2881bacdf1f86ac6d3199ef80c8c36451","original_commit_id":"7981aca2881bacdf1f86ac6d3199ef80c8c36451","user":{"login":"amishpatel1994","id":7492026,"avatar_url":"https://avatars.githubusercontent.com/u/7492026?v=2","gravatar_id":"7f58cc602cf123bf5e76b2721871b99d","url":"https://api.github.com/users/amishpatel1994","html_url":"https://github.com/amishpatel1994","followers_url":"https://api.github.com/users/amishpatel1994/followers","following_url":"https://api.github.com/users/amishpatel1994/following{/other_user}","gists_url":"https://api.github.com/users/amishpatel1994/gists{/gist_id}","starred_url":"https://api.github.com/users/amishpatel1994/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/amishpatel1994/subscriptions","organizations_url":"https://api.github.com/users/amishpatel1994/orgs","repos_url":"https://api.github.com/users/amishpatel1994/repos","events_url":"https://api.github.com/users/amishpatel1994/events{/privacy}","received_events_url":"https://api.github.com/users/amishpatel1994/received_events","type":"User","site_admin":false},"body":"Yes, sure. I will give it a shot once I make other changes and finish documentation. ","created_at":"2014-08-21T16:48:53Z","updated_at":"2014-08-21T16:48:53Z","html_url":"https://github.com/CloudBindle/Bindle/pull/28#discussion_r16551320","pull_request_url":"https://api.github.com/repos/CloudBindle/Bindle/pulls/28","_links":{"self":{"href":"https://api.github.com/repos/CloudBindle/Bindle/pulls/comments/16551320"},"html":{"href":"https://github.com/CloudBindle/Bindle/pull/28#discussion_r16551320"},"pull_request":{"href":"https://api.github.com/repos/CloudBindle/Bindle/pulls/28"}}},"pull_request":{"url":"https://api.github.com/repos/CloudBindle/Bindle/pulls/28","id":20075149,"html_url":"https://github.com/CloudBindle/Bindle/pull/28","diff_url":"https://github.com/CloudBindle/Bindle/pull/28.diff","patch_url":"https://github.com/CloudBindle/Bindle/pull/28.patch","issue_url":"https://api.github.com/repos/CloudBindle/Bindle/issues/28","number":28,"state":"open","locked":false,"title":"Feature/bindle test framework","user":{"login":"amishpatel1994","id":7492026,"avatar_url":"https://avatars.githubusercontent.com/u/7492026?v=2","gravatar_id":"7f58cc602cf123bf5e76b2721871b99d","url":"https://api.github.com/users/amishpatel1994","html_url":"https://github.com/amishpatel1994","followers_url":"https://api.github.com/users/amishpatel1994/followers","following_url":"https://api.github.com/users/amishpatel1994/following{/other_user}","gists_url":"https://api.github.com/users/amishpatel1994/gists{/gist_id}","starred_url":"https://api.github.com/users/amishpatel1994/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/amishpatel1994/subscriptions","organizations_url":"https://api.github.com/users/amishpatel1994/orgs","repos_url":"https://api.github.com/users/amishpatel1994/repos","events_url":"https://api.github.com/users/amishpatel1994/events{/privacy}","received_events_url":"https://api.github.com/users/amishpatel1994/received_events","type":"User","site_admin":false},"body":"Includes Bindle Tester - Test Framework that is integrated with jenkins to follow CI principles.\r\nAlso includes documentation for Bindle Tester\r\n","created_at":"2014-08-20T21:23:44Z","updated_at":"2014-08-21T16:48:53Z","closed_at":null,"merged_at":null,"merge_commit_sha":"7e7e24aa5dc623179cf724654397cb19b1bc5076","assignee":{"login":"denis-yuen","id":1730679,"avatar_url":"https://avatars.githubusercontent.com/u/1730679?v=2","gravatar_id":"b997c877261fd0279939357a3b632730","url":"https://api.github.com/users/denis-yuen","html_url":"https://github.com/denis-yuen","followers_url":"https://api.github.com/users/denis-yuen/followers","following_url":"https://api.github.com/users/denis-yuen/following{/other_user}","gists_url":"https://api.github.com/users/denis-yuen/gists{/gist_id}","starred_url":"https://api.github.com/users/denis-yuen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/denis-yuen/subscriptions","organizations_url":"https://api.github.com/users/denis-yuen/orgs","repos_url":"https://api.github.com/users/denis-yuen/repos","events_url":"https://api.github.com/users/denis-yuen/events{/privacy}","received_events_url":"https://api.github.com/users/denis-yuen/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/CloudBindle/Bindle/pulls/28/commits","review_comments_url":"https://api.github.com/repos/CloudBindle/Bindle/pulls/28/comments","review_comment_url":"https://api.github.com/repos/CloudBindle/Bindle/pulls/comments/{number}","comments_url":"https://api.github.com/repos/CloudBindle/Bindle/issues/28/comments","statuses_url":"https://api.github.com/repos/CloudBindle/Bindle/statuses/7981aca2881bacdf1f86ac6d3199ef80c8c36451","head":{"label":"CloudBindle:feature/bindle_test_framework","ref":"feature/bindle_test_framework","sha":"7981aca2881bacdf1f86ac6d3199ef80c8c36451","user":{"login":"CloudBindle","id":7140588,"avatar_url":"https://avatars.githubusercontent.com/u/7140588?v=2","gravatar_id":null,"url":"https://api.github.com/users/CloudBindle","html_url":"https://github.com/CloudBindle","followers_url":"https://api.github.com/users/CloudBindle/followers","following_url":"https://api.github.com/users/CloudBindle/following{/other_user}","gists_url":"https://api.github.com/users/CloudBindle/gists{/gist_id}","starred_url":"https://api.github.com/users/CloudBindle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CloudBindle/subscriptions","organizations_url":"https://api.github.com/users/CloudBindle/orgs","repos_url":"https://api.github.com/users/CloudBindle/repos","events_url":"https://api.github.com/users/CloudBindle/events{/privacy}","received_events_url":"https://api.github.com/users/CloudBindle/received_events","type":"Organization","site_admin":false},"repo":{"id":18372220,"name":"Bindle","full_name":"CloudBindle/Bindle","owner":{"login":"CloudBindle","id":7140588,"avatar_url":"https://avatars.githubusercontent.com/u/7140588?v=2","gravatar_id":null,"url":"https://api.github.com/users/CloudBindle","html_url":"https://github.com/CloudBindle","followers_url":"https://api.github.com/users/CloudBindle/followers","following_url":"https://api.github.com/users/CloudBindle/following{/other_user}","gists_url":"https://api.github.com/users/CloudBindle/gists{/gist_id}","starred_url":"https://api.github.com/users/CloudBindle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CloudBindle/subscriptions","organizations_url":"https://api.github.com/users/CloudBindle/orgs","repos_url":"https://api.github.com/users/CloudBindle/repos","events_url":"https://api.github.com/users/CloudBindle/events{/privacy}","received_events_url":"https://api.github.com/users/CloudBindle/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/CloudBindle/Bindle","description":"The Bindle project uses Vagrant to build clusters of machines on clouds.","fork":false,"url":"https://api.github.com/repos/CloudBindle/Bindle","forks_url":"https://api.github.com/repos/CloudBindle/Bindle/forks","keys_url":"https://api.github.com/repos/CloudBindle/Bindle/keys{/key_id}","collaborators_url":"https://api.github.com/repos/CloudBindle/Bindle/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/CloudBindle/Bindle/teams","hooks_url":"https://api.github.com/repos/CloudBindle/Bindle/hooks","issue_events_url":"https://api.github.com/repos/CloudBindle/Bindle/issues/events{/number}","events_url":"https://api.github.com/repos/CloudBindle/Bindle/events","assignees_url":"https://api.github.com/repos/CloudBindle/Bindle/assignees{/user}","branches_url":"https://api.github.com/repos/CloudBindle/Bindle/branches{/branch}","tags_url":"https://api.github.com/repos/CloudBindle/Bindle/tags","blobs_url":"https://api.github.com/repos/CloudBindle/Bindle/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/CloudBindle/Bindle/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/CloudBindle/Bindle/git/refs{/sha}","trees_url":"https://api.github.com/repos/CloudBindle/Bindle/git/trees{/sha}","statuses_url":"https://api.github.com/repos/CloudBindle/Bindle/statuses/{sha}","languages_url":"https://api.github.com/repos/CloudBindle/Bindle/languages","stargazers_url":"https://api.github.com/repos/CloudBindle/Bindle/stargazers","contributors_url":"https://api.github.com/repos/CloudBindle/Bindle/contributors","subscribers_url":"https://api.github.com/repos/CloudBindle/Bindle/subscribers","subscription_url":"https://api.github.com/repos/CloudBindle/Bindle/subscription","commits_url":"https://api.github.com/repos/CloudBindle/Bindle/commits{/sha}","git_commits_url":"https://api.github.com/repos/CloudBindle/Bindle/git/commits{/sha}","comments_url":"https://api.github.com/repos/CloudBindle/Bindle/comments{/number}","issue_comment_url":"https://api.github.com/repos/CloudBindle/Bindle/issues/comments/{number}","contents_url":"https://api.github.com/repos/CloudBindle/Bindle/contents/{+path}","compare_url":"https://api.github.com/repos/CloudBindle/Bindle/compare/{base}...{head}","merges_url":"https://api.github.com/repos/CloudBindle/Bindle/merges","archive_url":"https://api.github.com/repos/CloudBindle/Bindle/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/CloudBindle/Bindle/downloads","issues_url":"https://api.github.com/repos/CloudBindle/Bindle/issues{/number}","pulls_url":"https://api.github.com/repos/CloudBindle/Bindle/pulls{/number}","milestones_url":"https://api.github.com/repos/CloudBindle/Bindle/milestones{/number}","notifications_url":"https://api.github.com/repos/CloudBindle/Bindle/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/CloudBindle/Bindle/labels{/name}","releases_url":"https://api.github.com/repos/CloudBindle/Bindle/releases{/id}","created_at":"2014-04-02T15:59:25Z","updated_at":"2014-07-29T22:11:21Z","pushed_at":"2014-08-21T15:22:28Z","git_url":"git://github.com/CloudBindle/Bindle.git","ssh_url":"git@github.com:CloudBindle/Bindle.git","clone_url":"https://github.com/CloudBindle/Bindle.git","svn_url":"https://github.com/CloudBindle/Bindle","homepage":"https://github.com/CloudBindle","size":4461,"stargazers_count":6,"watchers_count":6,"language":"Perl","has_issues":true,"has_downloads":true,"has_wiki":false,"forks_count":3,"mirror_url":null,"open_issues_count":18,"forks":3,"open_issues":18,"watchers":6,"default_branch":"develop"}},"base":{"label":"CloudBindle:develop","ref":"develop","sha":"eb1c80cb014b99e403444db4f5917afba6856319","user":{"login":"CloudBindle","id":7140588,"avatar_url":"https://avatars.githubusercontent.com/u/7140588?v=2","gravatar_id":null,"url":"https://api.github.com/users/CloudBindle","html_url":"https://github.com/CloudBindle","followers_url":"https://api.github.com/users/CloudBindle/followers","following_url":"https://api.github.com/users/CloudBindle/following{/other_user}","gists_url":"https://api.github.com/users/CloudBindle/gists{/gist_id}","starred_url":"https://api.github.com/users/CloudBindle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CloudBindle/subscriptions","organizations_url":"https://api.github.com/users/CloudBindle/orgs","repos_url":"https://api.github.com/users/CloudBindle/repos","events_url":"https://api.github.com/users/CloudBindle/events{/privacy}","received_events_url":"https://api.github.com/users/CloudBindle/received_events","type":"Organization","site_admin":false},"repo":{"id":18372220,"name":"Bindle","full_name":"CloudBindle/Bindle","owner":{"login":"CloudBindle","id":7140588,"avatar_url":"https://avatars.githubusercontent.com/u/7140588?v=2","gravatar_id":null,"url":"https://api.github.com/users/CloudBindle","html_url":"https://github.com/CloudBindle","followers_url":"https://api.github.com/users/CloudBindle/followers","following_url":"https://api.github.com/users/CloudBindle/following{/other_user}","gists_url":"https://api.github.com/users/CloudBindle/gists{/gist_id}","starred_url":"https://api.github.com/users/CloudBindle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CloudBindle/subscriptions","organizations_url":"https://api.github.com/users/CloudBindle/orgs","repos_url":"https://api.github.com/users/CloudBindle/repos","events_url":"https://api.github.com/users/CloudBindle/events{/privacy}","received_events_url":"https://api.github.com/users/CloudBindle/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/CloudBindle/Bindle","description":"The Bindle project uses Vagrant to build clusters of machines on clouds.","fork":false,"url":"https://api.github.com/repos/CloudBindle/Bindle","forks_url":"https://api.github.com/repos/CloudBindle/Bindle/forks","keys_url":"https://api.github.com/repos/CloudBindle/Bindle/keys{/key_id}","collaborators_url":"https://api.github.com/repos/CloudBindle/Bindle/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/CloudBindle/Bindle/teams","hooks_url":"https://api.github.com/repos/CloudBindle/Bindle/hooks","issue_events_url":"https://api.github.com/repos/CloudBindle/Bindle/issues/events{/number}","events_url":"https://api.github.com/repos/CloudBindle/Bindle/events","assignees_url":"https://api.github.com/repos/CloudBindle/Bindle/assignees{/user}","branches_url":"https://api.github.com/repos/CloudBindle/Bindle/branches{/branch}","tags_url":"https://api.github.com/repos/CloudBindle/Bindle/tags","blobs_url":"https://api.github.com/repos/CloudBindle/Bindle/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/CloudBindle/Bindle/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/CloudBindle/Bindle/git/refs{/sha}","trees_url":"https://api.github.com/repos/CloudBindle/Bindle/git/trees{/sha}","statuses_url":"https://api.github.com/repos/CloudBindle/Bindle/statuses/{sha}","languages_url":"https://api.github.com/repos/CloudBindle/Bindle/languages","stargazers_url":"https://api.github.com/repos/CloudBindle/Bindle/stargazers","contributors_url":"https://api.github.com/repos/CloudBindle/Bindle/contributors","subscribers_url":"https://api.github.com/repos/CloudBindle/Bindle/subscribers","subscription_url":"https://api.github.com/repos/CloudBindle/Bindle/subscription","commits_url":"https://api.github.com/repos/CloudBindle/Bindle/commits{/sha}","git_commits_url":"https://api.github.com/repos/CloudBindle/Bindle/git/commits{/sha}","comments_url":"https://api.github.com/repos/CloudBindle/Bindle/comments{/number}","issue_comment_url":"https://api.github.com/repos/CloudBindle/Bindle/issues/comments/{number}","contents_url":"https://api.github.com/repos/CloudBindle/Bindle/contents/{+path}","compare_url":"https://api.github.com/repos/CloudBindle/Bindle/compare/{base}...{head}","merges_url":"https://api.github.com/repos/CloudBindle/Bindle/merges","archive_url":"https://api.github.com/repos/CloudBindle/Bindle/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/CloudBindle/Bindle/downloads","issues_url":"https://api.github.com/repos/CloudBindle/Bindle/issues{/number}","pulls_url":"https://api.github.com/repos/CloudBindle/Bindle/pulls{/number}","milestones_url":"https://api.github.com/repos/CloudBindle/Bindle/milestones{/number}","notifications_url":"https://api.github.com/repos/CloudBindle/Bindle/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/CloudBindle/Bindle/labels{/name}","releases_url":"https://api.github.com/repos/CloudBindle/Bindle/releases{/id}","created_at":"2014-04-02T15:59:25Z","updated_at":"2014-07-29T22:11:21Z","pushed_at":"2014-08-21T15:22:28Z","git_url":"git://github.com/CloudBindle/Bindle.git","ssh_url":"git@github.com:CloudBindle/Bindle.git","clone_url":"https://github.com/CloudBindle/Bindle.git","svn_url":"https://github.com/CloudBindle/Bindle","homepage":"https://github.com/CloudBindle","size":4461,"stargazers_count":6,"watchers_count":6,"language":"Perl","has_issues":true,"has_downloads":true,"has_wiki":false,"forks_count":3,"mirror_url":null,"open_issues_count":18,"forks":3,"open_issues":18,"watchers":6,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/CloudBindle/Bindle/pulls/28"},"html":{"href":"https://github.com/CloudBindle/Bindle/pull/28"},"issue":{"href":"https://api.github.com/repos/CloudBindle/Bindle/issues/28"},"comments":{"href":"https://api.github.com/repos/CloudBindle/Bindle/issues/28/comments"},"review_comments":{"href":"https://api.github.com/repos/CloudBindle/Bindle/pulls/28/comments"},"review_comment":{"href":"https://api.github.com/repos/CloudBindle/Bindle/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/CloudBindle/Bindle/pulls/28/commits"},"statuses":{"href":"https://api.github.com/repos/CloudBindle/Bindle/statuses/7981aca2881bacdf1f86ac6d3199ef80c8c36451"}}}}