Author: dkulp
Date: Wed Feb 15 03:18:35 2012
New Revision: 1244331
URL: http://svn.apache.org/viewvc?rev=1244331&view=rev
Log:
New version of DoMerges that no longer needs svnmerge.py as it handles
it all internally. Also works within a git clone instead of svn
checkout.
Modified:
cxf/trunk/bin/DoMerges.java
Modified: cxf/trunk/bin/DoMerges.java
URL:
http://svn.apache.org/viewvc/cxf/trunk/bin/DoMerges.java?rev=1244331&r1=1244330&r2=1244331&view=diff
==============================================================================
--- cxf/trunk/bin/DoMerges.java (original)
+++ cxf/trunk/bin/DoMerges.java Wed Feb 15 03:18:35 2012
@@ -23,13 +23,11 @@ import java.util.regex.Pattern;
/* dkulp - Stupid little program I use to help merge changes from
- trunk to the fixes branches. It requires the svnmerge.py be
- available on the path. Grab the latest from:
- http://svn.collab.net/repos/svn/trunk/contrib/client-side/svnmerge/
- (of course, that then requries python installed and whatever else
svnmerge.py
- needs.) It also requires the command line version of svn.
+ trunk to the fixes branches. It requires the command line version of
+ svn to be available on the path. If using a git checkout, it also requires
+ the command line version of git on the path.
- Basically, svnmerge.py does all the work, but this little wrapper
+ Basically, svn does all the work, but this little wrapper
thing will display the commit logs, prompt if you want to merge/block/ignore
each commit, prompt for commit (so you can resolve any conflicts first),
etc....
@@ -67,8 +65,214 @@ import java.util.regex.Pattern;
public class DoMerges {
public static boolean auto = false;
+ public static boolean isGit = false;
+ public static Pattern jiraPattern = Pattern.compile("([A-Z]{2,10}+-\\d+)");
+
+ public static String propSource;
+ public static String svnSource;
+ public static String svnDest;
+ public static String svnRoot;
+ public static String gitSource;
+
+ public static Ranges merged = new Ranges();
+ public static Ranges blocked = new Ranges();
+
+ public static String maxRev;
+
+ static class Ranges extends TreeSet<Range> {
+ private static final long serialVersionUID = 1L;
+
+ public void addRange(Range r) {
+ add(r);
+ }
+ public boolean isInRange(int i) {
+ for (Range r2 : this) {
+ if (r2.contains(i)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ public String toProperty() {
+ StringBuilder b = new StringBuilder(propSource);
+ b.append(":");
+ boolean first = true;
+ for (Range r : this) {
+ if (!first) {
+ b.append(',');
+ } else {
+ first = false;
+ }
+ b.append(r.toString());
+ }
+ return b.toString();
+ }
+ public void optimize(Ranges blocked, Set<Integer> ignores) {
+ Iterator<Range> it = this.iterator();
+ Range last = it.next();
+ while (it.hasNext()) {
+ Range r = it.next();
+ if ((last.max + 1) == r.min) {
+ last.max = r.max;
+ it.remove();
+ } else {
+ last = r;
+ }
+ /*
+ while (last.max < r.min) {
+ if (!blocked.isInRange(last.max + 1)
+ && !ignores.contains(last.max + 1)) {
+ last.max++;
+ } else {
+ break;
+ }
+ }
+ if (last.max == r.min) {
+ last.max = r.max;
+ it.remove();
+ } else {
+ last = r;
+ }
+ */
+ }
+ }
+ }
+
+ static class Range implements Comparable<Range> {
+ int min, max;
+
+ public Range(String s) {
+ int idx = s.indexOf('-');
+ if (idx == -1) {
+ min = Integer.parseInt(s);
+ max = min;
+ } else {
+ min = Integer.parseInt(s.substring(0, idx));
+ max = Integer.parseInt(s.substring(idx + 1));
+ }
+ }
+
+ public boolean contains(int i) {
+ return i >= min && i <= max;
+ }
+
+ public String toString() {
+ if (min == max) {
+ return Integer.toString(min);
+ }
+ return Integer.toString(min) + "-" + Integer.toString(max);
+ }
+
+ public int compareTo(Range o) {
+ return Integer.valueOf(min).compareTo(Integer.valueOf(o.min));
+ }
+ }
+
+ static void waitFor(Process p) throws Exception {
+ if (p.waitFor() != 0) {
+ System.out.println("ERROR!");
+ BufferedReader reader = new BufferedReader(new
InputStreamReader(p.getErrorStream()));
+ String line = reader.readLine();
+ while (line != null) {
+ System.out.println(line);
+ line = reader.readLine();
+ }
+ System.exit(1);
+ }
+ }
+ static void runProcess(Process p) throws Exception {
+ BufferedReader reader = new BufferedReader(new
InputStreamReader(p.getInputStream()));
+ String line = reader.readLine();
+ while (line != null) {
+ System.out.println(line);
+ line = reader.readLine();
+ }
+ waitFor(p);
+ }
+
+ static void initSvnInfo() throws Exception {
+ Process p;
+ if (isGit) {
+ p = Runtime.getRuntime().exec(new String[] {"git", "svn", "info",
"."});
+ } else {
+ p = Runtime.getRuntime().exec(new String[] {"svn", "info", "."});
+ }
+ BufferedReader reader = new BufferedReader(new
InputStreamReader(p.getInputStream()));
+ String line = reader.readLine();
+ while (line != null) {
+ if (line.startsWith("Repository Root: ")) {
+ svnRoot = line.substring("Repository Root: ".length()).trim();
+ } else if (line.startsWith("URL: ")) {
+ svnDest = line.substring(5).trim();
+ }
+ line = reader.readLine();
+ }
+ p.waitFor();
+
+
+ if (isGit) {
+ p = Runtime.getRuntime().exec(new String[] {"git", "svn",
"propget", "svnmerge-integrated", "."});
+ } else {
+ p = Runtime.getRuntime().exec(new String[] {"svn", "propget",
"svnmerge-integrated", "."});
+ }
+ reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
+ line = reader.readLine();
+ while (line != null) {
+ int idx = line.indexOf(':');
+ propSource = line.substring(0, idx);
+ svnSource = svnRoot + propSource;
+ if (isGit) {
+ gitSource = line.substring(0, idx);
+ if (gitSource.contains("/")) {
+ gitSource = gitSource.substring(gitSource.lastIndexOf('/')
+ 1);
+ }
+ gitSource = "origin/" + gitSource;
+ }
+ parseRevs(line.substring(idx + 1), merged);
+ line = reader.readLine();
+ }
+ p.waitFor();
+
+ if (isGit) {
+ p = Runtime.getRuntime().exec(new String[] {"git", "svn",
"propget", "svnmerge-blocked", "."});
+ } else {
+ p = Runtime.getRuntime().exec(new String[] {"svn", "propget",
"svnmerge-blocked", "."});
+ }
+ reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
+ line = reader.readLine();
+ while (line != null) {
+ int idx = line.indexOf(':');
+ parseRevs(line.substring(idx + 1), blocked);
+ line = reader.readLine();
+ }
+ p.waitFor();
+
+
+ p = Runtime.getRuntime().exec(new String[] {"svn", "info", svnSource});
+ reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
+ line = reader.readLine();
+ while (line != null) {
+ if (line.startsWith("Revision: ")) {
+ maxRev = line.substring("Revision: ".length()).trim();
+ }
+ line = reader.readLine();
+ }
+ p.waitFor();
+ }
+
+ private static void parseRevs(String revs, Ranges ranges) {
+ String sp[] = revs.split(",");
+ for (String s : sp) {
+ ranges.addRange(new Range(s));
+ }
+ }
+
+
static void removeSvnMergeInfo() throws Exception {
+ if (isGit) {
+ return;
+ }
Process p = Runtime.getRuntime().exec(new String[] {"svn", "st", "."});
BufferedReader reader = new BufferedReader(new
InputStreamReader(p.getInputStream()));
List<String> list = new ArrayList<String>();
@@ -99,6 +303,9 @@ public class DoMerges {
}
}
static void doCommit() throws Exception {
+ doCommit(null, null);
+ }
+ static boolean doCommit(String ver, String log) throws Exception {
while (System.in.available() > 0) {
System.in.read();
}
@@ -110,208 +317,363 @@ public class DoMerges {
c = Character.toUpperCase((char)i);
}
if (c == 'N') {
- return;
+ return false;
}
- Process p = Runtime.getRuntime().exec(new String[] {"svn", "resolved",
"."});
- if (p.waitFor() != 0) {
- Thread.sleep(10);
+ if (!isGit) {
+ Process p = Runtime.getRuntime().exec(new String[] {"svn",
"resolved", "."});
+ if (p.waitFor() != 0) {
+ Thread.sleep(10);
+ }
}
- p = Runtime.getRuntime().exec(new String[] {"svn", "commit", "-F",
"svnmerge-commit-message.txt"});
- BufferedReader reader = new BufferedReader(new
InputStreamReader(p.getInputStream()));
- String line = reader.readLine();
- while (line != null) {
- System.out.println(line);
- line = reader.readLine();
+
+ File file = createLog(ver, log);
+ Process p;
+ if (isGit) {
+ p = Runtime.getRuntime().exec(new String[] {"git", "commit", "-a",
"-F", file.toString()});
+ } else {
+ p = Runtime.getRuntime().exec(new String[] {"svn", "commit", "-F",
file.toString()});
}
- if (p.waitFor() != 0) {
- System.out.println("ERROR!");
- reader = new BufferedReader(new
InputStreamReader(p.getErrorStream()));
- line = reader.readLine();
+ runProcess(p);
+ return true;
+ }
+
+
+ private static File getLogFile(String action, String vers, List<VerLog>
records) throws Exception {
+ File file = File.createTempFile("domerge", ".log");
+ file.deleteOnExit();
+ BufferedWriter writer = new BufferedWriter(new FileWriter(file));
+ writer.write(action);
+ writer.write(" revisions ");
+ writer.write(vers);
+ writer.write(" via ");
+ if (isGit) {
+ writer.write(" git from\n");
+ } else {
+ writer.write(" svn from\n");
+ }
+ writer.write(svnSource);
+ writer.write("\n\n");
+ for (VerLog l : records) {
+ writer.write("........\n");
+ BufferedReader reader = new BufferedReader(new
StringReader(l.log));
+ String line = reader.readLine();
while (line != null) {
- System.out.println(line);
+ if (!line.startsWith("--------")) {
+ writer.write(" ");
+ writer.write(line);
+ writer.write("\n");
+ }
line = reader.readLine();
}
- System.exit(1);
+ writer.write("........\n");
}
- }
- public static void changes(String ver, String root) throws Exception {
+ writer.close();
+ return file;
+ }
+
+ private static File createLog(String ver, String log) throws Exception {
+ File file = File.createTempFile("domerge", ".log");
+ file.deleteOnExit();
+ BufferedWriter writer = new BufferedWriter(new FileWriter(file));
+ BufferedReader reader = new BufferedReader(new StringReader(log));
+ writer.write("Merged revisions ");
+ writer.write(ver);
+ writer.write(" via ");
+ if (isGit) {
+ writer.write(" git cherry-pick from\n");
+ } else {
+ writer.write(" svn merge from\n");
+ }
+ writer.write(svnSource);
+ writer.write("\n\n");
+ writer.write("........\n");
+ String line = reader.readLine();
+ while (line != null) {
+ if (!line.startsWith("--------")) {
+ writer.write(" ");
+ writer.write(line);
+ writer.write("\n");
+ }
+ line = reader.readLine();
+ }
+ writer.write("........\n");
+ writer.close();
+ return file;
+ }
+
+ public static void changes(String ver) throws Exception {
+ Process p;
+ if (isGit) {
+ String id = getGitVersion(ver);
+ p = Runtime.getRuntime().exec(getCommandLine(new String[] {"git",
"diff", id + "^", id, gitSource}));
+ } else {
+ p = Runtime.getRuntime().exec(getCommandLine(new String[] {"svn",
"diff", "-c", ver, svnRoot}));
+ }
+ runProcess(p);
+ }
+
+ private static String getGitVersion(String ver) throws Exception {
Process p;
BufferedReader reader;
String line;
- p = Runtime.getRuntime().exec(getCommandLine(new String[] {"svn",
"diff", "-c", ver, root}));
+ p = Runtime.getRuntime().exec(getCommandLine(new String[] {"git",
"svn", "find-rev", "r" + ver, gitSource}));
reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
line = reader.readLine();
+ String version = null;
while (line != null) {
- System.out.println(line);
- line = reader.readLine();
- }
- if (p.waitFor() != 0) {
- System.out.println("ERROR!");
- reader = new BufferedReader(new
InputStreamReader(p.getErrorStream()));
- line = reader.readLine();
- while (line != null) {
- System.out.println(line);
- line = reader.readLine();
+ line = line.trim();
+ if (version == null && line.length() > 0) {
+ version = line;
}
- System.exit(1);
+ line = reader.readLine();
}
+ waitFor(p);
+ return version;
}
- public static void flush(List<String> blocks, List<String> records) throws
Exception {
+ public static void flush(List<VerLog> blocks, List<VerLog> records) throws
Exception {
Process p;
BufferedReader reader;
String line;
-
- if (!records.isEmpty()) {
- StringBuilder ver = new StringBuilder();
- for (String s : records) {
- if (ver.length() > 0) {
- ver.append(',');
- }
- ver.append(s);
- }
- System.out.println("Recording " + ver);
- p = Runtime.getRuntime().exec(getCommandLine(new String[]
{"svnmerge.py", "merge", "--record-only", "-r", ver.toString()}));
+ File checkout = new File(".");
+ if (isGit) {
+ p = Runtime.getRuntime().exec(getCommandLine(new String[] {"git",
"svn", "dcommit"}));
reader = new BufferedReader(new
InputStreamReader(p.getInputStream()));
line = reader.readLine();
+ String version = null;
while (line != null) {
- System.out.println(line);
+ line = line.trim();
+ if (version == null && line.length() > 0) {
+ version = line;
+ }
line = reader.readLine();
}
- if (p.waitFor() != 0) {
- System.out.println("ERROR!");
- reader = new BufferedReader(new
InputStreamReader(p.getErrorStream()));
- line = reader.readLine();
- while (line != null) {
- System.out.println(line);
- line = reader.readLine();
+ waitFor(p);
+
+ checkout = File.createTempFile("gitsvn", ".co");
+ checkout.delete();
+ final File deleteDir = checkout;
+ Runtime.getRuntime().addShutdownHook(new Thread() {
+ public void run() {
+ deleteDirectory(deleteDir);
}
- System.exit(1);
+
+ });
+
+ p = Runtime.getRuntime().exec(getCommandLine(new String[] {"svn",
"co", "--depth", "empty",
+
svnDest, checkout.toString()}));
+ runProcess(p);
+ }
+
+ if (!records.isEmpty()) {
+ StringBuilder ver = new StringBuilder();
+ for (VerLog s : records) {
+ if (ver.length() > 0) {
+ ver.append(',');
+ }
+ ver.append(s.ver);
+ merged.addRange(new Range(s.ver));
}
- doCommit();
+ System.out.println("Recording " + ver);
+ File logF = getLogFile("Recording", ver.toString(), records);
+ p = Runtime.getRuntime().exec(getCommandLine(new String[] {"svn",
"propset",
+
"svnmerge-integrated",
+
merged.toProperty(),
+
checkout.toString()}));
+ runProcess(p);
+
+ p = Runtime.getRuntime().exec(getCommandLine(new String[] {"svn",
"commit",
+ "-F",
+
logF.toString(),
+
checkout.toString()}));
+ runProcess(p);
}
if (!blocks.isEmpty()) {
StringBuilder ver = new StringBuilder();
- for (String s : blocks) {
+ for (VerLog s : blocks) {
if (ver.length() > 0) {
ver.append(',');
}
- ver.append(s);
+ ver.append(s.ver);
+ blocked.addRange(new Range(s.ver));
}
System.out.println("Blocking " + ver);
- p = Runtime.getRuntime().exec(getCommandLine(new String[]
{"svnmerge.py", "block", "-r", ver.toString()}));
- reader = new BufferedReader(new
InputStreamReader(p.getInputStream()));
- line = reader.readLine();
- while (line != null) {
- System.out.println(line);
- line = reader.readLine();
- }
- if (p.waitFor() != 0) {
- System.out.println("ERROR!");
- reader = new BufferedReader(new
InputStreamReader(p.getErrorStream()));
- line = reader.readLine();
- while (line != null) {
- System.out.println(line);
- line = reader.readLine();
- }
- System.exit(1);
- }
- doCommit();
+ File logF = getLogFile("Blocking", ver.toString(), blocks);
+ p = Runtime.getRuntime().exec(getCommandLine(new String[] {"svn",
"propset",
+
"svnmerge-blocked",
+
blocked.toProperty(),
+
checkout.toString()}));
+ runProcess(p);
+ p = Runtime.getRuntime().exec(getCommandLine(new String[] {"svn",
"commit",
+ "-F",
+
logF.toString(),
+
checkout.toString()}));
+ runProcess(p);
}
blocks.clear();
records.clear();
}
- public static void main (String args[]) throws Exception {
- if (args.length > 0 && "-auto".equals(args[0])) {
- auto = true;
+ public static void doUpdate() throws Exception {
+ if (isGit) {
+ Process p = Runtime.getRuntime().exec(new String[] {"git",
"pull"});
+ runProcess(p);
+ p = Runtime.getRuntime().exec(new String[] {"git", "svn",
"rebase"});
+ runProcess(p);
+ } else {
+ Process p = Runtime.getRuntime().exec(new String[] {"svn", "up",
"-r", "head", "."});
+ runProcess(p);
}
+ }
- System.out.println("Updating directory");
-
- Process p = Runtime.getRuntime().exec(new String[] {"svn", "up", "-r",
"head", "."});
- BufferedReader reader = new BufferedReader(new
InputStreamReader(p.getInputStream()));
- String line = reader.readLine();
- while (line != null) {
- System.out.println(line);
- line = reader.readLine();
+ public static List<String> getAvailableUpdates() throws Exception {
+ List<String> verList = new ArrayList<String>();
+ Process p;
+ BufferedReader reader;
+ String line;
+
+ String min = Integer.toString(merged.first().max);
+ if (isGit) {
+ p = Runtime.getRuntime().exec(getCommandLine(new String[] {"git",
"svn", "log",
+
"--oneline", "-r",
+ min +
":" + maxRev,
+
gitSource}));
+ } else {
+ p = Runtime.getRuntime().exec(getCommandLine(new String[] {"svn",
"log",
+
"--quiet", "-r",
+ min +
":" + maxRev,
+
svnSource}));
}
- p.waitFor();
-
-
- p = Runtime.getRuntime().exec(getCommandLine(new String[]
{"svnmerge.py", "avail"}));
-
+
reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
line = reader.readLine();
- List<String> verList = new ArrayList<String>();
while (line != null) {
- String vers[] = line.split(",");
- for (String s : vers) {
- if (s.indexOf("-") != -1) {
- String s1 = s.substring(0, s.indexOf("-"));
- String s2 = s.substring(s.indexOf("-") + 1);
- int i1 = Integer.parseInt(s1);
- int i2 = Integer.parseInt(s2);
- for (int x = i1; x <= i2; x++) {
- verList.add(Integer.toString(x));
- }
- } else {
- verList.add(s);
- }
+ if (line.charAt(0) == 'r') {
+ line = line.substring(0,
line.indexOf('|')).substring(1).trim();
+ int ver = Integer.parseInt(line);
+ if (!merged.isInRange(ver) && !blocked.isInRange(ver)) {
+ verList.add(line);
+ }
}
line = reader.readLine();
}
p.waitFor();
- System.out.println("Merging versions (" + verList.size() + "): " +
verList);
+ return verList;
+ }
- String root = null;
- p = Runtime.getRuntime().exec(new String[] {"svn", "info"});
+ public static String getLog(String ver, Set<String> jiras) throws
Exception {
+ Process p;
+ BufferedReader reader;
+ String line;
+ if (isGit) {
+ p = Runtime.getRuntime().exec(new String[] {"git", "svn", "log",
"-r" , ver, gitSource});
+ } else {
+ p = Runtime.getRuntime().exec(new String[] {"svn", "log", "-r" ,
ver, svnRoot});
+ }
reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
line = reader.readLine();
+ StringWriter swriter = new StringWriter();
+ BufferedWriter writer = new BufferedWriter(swriter);
while (line != null) {
- if (line.startsWith("Repository Root: ")) {
- root = line.substring("Repository Root: ".length()).trim();
+ writer.write(line);
+ writer.newLine();
+ Matcher m = jiraPattern.matcher(line);
+ while (m.find()) {
+ jiras.add(m.group());
}
line = reader.readLine();
}
- System.out.println("Root: " + root);
p.waitFor();
+ writer.flush();
+ return swriter.toString();
+ }
+
+ private static void doMerge(String ver, String log, List<VerLog> records)
throws Exception {
+ Process p;
+
+ if (isGit) {
+ String id = getGitVersion(ver);
+ p = Runtime.getRuntime().exec(getCommandLine(new String[] {"git",
"cherry-pick",
+
"--no-commit",
+ id,
gitSource}));
+ } else {
+ p = Runtime.getRuntime().exec(getCommandLine(new String[] {"svn",
"merge", "--non-interactive",
+ "-c",
ver, svnSource}));
+ }
+ runProcess(p);
+
+ if (!isGit) {
+ removeSvnMergeInfo();
+
+ Range r = new Range(ver);
+ merged.add(r);
+ p = Runtime.getRuntime().exec(new String[] {"svn", "propset",
"svnmerge-integrated",
+ merged.toProperty(),
"."});
+ removeSvnMergeInfo();
+ runProcess(p);
+
+ if (!doCommit(ver, log)) {
+ merged.remove(r);
+ }
+ } else {
+ p = Runtime.getRuntime().exec(getCommandLine(new String[] {"git",
"status"}));
+ runProcess(p);
+
+ if (doCommit(ver, log)) {
+ records.add(new VerLog(ver, log));
+ }
+ }
+ }
+
+ static class VerLog {
+ String ver;
+ String log;
+
+ public VerLog(String v, String l) {
+ ver = v;
+ log = l;
+ }
+ }
+
+ public static void main (String args[]) throws Exception {
+ if (args.length > 0 && "-auto".equals(args[0])) {
+ auto = true;
+ }
+ File file = new File(".git");
+ if (file.exists() && file.isDirectory()) {
+ isGit = true;
+ }
- List<String> blocks = new ArrayList<String>();
- List<String> records = new ArrayList<String>();
+ System.out.println("Updating directory");
+
+ doUpdate();
+ initSvnInfo();
+
+ List<String> verList = getAvailableUpdates();
+
+ System.out.println("Merging versions (" + verList.size() + "): " +
verList);
+
+ List<VerLog> blocks = new ArrayList<VerLog>();
+ List<VerLog> records = new ArrayList<VerLog>();
+ Set<Integer> ignores = new TreeSet<Integer>();
Set<String> jiras = new TreeSet<String>();
- Pattern jiraPattern = Pattern.compile("([A-Z]{2,10}+-\\d+)");
for (int cur = 0; cur < verList.size(); cur++) {
jiras.clear();
String ver = verList.get(cur);
System.out.println("Merging: " + ver + " (" + (cur + 1) + "/" +
verList.size() + ")");
System.out.println("http://svn.apache.org/viewvc?view=revision&revision=" +
ver);
-
- p = Runtime.getRuntime().exec(new String[] {"svn", "log", "-r" ,
ver, root});
- reader = new BufferedReader(new
InputStreamReader(p.getInputStream()));
- line = reader.readLine();
- StringWriter swriter = new StringWriter();
- BufferedWriter writer = new BufferedWriter(swriter);
- while (line != null) {
- writer.write(line);
- writer.newLine();
- Matcher m = jiraPattern.matcher(line);
- while (m.find()) {
- jiras.add(m.group());
- }
- line = reader.readLine();
- }
- p.waitFor();
- writer.flush();
+
+ String log = getLog(ver, jiras);
+
for (String s : jiras) {
System.out.println("https://issues.apache.org/jira/browse/" +
s);
}
- System.out.println(swriter.toString());
+ System.out.println(log);
while (System.in.available() > 0) {
System.in.read();
@@ -330,48 +692,36 @@ public class DoMerges {
switch (c) {
case 'M':
- p = Runtime.getRuntime().exec(getCommandLine(new String[]
{"svnmerge.py", "merge", "-r", ver}));
- reader = new BufferedReader(new
InputStreamReader(p.getInputStream()));
- line = reader.readLine();
- while (line != null) {
- System.out.println(line);
- line = reader.readLine();
- }
- if (p.waitFor() != 0) {
- System.out.println("ERROR!");
- reader = new BufferedReader(new
InputStreamReader(p.getErrorStream()));
- line = reader.readLine();
- while (line != null) {
- System.out.println(line);
- line = reader.readLine();
- }
- System.exit(1);
- }
- removeSvnMergeInfo();
- doCommit();
+ doMerge(ver, log, records);
break;
case 'B':
- blocks.add(ver);
+ blocks.add(new VerLog(ver, log));
break;
case 'R':
- records.add(ver);
+ records.add(new VerLog(ver, log));
break;
case 'F':
flush(blocks, records);
cur--;
break;
case 'C':
- changes(ver, root);
+ changes(ver);
cur--;
break;
case 'I':
System.out.println("Ignoring");
+ ignores.add(Integer.valueOf(ver));
break;
}
}
+ optimizeRanges(ignores);
flush(blocks, records);
}
+ private static void optimizeRanges(Set<Integer> ignores) {
+ merged.optimize(blocked, ignores);
+ blocked.optimize(merged, ignores);
+ }
private static String[] getCommandLine(String[] args) {
List<String> argLine = new ArrayList<String>();
if (isWindows()) {
@@ -387,4 +737,38 @@ public class DoMerges {
private static boolean isWindows() {
return System.getProperty("os.name").toLowerCase().indexOf("windows")
!= -1;
}
+
+
+ private static void deleteDirectory(File d) {
+ String[] list = d.list();
+ if (list == null) {
+ list = new String[0];
+ }
+ for (int i = 0; i < list.length; i++) {
+ String s = list[i];
+ File f = new File(d, s);
+ if (f.isDirectory()) {
+ deleteDirectory(f);
+ } else {
+ delete(f);
+ }
+ }
+ delete(d);
+ }
+
+ public static void delete(File f) {
+ if (!f.delete()) {
+ if (isWindows()) {
+ System.gc();
+ }
+ try {
+ Thread.sleep(1);
+ } catch (InterruptedException ex) {
+ // Ignore Exception
+ }
+ f.delete();
+ }
+ }
}
+
+