You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2012/08/21 18:13:35 UTC
svn commit: r1375640 - /cxf/branches/2.6.x-fixes/bin/DoMerges.java
Author: dkulp
Date: Tue Aug 21 16:13:35 2012
New Revision: 1375640
URL: http://svn.apache.org/viewvc?rev=1375640&view=rev
Log:
Merged revisions 1373475 via git cherry-pick from
https://svn.apache.org/repos/asf/cxf/trunk
........
r1373475 | dkulp | 2012-08-15 11:34:20 -0400 (Wed, 15 Aug 2012) | 2 lines
Update DoMerges to try and auto-detect stuff already merged
........
Modified:
cxf/branches/2.6.x-fixes/bin/DoMerges.java
Modified: cxf/branches/2.6.x-fixes/bin/DoMerges.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/bin/DoMerges.java?rev=1375640&r1=1375639&r2=1375640&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/bin/DoMerges.java (original)
+++ cxf/branches/2.6.x-fixes/bin/DoMerges.java Tue Aug 21 16:13:35 2012
@@ -588,8 +588,71 @@ public class DoMerges {
}
+ public static List<String[]> getGitLogs(Integer starting) throws Exception {
+ BufferedReader reader;
+ String line;
+ Process p = Runtime.getRuntime().exec(new String[] {"git", "svn", "log", "-r" , starting.toString(), gitSource});
+ reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
+ line = reader.readLine();
+ String date = null;
+ while (line != null && date == null) {
+ if (line.indexOf('|') != -1) {
+ //strip of rev #
+ line = line.substring(line.indexOf('|') + 1).trim();
+ if (line.indexOf('|') != -1) {
+ //strip off committer
+ line = line.substring(line.indexOf('|') + 1).trim();
+ }
+ date = line.substring(0, line.indexOf(' '));
+ }
+ line = reader.readLine();
+ }
+ reader.close();
+
+ p = Runtime.getRuntime().exec(new String[] {"git", "log", "--since=" + date});
+ reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
+ line = reader.readLine();
- public static String getLog(Integer ver, Set<String> jiras) throws Exception {
+ List<String[]> map = new LinkedList<String[]>();
+ List<String> list = new ArrayList<String>(10);
+ while (line != null) {
+ if (line.length() > 0 && line.charAt(0) != ' ') {
+ if (!list.isEmpty()) {
+ addIfNotMergeBlock(map, list);
+ list.clear();
+ }
+ while (line != null && line.length() > 0 && line.charAt(0) != ' ') {
+ list.add(line);
+ line = reader.readLine();
+ }
+ }
+ list.add(line);
+ line = reader.readLine();
+ }
+ if (!list.isEmpty()) {
+ addIfNotMergeBlock(map, list);
+ list.clear();
+ }
+ return map;
+ }
+ private static void addIfNotMergeBlock(List<String[]> map, List<String> list) {
+ for (String s: list) {
+ if (s.trim().startsWith("Merged revision")
+ && s.contains(" via ")) {
+ return;
+ }
+ if (s.trim().startsWith("Recording revision")
+ && s.contains(" via ")) {
+ return;
+ }
+ if (s.trim().startsWith("Blocking revision")
+ && s.contains(" via ")) {
+ return;
+ }
+ }
+ map.add(list.toArray(new String[list.size()]));
+ }
+ public static String[] getLog(Integer ver, Set<String> jiras) throws Exception {
Process p;
BufferedReader reader;
String line;
@@ -600,11 +663,9 @@ public class DoMerges {
}
reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
line = reader.readLine();
- StringWriter swriter = new StringWriter();
- BufferedWriter writer = new BufferedWriter(swriter);
+ List<String> lines = new ArrayList<String>(10);
while (line != null) {
- writer.write(line);
- writer.newLine();
+ lines.add(line);
Matcher m = jiraPattern.matcher(line);
while (m.find()) {
jiras.add(m.group());
@@ -612,8 +673,7 @@ public class DoMerges {
line = reader.readLine();
}
p.waitFor();
- writer.flush();
- return swriter.toString();
+ return lines.toArray(new String[lines.size()]);
}
private static void doMerge(int ver, String log, List<VerLog> records) throws Exception {
@@ -697,32 +757,52 @@ public class DoMerges {
verList.clear();
verList.add(onlyVersion);
}
+ if (verList.isEmpty()) {
+ System.out.println("Nothing needs to be merged");
+ System.exit(0);
+ }
System.out.println("Merging versions (" + verList.size() + "): " + verList);
+ Integer verArray[] = verList.toArray(new Integer[verList.size()]);
+ List<String[]> gitLogs = null;
+ if (isGit && onlyVersion == -1) {
+ //with GIT, we can relatively quickly check the logs on the current branch
+ //and compare with what should be merged and check if things are already merged
+ gitLogs = getGitLogs(verArray[0]);
+ }
+
List<VerLog> blocks = new ArrayList<VerLog>();
List<VerLog> records = new ArrayList<VerLog>();
Set<Integer> ignores = new TreeSet<Integer>();
Set<String> jiras = new TreeSet<String>();
- Integer verArray[] = verList.toArray(new Integer[verList.size()]);
for (int cur = 0; cur < verArray.length; cur++) {
jiras.clear();
int ver = verArray[cur];
System.out.println("Merging: " + ver + " (" + (cur + 1) + "/" + verList.size() + ")");
System.out.println("http://svn.apache.org/viewvc?view=revision&revision=" + ver);
- String log = getLog(ver, jiras);
+ String[] logLines = getLog(ver, jiras);
for (String s : jiras) {
System.out.println("https://issues.apache.org/jira/browse/" + s);
}
- System.out.println(log);
+ StringBuilder log = new StringBuilder();
+ for (String s : logLines) {
+ System.out.println(s);
+ log.append(s);
+ }
+
+
+ char c = auto ? 'M' : 0;
+ if (checkAlreadyMerged(gitLogs, logLines)) {
+ c = 'R';
+ }
while (System.in.available() > 0) {
System.in.read();
}
- char c = auto ? 'M' : 0;
while (c != 'M'
&& c != 'B'
&& c != 'I'
@@ -736,13 +816,13 @@ public class DoMerges {
switch (c) {
case 'M':
- doMerge(ver, log, records);
+ doMerge(ver, log.toString(), records);
break;
case 'B':
- blocks.add(new VerLog(ver, log));
+ blocks.add(new VerLog(ver, log.toString()));
break;
case 'R':
- records.add(new VerLog(ver, log));
+ records.add(new VerLog(ver, log.toString()));
break;
case 'F':
flush(blocks, records);
@@ -762,6 +842,49 @@ public class DoMerges {
flush(blocks, records);
}
+ private static boolean checkAlreadyMerged(List<String[]> gitLogs, String[] logLines) throws IOException {
+ for (String[] f : gitLogs) {
+ if (compareLogs(f, logLines)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ private static boolean compareLogs(String[] f, String[] logLines) throws IOException {
+ ArrayList<String> onBranch = new ArrayList<String>(f.length);
+ for (String s : f) {
+ if (s.trim().length() > 0
+ && s.charAt(0) == ' '
+ && !s.contains("git-svn-id")) {
+ onBranch.add(s.trim());
+ }
+ }
+ for (String s : logLines) {
+ onBranch.remove(s.trim());
+ }
+ if (onBranch.isEmpty()) {
+ //everything in the source log is in a log on this branch, let's prompt to record the merge
+ System.out.println("Found possible commit already on branch:");
+ for (String s : f) {
+ System.out.println(s);
+ }
+
+ while (System.in.available() > 0) {
+ System.in.read();
+ }
+ char c = 0;
+ while (c != 'Y'
+ && c != 'N') {
+ System.out.print("Record as merged [Y/N]? ");
+ int i = System.in.read();
+ c = Character.toUpperCase((char)i);
+ }
+ if (c == 'Y') {
+ return true;
+ }
+ }
+ return false;
+ }
private static void optimizeRanges(Set<Integer> ignores) {
merged.optimize(blocked, ignores);
blocked.optimize(merged, ignores);