package jetbrains.mps.vcs.platform.util;
/*Generated by MPS */
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import java.io.File;
import com.intellij.openapi.vfs.VirtualFile;
import java.io.IOException;
import jetbrains.mps.util.FileUtil;
import jetbrains.mps.vcs.util.MergeDriverBackupUtil;
import jetbrains.mps.vcs.util.MergeConstants;
import jetbrains.mps.vcs.util.MergeVersion;
import jetbrains.mps.ide.vfs.VirtualFileUtils;
import com.intellij.util.io.ZipUtil;
import com.intellij.openapi.application.PathManager;
import java.io.FilenameFilter;
import org.apache.log4j.Level;
import org.jetbrains.annotations.Nullable;
import jetbrains.mps.vcs.util.ModelVersion;
import jetbrains.mps.util.UnzipUtil;
import jetbrains.mps.project.MPSExtentions;
import jetbrains.mps.smodel.SModel;
import jetbrains.mps.smodel.persistence.def.ModelReadException;
import jetbrains.mps.vcspersistence.VCSPersistenceSupport;
import jetbrains.mps.vfs.IFile;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.internal.collections.runtime.ISelector;
public class MergeBackupUtil {
private static final Logger LOG = LogManager.getLogger(MergeBackupUtil.class);
public MergeBackupUtil() {
}
public static File zipModel(byte[][] contents, VirtualFile file) throws IOException {
File tmpDir = FileUtil.createTmpDir();
MergeDriverBackupUtil.writeContentsToFile(contents[MergeConstants.ORIGINAL], file.getName(), tmpDir, MergeVersion.BASE.getSuffix());
MergeDriverBackupUtil.writeContentsToFile(contents[MergeConstants.CURRENT], file.getName(), tmpDir, MergeVersion.MINE.getSuffix());
MergeDriverBackupUtil.writeContentsToFile(contents[MergeConstants.LAST_REVISION], file.getName(), tmpDir, MergeVersion.REPOSITORY.getSuffix());
File zipfile = chooseZipFileForModelFile(VirtualFileUtils.toIFile(file));
zipfile.getParentFile().mkdirs();
FileUtil.zip(tmpDir, zipfile);
FileUtil.delete(tmpDir);
return zipfile;
}
public static void packMergeResult(File file, String fileName, String resultContent) {
try {
File tmp = FileUtil.createTmpDir();
ZipUtil.extract(file, tmp, null);
// copy merge result
FileUtil.writeFile(new File(tmp + File.separator + fileName + ".result"), resultContent);
// copy logfiles
File logsDir = new File(PathManager.getLogPath());
File[] logfiles = logsDir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.matches("mpsvcs\\.log(\\.1)?") || name.matches("mps\\.log(\\.1)?");
}
});
File tmpLogDir = new File(tmp + File.separator + "logs");
tmpLogDir.mkdir();
for (File logfile : logfiles) {
FileUtil.copyFile(logfile, new File(tmpLogDir + File.separator + logfile.getName()));
}
FileUtil.zip(tmp, file);
FileUtil.delete(tmp);
} catch (IOException e) {
if (LOG.isEnabledFor(Level.ERROR)) {
LOG.error("", e);
}
}
}
public static String getMergeBackupDirPath() {
return PathManager.getSystemPath() + File.separator + "merge-backup";
}
@Nullable
public static String[] loadZippedModelsAsText(File zipfile, ModelVersion[] versions) throws IOException {
File tmpdir = FileUtil.createTmpDir();
UnzipUtil.unzip(zipfile, tmpdir);
String[] models = new String[versions.length];
int index = 0;
for (final ModelVersion v : versions) {
File file;
File[] files = tmpdir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(MPSExtentions.DOT_MODEL + "." + v.getSuffix());
}
});
if (files == null || files.length != 1) {
if (LOG.isEnabledFor(Level.ERROR)) {
LOG.error("Wrong zip contents");
}
}
file = files[0];
char[] fileText = com.intellij.openapi.util.io.FileUtil.loadFileText(file);
models[index] = new String(fileText);
index++;
}
FileUtil.delete(tmpdir);
return models;
}
@Nullable
public static SModel[] loadZippedModels(File zipfile, ModelVersion[] versions) throws IOException, ModelReadException {
String[] modelsAsText = MergeBackupUtil.loadZippedModelsAsText(zipfile, versions);
if (modelsAsText == null) {
return null;
}
SModel[] models = new SModel[modelsAsText.length];
for (int i = 0; i < models.length; i++) {
models[i] = VCSPersistenceSupport.readModel(modelsAsText[i], false);
}
return models;
}
public static File chooseZipFileForModelFile(IFile file) {
// FIXME Please, please! Year 2015, two static classes, one set static fields of another?!
MergeDriverBackupUtil.setMergeBackupDirPath(getMergeBackupDirPath());
// What was the reason to alter name of the backup file with model name?
return MergeDriverBackupUtil.chooseZipFileForModelLongName(file.getName(), null);
}
public static Iterable<File> findZipFilesForModelFile(final String modelFileName) {
File[] files = new File(MergeBackupUtil.getMergeBackupDirPath()).listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.contains(modelFileName) && name.endsWith(".zip");
}
});
return Sequence.fromIterable(Sequence.fromArray(files)).sort(new ISelector<File, String>() {
public String select(File f) {
return f.getName();
}
}, false);
}
}