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();
+        }
+    }
 }
+
+


Reply via email to