Last active
August 29, 2015 13:56
-
-
Save yu-tang/9302731 to your computer and use it in GitHub Desktop.
OmegaT scripting: Upload source files to SVN remote repository
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Commit source file changes to SVN remote repository | |
* | |
* Supported basic operations are shown in the next list. | |
* | |
* 1. svn add for manually added (unversioned) files/folders. | |
* 2. svn delete for manually deleting (missing) files/folders. | |
* 3. modified files. | |
* | |
* copy, move, merge or any other svn commands are not available. | |
* | |
* @author Yu Tang | |
* @date 2014-03-09 | |
* @since 2014-03-03 | |
* @version 0.4 | |
*/ | |
import static javax.swing.JOptionPane.* | |
import org.omegat.core.team.SVNRemoteRepository | |
import static org.omegat.util.FileUtil.computeRelativePath | |
import org.omegat.util.Log | |
import static org.omegat.util.Preferences.* | |
import static org.tmatesoft.svn.core.SVNDepth.EMPTY | |
import static org.tmatesoft.svn.core.SVNDepth.INFINITY | |
import static org.tmatesoft.svn.core.SVNNodeKind.* | |
import org.tmatesoft.svn.core.wc.ISVNStatusHandler | |
import static org.tmatesoft.svn.core.wc.SVNRevision.WORKING | |
import static org.tmatesoft.svn.core.wc.SVNStatusType.* | |
// constants (for v3.1.0 or later) | |
final def RET_VAL_COMMIT_NOT_EXECUTED = "Your commit is not executed." | |
final def RET_VAL_COMMIT_EXECUTED = "Your commit is executed. Wait a little while and see detailed information." | |
def repo = project.getRepository() | |
// abort when valid svn repository is not available | |
if (!availSvnRepo(repo)) { | |
return RET_VAL_COMMIT_NOT_EXECUTED | |
} | |
def sourceDir = new File(project.projectProperties.sourceRoot) | |
def man = repo.ourClientManager | |
def WCClient = man.WCClient | |
def commitClient = man.commitClient | |
// SVNStatus[] | |
def (items2BAdded, items2BDeleted) = getStats2BAddedOrDeleted(man.statusClient, WCClient, sourceDir) | |
// SVNCommitItem[] | |
def packet = getPacket(commitClient, sourceDir) | |
// exit if no commit items | |
if (!items2BAdded && !items2BDeleted && !packet.commitItems) { | |
packet.dispose() | |
console.println "No commit items found." | |
return RET_VAL_COMMIT_NOT_EXECUTED | |
} | |
// ask user for commit | |
def commitItemList = getCommitItemListString(items2BAdded, items2BDeleted, packet.commitItems, sourceDir) | |
int ret = askUserForCommit(commitItemList) | |
packet.dispose() | |
if (ret == CANCEL_OPTION) { | |
console.println "Commit operation has been canceled by user." | |
return RET_VAL_COMMIT_NOT_EXECUTED | |
} | |
// svn add items | |
items2BAdded.each { status -> | |
WCClient.doAdd(status.file, false, false, false, EMPTY, false, false) | |
} | |
// svn delete items | |
items2BDeleted.each { status -> | |
WCClient.doDelete(status.file, false, false) | |
} | |
// commit | |
Log.logInfoRB "SVN_START", "upload" | |
mainWindow.showStatusMessageRB "TEAM_SYNCHRONIZE" | |
console.println "Now uploading ..." | |
Thread.start { | |
doCommit(man, sourceDir, repo, commitItemList) | |
} | |
// exit | |
return RET_VAL_COMMIT_EXECUTED | |
// =================================================================== | |
// verify valid svn repository available | |
boolean availSvnRepo(repository) { | |
if (!repository) { | |
console.println "The project is not loaded yet or not a Team project." | |
return false | |
} | |
if (!(repository instanceof SVNRemoteRepository)) { | |
console.println "This repository type is not SVN." | |
return false | |
} | |
if (repository.readOnly) { | |
console.println "This repository is read-only. Could not upload." | |
return false | |
} | |
true | |
} | |
// Get statuses to be added or deleted to version control. | |
def getStats2BAddedOrDeleted(statusClient, WCClient, sourceDir) { | |
def added = [], deleted = [] | |
statusClient.doStatus(sourceDir, WORKING, INFINITY, false, false, false, false, { status -> | |
switch (status.combinedNodeAndContentsStatus) { | |
// add | |
case STATUS_UNVERSIONED: | |
added << status | |
break | |
// delete | |
case STATUS_MISSING: | |
deleted << status | |
break | |
} | |
} as ISVNStatusHandler, null) | |
[added, deleted] | |
} | |
// Get packet | |
def getPacket(commitClient, sourceDir) { | |
commitClient.doCollectCommitItems( | |
[sourceDir] as File[], false, false, INFINITY, null) | |
} | |
// ask user for commit | |
def askUserForCommit(commitItemListString) { | |
def title = "Commit source items" | |
def msg = "Your commit includes these changes:\n" + commitItemListString | |
mainWindow.showConfirmDialog(msg, title, OK_CANCEL_OPTION, PLAIN_MESSAGE) | |
} | |
// commit item list string | |
def getCommitItemListString(items2BAdded, items2BDeleted, commitItems, sourceRoot) { | |
def ret = "" | |
def op = "Add" | |
items2BAdded.each {status -> | |
def kind = status.file.isFile() ? FILE : DIR | |
def path = computeRelativePath(sourceRoot, status.file) | |
ret += "\n$op ($kind) $path" | |
} | |
op = "Del" | |
items2BDeleted.each {status -> | |
def path = computeRelativePath(sourceRoot, status.file) | |
ret += "\n$op ($status.kind) $path" | |
} | |
commitItems.each { item -> | |
op = "Unk" | |
if (item.isAdded()) { | |
op = "Add" | |
} else if (item.isContentsModified()) { | |
op = "Mod" | |
} else if (item.isCopied()) { | |
op = "Copy" // just in case | |
} else if (item.isDeleted()) { | |
op = "Del" | |
} | |
def path = computeRelativePath(sourceRoot, item.file) | |
ret += "\n$op ($item.kind) $path" | |
} | |
ret | |
} | |
// commit | |
def doCommit(manager, sourceDir, repository, commitItemList) { | |
def author = getPreferenceDefault(TEAM_AUTHOR, System.getProperty("user.name")) | |
def commitMessage = "Changed source item(s) by $author" | |
try { | |
def client = manager.commitClient | |
def packet = getPacket(client, sourceDir) | |
def info = client.doCommit(packet, false, commitMessage) | |
if (info.errorMessage) { | |
throw new IOException(info.errorMessage) | |
} | |
console.println "Commit completed." + commitItemList | |
Log.logDebug SVNRemoteRepository.LOGGER, "SVN committed followed files into new revision {0}" + commitItemList, info.newRevision | |
Log.logInfoRB "SVN_FINISH", "upload" | |
mainWindow.showStatusMessageRB null | |
} catch(ex) { | |
Log.logErrorRB "SVN_ERROR", "upload", ex.message | |
console.println "Commit failed: ${ex.message}" | |
mainWindow.showStatusMessageRB "SVN_ERROR", "upload", ex.message | |
} finally { | |
packet.dispose() | |
manager.WCClient.doCleanup sourceDir, true | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment