/**************************************************************************
OmegaT - Computer Assisted Translation (CAT) tool
with fuzzy matching, translation memory, keyword search,
glossaries, and translation leveraging into updated projects.
Copyright (C) 2014 Alex Buloichik
Home page: http://www.omegat.org/
Support center: http://groups.yahoo.com/group/OmegaT/
This file is part of OmegaT.
OmegaT is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OmegaT is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
**************************************************************************/
package org.omegat.convert;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import org.apache.commons.io.FileUtils;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import org.omegat.core.Core;
import org.omegat.core.data.ProjectProperties;
import org.omegat.core.team2.ProjectTeamSettings;
import org.omegat.core.team2.RebaseAndCommit;
import org.omegat.core.team2.RemoteRepositoryProvider;
import org.omegat.util.OStrings;
import org.omegat.util.ProjectFileStorage;
import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc2.SvnGetInfo;
import org.tmatesoft.svn.core.wc2.SvnInfo;
import org.tmatesoft.svn.core.wc2.SvnOperationFactory;
import org.tmatesoft.svn.core.wc2.SvnTarget;
import gen.core.project.RepositoryDefinition;
import gen.core.project.RepositoryMapping;
/**
* Check if project is 2.6-style team project, i.e. 'inplace' repository working copy exit. Then convert it
* into 3.6-style team project.
*
* @author Alex Buloichik (alex73mail@gmail.com)
*/
public class ConvertProject26to37team {
public static void checkTeam(File projectRootFolder) throws Exception {
if (isSVNDirectory(projectRootFolder) || isGITDirectory(projectRootFolder)) {
// project is 2.6-style team project
if (isConsoleMode()) {
Core.getMainWindow().displayWarningRB("TEAM_26_TO_37_CONSOLE");
return;
}
// ask for convert
int res = JOptionPane.showConfirmDialog(Core.getMainWindow().getApplicationFrame(),
OStrings.getString("TEAM_26_to_37_CONFIRM_MESSAGE"),
OStrings.getString("TEAM_26_to_37_CONFIRM_TITLE"), JOptionPane.OK_CANCEL_OPTION);
if (res != JOptionPane.OK_OPTION) {
return;
}
// convert
convert(projectRootFolder);
JOptionPane.showMessageDialog(Core.getMainWindow().getApplicationFrame(),
OStrings.getString("TEAM_26_to_37_CONVERTED_MESSAGE"),
OStrings.getString("TEAM_26_to_37_CONFIRM_TITLE"), JOptionPane.INFORMATION_MESSAGE);
}
}
private static void convert(File projectRootFolder) throws Exception {
ProjectProperties props = ProjectFileStorage.loadProjectProperties(projectRootFolder);
String version;
String url;
RepositoryDefinition def = new RepositoryDefinition();
if (isSVNDirectory(projectRootFolder)) {
url = getSVNUrl(projectRootFolder);
def.setType("svn");
version = getSVNTmxVersion(projectRootFolder);
} else {
url = getGITUrl(projectRootFolder);
def.setType("git");
version = getGITTmxVersion(projectRootFolder);
}
if (url == null) {
throw new Exception("Repository URL not defined");
}
def.setUrl(url);
saveVersion(projectRootFolder, "omegat/project_save.tmx", version);
// map full project
RepositoryMapping map = new RepositoryMapping();
map.setLocal("");
map.setRepository("");
def.getMapping().add(map);
props.setRepositories(new ArrayList<RepositoryDefinition>());
props.getRepositories().add(def);
ProjectFileStorage.writeProjectFile(props);
// all data saved - remove old repository
FileUtils.deleteDirectory(new File(projectRootFolder, ".svn"));
FileUtils.deleteDirectory(new File(projectRootFolder, ".git"));
}
/**
* Save version of project_save.tmx to .repositories/versions.properties.
*/
private static void saveVersion(File projectRootFolder, String file, String version) throws IOException {
ProjectTeamSettings teamSettings = new ProjectTeamSettings(new File(projectRootFolder,
RemoteRepositoryProvider.REPO_SUBDIR));
teamSettings.set(RebaseAndCommit.VERSION_PREFIX + file, version);
}
/**
* Check if project contains 2.6-style SVN directory.
*/
private static boolean isSVNDirectory(File projectRootFolder) {
File svnDir = new File(projectRootFolder, ".svn");
return svnDir.exists() && svnDir.isDirectory();
}
/**
* Check if project contains 2.6-style GIT directory.
*/
private static boolean isGITDirectory(File projectRootFolder) {
File gitDir = new File(projectRootFolder, ".git");
return gitDir.exists() && gitDir.isDirectory();
}
/**
* Get repository URL for SVN.
*/
private static String getSVNUrl(File wc) throws Exception {
final SvnOperationFactory of = new SvnOperationFactory();
final SvnGetInfo infoOp = of.createGetInfo();
infoOp.setSingleTarget(SvnTarget.fromFile(wc));
infoOp.setDepth(SVNDepth.EMPTY);
infoOp.setRevision(SVNRevision.WORKING);
final SvnInfo info = infoOp.run();
SVNURL svn = info.getUrl();
return svn.toString();
}
/**
* Get repository URL for SVN.
*/
private static String getGITUrl(File wc) throws Exception {
Repository repository = Git.open(wc).getRepository();
StoredConfig config = repository.getConfig();
return config.getString("remote", "origin", "url");
}
/**
* Get version of "omegat/project_save.tmx" in SVN.
*/
private static String getSVNTmxVersion(File wc) throws Exception {
final SvnOperationFactory of = new SvnOperationFactory();
final SvnGetInfo infoOp = of.createGetInfo();
infoOp.setSingleTarget(SvnTarget.fromFile(new File(wc, "omegat/project_save.tmx")));
infoOp.setDepth(SVNDepth.EMPTY);
SvnInfo info = infoOp.run();
long r = info.getRevision();
return Long.toString(r);
}
/**
* Get version of "omegat/project_save.tmx" in GIT.
*/
private static String getGITTmxVersion(File wc) throws Exception {
Repository repository = Git.open(wc).getRepository();
try (RevWalk walk = new RevWalk(repository)) {
Ref localBranch = repository.findRef("HEAD");
RevCommit headCommit = walk.lookupCommit(localBranch.getObjectId());
return headCommit.getName();
}
}
/**
* Check if executed in console mode.
*/
private static boolean isConsoleMode() {
try {
Core.getMainWindow().getApplicationFrame();
return false;
} catch (NoSuchMethodError ex) {
return true;
}
}
}