Change 117522 by jkristian@jkristian-home on 2003/11/11 00:46:57

	Renamed UnixStyleFilter to UnixCommand.
	Improved.

Affected files ...

... //users/jkristian/lib/UnixCommandResources.properties#1 branch
... //users/jkristian/lib/UnixStyleFilterResources.properties#2 delete
... //users/jkristian/lib/p4d2pResources.properties#3 edit
... //users/jkristian/src/UnixCommand.java#1 add
... //users/jkristian/src/UnixStyleFilter.java#3 delete
... //users/jkristian/src/p4d2p.java#3 edit

Differences ...

==== //users/jkristian/lib/p4d2pResources.properties#3 (text) ====

***************
*** 46,48 ****
--- 46,49 ----
  \    John Kristian <jkristian@docent.com>. Thanks to Gurusamy Sarathy for\n\
  \    inspiration; but I accept all blame.\n\
  
+ diff.default: converting default diff (not recommended for `patch`)\n

==== //users/jkristian/src/p4d2p.java#3 (text) ====

***************
*** 1,8 ****
  import java.io.File;
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
  import java.io.IOException;
- import java.io.PushbackReader;
  import java.io.Writer;
  import java.text.DateFormat;
  import java.text.SimpleDateFormat;
--- 1,5 ----
***************
*** 17,67 ****
  public class p4d2p implements LineWriter {
  
      public static void main(String[] ARGV) throws IOException {
!         UnixStyleFilter filter = new UnixStyleFilter(p4d2p.class, "hi::o:p:v", ARGV);
          try {
!             Properties options = filter.getOptions();
!             if (options.getProperty("h") != null) {
!                 filter.writeError(filter.getHelp());
              } else {
!                 filter.setEditInPlace(options.getProperty("i"));
!                 LineWriter self = new p4d2p(filter, filter.getOutputWriter());
!                 while (filter.getFile()) {
!                     Copier.copyAll(filter.getInputLineReader(), self);
                      self.close();
                  }
              }
          } finally {
!             filter.flush();
          }
      }
  
!     private String oldFile = null;
!     private String oldNote;
!     private String newFile;
!     private String newNote;
!     private List movedFiles = new ArrayList();
  
!     private static final Pattern P4_DESCRIBE_MOVE   = Pattern.compile("^\\.\\.\\. (//.+?\\#\\d+ (add|branch|delete))$", Pattern.MULTILINE);
!     private static final Pattern P4_MOVED_FILE      = Pattern.compile("//(.+?)(\\#\\d+) (\\w*)$", Pattern.MULTILINE);
!     private static final Pattern P4_DESCRIBE_HEADER = Pattern.compile("^==== //(.+?)(\\#\\d+) .*?====( \\(.+\\))?$", Pattern.MULTILINE);
!     private static final Pattern P4_DIFF_HEADER     = Pattern.compile("^==== //(.+?)(\\#\\d+) +- +(.+?) +====( \\(.+\\))?$", Pattern.MULTILINE);
!     private static final Pattern P4_DIFF2_HEADER    = Pattern.compile("^==== //(.+?)(\\#\\d+) +\\(.+?\\) +- +(.+?)(\\#\\d+) +\\(.+?\\) +==== +\\w+$", Pattern.MULTILINE);
  
!     private static final Pattern VERSION = Pattern.compile("\\#(\\d+)");
!     private static final Pattern UNIFIED_DIFF = Pattern.compile("^\\@\\@\\s.*\\s\\@\\@$", Pattern.MULTILINE);
!     private static final Pattern CONTEXT_DIFF = Pattern.compile("^\\*+$", Pattern.MULTILINE);
!     private static final Pattern DEFAULT_DIFF = Pattern.compile("^\\d+(,\\d+)?[acd]\\d+", Pattern.MULTILINE);
  
      public void write(StringBuffer line) throws IOException {
-         //if (verbose) out.write("// write(line)\n");
          Matcher m;
  
          if ((m = P4_DESCRIBE_MOVE.matcher(line)).find()) { // add, branch or delete
-             if (verbose) out.write("// p4 describe move\n");
              movedFiles.add(m.group(1));
  
          } else if ((m = P4_DIFF_HEADER.matcher(line)).find()) {
-             if (verbose) out.write("// p4 diff header\n");
              oldFile = m.group(1);
              newFile = m.group(3);
              oldNote = " " + options.getProperty("o", m.group(2));
--- 14,78 ----
  public class p4d2p implements LineWriter {
  
      public static void main(String[] ARGV) throws IOException {
!         UnixCommand command = new UnixCommand(p4d2p.class, "hi::o:p:v", ARGV);
          try {
!             Properties options = command.getOptions();
!             if (options.get("h") != null) {
!                 command.writeError(command.getHelp());
              } else {
!                 command.setEditInPlace(options.getProperty("i"));
!                 LineWriter self = new p4d2p(command);
!                 while (command.getFile()) {
!                     Copier.copyAll(command.getInputLineReader(), self);
                      self.close();
                  }
              }
          } finally {
!             command.flush();
          }
      }
  
!     protected p4d2p(UnixCommand command) throws IOException {
!         this.command = command;
!         this.options = command.getOptions();
!         this.verbose = (options.get("v") != null);
!         this.out = command.getOutputWriter();
!     }
! 
!     protected static DateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); // ISO 8601
!     protected static String epoch = timeFormat.format(new Date(0));
! 
!     protected String now = timeFormat.format(new Date());
!     protected UnixCommand command;
!     protected Properties options;
!     protected boolean verbose;
!     protected Writer out;
!     protected Writer err;
  
!     protected String oldFile = null;
!     protected String oldNote;
!     protected String newFile;
!     protected String newNote;
!     protected List movedFiles = new ArrayList();
  
!     protected static Pattern P4_DESCRIBE_MOVE   = Pattern.compile("^\\.\\.\\. (//.+?\\#\\d+ (add|branch|delete))$", Pattern.MULTILINE);
!     protected static Pattern P4_MOVED_FILE      = Pattern.compile("//(.+?)(\\#\\d+) (\\w*)$", Pattern.MULTILINE);
!     protected static Pattern P4_DESCRIBE_HEADER = Pattern.compile("^==== //(.+?)(\\#\\d+) .*?====( \\(.+\\))?$", Pattern.MULTILINE);
!     protected static Pattern P4_DIFF_HEADER     = Pattern.compile("^==== //(.+?)(\\#\\d+) +- +(.+?) +====( \\(.+\\))?$", Pattern.MULTILINE);
!     protected static Pattern P4_DIFF2_HEADER    = Pattern.compile("^==== //(.+?)(\\#\\d+) +\\(.+?\\) +- +(.+?)(\\#\\d+) +\\(.+?\\) +==== +\\w+$",
!                                                                   Pattern.MULTILINE);
!     protected static Pattern VERSION = Pattern.compile("\\#(\\d+)");
!     protected static Pattern UNIFIED_DIFF = Pattern.compile("^\\@\\@\\s.*\\s\\@\\@$", Pattern.MULTILINE);
!     protected static Pattern CONTEXT_DIFF = Pattern.compile("^\\*+$", Pattern.MULTILINE);
!     protected static Pattern DEFAULT_DIFF = Pattern.compile("^\\d+(,\\d+)?[acd]\\d+", Pattern.MULTILINE);
  
      public void write(StringBuffer line) throws IOException {
          Matcher m;
  
          if ((m = P4_DESCRIBE_MOVE.matcher(line)).find()) { // add, branch or delete
              movedFiles.add(m.group(1));
  
          } else if ((m = P4_DIFF_HEADER.matcher(line)).find()) {
              oldFile = m.group(1);
              newFile = m.group(3);
              oldNote = " " + options.getProperty("o", m.group(2));
***************
*** 69,82 ****
              newNote = " " + ((lastModified == 0) ? now : timeFormat.format(new Date(lastModified)));
  
          } else if ((m = P4_DIFF2_HEADER.matcher(line)).find()) {
-             if (verbose) out.write("// p4 diff2 header\n");
              oldFile = m.group(1);
              newFile = m.group(3);
              oldNote = " " + options.getProperty("o", m.group(2));
              newNote = " " + m.group(4);
  
          } else if ((m = P4_DESCRIBE_HEADER.matcher(line)).find()) {
-             if (verbose) out.write("// p4 describe header\n");
              newFile = m.group(1);
              newNote = " " + m.group(2);
              oldFile = newFile;
--- 80,91 ----
***************
*** 87,112 ****
          } else if (oldFile != null) {
  
              if ((m = UNIFIED_DIFF.matcher(line)).find()) { // the preferred format for `patch`
-                 if (verbose) System.err.println("emitting diff -u header");
                  out.write("Index: //" + oldFile + "\n");
                  out.write("--- " + oldFile + oldNote + "\n");
                  out.write("+++ " + oldFile + newNote + "\n");
                  oldFile = null;
  
              } else if ((m = CONTEXT_DIFF.matcher(line)).find()) {
-                 if (verbose) System.err.println("emitting diff -c header");
                  out.write("Index: //" + oldFile + "\n");
                  out.write("*** " + oldFile + oldNote + "\n");
                  out.write("--- " + oldFile + newNote + "\n");
                  oldFile = null;
  
              } else if ((m = DEFAULT_DIFF.matcher(line)).find()) {
!                 if (verbose) System.err.println("emitting diff header (not recommended for `patch`)");
                  out.write("Index: " + oldFile + "\n");
                  out.write("diff -r //" + oldFile + " " + newFile + "\n");
                  oldFile = null;
              }
          }
          out.write(line.toString());
      }
  
--- 96,120 ----
          } else if (oldFile != null) {
  
              if ((m = UNIFIED_DIFF.matcher(line)).find()) { // the preferred format for `patch`
                  out.write("Index: //" + oldFile + "\n");
                  out.write("--- " + oldFile + oldNote + "\n");
                  out.write("+++ " + oldFile + newNote + "\n");
                  oldFile = null;
  
              } else if ((m = CONTEXT_DIFF.matcher(line)).find()) {
                  out.write("Index: //" + oldFile + "\n");
                  out.write("*** " + oldFile + oldNote + "\n");
                  out.write("--- " + oldFile + newNote + "\n");
                  oldFile = null;
  
              } else if ((m = DEFAULT_DIFF.matcher(line)).find()) {
!                 if (verbose) command.writeError(command.getResource("diff.default"));
                  out.write("Index: " + oldFile + "\n");
                  out.write("diff -r //" + oldFile + " " + newFile + "\n");
                  oldFile = null;
              }
          }
+ 
          out.write(line.toString());
      }
  
***************
*** 123,134 ****
                  newFile = m.group(1);
                  newNote = m.group(2);
                  verb = m.group(3);
-                 if (verbose) System.err.println(verb);
                  oldFile = newFile;
!                 if (verb.equals("delete")) {
!                     Matcher version = VERSION.matcher(newNote);
!                     version.find();
!                     oldNote = "#" + (Long.parseLong(version.group(1)) - 1);
                      newNote = epoch;
                      file = p4print("//" + oldFile + oldNote);
                  } else { // add or branch
--- 131,140 ----
                  newFile = m.group(1);
                  newNote = m.group(2);
                  verb = m.group(3);
                  oldFile = newFile;
!                 if ("delete".equals(verb)) {
!                     (m = VERSION.matcher(newNote)).find();
!                     oldNote = "#" + (Long.parseLong(m.group(1)) - 1);
                      newNote = epoch;
                      file = p4print("//" + oldFile + oldNote);
                  } else { // add or branch
***************
*** 144,150 ****
                      out.write("--- " + oldFile + oldNote + "\n");
                      out.write("+++ " + newFile + newNote + "\n");
                      String prefix;
!                     if (verb.equals("delete")) {
                          out.write("@@ -1" + lines + " +0,0 @@\n");
                          prefix = "-";
                      } else { // add or branch
--- 150,156 ----
                      out.write("--- " + oldFile + oldNote + "\n");
                      out.write("+++ " + newFile + newNote + "\n");
                      String prefix;
!                     if ("delete".equals(verb)) {
                          out.write("@@ -1" + lines + " +0,0 @@\n");
                          prefix = "-";
                      } else { // add or branch
***************
*** 165,171 ****
          oldFile = null;
      }
  
!     private List p4print(String name) throws IOException {
          CommandLine cmd = (new CommandLine(options.getProperty("p", "p4 print -q"))).append(name);
          // Sadly, executing `p4 print` will consume some input.
          // Which is one reason not to emit files immediately
--- 171,177 ----
          oldFile = null;
      }
  
!     protected List p4print(String name) throws IOException {
          CommandLine cmd = (new CommandLine(options.getProperty("p", "p4 print -q"))).append(name);
          // Sadly, executing `p4 print` will consume some input.
          // Which is one reason not to emit files immediately
***************
*** 173,198 ****
          ProcessInputStream p = new ProcessInputStream(cmd.exec());
          List file = (new LineReader(p)).readList();
          if (p.exitValue() != 0) {
!             System.err.println("exit " + p.exitValue() + " from " + cmd);
          }
          return file;
      }
  
-     protected UnixStyleFilter filter;
-     protected Properties options;
-     protected boolean verbose;
-     protected Writer out;
- 
-     private p4d2p(UnixStyleFilter filter, Writer out) {
-         this.filter = filter;
-         this.options = filter.getOptions();
-         this.verbose = (options.getProperty("v") != null);
-         this.out = out;
-     }
- 
-     private static DateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); // ISO 8601
-     private static final String epoch = timeFormat.format(new Date(0));
- 
-     private String now = timeFormat.format(new Date());
- 
  }
--- 179,187 ----
          ProcessInputStream p = new ProcessInputStream(cmd.exec());
          List file = (new LineReader(p)).readList();
          if (p.exitValue() != 0) {
!             command.writeError("exit " + p.exitValue() + " from " + cmd + "\n");
          }
          return file;
      }
  
  }