use of org.eclipse.jgit.api.errors.CanceledException in project omegat by omegat-org.
the class GITExternalGpgSigner method signWithGpg.
private byte[] signWithGpg(byte[] data, String keySpec, String gpgProgram) throws IOException, CanceledException {
// Sign an object with an external GPG executable. GPG handles
// passphrase entry, including gpg-agent and native keychain
// integration.
String program = gpgProgram;
if (StringUtils.isEmptyOrNull(program)) {
program = FROM_PATH.getGpg();
if (StringUtils.isEmptyOrNull(program)) {
throw new IOException(OStrings.getString(ExternalGpgSigner_gpgNotFound));
}
}
ProcessBuilder process = new ProcessBuilder();
process.command(program, // $NON-NLS-1$
"-bsau", keySpec, // $NON-NLS-1$
"--batch", // $NON-NLS-1$
"--no-tty", // $NON-NLS-1$
"--status-fd", // $NON-NLS-1$
"2", // $NON-NLS-1$
"--output", // $NON-NLS-1$
"-");
gpgEnvironment(process);
try (ByteArrayInputStream dataIn = new ByteArrayInputStream(data)) {
class Holder {
byte[] rawData;
}
Holder result = new Holder();
runProcess(process, dataIn, b -> {
// Sanity check: do we have a signature?
GpgSignatureVerifierFactory factory = GpgSignatureVerifierFactory.getDefault();
boolean isValid;
if (factory == null) {
byte[] fromGpg = b.toByteArray(SIGNATURE_START.length);
isValid = Arrays.equals(fromGpg, SIGNATURE_START);
if (isValid) {
result.rawData = b.toByteArray();
}
} else {
byte[] fromGpg = b.toByteArray();
GpgSignatureVerifier verifier = factory.getVerifier();
try {
GpgSignatureVerifier.SignatureVerification verification = verifier.verify(data, fromGpg);
isValid = verification != null && verification.getVerified();
if (isValid) {
result.rawData = fromGpg;
}
} catch (JGitInternalException e) {
throw new IOException(e.getLocalizedMessage(), e);
} finally {
verifier.clear();
}
}
if (!isValid) {
throw new IOException(MessageFormat.format(OStrings.getString(ExternalGpgSigner_noSignature), toString(b)));
}
}, e -> {
// https://github.com/gpg/gnupg/blob/master/doc/DETAILS
try (BufferedReader r = new BufferedReader(new InputStreamReader(e.openInputStream(), StandardCharsets.UTF_8))) {
String line;
boolean pinentry = false;
while ((line = r.readLine()) != null) {
if (!pinentry && line.startsWith("[GNUPG:] PINENTRY_LAUNCHED")) {
pinentry = true;
} else if (pinentry) {
if (line.startsWith("[GNUPG:] FAILURE sign")) {
throw new CanceledException(OStrings.getString(ExternalGpgSigner_signingCanceled));
}
if (line.startsWith("[GNUPG:]")) {
pinentry = false;
}
}
}
} catch (IOException ex) {
// Swallow it here; runProcess will raise one anyway.
}
});
return result.rawData;
}
}
use of org.eclipse.jgit.api.errors.CanceledException in project archi-modelrepository-plugin by archi-contribs.
the class MergeConflictHandler method extractModel.
/**
* Extract a model from either our latest commit or their latest online commit
* ref = "refs/head/master" or "origin/master"
* @throws CanceledException
*/
private IArchimateModel extractModel(String ref) throws IOException, CanceledException {
// $NON-NLS-1$ //$NON-NLS-2$
File tmpFolder = new File(System.getProperty("java.io.tmpdir"), "org.archicontribs.modelrepository.tmp");
FileUtils.deleteFolder(tmpFolder);
tmpFolder.mkdirs();
try (Repository repository = Git.open(fArchiRepo.getLocalRepositoryFolder()).getRepository()) {
RevCommit commit = null;
// A RevWalk walks over commits based on some filtering that is defined
try (RevWalk revWalk = new RevWalk(repository)) {
// We are interested in the origin master branch
ObjectId objectID = repository.resolve(ref);
if (objectID != null) {
commit = revWalk.parseCommit(objectID);
}
revWalk.dispose();
}
if (commit == null) {
throw new IOException(Messages.MergeConflictHandler_1);
}
// Walk the tree and get the contents of the commit
try (TreeWalk treeWalk = new TreeWalk(repository)) {
treeWalk.addTree(commit.getTree());
treeWalk.setRecursive(true);
while (treeWalk.next()) {
if (fProgressMonitor != null && fProgressMonitor.isCanceled()) {
throw new CanceledException(Messages.MergeConflictHandler_2);
}
ObjectId objectId = treeWalk.getObjectId(0);
ObjectLoader loader = repository.open(objectId);
File file = new File(tmpFolder, treeWalk.getPathString());
file.getParentFile().mkdirs();
try (FileOutputStream out = new FileOutputStream(file)) {
loader.copyTo(out);
}
}
}
}
// Load it
GraficoModelImporter importer = new GraficoModelImporter(tmpFolder);
IArchimateModel model = importer.importAsModel();
FileUtils.deleteFolder(tmpFolder);
return model;
}
use of org.eclipse.jgit.api.errors.CanceledException in project archi-modelrepository-plugin by archi-contribs.
the class MergeBranchAction method merge.
private int merge(BranchInfo currentBranch, BranchInfo branchToMerge, ProgressMonitorDialog pmDialog) throws GitAPIException, IOException {
pmDialog.getProgressMonitor().subTask(Messages.MergeBranchAction_13);
// update dialog
Display.getCurrent().readAndDispatch();
try (Git git = Git.open(getRepository().getLocalRepositoryFolder())) {
ObjectId mergeBase = git.getRepository().resolve(branchToMerge.getShortName());
String mergeMessage = NLS.bind(Messages.MergeBranchAction_2, branchToMerge.getShortName(), currentBranch.getShortName());
MergeResult mergeResult = git.merge().include(mergeBase).setCommit(true).setFastForward(FastForwardMode.FF).setStrategy(MergeStrategy.RECURSIVE).setSquash(false).setMessage(mergeMessage).call();
MergeStatus status = mergeResult.getMergeStatus();
// Conflict
if (status == MergeStatus.CONFLICTING) {
// Try to handle the merge conflict
MergeConflictHandler handler = new MergeConflictHandler(mergeResult, branchToMerge.getShortName(), getRepository(), fWindow.getShell());
try {
handler.init(pmDialog.getProgressMonitor());
} catch (IOException | GitAPIException ex) {
// Clean up
handler.resetToLocalState();
if (ex instanceof CanceledException) {
return MERGE_STATUS_MERGE_CANCEL;
}
throw ex;
}
String dialogMessage = NLS.bind(Messages.MergeBranchAction_10, branchToMerge.getShortName(), currentBranch.getShortName());
pmDialog.getShell().setVisible(false);
boolean result = handler.openConflictsDialog(dialogMessage);
pmDialog.getShell().setVisible(true);
if (result) {
handler.merge();
} else // User cancelled - so we reset
{
handler.resetToLocalState();
return MERGE_STATUS_MERGE_CANCEL;
}
}
// Reload the model from the Grafico XML files
GraficoModelLoader loader = new GraficoModelLoader(getRepository());
loader.loadModel();
// Do a commit if needed
if (getRepository().hasChangesToCommit()) {
mergeMessage = NLS.bind(Messages.MergeBranchAction_3, branchToMerge.getShortName(), currentBranch.getShortName());
// Did we restore any missing objects?
String restoredObjects = loader.getRestoredObjectsAsString();
// Add to commit message
if (restoredObjects != null) {
// $NON-NLS-1$ //$NON-NLS-2$
mergeMessage += "\n\n" + Messages.RefreshModelAction_3 + "\n" + restoredObjects;
}
// IMPORTANT!!! "amend" has to be false after a merge conflict or else the commit will be orphaned
getRepository().commitChanges(mergeMessage, false);
}
}
return MERGE_STATUS_OK;
}
use of org.eclipse.jgit.api.errors.CanceledException in project archi-modelrepository-plugin by archi-contribs.
the class RefreshModelAction method pull.
protected int pull(UsernamePassword npw, ProgressMonitorDialog pmDialog) throws IOException, GitAPIException {
PullResult pullResult = null;
pmDialog.getProgressMonitor().subTask(Messages.RefreshModelAction_6);
// update dialog
Display.getCurrent().readAndDispatch();
try {
pullResult = getRepository().pullFromRemote(npw, new ProgressMonitorWrapper(pmDialog.getProgressMonitor()));
} catch (Exception ex) {
// So quietly absorb this and return OK
if (ex instanceof RefNotAdvertisedException) {
return PULL_STATUS_OK;
}
throw ex;
}
// Check for tracking updates
FetchResult fetchResult = pullResult.getFetchResult();
boolean newTrackingRefUpdates = fetchResult != null && !fetchResult.getTrackingRefUpdates().isEmpty();
// Merge is already up to date...
if (pullResult.getMergeResult().getMergeStatus() == MergeStatus.ALREADY_UP_TO_DATE) {
// Check if any tracked refs were updated
if (newTrackingRefUpdates) {
return PULL_STATUS_OK;
}
return PULL_STATUS_UP_TO_DATE;
}
pmDialog.getProgressMonitor().subTask(Messages.RefreshModelAction_7);
BranchStatus branchStatus = getRepository().getBranchStatus();
// Setup the Graphico Model Loader
GraficoModelLoader loader = new GraficoModelLoader(getRepository());
// Merge failure
if (!pullResult.isSuccessful() && pullResult.getMergeResult().getMergeStatus() == MergeStatus.CONFLICTING) {
// Get the remote ref name
String remoteRef = branchStatus.getCurrentRemoteBranch().getFullName();
// Try to handle the merge conflict
MergeConflictHandler handler = new MergeConflictHandler(pullResult.getMergeResult(), remoteRef, getRepository(), fWindow.getShell());
try {
handler.init(pmDialog.getProgressMonitor());
} catch (IOException | GitAPIException ex) {
// Clean up
handler.resetToLocalState();
if (ex instanceof CanceledException) {
return PULL_STATUS_MERGE_CANCEL;
}
throw ex;
}
String dialogMessage = NLS.bind(Messages.RefreshModelAction_4, branchStatus.getCurrentLocalBranch().getShortName());
pmDialog.getShell().setVisible(false);
boolean result = handler.openConflictsDialog(dialogMessage);
pmDialog.getShell().setVisible(true);
if (result) {
handler.merge();
} else // User cancelled - we assume they committed all changes so we can reset
{
handler.resetToLocalState();
return PULL_STATUS_MERGE_CANCEL;
}
// We now have to check if model can be reloaded
pmDialog.getProgressMonitor().subTask(Messages.RefreshModelAction_8);
// Reload the model from the Grafico XML files
try {
loader.loadModel();
} catch (IOException ex) {
// Clean up
handler.resetToLocalState();
throw ex;
}
} else {
// Reload the model from the Grafico XML files
pmDialog.getProgressMonitor().subTask(Messages.RefreshModelAction_8);
loader.loadModel();
}
// Do a commit if needed
if (getRepository().hasChangesToCommit()) {
pmDialog.getProgressMonitor().subTask(Messages.RefreshModelAction_9);
String commitMessage = NLS.bind(Messages.RefreshModelAction_1, branchStatus.getCurrentLocalBranch().getShortName());
// Did we restore any missing objects?
String restoredObjects = loader.getRestoredObjectsAsString();
// Add to commit message
if (restoredObjects != null) {
// $NON-NLS-1$ //$NON-NLS-2$
commitMessage += "\n\n" + Messages.RefreshModelAction_3 + "\n" + restoredObjects;
}
// TODO - not sure if amend should be false or true here?
getRepository().commitChanges(commitMessage, false);
}
return PULL_STATUS_OK;
}
Aggregations