You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by fi...@apache.org on 2013/01/03 01:43:18 UTC

git commit: Script to create JIRA issues for version tagging in place.

Updated Branches:
  refs/heads/jira [created] efc1181e9


Script to create JIRA issues for version tagging in place.


Project: http://git-wip-us.apache.org/repos/asf/cordova-labs/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-labs/commit/efc1181e
Tree: http://git-wip-us.apache.org/repos/asf/cordova-labs/tree/efc1181e
Diff: http://git-wip-us.apache.org/repos/asf/cordova-labs/diff/efc1181e

Branch: refs/heads/jira
Commit: efc1181e962d53b69731ec22301141f7bba9de8e
Parents: 68340ce
Author: Fil Maj <ma...@gmail.com>
Authored: Wed Jan 2 16:45:02 2013 -0800
Committer: Fil Maj <ma...@gmail.com>
Committed: Wed Jan 2 16:45:02 2013 -0800

----------------------------------------------------------------------
 .gitignore   |    1 +
 README.md    |   31 +++++----
 jira.js      |  186 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 package.json |   13 ++++
 4 files changed, 217 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-labs/blob/efc1181e/.gitignore
----------------------------------------------------------------------
diff --git a/.gitignore b/.gitignore
index fd29596..00306e0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
 # OS X
 .DS_Store
+node_modules

http://git-wip-us.apache.org/repos/asf/cordova-labs/blob/efc1181e/README.md
----------------------------------------------------------------------
diff --git a/README.md b/README.md
index 2d78d3a..69e2aee 100644
--- a/README.md
+++ b/README.md
@@ -1,22 +1,25 @@
-# Cordova Laboratory
+# cordova-jira
 
-> Caution: Safety Goggles are Recommended!
+> create issues + subtasks in JIRA when cordova changes versions
 
-## Purpose
+## Prerequisites
 
