summaryrefslogtreecommitdiffstats
path: root/VNF_Catalogue/cronjob/github.js
diff options
context:
space:
mode:
Diffstat (limited to 'VNF_Catalogue/cronjob/github.js')
-rw-r--r--VNF_Catalogue/cronjob/github.js159
1 files changed, 159 insertions, 0 deletions
diff --git a/VNF_Catalogue/cronjob/github.js b/VNF_Catalogue/cronjob/github.js
new file mode 100644
index 00000000..cc6e35f6
--- /dev/null
+++ b/VNF_Catalogue/cronjob/github.js
@@ -0,0 +1,159 @@
+// Important Add your access token here default rate of github is limited to 60 API calls per hour
+var access_token = '523825265638c8f2b5b9f1d1f5af31d71bceb49c';
+// Important set the delta threshold for repo details updation. For instance if the threshold is
+// set to 1 day(60 * 60 * 24), the cronjob will only update the row if the difference between current
+// time and last_updated time stamp of a repo is greater than one day
+var delta = 60 * 60 * 24;
+
+
+var github = require('octonode');
+db_pool = require('/usr/src/app/database').pool;
+async = require('async');
+
+var current_time = Math.floor(new Date().getTime() / 1000);//toISOString().slice(0, 19).replace('T', ' ');
+console.log(current_time);
+
+var get_val_from_header = function(header_link) {
+ // small hack by parsing the header and setting per_page = 1, hence no pagination fetch required
+ result_intermediate = header_link.split(';');
+ result_intermediate = result_intermediate[result_intermediate.length - 2];
+ var reg = /&page=([0-9].*)>/g;
+ var match = reg.exec(result_intermediate);
+ return parseInt(match[1]);
+}
+
+var get_stargazers = function(result, ghrepo, orig_repo, primary_callback, cb) {
+ ghrepo.stargazers({per_page: 1}, function(err, data, headers) {
+ //console.log(JSON.stringify(data));
+ try {
+ result['no_of_stars'] = get_val_from_header(headers['link']);
+ cb(null, result, ghrepo, orig_repo, primary_callback);
+ } catch(err) {
+ result['no_of_stars'] = null;
+ cb(null, result, ghrepo, orig_repo, primary_callback);
+ }
+ });
+}
+
+var get_branches = function(result, ghrepo, orig_repo, primary_callback, cb) {
+ ghrepo.branches({per_page: 1}, function(err, data, headers) {
+ try {
+ result['versions'] = get_val_from_header(headers['link']);
+ cb(null, result, ghrepo, orig_repo, primary_callback);
+ } catch(err) {
+ result['versions'] = null;
+ cb(null, result, ghrepo, orig_repo, primary_callback);
+ }
+ });
+}
+
+var get_contributors = function(result, ghrepo, orig_repo, primary_callback, cb) {
+ ghrepo.contributors({per_page: 1}, function(err, data, headers) {
+ try {
+ result['no_of_developers'] = get_val_from_header(headers['link']);
+ cb(null, result, ghrepo, orig_repo, primary_callback);
+ } catch(err) {
+ result['no_of_developers'] = null;
+ cb(null, result, ghrepo, orig_repo, primary_callback);
+ }
+ });
+}
+
+var get_lines_of_code = function(result, ghrepo, orig_repo, primary_callback, cb) {
+ // #TODO
+ console.log('here');
+
+ console.log(orig_repo);
+ const
+ spawn = require( 'child_process' ).spawn,
+ ls = spawn( 'bash', ['/usr/src/app/git_count_loc.sh', orig_repo] );
+
+ ls.stdout.on( 'data', data => {
+ console.log( `stdout: ${data}` );
+ result['lines_of_code'] = parseInt(`${data}`.replace(/\n$/, ''), 10);
+ //cb(null, result, primary_callback);
+ });
+
+ ls.stderr.on( 'data', data => {
+ //console.log( `stderr: ${data}` );
+ //cb(null, result, primary_callback);
+ });
+
+ ls.on( 'close', code => {
+ console.log( `child process exited with code ${code}` );
+ cb(null, result, primary_callback);
+ });
+}
+
+var secondary_callback = function (err, result, primary_callback) {
+ console.log(result);
+ if((result['last_updated'] == null) || (current_time - result['last_updated'] > delta)) {
+ db_pool.getConnection(function(err, connection) {
+ //Use the connection
+ var last_updated = current_time;
+ var no_of_stars = result['no_of_stars'];
+ var versions = result['versions'];
+ var no_of_developers = result['no_of_developers'];
+ var lines_of_code = result['lines_of_code'];
+ console.log('here');
+ console.log(lines_of_code);
+ sql_query = 'update vnf set last_updated = FROM_UNIXTIME(' + last_updated;
+ sql_query += '), no_of_stars = ' + no_of_stars + ', versions = ' + versions;
+ sql_query += ', lines_of_code = ' + lines_of_code;
+ sql_query += ', no_of_developers = ' + no_of_developers + ' where vnf_id = ';
+ sql_query += result['vnf_id'];
+ console.log(sql_query);
+ connection.query(sql_query, function (error, results, fields) {
+ //if (error) throw error;
+ //And done with the connection.
+ connection.release();
+ if(error) {
+ primary_callback(null, result['vnf_id'] + ' not updated');
+ } else {
+ primary_callback(null, result['vnf_id'] + ' updated');
+ }
+ // Handle error after the release.
+ // Don't use the connection here, it has been returned to the pool.
+ });
+ });
+ } else {
+ primary_callback(null, result['vnf_id'] + ' not updated');
+ }
+}
+
+var get_stats = function(vnf_details, callback) {
+ repo = vnf_details['repo_url'];
+ orig_repo = repo;
+ repo = repo.split("/");
+ github_id = repo[repo.length - 2] + '/' + repo[repo.length - 1];
+
+ var async = require('async');
+ var client = github.client(access_token);
+ var ghrepo = client.repo(github_id);
+
+ result = {}
+ result['vnf_id'] = vnf_details['vnf_id'];
+ result['last_updated'] = vnf_details['last_updated'];
+
+ async.waterfall([
+ async.apply(get_stargazers, result, ghrepo, orig_repo, callback),
+ get_branches,
+ get_contributors,
+ get_lines_of_code,
+ ], secondary_callback);
+}
+
+db_pool.getConnection(function(err, connection) {
+ sql_query = 'select vnf_id, repo_url, UNIX_TIMESTAMP(last_updated) last_updated from vnf';
+ console.log(sql_query);
+ connection.query(sql_query, function (error, results, fields) {
+ if (error) throw error;
+ async.map(results, get_stats, function(error, results) {
+ //console.log(results);
+ console.log(results);
+ process.exit();
+
+ });
+ });
+});
+