diff options
9 files changed, 107 insertions, 6 deletions
diff --git a/org.eclipse.egit.core.test/src/org/eclipse/egit/core/GitMoveDeleteHookTest.java b/org.eclipse.egit.core.test/src/org/eclipse/egit/core/GitMoveDeleteHookTest.java index 354641c82c..4013435668 100644 --- a/org.eclipse.egit.core.test/src/org/eclipse/egit/core/GitMoveDeleteHookTest.java +++ b/org.eclipse.egit.core.test/src/org/eclipse/egit/core/GitMoveDeleteHookTest.java @@ -30,6 +30,8 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.preferences.IEclipsePreferences; +import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.egit.core.op.AddToIndexOperation; import org.eclipse.egit.core.project.RepositoryMapping; import org.eclipse.egit.core.test.TestProject; @@ -51,11 +53,18 @@ import org.eclipse.jgit.util.SystemReader; import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.junit.experimental.theories.DataPoints; +import org.junit.experimental.theories.Theories; +import org.junit.experimental.theories.Theory; +import org.junit.runner.RunWith; /** * All sorts of interesting cases */ +@RunWith(Theories.class) public class GitMoveDeleteHookTest { + @DataPoints + public static boolean[] autoStageDeletions = { true, false }; TestUtils testUtils = new TestUtils(); @@ -139,8 +148,13 @@ public class GitMoveDeleteHookTest { return project; } - @Test - public void testDeleteFile() throws Exception { + @Theory + public void testDeleteFile(boolean autoStageDelete) throws Exception { + IEclipsePreferences p = InstanceScope.INSTANCE + .getNode(Activator.getPluginId()); + p.putBoolean(GitCorePreferences.core_autoStageDeletion, + autoStageDelete); + TestProject project = initRepoInsideProjectInsideWorkspace(); testUtils.addFileToProject(project.getProject(), "file.txt", "some text"); @@ -168,8 +182,13 @@ public class GitMoveDeleteHookTest { // Check index for the deleted file dirCache.read(); - assertEquals(1, dirCache.getEntryCount()); - assertNull(dirCache.getEntry("file.txt")); + if (autoStageDelete) { + assertEquals(1, dirCache.getEntryCount()); + assertNull(dirCache.getEntry("file.txt")); + } else { + assertEquals(2, dirCache.getEntryCount()); + assertNotNull(dirCache.getEntry("file.txt")); + } assertNotNull(dirCache.getEntry("file2.txt")); // Actual file is deleted assertFalse(file.exists()); diff --git a/org.eclipse.egit.core.test/src/org/eclipse/egit/core/synchronize/GitSubscriberMergeContextTest.java b/org.eclipse.egit.core.test/src/org/eclipse/egit/core/synchronize/GitSubscriberMergeContextTest.java index e2e8cc7786..3f112e3f96 100644 --- a/org.eclipse.egit.core.test/src/org/eclipse/egit/core/synchronize/GitSubscriberMergeContextTest.java +++ b/org.eclipse.egit.core.test/src/org/eclipse/egit/core/synchronize/GitSubscriberMergeContextTest.java @@ -26,6 +26,10 @@ import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.mapping.ResourceMapping; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.preferences.IEclipsePreferences; +import org.eclipse.core.runtime.preferences.InstanceScope; +import org.eclipse.egit.core.Activator; +import org.eclipse.egit.core.GitCorePreferences; import org.eclipse.egit.core.project.RepositoryMapping; import org.eclipse.egit.core.test.TestRepository; import org.eclipse.egit.core.test.TestUtils; @@ -347,6 +351,9 @@ public class GitSubscriberMergeContextTest extends ModelTestCase { @Test public void mergeModelWithDeletedFileNoConflict() throws Exception { + IEclipsePreferences p = InstanceScope.INSTANCE + .getNode(Activator.getPluginId()); + p.putBoolean(GitCorePreferences.core_autoStageDeletion, true); File file1 = testRepo.createFile(iProject, "file1." + SAMPLE_FILE_EXTENSION); File file2 = testRepo.createFile(iProject, "file2." diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/Activator.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/Activator.java index 6973e18564..aa82709ae8 100644 --- a/org.eclipse.egit.core/src/org/eclipse/egit/core/Activator.java +++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/Activator.java @@ -635,6 +635,22 @@ public class Activator extends Plugin implements DebugOptionsListener { true)); } + /** + * @return {@code true} if files that get deleted should be automatically + * staged + * @since 4.6 + */ + public static boolean autoStageDeletion() { + IEclipsePreferences d = DefaultScope.INSTANCE + .getNode(Activator.getPluginId()); + IEclipsePreferences p = InstanceScope.INSTANCE + .getNode(Activator.getPluginId()); + boolean autoStageDeletion = p.getBoolean( + GitCorePreferences.core_autoStageDeletion, + d.getBoolean(GitCorePreferences.core_autoStageDeletion, false)); + return autoStageDeletion; + } + private static class IgnoreDerivedResources implements IResourceChangeListener { diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/GitCorePreferenceInitializer.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/GitCorePreferenceInitializer.java index 64132bff59..80bcfd8616 100644 --- a/org.eclipse.egit.core/src/org/eclipse/egit/core/GitCorePreferenceInitializer.java +++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/GitCorePreferenceInitializer.java @@ -29,6 +29,7 @@ public class GitCorePreferenceInitializer extends AbstractPreferenceInitializer p.putInt(GitCorePreferences.core_streamFileThreshold, 50 * MB); p.putBoolean(GitCorePreferences.core_autoShareProjects, true); p.putBoolean(GitCorePreferences.core_autoIgnoreDerivedResources, true); + p.putBoolean(GitCorePreferences.core_autoStageDeletion, false); String defaultRepoDir = RepositoryUtil.getDefaultDefaultRepositoryDir(); p.put(GitCorePreferences.core_defaultRepositoryDir, defaultRepoDir); diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/GitCorePreferences.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/GitCorePreferences.java index 8c8d93a259..a3c81250fc 100644 --- a/org.eclipse.egit.core/src/org/eclipse/egit/core/GitCorePreferences.java +++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/GitCorePreferences.java @@ -56,4 +56,10 @@ public class GitCorePreferences { * to let JGit use its default behavior. */ public static final String core_preferredMergeStrategy_Default = "jgit-default-mergeStrategy"; //$NON-NLS-1$ + + /** + * if {@code true} file deletions are automatically staged by + * GitMoveDeleteHook + */ + public static final String core_autoStageDeletion = "core_auto_stage_deletion"; //$NON-NLS-1$ } diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/GitMoveDeleteHook.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/GitMoveDeleteHook.java index 2782b9b4d2..95acf74f6b 100644 --- a/org.eclipse.egit.core/src/org/eclipse/egit/core/GitMoveDeleteHook.java +++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/GitMoveDeleteHook.java @@ -61,6 +61,10 @@ class GitMoveDeleteHook implements IMoveDeleteHook { @Override public boolean deleteFile(final IResourceTree tree, final IFile file, final int updateFlags, final IProgressMonitor monitor) { + if (!org.eclipse.egit.core.Activator.autoStageDeletion()) { + return false; + } + // Linked resources are not files, hence not tracked by git if (file.isLinked()) return false; diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIText.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIText.java index 7696a70f03..28a0380760 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIText.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIText.java @@ -3247,6 +3247,9 @@ public class UIText extends NLS { public static String CommittingPreferencePage_AlwaysUseStagingView; /** */ + public static String CommittingPreferencePage_autoStageDeletion; + + /** */ public static String CommittingPreferencePage_AutoStageOnCommit; /** */ diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/CommittingPreferencePage.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/CommittingPreferencePage.java index da563546ec..1482458763 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/CommittingPreferencePage.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/CommittingPreferencePage.java @@ -10,6 +10,12 @@ *******************************************************************************/ package org.eclipse.egit.ui.internal.preferences; +import java.io.IOException; + +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.preferences.InstanceScope; +import org.eclipse.egit.core.GitCorePreferences; import org.eclipse.egit.ui.Activator; import org.eclipse.egit.ui.PluginPreferenceInitializer; import org.eclipse.egit.ui.UIPreferences; @@ -22,7 +28,9 @@ import org.eclipse.jface.preference.FieldEditor; import org.eclipse.jface.preference.FieldEditorPreferencePage; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.IntegerFieldEditor; +import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.util.IPropertyChangeListener; +import org.eclipse.jface.util.Policy; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; @@ -34,6 +42,7 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; +import org.eclipse.ui.preferences.ScopedPreferenceStore; /** Preferences for committing with commit dialog/staging view. */ public class CommittingPreferencePage extends FieldEditorPreferencePage @@ -55,6 +64,8 @@ public class CommittingPreferencePage extends FieldEditorPreferencePage private Group generalGroup; + private ScopedPreferenceStore corePreferences; + /** */ public CommittingPreferencePage() { super(GRID); @@ -63,7 +74,14 @@ public class CommittingPreferencePage extends FieldEditorPreferencePage @Override public void init(IWorkbench workbench) { - // Nothing to do + corePreferences = new ScopedPreferenceStore(InstanceScope.INSTANCE, + org.eclipse.egit.core.Activator.getPluginId()); + } + + @Override + public void dispose() { + super.dispose(); + corePreferences = null; } @Override @@ -104,6 +122,18 @@ public class CommittingPreferencePage extends FieldEditorPreferencePage UIText.CommittingPreferencePage_includeUntrackedFilesTooltip); addField(includeUntracked); + BooleanFieldEditor autoStageDeletion = new BooleanFieldEditor( + GitCorePreferences.core_autoStageDeletion, + UIText.CommittingPreferencePage_autoStageDeletion, + generalGroup) { + + @Override + public IPreferenceStore getPreferenceStore() { + return corePreferences; + } + }; + addField(autoStageDeletion); + IntegerFieldEditor historySize = new IntegerFieldEditor( UIPreferences.COMMIT_DIALOG_HISTORY_SIZE, UIText.CommittingPreferencePage_commitMessageHistory, @@ -263,7 +293,21 @@ public class CommittingPreferencePage extends FieldEditorPreferencePage warnCheckbox.getSelection()); doGetPreferenceStore().setValue(UIPreferences.BLOCK_COMMIT, blockCheckbox.getSelection()); - return super.performOk(); + boolean isOk = super.performOk(); + if (isOk && corePreferences.needsSaving()) { + try { + corePreferences.save(); + } catch (IOException e) { + String message = JFaceResources.format( + "PreferenceDialog.saveErrorMessage", getTitle(), //$NON-NLS-1$ + e.getMessage()); + Policy.getStatusHandler().show( + new Status(IStatus.ERROR, Policy.JFACE, message, e), + JFaceResources + .getString("PreferenceDialog.saveErrorTitle")); //$NON-NLS-1$ + } + } + return isOk; } private Group createGroup(Composite parent, int numColumns) { diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/uitext.properties b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/uitext.properties index 90490dac69..2830767c54 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/uitext.properties +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/uitext.properties @@ -1044,6 +1044,7 @@ CommittingPreferencePage_WarnBlock_WarningsAndErrors=Warnings and errors CommittingPreferencePage_BlockCommit=Block commit button CommittingPreferencePage_BlockCommitCombo=Block if there are: CommittingPreferencePage_AlwaysUseStagingView=Use Staging View to commit instead of Commit Dialog +CommittingPreferencePage_autoStageDeletion=Automatically stage files being deleted CommittingPreferencePage_AutoStageOnCommit=Automatically stage selected resources on commit CommittingPreferencePage_general=General |