{"action":"created","comment":{"url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/pulls/comments/36327077","id":36327077,"diff_hunk":"@@ -0,0 +1,240 @@\n+'use strict';\n+var exec = require('child_process').exec;\n+var path = require('path');\n+var https = require('https');\n+var unzip = require('unzip');\n+var Promise = require('lie');\n+var fs = require('fs-extra-promise');\n+var url = require('url');\n+var fileNotFoundCode = \"ENOENT\";\n+var magicDirectoryNameToDoLocalDevelopment = \"localdev\"; // If this file exists in the thaliDontCheckIn directory then\n+                                                    // we will copy the Cordova plugin from a sibling Thali_CordovaPlugin\n+                                                    // project to this Cordova project.\n+\n+// I tried child-process-promise but it failed without errors and I just don't\n+// have time to fight with it right now.\n+function childProcessExecPromise(command, currentWorkingDirectory) {\n+    return new Promise(function(resolve, reject) {\n+        exec(command, { cwd: currentWorkingDirectory }, function(error, stdout, stderr) {\n+           if (error) {\n+               reject(error);\n+           } \n+           resolve();\n+        });\n+    })\n+}\n+\n+\n+// Unfortunately the obvious library, request-promise, doesn't handle streams\n+// well so it would take the multi-megabyte ZIP response file and turn it into\n+// an in-memory string. So we use this instead.\n+function httpRequestPromise(method, urlObject) {\n+    if (method != \"GET\" && method != \"HEAD\") {\n+        return Promise.reject(\"We only support GET or HEAD requests\");\n+    }\n+    \n+    return new Promise(function(resolve, reject) {\n+       var httpsRequestOptions = {\n+                    host: urlObject.host,\n+                    method: method,\n+                    path: urlObject.path,\n+                    keepAlive: true\n+                };\n+                \n+        var req = https.request(httpsRequestOptions, function(res) {\n+            if (res.statusCode != 200) {\n+                reject(\"Did not get 200 for \" + urlObject.href + \", instead got \" + res.statusCode);\n+                return;\n+            }\n+            \n+            resolve(res);\n+        }).on('error', function(e) {\n+            reject(\"Got error on \" + urlObject.href + \" - \" + e);\n+        });      \n+        \n+        req.end();        \n+    });\n+}\n+\n+function getEtagFileLocation(depotName, branchName, directoryToInstallIn) {\n+    return path.join(directoryToInstallIn, \"etag-\" + depotName + \"-\" + branchName);\n+}\n+\n+function getEtagFromEtagFile(depotName, branchName, directoryToInstallIn) {\n+    var etagFileLocation = getEtagFileLocation(depotName, branchName, directoryToInstallIn);\n+    return fs.readFileAsync(etagFileLocation)\n+    .catch(function(err) {\n+        if (err.code != fileNotFoundCode) {\n+            return Promise.reject(err);\n+        } else {\n+            return Promise.resolve();\n+        }   \n+    }); \n+}\n+\n+function returnEtagFromResponse(httpResponse) {\n+    // The etag value is returned with quotes but when we set the header it adds its\n+    // own quotes so we need to strip those quotes here\n+    return httpResponse && httpResponse.headers && httpResponse.headers.etag &&\n+                httpResponse.headers.etag.substring(1, httpResponse.headers.etag.length - 1);\n+}\n+\n+function writeToEtagFile(depotName, branchName, directoryToInstallIn, httpResponse) {\n+    var etag = returnEtagFromResponse(httpResponse);\n+    \n+    if (etag == null) {\n+        return Promise.reject(\"Did not get ETag header, something is wrong because Github always sends one!\");\n+    }\n+        \n+    var etagFileLocation = getEtagFileLocation(depotName, branchName, directoryToInstallIn);\n+    return fs.writeFileAsync(etagFileLocation, etag);\n+}\n+\n+function getGitHubZipUrlObject(projectName, depotName, branchName) {\n+    return url.parse(\"https://codeload.github.com/\" + projectName + \"/\" + depotName + \"/zip/\" + branchName);\n+}\n+\n+/**\n+ * This method is a hack because I'm having trouble getting GitHub to respect if-none-match headers. So instead\n+ * I'm doing a HEAD request and manually checking if the etags match.\n+ */\n+function doGitHubEtagsMatch(projectName, depotName, branchName, directoryToInstallIn) {\n+    return getEtagFromEtagFile(depotName, branchName, directoryToInstallIn)\n+    .then(function(etagFromFile) {\n+        if (!etagFromFile) {\n+            return false;\n+        }\n+        \n+        return httpRequestPromise(\"HEAD\", \n+            getGitHubZipUrlObject(projectName, depotName, branchName))\n+        .then(function(res) {\n+            var etagFromHeadRequest = returnEtagFromResponse(res);\n+            return etagFromFile == etagFromHeadRequest;\n+        });\n+    });\n+}\n+\n+function createUnzipedDirectoryPath(depotName, branchName, directoryToInstallIn) {\n+    return path.join(directoryToInstallIn, depotName + \"-\" + branchName);\n+}\n+\n+function createGitHubZipResponse(depotName, branchName, directoryToInstallIn, directoryUpdated) {\n+    return {\n+        unzipedDirectory: createUnzipedDirectoryPath(depotName, branchName, directoryToInstallIn),\n+        directoryUpdated: directoryUpdated\n+    };\n+}\n+\n+function installGitHubZip(projectName, depotName, branchName, directoryToInstallIn) {    \n+    var gitHubZipUrlObject = getGitHubZipUrlObject(projectName, depotName, branchName);\n+    \n+    return doGitHubEtagsMatch(projectName, depotName, branchName, directoryToInstallIn)\n+    .then(function(doTheEtagsMatch) {\n+        if (doTheEtagsMatch) {\n+            return createGitHubZipResponse(depotName, branchName, directoryToInstallIn, false);\n+        }\n+        return httpRequestPromise(\"GET\", gitHubZipUrlObject)\n+        .then(function(res) {\n+            return new Promise(function(resolve, reject) {\n+                res.pipe(unzip.Extract({ path: directoryToInstallIn}))\n+                .on('close', function() {\n+                    resolve();\n+                }).on('error', function(e) {\n+                   reject(\"Could not extract zip file \" + gitHubZipUrlObject.href + \", error was \" + e); \n+                });\n+            }).then(function() {\n+                return writeToEtagFile(depotName, branchName, directoryToInstallIn, res);\n+            }).then(function() {\n+                return createGitHubZipResponse(depotName, branchName, directoryToInstallIn, true);\n+            });\n+        });\n+    });\n+}\n+\n+function uninstallPluginsIfNecessary(weAddedPluginsFile, appRootDirectory) {\n+    return fs.readFileAsync(weAddedPluginsFile).catch(function(err) {\n+        if (err) {\n+            if (err.code == fileNotFoundCode) {\n+                return false;\n+            }\n+            \n+            return Promise.reject(err);\n+        }\n+        \n+        return true;\n+    }).then(function(doWeNeedToUninstall) {\n+        if (!doWeNeedToUninstall) {\n+            return;\n+        }\n+        \n+        return childProcessExecPromise('cordova plugin remove org.thaliproject.p2p', appRootDirectory)\n+    })\n+}\n+\n+/**\n+ * This will copy the contents of a Thali_CordovaPlugin local depot to the right directory in the\n+ * current Cordova project so it will be installed. This is used for local development only.\n+ */\n+function copyDevelopmentThaliCordovaPluginToProject(appRootDirectory, thaliDontCheckIn, depotName, branchName) {\n+    var targetDirectory = createUnzipedDirectoryPath(depotName, branchName, thaliDontCheckIn);","path":"thali/install/install.js","position":179,"original_position":179,"commit_id":"86a8b561cdeec79c7f8126fb3660218bfbe55636","original_commit_id":"86a8b561cdeec79c7f8126fb3660218bfbe55636","user":{"login":"mattpodwysocki","id":49051,"avatar_url":"https://avatars.githubusercontent.com/u/49051?v=3","gravatar_id":"","url":"https://api.github.com/users/mattpodwysocki","html_url":"https://github.com/mattpodwysocki","followers_url":"https://api.github.com/users/mattpodwysocki/followers","following_url":"https://api.github.com/users/mattpodwysocki/following{/other_user}","gists_url":"https://api.github.com/users/mattpodwysocki/gists{/gist_id}","starred_url":"https://api.github.com/users/mattpodwysocki/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mattpodwysocki/subscriptions","organizations_url":"https://api.github.com/users/mattpodwysocki/orgs","repos_url":"https://api.github.com/users/mattpodwysocki/repos","events_url":"https://api.github.com/users/mattpodwysocki/events{/privacy}","received_events_url":"https://api.github.com/users/mattpodwysocki/received_events","type":"User","site_admin":false},"body":"createUnzipedDirectoryPath => createUnzippedDirectoryPath","created_at":"2015-08-05T17:12:31Z","updated_at":"2015-08-05T17:12:31Z","html_url":"https://github.com/thaliproject/Thali_CordovaPlugin/pull/59#discussion_r36327077","pull_request_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/pulls/59","_links":{"self":{"href":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/pulls/comments/36327077"},"html":{"href":"https://github.com/thaliproject/Thali_CordovaPlugin/pull/59#discussion_r36327077"},"pull_request":{"href":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/pulls/59"}}},"pull_request":{"url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/pulls/59","id":41628350,"html_url":"https://github.com/thaliproject/Thali_CordovaPlugin/pull/59","diff_url":"https://github.com/thaliproject/Thali_CordovaPlugin/pull/59.diff","patch_url":"https://github.com/thaliproject/Thali_CordovaPlugin/pull/59.patch","issue_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/issues/59","number":59,"state":"open","locked":false,"title":"Story 0 yarong","user":{"login":"yaronyg","id":1480964,"avatar_url":"https://avatars.githubusercontent.com/u/1480964?v=3","gravatar_id":"","url":"https://api.github.com/users/yaronyg","html_url":"https://github.com/yaronyg","followers_url":"https://api.github.com/users/yaronyg/followers","following_url":"https://api.github.com/users/yaronyg/following{/other_user}","gists_url":"https://api.github.com/users/yaronyg/gists{/gist_id}","starred_url":"https://api.github.com/users/yaronyg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yaronyg/subscriptions","organizations_url":"https://api.github.com/users/yaronyg/orgs","repos_url":"https://api.github.com/users/yaronyg/repos","events_url":"https://api.github.com/users/yaronyg/events{/privacy}","received_events_url":"https://api.github.com/users/yaronyg/received_events","type":"User","site_admin":false},"body":"Automated install both for users of Thali_Cordova Plugin as well as for our own internal testing. Cleaned up the tests a bit.\n<a href='#crh-start'></a><a href='#crh-data-%7B%22processed%22%3A%20%5B%22https%3A//github.com/thaliproject/Thali_CordovaPlugin/pull/59%23discussion_r36324744%22%2C%20%22https%3A//github.com/thaliproject/Thali_CordovaPlugin/pull/59%23discussion_r36326584%22%5D%2C%20%22comments%22%3A%20%7B%22Pull%2086a8b561cdeec79c7f8126fb3660218bfbe55636%20TeamReadMe.md%2016%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/thaliproject/Thali_CordovaPlugin/pull/59%23discussion_r36324744%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22Nit%20pick%20about%20too%20short%20of%20a%20sentence%20and%20add%20%2C%20however%2C%20and%20continue%20sentence%22%2C%20%22created_at%22%3A%20%222015-08-05T16%3A50%3A49Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/49051%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/mattpodwysocki%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20TeamReadMe.md%3AL1-116%22%7D%2C%20%22Pull%2086a8b561cdeec79c7f8126fb3660218bfbe55636%20thali/install/install.js%209%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/thaliproject/Thali_CordovaPlugin/pull/59%23discussion_r36326584%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22All%20constants%20should%20be%20capitalized%2C%20eg%2C%20FILE_NOT_FOUND%22%2C%20%22created_at%22%3A%20%222015-08-05T17%3A07%3A48Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/49051%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/mattpodwysocki%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20thali/install/install.js%3AL1-241%22%7D%7D%7D'></a>\n<a href='https://www.codereviewhub.com/'><img src='http://www.codereviewhub.com/site/github-bar.png' height=40></a>\n- [ ] <a href='#crh-comment-Pull 86a8b561cdeec79c7f8126fb3660218bfbe55636 TeamReadMe.md 16'></a> <img src='http://www.codereviewhub.com/site/github-remaining.png' height=16 width=60>&nbsp;<b><a href='https://github.com/thaliproject/Thali_CordovaPlugin/pull/59#discussion_r36324744'>File: TeamReadMe.md:L1-116</a></b>\n- <a href='https://github.com/mattpodwysocki'><img border=0 src='https://avatars.githubusercontent.com/u/49051?v=3' height=16 width=16'></a> Nit pick about too short of a sentence and add , however, and continue sentence\n- [ ] <a href='#crh-comment-Pull 86a8b561cdeec79c7f8126fb3660218bfbe55636 thali/install/install.js 9'></a> <img src='http://www.codereviewhub.com/site/github-remaining.png' height=16 width=60>&nbsp;<b><a href='https://github.com/thaliproject/Thali_CordovaPlugin/pull/59#discussion_r36326584'>File: thali/install/install.js:L1-241</a></b>\n- <a href='https://github.com/mattpodwysocki'><img border=0 src='https://avatars.githubusercontent.com/u/49051?v=3' height=16 width=16'></a> All constants should be capitalized, eg, FILE_NOT_FOUND\n\n\n<a href='https://www.codereviewhub.com/thaliproject/Thali_CordovaPlugin/pull/59?mark_as_completed=1'><img src='http://www.codereviewhub.com/site/github-mark-as-completed.png' height=26></a>&nbsp;<a href='https://www.codereviewhub.com/thaliproject/Thali_CordovaPlugin/pull/59?approve=1'><img src='http://www.codereviewhub.com/site/github-approve.png' height=26></a>&nbsp;<a href='https://github.com/thaliproject/Thali_CordovaPlugin/pull/59'><img src='http://www.codereviewhub.com/site/github-refresh.png' height=26></a>\n<a href='#crh-end'></a>","created_at":"2015-08-04T23:12:52Z","updated_at":"2015-08-05T17:12:31Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f596dbff70895952e01c5812b3e3dd42bedbb735","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/pulls/59/commits","review_comments_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/pulls/59/comments","review_comment_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/pulls/comments{/number}","comments_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/issues/59/comments","statuses_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/statuses/86a8b561cdeec79c7f8126fb3660218bfbe55636","head":{"label":"thaliproject:story_0_yarong","ref":"story_0_yarong","sha":"86a8b561cdeec79c7f8126fb3660218bfbe55636","user":{"login":"thaliproject","id":7918300,"avatar_url":"https://avatars.githubusercontent.com/u/7918300?v=3","gravatar_id":"","url":"https://api.github.com/users/thaliproject","html_url":"https://github.com/thaliproject","followers_url":"https://api.github.com/users/thaliproject/followers","following_url":"https://api.github.com/users/thaliproject/following{/other_user}","gists_url":"https://api.github.com/users/thaliproject/gists{/gist_id}","starred_url":"https://api.github.com/users/thaliproject/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thaliproject/subscriptions","organizations_url":"https://api.github.com/users/thaliproject/orgs","repos_url":"https://api.github.com/users/thaliproject/repos","events_url":"https://api.github.com/users/thaliproject/events{/privacy}","received_events_url":"https://api.github.com/users/thaliproject/received_events","type":"Organization","site_admin":false},"repo":{"id":36732493,"name":"Thali_CordovaPlugin","full_name":"thaliproject/Thali_CordovaPlugin","owner":{"login":"thaliproject","id":7918300,"avatar_url":"https://avatars.githubusercontent.com/u/7918300?v=3","gravatar_id":"","url":"https://api.github.com/users/thaliproject","html_url":"https://github.com/thaliproject","followers_url":"https://api.github.com/users/thaliproject/followers","following_url":"https://api.github.com/users/thaliproject/following{/other_user}","gists_url":"https://api.github.com/users/thaliproject/gists{/gist_id}","starred_url":"https://api.github.com/users/thaliproject/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thaliproject/subscriptions","organizations_url":"https://api.github.com/users/thaliproject/orgs","repos_url":"https://api.github.com/users/thaliproject/repos","events_url":"https://api.github.com/users/thaliproject/events{/privacy}","received_events_url":"https://api.github.com/users/thaliproject/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/thaliproject/Thali_CordovaPlugin","description":"Thali p2p plugin ","fork":false,"url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin","forks_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/forks","keys_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/teams","hooks_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/hooks","issue_events_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/issues/events{/number}","events_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/events","assignees_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/assignees{/user}","branches_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/branches{/branch}","tags_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/tags","blobs_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/git/refs{/sha}","trees_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/statuses/{sha}","languages_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/languages","stargazers_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/stargazers","contributors_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/contributors","subscribers_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/subscribers","subscription_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/subscription","commits_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/commits{/sha}","git_commits_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/git/commits{/sha}","comments_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/comments{/number}","issue_comment_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/issues/comments{/number}","contents_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/contents/{+path}","compare_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/merges","archive_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/downloads","issues_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/issues{/number}","pulls_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/pulls{/number}","milestones_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/milestones{/number}","notifications_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/labels{/name}","releases_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/releases{/id}","created_at":"2015-06-02T12:45:51Z","updated_at":"2015-07-29T10:31:47Z","pushed_at":"2015-08-04T23:21:48Z","git_url":"git://github.com/thaliproject/Thali_CordovaPlugin.git","ssh_url":"git@github.com:thaliproject/Thali_CordovaPlugin.git","clone_url":"https://github.com/thaliproject/Thali_CordovaPlugin.git","svn_url":"https://github.com/thaliproject/Thali_CordovaPlugin","homepage":null,"size":1399,"stargazers_count":7,"watchers_count":7,"language":"Objective-C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":32,"forks":1,"open_issues":32,"watchers":7,"default_branch":"master"}},"base":{"label":"thaliproject:story_0","ref":"story_0","sha":"1a769299ae85ce8555c0aac198e6046bb3cabb27","user":{"login":"thaliproject","id":7918300,"avatar_url":"https://avatars.githubusercontent.com/u/7918300?v=3","gravatar_id":"","url":"https://api.github.com/users/thaliproject","html_url":"https://github.com/thaliproject","followers_url":"https://api.github.com/users/thaliproject/followers","following_url":"https://api.github.com/users/thaliproject/following{/other_user}","gists_url":"https://api.github.com/users/thaliproject/gists{/gist_id}","starred_url":"https://api.github.com/users/thaliproject/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thaliproject/subscriptions","organizations_url":"https://api.github.com/users/thaliproject/orgs","repos_url":"https://api.github.com/users/thaliproject/repos","events_url":"https://api.github.com/users/thaliproject/events{/privacy}","received_events_url":"https://api.github.com/users/thaliproject/received_events","type":"Organization","site_admin":false},"repo":{"id":36732493,"name":"Thali_CordovaPlugin","full_name":"thaliproject/Thali_CordovaPlugin","owner":{"login":"thaliproject","id":7918300,"avatar_url":"https://avatars.githubusercontent.com/u/7918300?v=3","gravatar_id":"","url":"https://api.github.com/users/thaliproject","html_url":"https://github.com/thaliproject","followers_url":"https://api.github.com/users/thaliproject/followers","following_url":"https://api.github.com/users/thaliproject/following{/other_user}","gists_url":"https://api.github.com/users/thaliproject/gists{/gist_id}","starred_url":"https://api.github.com/users/thaliproject/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thaliproject/subscriptions","organizations_url":"https://api.github.com/users/thaliproject/orgs","repos_url":"https://api.github.com/users/thaliproject/repos","events_url":"https://api.github.com/users/thaliproject/events{/privacy}","received_events_url":"https://api.github.com/users/thaliproject/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/thaliproject/Thali_CordovaPlugin","description":"Thali p2p plugin ","fork":false,"url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin","forks_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/forks","keys_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/teams","hooks_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/hooks","issue_events_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/issues/events{/number}","events_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/events","assignees_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/assignees{/user}","branches_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/branches{/branch}","tags_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/tags","blobs_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/git/refs{/sha}","trees_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/statuses/{sha}","languages_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/languages","stargazers_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/stargazers","contributors_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/contributors","subscribers_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/subscribers","subscription_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/subscription","commits_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/commits{/sha}","git_commits_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/git/commits{/sha}","comments_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/comments{/number}","issue_comment_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/issues/comments{/number}","contents_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/contents/{+path}","compare_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/merges","archive_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/downloads","issues_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/issues{/number}","pulls_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/pulls{/number}","milestones_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/milestones{/number}","notifications_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/labels{/name}","releases_url":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/releases{/id}","created_at":"2015-06-02T12:45:51Z","updated_at":"2015-07-29T10:31:47Z","pushed_at":"2015-08-04T23:21:48Z","git_url":"git://github.com/thaliproject/Thali_CordovaPlugin.git","ssh_url":"git@github.com:thaliproject/Thali_CordovaPlugin.git","clone_url":"https://github.com/thaliproject/Thali_CordovaPlugin.git","svn_url":"https://github.com/thaliproject/Thali_CordovaPlugin","homepage":null,"size":1399,"stargazers_count":7,"watchers_count":7,"language":"Objective-C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":32,"forks":1,"open_issues":32,"watchers":7,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/pulls/59"},"html":{"href":"https://github.com/thaliproject/Thali_CordovaPlugin/pull/59"},"issue":{"href":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/issues/59"},"comments":{"href":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/issues/59/comments"},"review_comments":{"href":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/pulls/59/comments"},"review_comment":{"href":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/pulls/59/commits"},"statuses":{"href":"https://api.github.com/repos/thaliproject/Thali_CordovaPlugin/statuses/86a8b561cdeec79c7f8126fb3660218bfbe55636"}}}}