summaryrefslogtreecommitdiff
path: root/plugins/svn4idea/src/org/jetbrains/idea/svn/commandLine/SvnCommitRunner.java
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/svn4idea/src/org/jetbrains/idea/svn/commandLine/SvnCommitRunner.java')
-rw-r--r--plugins/svn4idea/src/org/jetbrains/idea/svn/commandLine/SvnCommitRunner.java66
1 files changed, 51 insertions, 15 deletions
diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/commandLine/SvnCommitRunner.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/commandLine/SvnCommitRunner.java
index 1f93976434af..cf13f1267c7c 100644
--- a/plugins/svn4idea/src/org/jetbrains/idea/svn/commandLine/SvnCommitRunner.java
+++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/commandLine/SvnCommitRunner.java
@@ -29,6 +29,8 @@ import org.tmatesoft.svn.core.wc2.SvnTarget;
import java.io.File;
import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
/**
* Created with IntelliJ IDEA.
@@ -94,6 +96,14 @@ public class SvnCommitRunner {
}
public static class CommandListener extends LineCommandListener {
+
+ // Status could contain spaces, like "Adding copy of <path>". But at the end we are not interested in "copy of" part and want to have
+ // only "Adding" in match group.
+ private static final String STATUS = "\\s*(\\w+)(.*?)\\s\\s+";
+ private static final String OPTIONAL_FILE_TYPE = "(\\(.*\\))?";
+ private static final String PATH = "\\s*(.*?)\\s*";
+ private static final Pattern CHANGED_PATH = Pattern.compile(STATUS + OPTIONAL_FILE_TYPE + PATH);
+
@Nullable private final CommitEventHandler myHandler;
private SvnBindException myException;
private long myCommittedRevision = Revision.SVN_INVALID_REVNUM;
@@ -138,6 +148,24 @@ public class SvnCommitRunner {
}
return;
}
+ if (line.startsWith(CommitEventType.skipped.getText())) {
+ File target = null;
+ if (myHandler != null) {
+ int pathStart = line.indexOf('\'');
+ if (pathStart > -1) {
+ int pathEnd = line.indexOf('\'', pathStart + 1);
+ if (pathEnd > -1) {
+ target = toFile(line.substring(pathStart + 1, pathEnd));
+ }
+ }
+ if (target != null) {
+ myHandler.commitEvent(CommitEventType.skipped, myBase);
+ } else {
+ LOG.info("Can not parse 'Skipped' path " + line);
+ }
+ }
+ return;
+ }
if (line.startsWith(CommitEventType.committedRevision.getText())) {
final String substring = line.substring(CommitEventType.committedRevision.getText().length());
int cnt = 0;
@@ -167,26 +195,34 @@ public class SvnCommitRunner {
}
} else {
if (myHandler == null) return;
- // status and path are separated by several spaces
- final int idxSpace = line.indexOf(" ");
- if (idxSpace == -1) {
- LOG.info("Can not parse event type: " + line);
- return;
- }
- final CommitEventType type = CommitEventType.create(line.substring(0, idxSpace));
- if (type == null) {
- LOG.info("Can not parse event type: " + line);
- return;
- }
- File target = new File(new String(line.substring(idxSpace + 1).trim()));
- if (!target.isAbsolute()) {
- target = new File(myBase, target.getPath());
+
+ Matcher matcher = CHANGED_PATH.matcher(line);
+ if (matcher.matches()) {
+ final CommitEventType type = CommitEventType.create(matcher.group(1));
+ if (type == null) {
+ LOG.info("Can not parse event type: " + line);
+ return;
+ }
+ myHandler.commitEvent(type, toFile(matcher.group(4)));
+ } else {
+ LOG.info("Can not parse output: " + line);
}
- myHandler.commitEvent(type, target);
}
}
+
+ @NotNull
+ private File toFile(@NotNull String path) {
+ File result = new File(path);
+
+ if (!result.isAbsolute()) {
+ result = new File(myBase, result.getPath());
+ }
+
+ return result;
+ }
}
+
/*C:\TestProjects\sortedProjects\Subversion\local2\preRelease\mod2\src\com\test>sv
n st
D gggG