diff options
Diffstat (limited to 'org.eclipse.egit.ui/src/org/eclipse/egit/ui')
-rw-r--r-- | org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CommitMessageComponent.java | 80 | ||||
-rw-r--r-- | org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/staging/StagingView.java | 38 |
2 files changed, 96 insertions, 22 deletions
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CommitMessageComponent.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CommitMessageComponent.java index 31a3fb8d55..7afff02ffd 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CommitMessageComponent.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CommitMessageComponent.java @@ -396,10 +396,23 @@ public class CommitMessageComponent { * */ public void updateUIFromState() { - commitText.setText(commitMessage); - commitText.getTextWidget().setCaretOffset(caretPosition); - authorText.setText(author); + updateUIFromState(true); + } + + /** + * Set the UI widgets to the values from the internal state. + * + * @param withCommitMessage + * {@code true} if the commit message shall be updated, too, + * {@code false} to only update author and committer + */ + public void updateUIFromState(boolean withCommitMessage) { + if (withCommitMessage) { + commitText.setText(commitMessage); + commitText.getTextWidget().setCaretOffset(caretPosition); + } committerText.setText(committer); + authorText.setText(author); } /** @@ -564,20 +577,41 @@ public class CommitMessageComponent { } }); committerText.addModifyListener(new ModifyListener() { - String oldCommitter = committerText.getText(); + String oldCommitter = committerText.getText().trim(); @Override public void modifyText(ModifyEvent e) { - if (!listenersEnabled || !committerText.isEnabled()) + String newCommitter = committerText.getText().trim(); + if (!listenersEnabled || !committerText.isEnabled()) { + if (!oldCommitter.equals(newCommitter) && RawParseUtils + .parsePersonIdent(newCommitter) != null) { + oldCommitter = newCommitter; + } return; - if (signedOff) { - // the commit message is signed - // the signature must be updated - String newCommitter = committerText.getText(); - String oldSignOff = getSignedOff(oldCommitter); - String newSignOff = getSignedOff(newCommitter); - commitText.setText(replaceSignOff(commitText.getText(), - oldSignOff, newSignOff)); + } + if (!oldCommitter.equals(newCommitter) && RawParseUtils + .parsePersonIdent(newCommitter) != null) { + String oldCommitText = commitText.getText(); + String newCommitText = oldCommitText; + String currentAuthor = authorText.getText().trim(); + if (newCommitter.equals(currentAuthor)) { + if (signedOff) { + // Only add a new signed-off if there isn't one + // already + String signOff = getSignedOff(newCommitter); + if (!hasSignOff(oldCommitText, signOff)) { + newCommitText = signOff(oldCommitText); + } + } + } else { + String oldSignOff = getSignedOff(oldCommitter); + String newSignOff = getSignedOff(newCommitter); + newCommitText = replaceSignOff(oldCommitText, + oldSignOff, newSignOff); + } + if (!oldCommitText.equals(newCommitText)) { + commitText.setText(newCommitText); + } oldCommitter = newCommitter; } listener.statusUpdated(); @@ -787,7 +821,7 @@ public class CommitMessageComponent { } private String getSignedOff() { - return getSignedOff(committerText.getText()); + return getSignedOff(committerText.getText().trim()); } private String getSignedOff(String signer) { @@ -824,10 +858,14 @@ public class CommitMessageComponent { private void updateSignedOffButton() { String curText = commitText.getText(); - if (!curText.endsWith(Text.DELIMITER)) + if (!curText.endsWith(Text.DELIMITER)) { curText += Text.DELIMITER; - signedOff = curText.indexOf(getSignedOff() + Text.DELIMITER) != -1; - listener.updateSignedOffToggleSelection(signedOff); + } + if (RawParseUtils + .parsePersonIdent(committerText.getText().trim()) != null) { + signedOff = curText.indexOf(getSignedOff() + Text.DELIMITER) != -1; + listener.updateSignedOffToggleSelection(signedOff); + } } private void refreshSignedOffBy() { @@ -848,6 +886,14 @@ public class CommitMessageComponent { } } + private boolean hasSignOff(String input, String signature) { + String curText = input; + if (!curText.endsWith(Text.DELIMITER)) { + curText += Text.DELIMITER; + } + return curText.indexOf(signature + Text.DELIMITER) >= 0; + } + private String replaceSignOff(String input, String oldSignOff, String newSignOff) { assert input != null; diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/staging/StagingView.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/staging/StagingView.java index d49184696d..0cf0d56eeb 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/staging/StagingView.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/staging/StagingView.java @@ -749,6 +749,8 @@ public class StagingView extends ViewPart private ListenerHandle refsChangedListener; + private ListenerHandle configChangedListener; + private LocalResourceManager resources = new LocalResourceManager( JFaceResources.getResources()); @@ -3625,6 +3627,7 @@ public class StagingView extends ViewPart */ private void clearRepository(@Nullable Repository repository) { saveCommitMessageComponentState(); + removeRepositoryListeners(); realRepository = repository; currentRepository = null; if (isDisposed()) { @@ -3722,12 +3725,15 @@ public class StagingView extends ViewPart if (repositoryChanged) { // Reset paths, they're from the old repository resetPathsToExpand(); - if (refsChangedListener != null) - refsChangedListener.remove(); + removeRepositoryListeners(); refsChangedListener = repository.getListenerList() .addRefsChangedListener( event -> updateRebaseButtonVisibility(repository .getRepositoryState().isRebasing())); + configChangedListener = repository.getListenerList() + .addConfigChangedListener( + event -> updateCommitAuthorAndCommitter( + repository)); } final StagingViewUpdate update = new StagingViewUpdate(repository, indexDiff, null); @@ -3808,6 +3814,17 @@ public class StagingView extends ViewPart }); } + private void removeRepositoryListeners() { + if (refsChangedListener != null) { + refsChangedListener.remove(); + refsChangedListener = null; + } + if (configChangedListener != null) { + configChangedListener.remove(); + configChangedListener = null; + } + } + /** * The max number of changed files we can handle in the "list" presentation * without freezing Eclipse UI for a too long time. @@ -4016,6 +4033,19 @@ public class StagingView extends ViewPart updateMessage(); } + private void updateCommitAuthorAndCommitter(Repository repository) { + CommitHelper helper = new CommitHelper(repository); + asyncExec(() -> { + boolean authorEqualsCommitter = commitMessageComponent.getAuthor() + .equals(commitMessageComponent.getCommitter()); + if (authorEqualsCommitter) { + commitMessageComponent.setAuthor(helper.getAuthor()); + } + commitMessageComponent.setCommitter(helper.getCommitter()); + commitMessageComponent.updateUIFromState(false); + }); + } + /** * Resets the commit message component state and saves the overwritten * commit message into message history @@ -4285,9 +4315,7 @@ public class StagingView extends ViewPart InstanceScope.INSTANCE.getNode( org.eclipse.egit.core.Activator.getPluginId()) .removePreferenceChangeListener(prefListener); - if (refsChangedListener != null) { - refsChangedListener.remove(); - } + removeRepositoryListeners(); if (switchRepositoriesAction != null) { switchRepositoriesAction.dispose(); |