-The purpose of this repo is for experimental code. Examples include demo apps,
-native api explorations, or anything really that does not fit in an existing Cordova platform.
+You will need [node.js](http://nodejs.org), and `npm` which comes bundled with it.
 
-## Project Organization
+## Installation
 
-> Everyone works on a branch
+    npm install
 
-`master` branch should *never* have content.
+## Usage
 
-Each project should create a separate branch to work on. There are major benefits
-to this practice:
+    ./node jira.js --version=<version> --username=<username> --password=<password>
 
-- Each project has an isolate git history, which allows for easy migration to
-  a new git repository;
-- Working directory is not polluted with the files of other projects.
-- Projects will not step on each others toes.
+Where:
+
+ - `version`: the version string to use. i.e. 2.3.0, 2.4.0rc1, 3.0.0rc2
+ - `username`: your Apache JIRA username
+ - `password`: your Apache JIRA password
+
+## Contributors
+
+See the `package.json` file for information.

http://git-wip-us.apache.org/repos/asf/cordova-labs/blob/efc1181e/jira.js
----------------------------------------------------------------------
diff --git a/jira.js b/jira.js
new file mode 100644
index 0000000..3960a3d
--- /dev/null
+++ b/jira.js
@@ -0,0 +1,186 @@
+var request = require('request');
+var n       = require('ncallbacks');
+var _       = require('underscore');
+var argv    = require('optimist').argv;
+
+var version = argv.version;
+var username = argv.username;
+var password = argv.password;
+
+if (!version || !username || !password) {
+    console.log("Usage: node jira.js --version=<version> --username=<username> --password=<password>");
+    console.log("Example: node jira.js --version=2.3.0rc2 --username=fil --password=poop");
+    return;
+}
+
+var JIRA_PROJECT_KEY = "CB";
+var API_URL = "https://issues.apache.org/jira/rest/api/latest/";
+
+var parent_issue = {
+    "fields":{
+        "project":{
+            "key":JIRA_PROJECT_KEY
+        },
+        "summary":"Tag " + version,
+        "description":"Parent issue to track the release steps for " + version + ".",
+        "issuetype":{
+            "name":"Task"
+        }
+    }
+};
+var sub = {
+    "fields":{
+        "project":{
+            "key":JIRA_PROJECT_KEY
+        },
+        "parent":{
+            "key":""
+        },
+        "summary":"",
+        "description":"",
+        "issuetype":{
+            "name":"Sub-task"
+        }
+    }
+};
+
+function create(json, callback) {
+    var auth = "Basic " + new Buffer(username + ":" + password).toString("base64");
+    request.post({
+        'uri':API_URL + 'issue',
+        'headers':{
+            'Authorization':auth
+        },
+        'json':json
+    }, callback);
+}
+function subtask(parent, summary, description, component, version) {
+    var obj = _.clone(sub);
+    obj.fields.parent = {"key":parent};
+    obj.fields.summary = summary;
+    obj.fields.description = description;
+    obj.fields.components = [];
+    obj.fields.components.push({"id":component});
+    obj.fields.fixVersions = [];
+    obj.fields.fixVersions.push({"id":version});
+    return obj;
+}
+
+// first, get list of Components
+request.get(API_URL + 'project/' + JIRA_PROJECT_KEY + '/components', function(err, res, components) {
+    if (err) throw ("ERROR GETTING COMPONENTS ZOMG!!!" + err);
+    if (!components) {
+        console.log("wtf no components in JIRA?", components);
+    } else {
+        // set up a simple component map
+        components = JSON.parse(components);
+        var component_map = {};
+        components.forEach(function(c) {
+            component_map[c.name] = c.id;
+        });
+        console.log('Retrieved list of Components in JIRA.');
+
+        // get list of fix-version
+        request.get(API_URL + 'project/' + JIRA_PROJECT_KEY + '/versions', function(err, res, versions) {
+            if (err) throw ("ERROR GETTING FIX-VERSIONS ZOMG!!!" + err);
+            if (!versions) {
+                console.log("wtf no versions in JIRA?", versions);
+            } else {
+                versions = JSON.parse(versions);
+                // massage desired version to get "root" version
+                var root_version = version;
+                var version_id = null;
+                if (version.indexOf('r') > -1) {
+                    root_version = version.substr(0, version.indexOf('r'));
+                }
+                // find matching version id in JIRA
+                for (var i = 0, l = versions.length; i < l; i++) {
+                    var v = versions[i];
+                    if (v.name == root_version) {
+                        version_id = v.id;
+                        break;
+                    }
+                }
+                if (!version_id) {
+                    // TODO: perhaps have this script create a fixversion in JIRA for this case?
+                    console.log('Cannot find version ID number in JIRA related to "root" version string: ' + root_version + '. Maybe you need to create this fixversion in JIRA first? Aborting.');
+                    return;
+                }
+                console.log('Creating issues for tagging version "' + version + '", JIRA fixVersion will be "' + root_version + '" (id: ' + version_id + ')...');
+
+                // fire off parent issue creation
+                parent_issue.fields.fixVersions = [{"id":version_id}];
+                create(parent_issue, function(err, res, body) {
+                    if (err) throw ("ERROR!!!" + err);
+                    var parent_key = body.key;
+                    if (!parent_key) {
+                        console.log('No ID retrieved for created parent issue. Aborting.');
+                        return;
+                    }
+                    console.log('Parent issue created.');
+
+                    // 38 is the total number of subtasks currently in a tag parent issue
+                    // breakdown:
+                    // - tag js
+                    // - tag hello world app
+                    // - tag mobile-spec
+                    // - tag docs
+                    // - 11 platforms * 3 tasks (update js, update sample app, tag) = 33
+                    // - generate source release
+                    //   = 38
+                    var end = n(38, function() {
+                        console.log('All sub-tasks created. JIRA spam complete.');
+                    });
+                    var subtask_error_check = function(err, res, body) {
+                        if (err) {
+                            console.error("There was an error creating a subtask :(");
+                        } else if (res.statusCode >= 400) {
+                            console.error("Got HTTP status " + res.statusCode + " during subtask creation :(");
+                            console.log(body);
+                        } else end();
+                    };
+
+                    create(subtask(parent_key, "Tag Cordova-JS", "Tag JavaScript so that each platform can cut a release.", component_map['CordovaJS'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Tag Hello World App", "Tag sample application so that each platform can cut a copy of the application.", component_map['App Hello World'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Update JavaScript for Android", "Update the cordova.js after CordovaJS has been tagged.", component_map['Android'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Update JavaScript for Bada", "Update the cordova.js after CordovaJS has been tagged.", component_map['Bada'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Update JavaScript for BlackBerry", "Update the cordova.js after CordovaJS has been tagged.", component_map['BlackBerry'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Update JavaScript for iOS", "Update the cordova.js after CordovaJS has been tagged.", component_map['iOS'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Update JavaScript for Mac", "Update the cordova.js after CordovaJS has been tagged.", component_map['Mac'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Update JavaScript for Qt", "Update the cordova.js after CordovaJS has been tagged.", component_map['Qt'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Update JavaScript for Tizen", "Update the cordova.js after CordovaJS has been tagged.", component_map['Tizen'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Update JavaScript for webOS", "Update the cordova.js after CordovaJS has been tagged.", component_map['webOS'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Update JavaScript for WP7", "Update the cordova.js after CordovaJS has been tagged.", component_map['WP7'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Update JavaScript for WP8", "Update the cordova.js after CordovaJS has been tagged.", component_map['WP8'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Update JavaScript for Windows 8", "Update the cordova.js after CordovaJS has been tagged.", component_map['Windows 8'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Update www/ Application for Android", "Update the www/ sample application after App-Hello-World has been tagged. IMPORTANT: Remove irrelevant platfroms from www/res/icon and www/res/screen.", component_map['Android'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Update www/ Application for Bada", "Update the www/ sample application after App-Hello-World has been tagged. IMPORTANT: Remove irrelevant platfroms from www/res/icon and www/res/screen.", component_map['Bada'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Update www/ Application for BlackBerry", "Update the www/ sample application after App-Hello-World has been tagged. IMPORTANT: Remove irrelevant platfroms from www/res/icon and www/res/screen.", component_map['BlackBerry'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Update www/ Application for iOS", "Update the www/ sample application after App-Hello-World has been tagged. IMPORTANT: Remove irrelevant platfroms from www/res/icon and www/res/screen.", component_map['iOS'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Update www/ Application for Mac", "Update the www/ sample application after App-Hello-World has been tagged. IMPORTANT: Remove irrelevant platfroms from www/res/icon and www/res/screen.", component_map['Mac'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Update www/ Application for Qt", "Update the www/ sample application after App-Hello-World has been tagged. IMPORTANT: Remove irrelevant platfroms from www/res/icon and www/res/screen.", component_map['Qt'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Update www/ Application for Tizen", "Update the www/ sample application after App-Hello-World has been tagged. IMPORTANT: Remove irrelevant platfroms from www/res/icon and www/res/screen.", component_map['Tizen'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Update www/ Application for webOS", "Update the www/ sample application after App-Hello-World has been tagged. IMPORTANT: Remove irrelevant platfroms from www/res/icon and www/res/screen.", component_map['webOS'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Update www/ Application for WP7", "Update the www/ sample application after App-Hello-World has been tagged. IMPORTANT: Remove irrelevant platfroms from www/res/icon and www/res/screen.", component_map['WP7'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Update www/ Application for WP8", "Update the www/ sample application after App-Hello-World has been tagged. IMPORTANT: Remove irrelevant platfroms from www/res/icon and www/res/screen.", component_map['WP8'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Update www/ Application for Windows 8", "Update the www/ sample application after App-Hello-World has been tagged. IMPORTANT: Remove irrelevant platfroms from www/res/icon and www/res/screen.", component_map['Windows 8'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Tag Android", "After updating the JavaScript and sample application, the release can be tagged.", component_map['Android'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Tag Bada", "After updating the JavaScript and sample application, the release can be tagged.", component_map['Bada'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Tag BlackBerry", "After updating the JavaScript and sample application, the release can be tagged.", component_map['BlackBerry'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Tag iOS", "After updating the JavaScript and sample application, the release can be tagged.", component_map['iOS'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Tag Mac", "After updating the JavaScript and sample application, the release can be tagged.", component_map['Mac'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Tag Qt", "After updating the JavaScript and sample application, the release can be tagged.", component_map['Qt'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Tag Tizen", "After updating the JavaScript and sample application, the release can be tagged.", component_map['Tizen'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Tag webOS", "After updating the JavaScript and sample application, the release can be tagged.", component_map['webOS'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Tag WP7", "After updating the JavaScript and sample application, the release can be tagged.", component_map['WP7'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Tag WP8", "After updating the JavaScript and sample application, the release can be tagged.", component_map['WP8'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Tag Windows 8", "After updating the JavaScript and sample application, the release can be tagged.", component_map['Windows 8'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Tag Docs", "After all platforms have been tagged, the docs can be tagged.", component_map['Docs'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Tag Mobile Spec", "After all platforms have been tagged, mobile-spec can be tagged.", component_map['mobile-spec'], version_id), subtask_error_check);
+                    create(subtask(parent_key, "Generate a Source Release", "After all other sub-tasks have been completed, Coho can generate a source release.", component_map['Coho'], version_id), subtask_error_check);
+                });
+            }
+        });
+    }
+});
+

http://git-wip-us.apache.org/repos/asf/cordova-labs/blob/efc1181e/package.json
----------------------------------------------------------------------
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..b7569bb
--- /dev/null
+++ b/package.json
@@ -0,0 +1,13 @@
+{
+    "name": "cordova-jira",
+    "version":"0.0.1",
+    "description": "jira spam all up in yo inbox",
+    "author": "Fil Maj <fi...@apache.org>",
+    "dependencies": {
+        "request":"2.12.0",
+        "optimist":"0.3.5",
+        "ncallbacks":"1.0.0",
+        "underscore":"1.4.3"
+    },
+    "engine": ">=0.8.x"
+}