package org.tmatesoft.svn.core.internal.wc17;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.util.Iterator;
import org.tmatesoft.svn.core.SVNErrorCode;
import org.tmatesoft.svn.core.SVNErrorMessage;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNNodeKind;
import org.tmatesoft.svn.core.SVNProperties;
import org.tmatesoft.svn.core.SVNPropertyValue;
import org.tmatesoft.svn.core.internal.util.SVNSkel;
import org.tmatesoft.svn.core.internal.wc.FSMergerBySequence;
import org.tmatesoft.svn.core.internal.wc.SVNConflictVersion;
import org.tmatesoft.svn.core.internal.wc.SVNDiffConflictChoiceStyle;
import org.tmatesoft.svn.core.internal.wc.SVNErrorManager;
import org.tmatesoft.svn.core.internal.wc.SVNFileUtil;
import org.tmatesoft.svn.core.internal.wc.admin.SVNAdminArea;
import org.tmatesoft.svn.core.internal.wc.admin.SVNLog;
import org.tmatesoft.svn.core.internal.wc17.SVNWCContext.ConflictMarkersInfo;
import org.tmatesoft.svn.core.internal.wc17.db.SvnWcDbConflicts;
import org.tmatesoft.svn.core.wc.ISVNConflictHandler;
import org.tmatesoft.svn.core.wc.SVNDiffOptions;
import org.tmatesoft.svn.core.wc.SVNMergeFileSet;
import org.tmatesoft.svn.core.wc.SVNMergeResult;
import org.tmatesoft.svn.core.wc.SVNStatusType;
import org.tmatesoft.svn.core.wc2.ISvnMerger;
import org.tmatesoft.svn.core.wc2.SvnMergeResult;
import org.tmatesoft.svn.util.SVNLogType;
import de.regnis.q.sequence.line.QSequenceLineRAData;
import de.regnis.q.sequence.line.QSequenceLineRAFileData;
public class DefaultSvnMerger implements ISvnMerger {
private final SVNWCContext context;
private SVNSkel workItems;
public DefaultSvnMerger(SVNWCContext context) {
this.context = context;
}
public SVNSkel getWorkItems() {
return workItems;
}
public SVNMergeResult mergeText(SVNMergeFileSet files, boolean dryRun, SVNDiffOptions options) throws SVNException {
return null;
}
public SVNMergeResult mergeProperties(String localPath, SVNProperties workingProperties, SVNProperties baseProperties, SVNProperties serverBaseProps, SVNProperties propDiff, SVNAdminArea adminArea, SVNLog log, boolean baseMerge, boolean dryRun) throws SVNException {
return null;
}
public SvnMergeResult mergeText(ISvnMerger baseMerger, File resultFile,
File targetAbspath,
File detranslatedTargetAbspath, File leftAbspath,
File rightAbspath, String targetLabel, String leftLabel,
String rightLabel, SVNDiffOptions options, SVNDiffConflictChoiceStyle style) throws SVNException {
ConflictMarkersInfo markersInfo = context.initConflictMarkers(targetLabel, leftLabel, rightLabel);
String targetMarker = markersInfo.targetMarker;
String leftMarker = markersInfo.leftMarker;
String rightMarker = markersInfo.rightMarker;
FSMergerBySequence merger = new FSMergerBySequence(targetMarker.getBytes(), SVNWCContext.CONFLICT_SEPARATOR, rightMarker.getBytes(), leftMarker.getBytes());
int mergeResult = 0;
RandomAccessFile localIS = null;
RandomAccessFile latestIS = null;
RandomAccessFile baseIS = null;
OutputStream result = null;
try {
result = SVNFileUtil.openFileForWriting(resultFile);
localIS = new RandomAccessFile(detranslatedTargetAbspath, "r");
latestIS = new RandomAccessFile(rightAbspath, "r");
baseIS = new RandomAccessFile(leftAbspath, "r");
QSequenceLineRAData baseData = new QSequenceLineRAFileData(baseIS);
QSequenceLineRAData localData = new QSequenceLineRAFileData(localIS);
QSequenceLineRAData latestData = new QSequenceLineRAFileData(latestIS);
mergeResult = merger.merge(baseData, localData, latestData, options, result, style);
} catch (IOException e) {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.IO_ERROR, e.getLocalizedMessage());
SVNErrorManager.error(err, e, SVNLogType.WC);
} finally {
SVNFileUtil.closeFile(result);
SVNFileUtil.closeFile(localIS);
SVNFileUtil.closeFile(baseIS);
SVNFileUtil.closeFile(latestIS);
}
if (mergeResult == FSMergerBySequence.CONFLICTED) {
return SvnMergeResult.create(SVNStatusType.CONFLICTED);
}
return SvnMergeResult.create(SVNStatusType.MERGED);
}
public SvnMergeResult mergeProperties(ISvnMerger baseMerger,
File localAbsPath, SVNNodeKind kind,
SVNConflictVersion leftVersion, SVNConflictVersion rightVersion,
SVNProperties serverBaseProperties,
SVNProperties pristineProperties, SVNProperties actualProperties,
SVNProperties propChanges, boolean baseMerge, boolean dryRun, ISVNConflictHandler conflictResolver) throws SVNException {
SVNWCContext.MergePropertiesInfo mergePropertiesInfo = new SVNWCContext.MergePropertiesInfo();
mergePropertiesInfo = context.mergeProperties3(mergePropertiesInfo, localAbsPath, serverBaseProperties, pristineProperties, actualProperties, propChanges);
SvnMergeResult result = new SvnMergeResult(mergePropertiesInfo.mergeOutcome);
if (dryRun) {
return SvnMergeResult.create(mergePropertiesInfo.mergeOutcome);
}
result.setActualProperties(mergePropertiesInfo.newActualProperties);
result.setBaseProperties(mergePropertiesInfo.newBaseProperties);
SVNSkel conflictSkel = mergePropertiesInfo.conflictSkel;
SVNSkel workItems = null;
if (conflictSkel != null) {
SvnWcDbConflicts.conflictSkelOpMerge(conflictSkel, leftVersion, rightVersion);
SVNSkel workItem = SvnWcDbConflicts.createConflictMarkers(context.getDb(), localAbsPath, conflictSkel);
workItems = context.wqMerge(workItems, workItem);
}
this.workItems = workItems;
result.setConflictSkel(conflictSkel);
return result;
}
}