blob: c5cb47b712ac7754ab7805bac64ae5d1a1b16801 [file] [log] [blame]
/*
* Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.idea.svn.commandLine;
import org.apache.subversion.javahl.ConflictDescriptor;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.svn.portable.ConflictActionConvertor;
import org.jetbrains.idea.svn.portable.IdeaSVNInfo;
import org.tmatesoft.svn.core.*;
import org.tmatesoft.svn.core.internal.wc.SVNConflictVersion;
import org.tmatesoft.svn.core.wc.*;
import org.xml.sax.SAXException;
import java.io.File;
import java.util.Date;
/**
* Created with IntelliJ IDEA.
* User: Irina.Chernushina
* Date: 1/27/12
* Time: 2:11 PM
*/
public class SvnInfoStructure {
@Nullable public File myFile;
public String relativeUrl;
public SVNURL myUrl;
public SVNURL myRootURL;
public long myRevision;
public SVNNodeKind myKind;
public String myUuid;
public long myCommittedRevision;
public Date myCommittedDate;
public String myAuthor;
public String mySchedule;
public SVNURL myCopyFromURL;
public long myCopyFromRevision;
public Date myTextTime;
public String myPropTime;
public String myChecksum;
public String myConflictOld;
public String myConflictNew;
public String myConflictWorking;
public String myPropRejectFile;
public SVNLockWrapper myLockWrapper;
public SVNDepth myDepth;
public String myChangelistName;
public long myWcSize;
public Date myCorrectCommittedDate;
public Date myCorrectTextDate;
public TreeConflictDescription myTreeConflict;
public SVNInfo convert() throws SAXException, SVNException {
return new IdeaSVNInfo(myFile, myUrl, myRootURL, myRevision, myKind, myUuid, myCommittedRevision, myCommittedDate, myAuthor, mySchedule,
myCopyFromURL, myCopyFromRevision, myTextTime, myPropTime, myChecksum, myConflictOld, myConflictNew, myConflictWorking,
myPropRejectFile, getLock(), myDepth, myChangelistName, myWcSize, createTreeConflict());
}
private SVNLock getLock() {
SVNLock lock = null;
if (myLockWrapper != null) {
myLockWrapper.setPath(relativeUrl);
lock = myLockWrapper.create();
}
return lock;
}
private SVNTreeConflictDescription createTreeConflict() throws SAXException, SVNException {
if (myTreeConflict == null) {
return null;
}
else {
assert myFile != null;
final SVNConflictAction action = ConflictActionConvertor.create(ConflictDescriptor.Action.valueOf(myTreeConflict.myAction));
final SVNConflictReason reason = parseConflictReason(myTreeConflict.myReason);
//final SVNConflictReason reason = ConflictReasonConvertor.convert(ConflictDescriptor.Reason.valueOf(myTreeConflict.myReason));
SVNOperation operation = SVNOperation.fromString(myTreeConflict.myOperation);
operation = operation == null ? SVNOperation.NONE : operation;
return new SVNTreeConflictDescription(myFile, myKind, action, reason, operation,
createVersion(myTreeConflict.mySourceLeft),
createVersion(myTreeConflict.mySourceRight));
}
}
private SVNConflictReason parseConflictReason(String reason) throws SAXException {
if (ConflictDescriptor.Reason.edited.name().equals(reason)) {
return SVNConflictReason.EDITED;
} else if (ConflictDescriptor.Reason.obstructed.name().equals(reason)) {
return SVNConflictReason.OBSTRUCTED;
} else if (ConflictDescriptor.Reason.deleted.name().equals(reason)) {
return SVNConflictReason.DELETED;
} else if (ConflictDescriptor.Reason.missing.name().equals(reason)) {
return SVNConflictReason.MISSING;
} else if (ConflictDescriptor.Reason.unversioned.name().equals(reason)) {
return SVNConflictReason.UNVERSIONED;
} else if (ConflictDescriptor.Reason.added.name().equals(reason)) {
return SVNConflictReason.ADDED;
} else if (ConflictDescriptor.Reason.replaced.name().equals(reason)) {
return SVNConflictReason.REPLACED;
}
if ("edit".equals(reason)) {
return SVNConflictReason.EDITED;
} else if (reason.contains("obstruct")) {
return SVNConflictReason.OBSTRUCTED;
} else if ("delete".equals(reason)) {
return SVNConflictReason.DELETED;
} else if (reason.contains("miss")) {
return SVNConflictReason.MISSING;
} else if (reason.contains("unversion")) {
return SVNConflictReason.UNVERSIONED;
} else if (reason.contains("add")) {
return SVNConflictReason.ADDED;
} else if (reason.contains("replace")) {
return SVNConflictReason.REPLACED;
}
throw new SAXException("Can not parse conflict reason: " + reason);
}
private SVNConflictVersion createVersion(final ConflictVersion version) throws SVNException, SAXException {
return version == null ? null : new SVNConflictVersion(SVNURL.parseURIEncoded(version.myRepoUrl), version.myPathInRepo,
parseRevision(version.myRevision), SVNNodeKind.parseKind(version.myKind));
}
private long parseRevision(final String revision) throws SAXException {
try {
return Long.parseLong(revision);
} catch (NumberFormatException e) {
throw new SAXException(e);
}
}
public static class TreeConflictDescription {
public String myOperation;
public String myKind;
public String myReason;
public String myVictim;
public String myAction;
public ConflictVersion mySourceLeft;
public ConflictVersion mySourceRight;
}
public static class ConflictVersion {
public String myKind;
public String myPathInRepo;
public String myRepoUrl;
public String myRevision;
}
}