# ignite-1099
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/8a0dbc21 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/8a0dbc21 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/8a0dbc21 Branch: refs/heads/ignite-1099 Commit: 8a0dbc21cabc8e69266602312edc56b815fec5fc Parents: bc336d9 Author: ashutak <ashu...@gridgain.com> Authored: Mon Jul 13 16:59:16 2015 +0300 Committer: ashutak <ashu...@gridgain.com> Committed: Mon Jul 13 16:59:16 2015 +0300 ---------------------------------------------------------------------- .../tools/jirabranches/JiraBranchesToHtml.java | 250 +++++++++++-------- scripts/jira-branches.sh | 4 +- 2 files changed, 142 insertions(+), 112 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8a0dbc21/modules/tools/src/main/java/org/apache/ignite/tools/jirabranches/JiraBranchesToHtml.java ---------------------------------------------------------------------- diff --git a/modules/tools/src/main/java/org/apache/ignite/tools/jirabranches/JiraBranchesToHtml.java b/modules/tools/src/main/java/org/apache/ignite/tools/jirabranches/JiraBranchesToHtml.java index 1e5b8bd..a705d23 100644 --- a/modules/tools/src/main/java/org/apache/ignite/tools/jirabranches/JiraBranchesToHtml.java +++ b/modules/tools/src/main/java/org/apache/ignite/tools/jirabranches/JiraBranchesToHtml.java @@ -37,22 +37,13 @@ import java.util.regex.*; */ public class JiraBranchesToHtml { /** */ - private static final SimpleDateFormat FORMAT = new SimpleDateFormat("MM/dd/yyyy"); - - /** Jira url. */ - private String jiraUrl; - - /** Script path. */ - private String scriptPath; + public static final String OUTPUT_FILE = U.getIgniteHome() + "/scripts/jira-branches-results.html"; - /** Input file. */ - private String inputFile; - - /** Output file. */ - private String outputFile; + /** */ + private static final SimpleDateFormat FORMAT = new SimpleDateFormat("MM/dd/yyyy"); /** */ - private static final Pattern TICKET_PATTERN = Pattern.compile("\\d{5}|\\d{4}"); + private static final Pattern TICKET_PATTERN = Pattern.compile("\\d{5}|\\d{4}|\\d{3}"); /** */ private static final Comparator<Result> COMP = new Comparator<Result>() { @@ -68,28 +59,67 @@ public class JiraBranchesToHtml { return o1.issue == null ? 1 : -1; } }; - private String prefix; /** * @param args Arguments. * @throws Exception If failed. */ public static void main(String[] args) throws Exception { - new JiraBranchesToHtml() - .setJiraUrl("https://issues.apache.org/jira") - .setPrefix("IGNITE") - .setScriptPath(U.getIgniteHome() + "/scripts/jira-branches.sh") - .setInputFile(U.getIgniteHome() + "/scripts/jira-branches.js") - .setOutputFile(U.getIgniteHome() + "/scripts/jira-branches-results.html") - .generateReport(); + System.out.print("Report 'Closed' issues only [y/N]: "); + + BufferedReader rdr = new BufferedReader(new InputStreamReader(System.in)); + + boolean closedOnly = "y".equalsIgnoreCase(rdr.readLine()); + + List<String> branches = getBranches(); + + Credentials cred = askForJiraCredentials("https://issues.apache.org/jira"); + + List<Result> res = new ArrayList<>(); + + try (JiraRestClient restClient = new AsynchronousJiraRestClientFactory(). + createWithBasicHttpAuthentication(URI.create(cred.jiraUrl), cred.name, cred.pswd)) { + for (String branchName : branches) { + if (branchName.toLowerCase().startsWith("IGNITE".toLowerCase())) { + Result r = result(restClient, branchName, cred.jiraUrl); + + if (r.issue == null || !closedOnly || "Closed".equalsIgnoreCase(r.issue.getStatus().getName())) { + System.out.println("Added issue: " + r); + + res.add(r); + } + } + } + } + + makeReport(res); + } + + /** + * @param res Results. + * @throws IOException + */ + public static void makeReport(List<Result> res) throws IOException { + String s = printIssueDetails(res); + + System.out.println(s); + + try (OutputStreamWriter bw = new OutputStreamWriter(new FileOutputStream(OUTPUT_FILE))) { + bw.write(s); + } + + if (Desktop.isDesktopSupported()) + Desktop.getDesktop().open(new File(OUTPUT_FILE)); + else + System.out.println("Results have been written to: " + OUTPUT_FILE); } /** - * Generate report about git branches and related Jira issues. - * - * @throws Exception + * @param jiraUrl Jira URL. + * @return Credentials/ + * @throws Exception If failed. */ - public void generateReport() throws Exception { + public static Credentials askForJiraCredentials(String jiraUrl) throws Exception{ System.out.println("Need to enter credentials for JIRA [" + jiraUrl + "]"); System.out.print("JIRA user: "); @@ -108,9 +138,16 @@ public class JiraBranchesToHtml { if (F.isEmpty(pswd)) throw new IllegalStateException("JIRA password cannot be empty."); - System.out.print("Report 'Closed' issues only [y/N]: "); + return new Credentials(jiraUrl, user, pswd); + } - boolean closedOnly = "y".equalsIgnoreCase(rdr.readLine()); + /** + * @return All branches from origin repository. + * @throws Exception if failed. + */ + public static List<String> getBranches() throws Exception { + String scriptPath = U.getIgniteHome() + "/scripts/jira-branches.sh"; + String inputFile = U.getIgniteHome() + "/scripts/jira-branches.js"; System.out.println(); System.out.println(">>> Executing script: " + scriptPath); @@ -133,109 +170,81 @@ public class JiraBranchesToHtml { throw new Exception("Failed to run script [script=" + scriptPath + ", exitCode=" + proc.exitValue() + ']'); - try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(inputFile))); - JiraRestClient restClient = new AsynchronousJiraRestClientFactory(). - createWithBasicHttpAuthentication(URI.create(jiraUrl), user, pswd)) { - List<Result> res = new ArrayList<>(); + try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(inputFile)))) { + List<String> branches = new ArrayList<>(); for (String line; (line = br.readLine()) != null; ) { - String branchName = line.replace("\\", "").trim(); - - if (branchName.startsWith(prefix)) { - Result r = result(restClient, branchName); - - if (r.error != null) { - Matcher m = TICKET_PATTERN.matcher(branchName); + String branch = line.replace("\\", "").trim(); - if (m.find()) { - Result r0 = result(restClient, prefix + "-" + m.group(0)); - - if (r0.error == null) - r = new Result(branchName, r0.issue, null); - } - } - - if (r.issue == null || !closedOnly || "Closed".equalsIgnoreCase(r.issue.getStatus().getName())) { - System.out.println("Added issue: " + r); - - res.add(r); - } - } - } - - String s = printIssueDetails(res); - - System.out.println(s); - - try (OutputStreamWriter bw = new OutputStreamWriter(new FileOutputStream(outputFile))) { - bw.write(s); + if (branch.startsWith("remotes/origin/")) + branches.add(branch.substring("remotes/origin/".length())); } - if (Desktop.isDesktopSupported()) - Desktop.getDesktop().open(new File(outputFile)); - else - System.out.println("Results have been written to: " + outputFile); + return branches; } } /** - * @param jiraUrl Jira url. - */ - public JiraBranchesToHtml setJiraUrl(String jiraUrl) { - this.jiraUrl = jiraUrl; - - return this; - } - - /** - * @param scriptPath Script path. + * @param restClient Rest client. + * @param branchName Branch name. + * @param jiraUrl + * @return Result. */ - public JiraBranchesToHtml setScriptPath(String scriptPath) { - this.scriptPath = scriptPath; + protected static Result result(JiraRestClient restClient, String branchName, String jiraUrl) { + int idx1 = branchName.indexOf('-'); - return this; - } + if (idx1 == -1) + return new Result(branchName, null, "Unknown branch name pattern.", jiraUrl); - /** - * @param inputFile Input file. - */ - public JiraBranchesToHtml setInputFile(String inputFile) { - this.inputFile = inputFile; + int idx2 = branchName.indexOf('-', idx1 + 1); - return this; - } + System.out.println(">>>>> " + branchName + " " + idx1 + " " + idx2); - /** - * @param outputFile Output file. - */ - public JiraBranchesToHtml setOutputFile(String outputFile) { - this.outputFile = outputFile; + if (idx2 == -1) + // For branches like "IGNITE-xxx" + try { + Issue issue = restClient.getIssueClient().getIssue(branchName).claim(); - return this; - } + return new Result(branchName, issue, null, jiraUrl); + } + catch (RestClientException e) { + return new Result(branchName, null, e.getMessage(), jiraUrl); + } + else { + // For branches like "IGNITE-xxx-<description>". + try { + Integer.valueOf(branchName.substring(idx1+1, idx2)); - /** - * @param prefix Jira prefix. - */ - public JiraBranchesToHtml setPrefix(String prefix) { - this.prefix = prefix; + try { + Issue issue = restClient.getIssueClient().getIssue(branchName.substring(0, idx2)).claim(); - return this; + return new Result(branchName, issue, null, jiraUrl); + } + catch (RestClientException e) { + return new Result(branchName, null, e.getMessage(), jiraUrl); + } + } + catch (NumberFormatException ignore) { + return new Result(branchName, null, "Unknown branch name pattern. " + + "Expected that '" + branchName.substring(idx1+1, idx2) + "' is a number.", jiraUrl); + } + } } /** * @param restClient Rest client. * @param branchName Branch name. + * @param jiraUrl * @return Result. */ - private static Result result(JiraRestClient restClient, String branchName) { + private static Result result0(String branchName, JiraRestClient restClient, String jiraName, String jiraUrl) { try { - Issue issue = restClient.getIssueClient().getIssue(branchName).claim(); + Issue issue = restClient.getIssueClient().getIssue(jiraName).claim(); - return new Result(branchName, issue, null); + return new Result(branchName, issue, null, jiraUrl); } catch (RestClientException e) { - return new Result(branchName, null, e.getMessage()); + return new Result(branchName, null, e.getMessage(), jiraUrl); } } @@ -243,7 +252,7 @@ public class JiraBranchesToHtml { * @param res Results. * @return Output. */ - private String printIssueDetails(List<Result> res) { + private static String printIssueDetails(List<Result> res) { StringBuilder sb = new StringBuilder(); println(sb, "<html>\n<head></head>\n<body>"); @@ -262,7 +271,7 @@ public class JiraBranchesToHtml { } print(sb, "<th colspan=7 align=\"left\">" + - "<a href=" + URI.create(jiraUrl) + "/browse/" + r.issue.getKey() + ">" + + "<a href=" + URI.create(r.jiraUrl) + "/browse/" + r.issue.getKey() + ">" + r.issueKey + ' ' + r.issue.getSummary() + "<a></th>"); print(sb, "</tr><tr>"); @@ -322,21 +331,25 @@ public class JiraBranchesToHtml { } /** */ - private static class Result { + public static class Result { + /** */ + public final String issueKey; + /** */ - private final String issueKey; + public final Issue issue; /** */ - private final Issue issue; + public final String error; /** */ - private final String error; + public final String jiraUrl; /** */ - Result(String issueKey, Issue issue, String error) { + public Result(String issueKey, Issue issue, String error, String url) { this.issueKey = issueKey; this.issue = issue; this.error = error; + jiraUrl = url; } /** {@inheritDoc} */ @@ -348,4 +361,23 @@ public class JiraBranchesToHtml { ']'; } } + + /** */ + public static class Credentials { + /** */ + public final String jiraUrl; + + /** */ + public final String name; + + /** */ + public final String pswd; + + /** */ + Credentials(String jiraUrl, String name, String pswd) { + this.jiraUrl = jiraUrl; + this.name = name; + this.pswd = pswd; + } + } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8a0dbc21/scripts/jira-branches.sh ---------------------------------------------------------------------- diff --git a/scripts/jira-branches.sh b/scripts/jira-branches.sh index d97a141..2d16ced 100755 --- a/scripts/jira-branches.sh +++ b/scripts/jira-branches.sh @@ -9,10 +9,8 @@ echo Update git branches list file. echo "var \$branches = \"\\" > $FILE -git branch -a | grep remotes/origin/ignite- | sed 's/remotes\/origin\/ignite\-\(.*\)$/IGNITE-\1 \\/g' >> $FILE +git branch -a >> $FILE echo '";' >> $FILE echo "var \$branchesDate = '$(date +"%Y-%m-%d")';" >> $FILE - -echo Open in browser $(dirname $FILE)/jira-branches.html