Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--org.eclipse.egit-feature/feature.properties4
-rw-r--r--org.eclipse.egit-feature/feature.xml14
-rw-r--r--org.eclipse.egit-feature/pom.xml2
-rw-r--r--org.eclipse.egit.core.junit/META-INF/MANIFEST.MF30
-rw-r--r--org.eclipse.egit.core.junit/pom.xml2
-rw-r--r--org.eclipse.egit.core.junit/src/org/eclipse/egit/core/test/GitTestCase.java14
-rw-r--r--org.eclipse.egit.core.test/META-INF/MANIFEST.MF24
-rw-r--r--org.eclipse.egit.core.test/pom.xml2
-rw-r--r--org.eclipse.egit.core.test/src/org/eclipse/egit/core/GitMoveDeleteHookTest.java4
-rw-r--r--org.eclipse.egit.core.test/src/org/eclipse/egit/core/synchronize/GitSubscriberMergeContextTest.java2
-rw-r--r--org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/GitProjectSetCapabilityTest.java2
-rw-r--r--org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/MergeWithPreferredStrategyTest.java10
-rw-r--r--org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/PreferredMergeStrategyTest.java22
-rw-r--r--org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/op/ConnectProviderOperationTest.java4
-rw-r--r--org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/op/TagOperationTest.java130
-rw-r--r--org.eclipse.egit.core/.options4
-rw-r--r--org.eclipse.egit.core/META-INF/MANIFEST.MF91
-rw-r--r--org.eclipse.egit.core/build.properties3
-rw-r--r--org.eclipse.egit.core/pom.xml2
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/Activator.java104
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/EclipseSshSessionFactory.java75
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/GitCorePreferenceInitializer.java5
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/GitCorePreferences.java20
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/GitMoveDeleteHook.java32
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/GitProvider.java2
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/RepositoryUtil.java31
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/internal/CoreText.java60
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/internal/EGitSshdSessionFactory.java4
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/internal/GitURI.java5
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/internal/coretext.properties20
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/internal/signing/ExternalGpgSigner.java498
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/internal/signing/GpgConfigurationException.java50
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/internal/signing/GpgSetup.java82
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/internal/trace/GitTraceLocation.java8
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/internal/trace/JSchLogger.java51
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/op/CommitOperation.java20
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/op/ConnectProviderOperation.java2
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/op/GarbageCollectOperation.java2
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/op/MergeOperation.java5
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/op/PullOperation.java7
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/op/RebaseOperation.java4
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/op/RewordCommitOperation.java283
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/op/TagOperation.java382
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/project/GitProjectData.java10
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/settings/GitSettings.java37
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/synchronize/GitResourceVariantComparator.java2
-rw-r--r--org.eclipse.egit.doc/META-INF/MANIFEST.MF2
-rw-r--r--org.eclipse.egit.doc/build-help.xml4
-rw-r--r--org.eclipse.egit.doc/build.properties3
-rw-r--r--org.eclipse.egit.doc/contexts.xml5
-rw-r--r--org.eclipse.egit.doc/contexts/GpgConfiguration.html98
-rw-r--r--org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.10/5.10.html (renamed from org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.9/5.9.html)17
-rw-r--r--org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.10/Contributors.html (renamed from org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.9/Contributors.html)16
-rw-r--r--org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.10/See-Also.html (renamed from org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.9/See-Also.html)8
-rw-r--r--org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.10/Updating-This-Document.html (renamed from org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.9/Updating-This-Document.html)8
-rw-r--r--org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.9/images/EGit_5.9_Commit_And_Push_Preference.pngbin77308 -> 0 bytes
-rw-r--r--org.eclipse.egit.doc/help/JGit/New_and_Noteworthy/5.10/5.10.html (renamed from org.eclipse.egit.doc/help/JGit/New_and_Noteworthy/5.9/5.9.html)14
-rw-r--r--org.eclipse.egit.doc/help/JGit/New_and_Noteworthy/5.10/Contributors.html (renamed from org.eclipse.egit.doc/help/JGit/New_and_Noteworthy/5.9/Contributors.html)33
-rw-r--r--org.eclipse.egit.doc/help/JGit/New_and_Noteworthy/5.10/Updating-This-Document.html (renamed from org.eclipse.egit.doc/help/JGit/New_and_Noteworthy/5.9/Updating-This-Document.html)8
-rw-r--r--org.eclipse.egit.doc/help/toc.xml26
-rw-r--r--org.eclipse.egit.doc/pom.xml2
-rw-r--r--org.eclipse.egit.gitflow-feature/feature.properties4
-rw-r--r--org.eclipse.egit.gitflow-feature/feature.xml8
-rw-r--r--org.eclipse.egit.gitflow-feature/pom.xml2
-rw-r--r--org.eclipse.egit.gitflow.test/META-INF/MANIFEST.MF8
-rw-r--r--org.eclipse.egit.gitflow.test/pom.xml2
-rw-r--r--org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/ReleaseStartOperationTest.java17
-rw-r--r--org.eclipse.egit.gitflow.ui/META-INF/MANIFEST.MF74
-rw-r--r--org.eclipse.egit.gitflow.ui/pom.xml2
-rw-r--r--org.eclipse.egit.gitflow.ui/src/org/eclipse/egit/gitflow/ui/internal/uitext.properties2
-rw-r--r--org.eclipse.egit.gitflow/META-INF/MANIFEST.MF26
-rw-r--r--org.eclipse.egit.gitflow/pom.xml2
-rw-r--r--org.eclipse.egit.gitflow/src/org/eclipse/egit/gitflow/op/AbstractVersionFinishOperation.java15
-rw-r--r--org.eclipse.egit.mylyn-feature/feature.properties4
-rw-r--r--org.eclipse.egit.mylyn-feature/feature.xml4
-rw-r--r--org.eclipse.egit.mylyn-feature/pom.xml2
-rw-r--r--org.eclipse.egit.mylyn.ui.test/META-INF/MANIFEST.MF2
-rw-r--r--org.eclipse.egit.mylyn.ui.test/pom.xml2
-rw-r--r--org.eclipse.egit.mylyn.ui/META-INF/MANIFEST.MF28
-rw-r--r--org.eclipse.egit.mylyn.ui/pom.xml2
-rw-r--r--org.eclipse.egit.repository/category.xml133
-rw-r--r--org.eclipse.egit.repository/pom.xml4
-rw-r--r--org.eclipse.egit.source-feature/feature.properties4
-rw-r--r--org.eclipse.egit.source-feature/feature.xml4
-rw-r--r--org.eclipse.egit.source-feature/pom.xml2
-rw-r--r--org.eclipse.egit.target/egit-4.10.target60
-rw-r--r--org.eclipse.egit.target/egit-4.10.tpd2
-rw-r--r--org.eclipse.egit.target/egit-4.11.target60
-rw-r--r--org.eclipse.egit.target/egit-4.11.tpd2
-rw-r--r--org.eclipse.egit.target/egit-4.12.target60
-rw-r--r--org.eclipse.egit.target/egit-4.12.tpd2
-rw-r--r--org.eclipse.egit.target/egit-4.13.target60
-rw-r--r--org.eclipse.egit.target/egit-4.13.tpd2
-rw-r--r--org.eclipse.egit.target/egit-4.14.target60
-rw-r--r--org.eclipse.egit.target/egit-4.14.tpd2
-rw-r--r--org.eclipse.egit.target/egit-4.15.target60
-rw-r--r--org.eclipse.egit.target/egit-4.15.tpd2
-rw-r--r--org.eclipse.egit.target/egit-4.16.target60
-rw-r--r--org.eclipse.egit.target/egit-4.16.tpd2
-rw-r--r--org.eclipse.egit.target/egit-4.17.target60
-rw-r--r--org.eclipse.egit.target/egit-4.17.tpd2
-rw-r--r--org.eclipse.egit.target/egit-4.18.target141
-rw-r--r--org.eclipse.egit.target/egit-4.18.tpd (renamed from org.eclipse.egit.target/egit-4.18-staging.tpd)4
-rw-r--r--org.eclipse.egit.target/egit-4.19-staging.target (renamed from org.eclipse.egit.target/egit-4.18-staging.target)67
-rw-r--r--org.eclipse.egit.target/egit-4.19-staging.tpd7
-rw-r--r--org.eclipse.egit.target/egit-4.6.target60
-rw-r--r--org.eclipse.egit.target/egit-4.6.tpd2
-rw-r--r--org.eclipse.egit.target/egit-4.7.target60
-rw-r--r--org.eclipse.egit.target/egit-4.7.tpd2
-rw-r--r--org.eclipse.egit.target/egit-4.8.target60
-rw-r--r--org.eclipse.egit.target/egit-4.8.tpd2
-rw-r--r--org.eclipse.egit.target/egit-4.9.target60
-rw-r--r--org.eclipse.egit.target/egit-4.9.tpd2
-rw-r--r--org.eclipse.egit.target/orbit/R20201130205003-2020-12.tpd (renamed from org.eclipse.egit.target/orbit/S20201118210000.tpd)4
-rw-r--r--org.eclipse.egit.target/orbit/S20210223232630.tpd77
-rw-r--r--org.eclipse.egit.target/pom.xml2
-rw-r--r--org.eclipse.egit.target/projects/jetty-9.4.x.tpd36
-rw-r--r--org.eclipse.egit.target/releasetrain/4.18-2020-12.tpd10
-rw-r--r--org.eclipse.egit.target/releasetrain/4.19-2021-03.tpd38
-rw-r--r--org.eclipse.egit.ui.test/META-INF/MANIFEST.MF34
-rw-r--r--org.eclipse.egit.ui.test/pom.xml2
-rw-r--r--org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/common/LocalRepositoryTestCase.java24
-rw-r--r--org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/internal/commit/DiffEditorOutlinePageSortingTest.java23
-rw-r--r--org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/test/team/actions/BranchAndResetActionTest.java15
-rw-r--r--org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/test/team/actions/CompareActionsTest.java17
-rw-r--r--org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/test/team/actions/TagActionTest.java54
-rw-r--r--org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/test/trace/TraceConfigurationDialogTest.java6
-rw-r--r--org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/view/repositories/GitRepositoriesViewTestBase.java4
-rw-r--r--org.eclipse.egit.ui/.settings/.api_filters11
-rw-r--r--org.eclipse.egit.ui/META-INF/MANIFEST.MF198
-rw-r--r--org.eclipse.egit.ui/OSGI-INF/org.eclipse.egit.ui.internal.ApplicationActiveListener.xml10
-rw-r--r--org.eclipse.egit.ui/OSGI-INF/org.eclipse.egit.ui.internal.ConfigurationChecker$Checker.xml8
-rw-r--r--org.eclipse.egit.ui/OSGI-INF/org.eclipse.egit.ui.internal.ExternalRepositoryScanner.xml8
-rw-r--r--org.eclipse.egit.ui/OSGI-INF/org.eclipse.egit.ui.internal.StartEventListener.xml8
-rw-r--r--org.eclipse.egit.ui/OSGI-INF/org.eclipse.egit.ui.internal.trace.DebugOptionsHandler.xml8
-rw-r--r--org.eclipse.egit.ui/plugin.properties4
-rw-r--r--org.eclipse.egit.ui/plugin.xml1
-rw-r--r--org.eclipse.egit.ui/pom.xml2
-rwxr-xr-xorg.eclipse.egit.ui/src/org/eclipse/egit/ui/Activator.java621
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/PluginPreferenceInitializer.java3
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIPreferences.java7
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ActionUtils.java70
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ApplicationActiveListener.java132
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ConfigurationChecker.java98
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ExternalRepositoryScanner.java491
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/StartEventListener.java121
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIIcons.java7
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIText.java124
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/FetchActionHandler.java6
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/PushActionHandler.java6
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/TagActionHandler.java91
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/AbstractGitCloneWizard.java6
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commands/shared/AbstractRebaseCommandHandler.java2
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/CommitEditor.java30
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/CommitJob.java23
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffEditor.java13
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffEditorOutlinePage.java78
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/HeaderText.java16
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/command/CherryPickUI.java3
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/command/RewordHandler.java67
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/command/SquashHandler.java26
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/command/StashApplyHandler.java5
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/credentials/SignatureUtils.java109
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/decorators/GitLightweightDecorator.java2
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CommitDialog.java8
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CommitMessageComponent.java79
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CreateTagDialog.java134
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/ErrorDialogWithHelp.java158
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/GitTraceConfigurationDialog.java21
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/fetch/FetchGerritChangePage.java26
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/fetch/FetchWizard.java6
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitInfoBuilder.java47
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitMessageViewer.java1
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GenerateHistoryJob.java2
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GitHistoryPage.java4
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/command/RewordHandler.java15
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/jobs/GpgConfigProblemReportAction.java52
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/jobs/RepositoryJob.java2
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/CommittingPreferencePage.java84
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/DoublePreferencesPreferencePage.java13
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/FullWidthFileFieldEditor.java95
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/GitPreferenceRoot.java29
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/HistoryPreferencePage.java3
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/ProjectsPreferencePage.java2
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/SynchronizePreferencePage.java2
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/WindowCachePreferencePage.java2
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/CommitPropertyDescriptor.java283
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/CommitPropertySource.java112
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/GitPropertyDescriptor.java41
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/GitPropertySheetPage.java80
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/ListPropertySource.java86
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/MessagePropertyDescriptor.java404
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/PersonIdentPropertySource.java103
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/TagPropertySource.java218
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/pull/PullOperationUI.java2
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/ConfirmationPage.java9
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/PushJob.java6
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/PushWizard.java14
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/rebase/CommitMessageEditorDialog.java4
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/rebase/RebaseInteractiveHandler.java26
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/rebase/RebaseInteractiveView.java8
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/reflog/ReflogView.java4
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/CreateRepositoryPage.java56
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/NewRepositoryWizard.java9
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/RepositoriesView.java20
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/RepositoriesViewContentProvider.java2
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/RepositoryPropertySource.java23
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/RepositoryPropertySourceProvider.java72
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/RepositoryRemotePropertySource.java67
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/RepositorySearchDialog.java2
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/tree/command/AddCommand.java4
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/tree/command/RemoveRemoteCommand.java5
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/resources/ResourceStateFactory.java21
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/staging/StagingView.java14
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/staging/StagingViewContentProvider.java7
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/synchronize/compare/LocalNonWorkspaceTypedElement.java2
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/trace/DebugOptionsHandler.java29
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/trace/GitTraceLocation.java29
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/uitext.properties59
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/variables/GitVariableResolver.java24
-rw-r--r--org.eclipse.egit/META-INF/MANIFEST.MF2
-rw-r--r--org.eclipse.egit/about.ini2
-rw-r--r--org.eclipse.egit/pom.xml2
-rw-r--r--pom.xml4
-rw-r--r--tools/oomph/EGit.setup32
225 files changed, 6619 insertions, 2541 deletions
diff --git a/org.eclipse.egit-feature/feature.properties b/org.eclipse.egit-feature/feature.properties
index 46829c5826..9233b2a4bb 100644
--- a/org.eclipse.egit-feature/feature.properties
+++ b/org.eclipse.egit-feature/feature.properties
@@ -1,5 +1,5 @@
###############################################################################
-# Copyright (c) 2000, 2010 IBM Corporation and others.
+# Copyright (c) 2000, 2021 IBM Corporation and others.
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License 2.0
# which accompanies this distribution, and is available at
@@ -19,7 +19,7 @@ description=Versioning with Git, integration with Gerrit, Gitflow, and Task repo
# "copyright" property - text of the "Feature Update Copyright"
copyright=\
-Copyright (c) 2005, 2020 Shawn Pearce, Robin Rosenberg, et.al.\n\
+Copyright (c) 2005, 2021 Shawn Pearce, Robin Rosenberg, et.al.\n\
All rights reserved. This program and the accompanying materials\n\
are made available under the terms of the Eclipse Public License 2.0\n\
which accompanies this distribution, and is available at\n\
diff --git a/org.eclipse.egit-feature/feature.xml b/org.eclipse.egit-feature/feature.xml
index 692e9c6737..ebd83de9cd 100644
--- a/org.eclipse.egit-feature/feature.xml
+++ b/org.eclipse.egit-feature/feature.xml
@@ -2,7 +2,7 @@
<feature
id="org.eclipse.egit"
label="%featureName"
- version="5.10.0.qualifier"
+ version="5.11.0.qualifier"
provider-name="%providerName"
plugin="org.eclipse.egit"
license-feature="org.eclipse.license"
@@ -37,14 +37,10 @@
<import plugin="org.eclipse.compare" version="3.6.0" match="compatible"/>
<import plugin="org.eclipse.core.net" version="1.3.0" match="compatible"/>
<import plugin="org.eclipse.team.core" version="3.8.0" match="compatible"/>
- <import plugin="org.eclipse.jsch.ui" version="1.3.0" match="compatible"/>
- <import plugin="org.eclipse.jsch.core" version="1.3.0" match="compatible"/>
- <import plugin="com.jcraft.jsch" version="0.1.55" match="compatible"/>
- <import feature="org.eclipse.jgit" version="5.10.0" match="equivalent"/>
- <import feature="org.eclipse.jgit.gpg.bc" version="5.10.0" match="equivalent"/>
- <import feature="org.eclipse.jgit.http.apache" version="5.10.0" match="equivalent"/>
- <import feature="org.eclipse.jgit.ssh.apache" version="5.10.0" match="equivalent"/>
- <import feature="org.eclipse.jgit.ssh.jsch" version="5.10.0" match="equivalent"/>
+ <import feature="org.eclipse.jgit" version="5.11.0" match="equivalent"/>
+ <import feature="org.eclipse.jgit.gpg.bc" version="5.11.0" match="equivalent"/>
+ <import feature="org.eclipse.jgit.http.apache" version="5.11.0" match="equivalent"/>
+ <import feature="org.eclipse.jgit.ssh.apache" version="5.11.0" match="equivalent"/>
</requires>
<plugin
diff --git a/org.eclipse.egit-feature/pom.xml b/org.eclipse.egit-feature/pom.xml
index 073a3ee59f..1eff5f41df 100644
--- a/org.eclipse.egit-feature/pom.xml
+++ b/org.eclipse.egit-feature/pom.xml
@@ -18,7 +18,7 @@
<parent>
<groupId>org.eclipse.egit</groupId>
<artifactId>egit-parent</artifactId>
- <version>5.10.0-SNAPSHOT</version>
+ <version>5.11.0-SNAPSHOT</version>
</parent>
<groupId>org.eclipse.egit.feature</groupId>
diff --git a/org.eclipse.egit.core.junit/META-INF/MANIFEST.MF b/org.eclipse.egit.core.junit/META-INF/MANIFEST.MF
index 9cc82191f4..2aa0c0ad1e 100644
--- a/org.eclipse.egit.core.junit/META-INF/MANIFEST.MF
+++ b/org.eclipse.egit.core.junit/META-INF/MANIFEST.MF
@@ -4,26 +4,26 @@ Bundle-Name: %Bundle-Name
Bundle-Vendor: %Bundle-Vendor
Automatic-Module-Name: org.eclipse.egit.core.junit
Bundle-SymbolicName: org.eclipse.egit.core.junit
-Bundle-Version: 5.10.0.qualifier
+Bundle-Version: 5.11.0.qualifier
Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.12.0,4.0.0)",
org.eclipse.core.filesystem;bundle-version="[1.6.0,2.0.0)",
org.eclipse.core.resources;bundle-version="[3.11.0,4.0.0)",
org.eclipse.jdt.core;bundle-version="[3.12.0,4.0.0)",
org.eclipse.jdt.launching;bundle-version="[3.8.100,4.0.0)",
org.junit;bundle-version="[4.13.0,5.0.0)"
-Import-Package: org.eclipse.egit.core;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.op;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.api;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.api.errors;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.dircache;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.errors;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.junit;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.lib;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.revwalk;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.storage.file;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.transport;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.treewalk;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.util;version="[5.10.0,5.11.0)"
+Import-Package: org.eclipse.egit.core;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.op;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.api;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.api.errors;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.dircache;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.errors;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.junit;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.lib;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.revwalk;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.storage.file;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.transport;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.treewalk;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.util;version="[5.11.0,5.12.0)"
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Export-Package: org.eclipse.egit.core.test;version="5.10.0";x-friends:="org.eclipse.egit.core.test,org.eclipse.egit.ui.test,org.eclipse.egit.gitflow.test"
+Export-Package: org.eclipse.egit.core.test;version="5.11.0";x-friends:="org.eclipse.egit.core.test,org.eclipse.egit.ui.test,org.eclipse.egit.gitflow.test"
Bundle-Localization: plugin
diff --git a/org.eclipse.egit.core.junit/pom.xml b/org.eclipse.egit.core.junit/pom.xml
index 2db89a012d..218edc3496 100644
--- a/org.eclipse.egit.core.junit/pom.xml
+++ b/org.eclipse.egit.core.junit/pom.xml
@@ -18,7 +18,7 @@
<parent>
<groupId>org.eclipse.egit</groupId>
<artifactId>egit-parent</artifactId>
- <version>5.10.0-SNAPSHOT</version>
+ <version>5.11.0-SNAPSHOT</version>
</parent>
<artifactId>org.eclipse.egit.core.junit</artifactId>
diff --git a/org.eclipse.egit.core.junit/src/org/eclipse/egit/core/test/GitTestCase.java b/org.eclipse.egit.core.junit/src/org/eclipse/egit/core/test/GitTestCase.java
index 074b7dcf40..63fa48af50 100644
--- a/org.eclipse.egit.core.junit/src/org/eclipse/egit/core/test/GitTestCase.java
+++ b/org.eclipse.egit.core.junit/src/org/eclipse/egit/core/test/GitTestCase.java
@@ -51,9 +51,10 @@ public abstract class GitTestCase {
public static void setUpClass() {
// suppress auto-ignoring and auto-sharing to avoid interference
IEclipsePreferences p = InstanceScope.INSTANCE.getNode(Activator
- .getPluginId());
+ .PLUGIN_ID);
p.putBoolean(GitCorePreferences.core_autoIgnoreDerivedResources, false);
p.putBoolean(GitCorePreferences.core_autoShareProjects, false);
+ FS.FileStoreAttributes.setBackground(false);
}
@Before
@@ -93,8 +94,15 @@ public abstract class GitTestCase {
public void tearDown() throws Exception {
project.dispose();
Activator.getDefault().getRepositoryCache().clear();
- if (gitDir.exists())
- FileUtils.delete(gitDir, FileUtils.RECURSIVE | FileUtils.RETRY);
+ if (gitDir.exists()) {
+ try {
+ FileUtils.delete(gitDir, FileUtils.RECURSIVE | FileUtils.RETRY);
+ } catch (Exception e) {
+ System.err.println(TestUtils.dumpThreads());
+ TestUtils.listDirectory(gitDir, true);
+ throw e;
+ }
+ }
SystemReader.setInstance(null);
}
diff --git a/org.eclipse.egit.core.test/META-INF/MANIFEST.MF b/org.eclipse.egit.core.test/META-INF/MANIFEST.MF
index 12e6ea79d8..5a5eb7ac74 100644
--- a/org.eclipse.egit.core.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.egit.core.test/META-INF/MANIFEST.MF
@@ -5,7 +5,7 @@ Bundle-Vendor: Eclipse.org
Automatic-Module-Name: org.eclipse.egit.core.test
Bundle-SymbolicName: org.eclipse.egit.core.test;singleton:=true
Fragment-Host: org.eclipse.egit.core
-Bundle-Version: 5.10.0.qualifier
+Bundle-Version: 5.11.0.qualifier
Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.12.0,4.0.0)",
org.eclipse.core.filesystem;bundle-version="[1.6.0,2.0.0)",
org.eclipse.core.resources;bundle-version="[3.11.0,4.0.0)",
@@ -13,19 +13,19 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.12.0,4.0.0)",
org.eclipse.jdt.core;bundle-version="[3.12.0,4.0.0)",
org.hamcrest;bundle-version="[1.1.0,2.0.0)",
org.junit;bundle-version="[4.13.0,5.0.0)",
- org.eclipse.egit.core.junit;bundle-version="[5.10.0,5.11.0)"
+ org.eclipse.egit.core.junit;bundle-version="[5.11.0,5.12.0)"
Import-Package: net.bytebuddy;version="[1.7.9,2.0.0)",
net.bytebuddy.agent;version="[1.7.9,2.0.0)",
- org.eclipse.egit.core;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.op;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.project;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.api.errors;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.attributes;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.junit;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.lib;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.treewalk;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.treewalk.filter;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.util;version="[5.10.0,5.11.0)",
+ org.eclipse.egit.core;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.op;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.project;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.api.errors;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.attributes;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.junit;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.lib;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.treewalk;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.treewalk.filter;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.util;version="[5.11.0,5.12.0)",
org.mockito;version="[2.13.0,3.0.0)",
org.mockito.junit;version="[2.13.0,3.0.0)",
org.mockito.stubbing;version="[2.13.0,3.0.0)"
diff --git a/org.eclipse.egit.core.test/pom.xml b/org.eclipse.egit.core.test/pom.xml
index 0cef607583..399d29104a 100644
--- a/org.eclipse.egit.core.test/pom.xml
+++ b/org.eclipse.egit.core.test/pom.xml
@@ -18,7 +18,7 @@
<parent>
<groupId>org.eclipse.egit</groupId>
<artifactId>egit-parent</artifactId>
- <version>5.10.0-SNAPSHOT</version>
+ <version>5.11.0-SNAPSHOT</version>
</parent>
<artifactId>org.eclipse.egit.core.test</artifactId>
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 7667538b73..0b00c9ee32 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
@@ -153,7 +153,7 @@ public class GitMoveDeleteHookTest {
@Theory
public void testDeleteFile(boolean autoStageDelete) throws Exception {
IEclipsePreferences p = InstanceScope.INSTANCE
- .getNode(Activator.getPluginId());
+ .getNode(Activator.PLUGIN_ID);
p.putBoolean(GitCorePreferences.core_autoStageDeletion,
autoStageDelete);
@@ -262,7 +262,7 @@ public class GitMoveDeleteHookTest {
private void configureAutoStageMoves(boolean autoStageMoves) {
IEclipsePreferences p = InstanceScope.INSTANCE
- .getNode(Activator.getPluginId());
+ .getNode(Activator.PLUGIN_ID);
p.putBoolean(GitCorePreferences.core_autoStageMoves, autoStageMoves);
}
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 6efd763aa3..d74dcfb9cd 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
@@ -354,7 +354,7 @@ public class GitSubscriberMergeContextTest extends ModelTestCase {
@Test
public void mergeModelWithDeletedFileNoConflict() throws Exception {
IEclipsePreferences p = InstanceScope.INSTANCE
- .getNode(Activator.getPluginId());
+ .getNode(Activator.PLUGIN_ID);
p.putBoolean(GitCorePreferences.core_autoStageDeletion, true);
File file1 = testRepo.createFile(iProject, "file1."
+ SAMPLE_FILE_EXTENSION);
diff --git a/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/GitProjectSetCapabilityTest.java b/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/GitProjectSetCapabilityTest.java
index 46679ff4fa..927d286ff2 100644
--- a/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/GitProjectSetCapabilityTest.java
+++ b/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/GitProjectSetCapabilityTest.java
@@ -91,7 +91,7 @@ public class GitProjectSetCapabilityTest {
}
// make sure the default directory for Repos is not the user home
IEclipsePreferences p = InstanceScope.INSTANCE
- .getNode(Activator.getPluginId());
+ .getNode(Activator.PLUGIN_ID);
p.put(GitCorePreferences.core_defaultRepositoryDir, repoRoot.getPath());
}
diff --git a/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/MergeWithPreferredStrategyTest.java b/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/MergeWithPreferredStrategyTest.java
index c48222a3a1..ac62817842 100644
--- a/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/MergeWithPreferredStrategyTest.java
+++ b/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/MergeWithPreferredStrategyTest.java
@@ -57,8 +57,8 @@ public class MergeWithPreferredStrategyTest extends GitTestCase {
@Before
public void setUp() throws Exception {
super.setUp();
- InstanceScope.INSTANCE.getNode(Activator.getPluginId()).put(
- GitCorePreferences.core_preferredMergeStrategy, "ours");
+ InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID)
+ .put(GitCorePreferences.core_preferredMergeStrategy, "ours");
gitDir = new File(project.getProject().getLocationURI().getPath(),
Constants.DOT_GIT);
testRepository = new TestRepository(gitDir);
@@ -87,8 +87,8 @@ public class MergeWithPreferredStrategyTest extends GitTestCase {
@After
public void tearDown() throws Exception {
super.tearDown();
- InstanceScope.INSTANCE.getNode(Activator.getPluginId()).remove(
- GitCorePreferences.core_preferredMergeStrategy);
+ InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID)
+ .remove(GitCorePreferences.core_preferredMergeStrategy);
}
@Test
@@ -109,7 +109,7 @@ public class MergeWithPreferredStrategyTest extends GitTestCase {
@Test
public void testMergeUsesPreferredStrategyRegisteredWithExplicitName()
throws Exception {
- InstanceScope.INSTANCE.getNode(Activator.getPluginId()).put(
+ InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID).put(
GitCorePreferences.core_preferredMergeStrategy,
"org.eclipse.egit.core.test.theirs");
MergeOperation operation = new MergeOperation(
diff --git a/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/PreferredMergeStrategyTest.java b/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/PreferredMergeStrategyTest.java
index f8a8da28db..7c30f1e5b6 100644
--- a/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/PreferredMergeStrategyTest.java
+++ b/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/PreferredMergeStrategyTest.java
@@ -31,8 +31,8 @@ public class PreferredMergeStrategyTest {
@Before
public void setUp() {
a = Activator.getDefault();
- InstanceScope.INSTANCE.getNode(Activator.getPluginId()).remove(
- GitCorePreferences.core_preferredMergeStrategy);
+ InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID)
+ .remove(GitCorePreferences.core_preferredMergeStrategy);
}
/**
@@ -40,8 +40,8 @@ public class PreferredMergeStrategyTest {
*/
@After
public void tearDown() {
- InstanceScope.INSTANCE.getNode(Activator.getPluginId()).remove(
- GitCorePreferences.core_preferredMergeStrategy);
+ InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID)
+ .remove(GitCorePreferences.core_preferredMergeStrategy);
}
@Test
@@ -51,8 +51,8 @@ public class PreferredMergeStrategyTest {
@Test
public void testGetPreferredMergeStrategyWhenNoPref() {
- InstanceScope.INSTANCE.getNode(Activator.getPluginId()).remove(
- GitCorePreferences.core_preferredMergeStrategy);
+ InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID)
+ .remove(GitCorePreferences.core_preferredMergeStrategy);
assertNull(a.getPreferredMergeStrategy());
}
@@ -61,9 +61,9 @@ public class PreferredMergeStrategyTest {
public void testGetPreferredMergeStrategyWhenInvalidPreference() {
// Using "invalid value" simulates a property set to a merge strategy
// that's no longer registered
- InstanceScope.INSTANCE.getNode(Activator.getPluginId())
- .put(GitCorePreferences.core_preferredMergeStrategy,
- "invalid value");
+ InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID).put(
+ GitCorePreferences.core_preferredMergeStrategy,
+ "invalid value");
assertNull(a.getPreferredMergeStrategy());
}
@@ -72,8 +72,8 @@ public class PreferredMergeStrategyTest {
public void testGetPreferredMergeStrategyWhenValidPreference() {
// Using "resolve" here because there's no need for more configuration
// in this test, it is a registered MergeStrategy
- InstanceScope.INSTANCE.getNode(Activator.getPluginId()).put(
- GitCorePreferences.core_preferredMergeStrategy, "resolve");
+ InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID)
+ .put(GitCorePreferences.core_preferredMergeStrategy, "resolve");
assertSame(MergeStrategy.RESOLVE, a.getPreferredMergeStrategy());
}
diff --git a/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/op/ConnectProviderOperationTest.java b/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/op/ConnectProviderOperationTest.java
index 78ebc96232..a784a5489c 100644
--- a/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/op/ConnectProviderOperationTest.java
+++ b/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/op/ConnectProviderOperationTest.java
@@ -120,7 +120,7 @@ public class ConnectProviderOperationTest extends GitTestCase {
public void testAutoIgnoresDerivedFolder() throws Exception {
// enable auto-ignore
IEclipsePreferences p = InstanceScope.INSTANCE.getNode(Activator
- .getPluginId());
+ .PLUGIN_ID);
boolean autoignore = p.getBoolean(
GitCorePreferences.core_autoIgnoreDerivedResources, false);
if (!autoignore) {
@@ -177,7 +177,7 @@ public class ConnectProviderOperationTest extends GitTestCase {
public void testNoAutoIgnoresDerivedFolder() throws Exception {
// disable auto-ignore
IEclipsePreferences p = InstanceScope.INSTANCE
- .getNode(Activator.getPluginId());
+ .getNode(Activator.PLUGIN_ID);
boolean autoignore = p.getBoolean(
GitCorePreferences.core_autoIgnoreDerivedResources, false);
if (autoignore) {
diff --git a/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/op/TagOperationTest.java b/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/op/TagOperationTest.java
index 9c9dee29d9..c26bb2f27d 100644
--- a/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/op/TagOperationTest.java
+++ b/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/op/TagOperationTest.java
@@ -24,9 +24,10 @@ import org.eclipse.egit.core.test.TestRepository;
import org.eclipse.egit.core.test.TestUtils;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.TagBuilder;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevTag;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.util.RawParseUtils;
@@ -68,97 +69,92 @@ public class TagOperationTest extends DualRepositoryTestCase {
@Test
public void addTag() throws Exception {
- assertTrue("Tags should be empty", repository1.getRepository()
- .getRefDatabase().getRefsByPrefix(Constants.R_TAGS).isEmpty());
- TagBuilder newTag = new TagBuilder();
- newTag.setTag("TheNewTag");
- newTag.setMessage("Well, I'm the tag");
- newTag.setTagger(RawParseUtils.parsePersonIdent(TestUtils.AUTHOR));
- newTag.setObjectId(repository1.getRepository()
- .resolve("refs/heads/master"), Constants.OBJ_COMMIT);
- TagOperation top = new TagOperation(repository1.getRepository(),
- newTag, false);
+ Repository repo = repository1.getRepository();
+ assertTrue("Tags should be empty", repo.getRefDatabase()
+ .getRefsByPrefix(Constants.R_TAGS).isEmpty());
+ PersonIdent author = RawParseUtils.parsePersonIdent(TestUtils.AUTHOR);
+ TagOperation top = new TagOperation(repo)
+ .setAnnotated(true)
+ .setForce(false).setName("TheNewTag")
+ .setMessage("Well, I'm the tag")
+ .setTagger(author)
+ .setTarget(repo.parseCommit(repo.resolve("refs/heads/master")));
top.execute(new NullProgressMonitor());
- assertFalse("Tags should not be empty", repository1.getRepository()
- .getRefDatabase().getRefsByPrefix(Constants.R_TAGS).isEmpty());
+ assertFalse("Tags should not be empty", repo.getRefDatabase()
+ .getRefsByPrefix(Constants.R_TAGS).isEmpty());
+ // Execute it again: should create an identical tag object with the same
+ // hash and be allowed
top.execute(null);
- assertEquals(top.getResult(), RefUpdate.Result.NO_CHANGE);
-
- top = new TagOperation(repository1.getRepository(), newTag, true);
+ // Set the force flag and re-execute; should also be allowed.
+ top.setForce(true);
top.execute(null);
- assertEquals(top.getResult(), RefUpdate.Result.NO_CHANGE);
- try (RevWalk walk = new RevWalk(repository1.getRepository())) {
- RevTag tag = walk.parseTag(repository1.getRepository().resolve(
- Constants.R_TAGS + "TheNewTag"));
+ // Change the message (force flag is still set)
+ try (RevWalk walk = new RevWalk(repo)) {
+ RevTag tag = walk
+ .parseTag(repo.resolve(Constants.R_TAGS + "TheNewTag"));
- newTag.setMessage("Another message");
+ top.setMessage("Another message");
assertFalse("Messages should differ",
- tag.getFullMessage().equals(newTag.getMessage()));
+ tag.getFullMessage().equals(top.getMessage()));
top.execute(null);
- tag = walk.parseTag(repository1.getRepository().resolve(
- Constants.R_TAGS + "TheNewTag"));
+ tag = walk.parseTag(repo.resolve(Constants.R_TAGS + "TheNewTag"));
assertTrue("Messages be same",
- tag.getFullMessage().equals(newTag.getMessage()));
- walk.dispose();
+ tag.getFullMessage().equals(top.getMessage()));
}
}
@Test
public void addEmptyAnnotatedTag() throws Exception {
- assertTrue("Tags should be empty", repository1.getRepository()
- .getRefDatabase().getRefsByPrefix(Constants.R_TAGS).isEmpty());
- TagBuilder newTag = new TagBuilder();
- newTag.setTag("TheNewTag");
- newTag.setMessage("");
- newTag.setTagger(RawParseUtils.parsePersonIdent(TestUtils.AUTHOR));
- ObjectId headCommit = repository1.getRepository()
- .resolve("refs/heads/master");
- newTag.setObjectId(headCommit, Constants.OBJ_COMMIT);
- TagOperation top = new TagOperation(repository1.getRepository(), newTag,
- false, true);
+ Repository repo = repository1.getRepository();
+ assertTrue("Tags should be empty", repo.getRefDatabase().getRefsByPrefix(Constants.R_TAGS).isEmpty());
+ RevCommit commit = repo.parseCommit(repo.resolve("refs/heads/master"));
+ TagOperation top = new TagOperation(repo)
+ .setName("TheNewTag")
+ .setAnnotated(true)
+ .setMessage("")
+ .setTagger(RawParseUtils.parsePersonIdent(TestUtils.AUTHOR))
+ .setTarget(repo.parseCommit(repo.resolve("refs/heads/master")));
top.execute(new NullProgressMonitor());
- assertFalse("Tags should not be empty", repository1.getRepository()
- .getRefDatabase().getRefsByPrefix(Constants.R_TAGS).isEmpty());
- assertIsAnnotated("TheNewTag", headCommit, "");
+ assertFalse("Tags should not be empty", repo.getRefDatabase()
+ .getRefsByPrefix(Constants.R_TAGS).isEmpty());
+ assertIsAnnotated("TheNewTag", commit, "");
}
@Test
public void addNullAnnotatedTag() throws Exception {
- assertTrue("Tags should be empty", repository1.getRepository()
- .getRefDatabase().getRefsByPrefix(Constants.R_TAGS).isEmpty());
- TagBuilder newTag = new TagBuilder();
- newTag.setTag("TheNewTag");
- newTag.setTagger(RawParseUtils.parsePersonIdent(TestUtils.AUTHOR));
- ObjectId headCommit = repository1.getRepository()
- .resolve("refs/heads/master");
- newTag.setObjectId(headCommit, Constants.OBJ_COMMIT);
- TagOperation top = new TagOperation(repository1.getRepository(), newTag,
- false, true);
+ Repository repo = repository1.getRepository();
+ assertTrue("Tags should be empty", repo.getRefDatabase()
+ .getRefsByPrefix(Constants.R_TAGS).isEmpty());
+ RevCommit commit = repo.parseCommit(repo.resolve("refs/heads/master"));
+ TagOperation top = new TagOperation(repo)
+ .setName("TheNewTag")
+ .setAnnotated(true)
+ .setTagger(RawParseUtils.parsePersonIdent(TestUtils.AUTHOR))
+ .setTarget(repo.parseCommit(repo.resolve("refs/heads/master")));
top.execute(new NullProgressMonitor());
- assertFalse("Tags should not be empty", repository1.getRepository()
- .getRefDatabase().getRefsByPrefix(Constants.R_TAGS).isEmpty());
- assertIsAnnotated("TheNewTag", headCommit, null);
+ assertFalse("Tags should not be empty", repo.getRefDatabase()
+ .getRefsByPrefix(Constants.R_TAGS).isEmpty());
+ assertIsAnnotated("TheNewTag", commit, "");
}
@Test
public void addLightweightTag() throws Exception {
- assertTrue("Tags should be empty", repository1.getRepository()
- .getRefDatabase().getRefsByPrefix(Constants.R_TAGS).isEmpty());
- TagBuilder newTag = new TagBuilder();
- newTag.setTag("TheNewTag");
- newTag.setTagger(RawParseUtils.parsePersonIdent(TestUtils.AUTHOR));
- ObjectId headCommit = repository1.getRepository()
- .resolve("refs/heads/master");
- newTag.setObjectId(headCommit, Constants.OBJ_COMMIT);
- TagOperation top = new TagOperation(repository1.getRepository(), newTag,
- false, false);
+ Repository repo = repository1.getRepository();
+ assertTrue("Tags should be empty", repo.getRefDatabase()
+ .getRefsByPrefix(Constants.R_TAGS).isEmpty());
+ RevCommit commit = repo.parseCommit(repo.resolve("refs/heads/master"));
+ TagOperation top = new TagOperation(repo)
+ .setName("TheNewTag")
+ .setAnnotated(false)
+ .setTagger(RawParseUtils.parsePersonIdent(TestUtils.AUTHOR))
+ .setTarget(repo.parseCommit(repo.resolve("refs/heads/master")));
top.execute(new NullProgressMonitor());
- assertFalse("Tags should not be empty", repository1.getRepository()
- .getRefDatabase().getRefsByPrefix(Constants.R_TAGS).isEmpty());
- assertIsLightweight("TheNewTag", headCommit);
+ assertFalse("Tags should not be empty", repo.getRefDatabase()
+ .getRefsByPrefix(Constants.R_TAGS).isEmpty());
+ assertIsLightweight("TheNewTag", commit);
}
private void assertIsAnnotated(String tag, ObjectId target, String message)
diff --git a/org.eclipse.egit.core/.options b/org.eclipse.egit.core/.options
index de24ff0deb..09d0a6fd01 100644
--- a/org.eclipse.egit.core/.options
+++ b/org.eclipse.egit.core/.options
@@ -2,9 +2,9 @@
org.eclipse.egit.core/debug = false
# General trace location for the EGit Core Plugin
org.eclipse.egit.core/debug/core = false
+# Trace location for GPG signing
+org.eclipse.egit.core/debug/core/gpg = false
# Trace location for the IndexDiffCache
org.eclipse.egit.core/debug/core/indexdiffcache = false
-# Trace location for JSch
-org.eclipse.egit.core/debug/core/jsch = false
# Trace location for ResourceRefreshJob
org.eclipse.egit.core/debug/core/refresh = false
diff --git a/org.eclipse.egit.core/META-INF/MANIFEST.MF b/org.eclipse.egit.core/META-INF/MANIFEST.MF
index 74521396f4..0890425f5a 100644
--- a/org.eclipse.egit.core/META-INF/MANIFEST.MF
+++ b/org.eclipse.egit.core/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name
Automatic-Module-Name: org.eclipse.egit.core
Bundle-SymbolicName: org.eclipse.egit.core;singleton:=true
-Bundle-Version: 5.10.0.qualifier
+Bundle-Version: 5.11.0.qualifier
Bundle-Activator: org.eclipse.egit.core.Activator
Bundle-Vendor: %Bundle-Vendor
Bundle-Localization: plugin
@@ -14,7 +14,7 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.12.0,4.0.0)",
org.eclipse.equinox.security;bundle-version="[1.2.200,2.0.0)",
org.eclipse.core.variables;bundle-version="[3.3.0,4.0.0)",
org.eclipse.core.filebuffers;bundle-version="[3.6.0,4.0.0)"
-Export-Package: org.eclipse.egit.core;version="5.10.0";
+Export-Package: org.eclipse.egit.core;version="5.11.0";
x-friends:="org.eclipse.egit.ui,
org.eclipse.egit.ui.test,
org.eclipse.egit.mylyn.ui,
@@ -23,21 +23,22 @@ Export-Package: org.eclipse.egit.core;version="5.10.0";
org.eclipse.mylyn.github.ui,
org.eclipse.mylyn.github.core,
org.eclipse.egit.core.junit",
- org.eclipse.egit.core.attributes;version="5.10.0";uses:="org.eclipse.jgit.lib",
- org.eclipse.egit.core.internal;version="5.10.0";
+ org.eclipse.egit.core.attributes;version="5.11.0";uses:="org.eclipse.jgit.lib",
+ org.eclipse.egit.core.internal;version="5.11.0";
x-friends:="org.eclipse.egit.ui,
org.eclipse.egit.import,
org.eclipse.egit.gitflow.ui,
org.eclipse.egit.gitflow,
org.eclipse.egit.mylyn.ui",
- org.eclipse.egit.core.internal.gerrit;version="5.10.0";x-friends:="org.eclipse.egit.ui",
- org.eclipse.egit.core.internal.indexdiff;version="5.10.0";x-friends:="org.eclipse.egit.ui,org.eclipse.egit.ui.test",
- org.eclipse.egit.core.internal.job;version="5.10.0";x-friends:="org.eclipse.egit.ui,org.eclipse.egit.gitflow.ui,org.eclipse.egit.gitflow",
- org.eclipse.egit.core.internal.rebase;version="5.10.0";x-friends:="org.eclipse.egit.ui",
- org.eclipse.egit.core.internal.storage;version="5.10.0";x-friends:="org.eclipse.egit.ui,org.eclipse.egit.core.test",
- org.eclipse.egit.core.internal.trace;version="5.10.0";x-internal:=true,
- org.eclipse.egit.core.internal.util;version="5.10.0";x-friends:="org.eclipse.egit.ui",
- org.eclipse.egit.core.op;version="5.10.0";
+ org.eclipse.egit.core.internal.gerrit;version="5.11.0";x-friends:="org.eclipse.egit.ui",
+ org.eclipse.egit.core.internal.indexdiff;version="5.11.0";x-friends:="org.eclipse.egit.ui,org.eclipse.egit.ui.test",
+ org.eclipse.egit.core.internal.job;version="5.11.0";x-friends:="org.eclipse.egit.ui,org.eclipse.egit.gitflow.ui,org.eclipse.egit.gitflow",
+ org.eclipse.egit.core.internal.rebase;version="5.11.0";x-friends:="org.eclipse.egit.ui",
+ org.eclipse.egit.core.internal.signing;version="5.11.0";x-friends:="org.eclipse.egit.ui",
+ org.eclipse.egit.core.internal.storage;version="5.11.0";x-friends:="org.eclipse.egit.ui,org.eclipse.egit.core.test",
+ org.eclipse.egit.core.internal.trace;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.core.internal.util;version="5.11.0";x-friends:="org.eclipse.egit.ui",
+ org.eclipse.egit.core.op;version="5.11.0";
x-friends:="org.eclipse.egit.ui.test,
org.eclipse.egit.ui,
org.eclipse.egit.gitflow,
@@ -46,43 +47,41 @@ Export-Package: org.eclipse.egit.core;version="5.10.0";
org.eclipse.egit.github.core,
org.eclipse.mylyn.github.ui,
org.eclipse.egit.core.junit",
- org.eclipse.egit.core.project;version="5.10.0";x-friends:="org.eclipse.egit.ui,org.eclipse.egit.ui.test,org.eclipse.egit.gitflow.ui",
- org.eclipse.egit.core.securestorage;version="5.10.0";x-friends:="org.eclipse.egit.ui",
- org.eclipse.egit.core.settings;version="5.10.0",
- org.eclipse.egit.core.storage;version="5.10.0";
+ org.eclipse.egit.core.project;version="5.11.0";x-friends:="org.eclipse.egit.ui,org.eclipse.egit.ui.test,org.eclipse.egit.gitflow.ui",
+ org.eclipse.egit.core.securestorage;version="5.11.0";x-friends:="org.eclipse.egit.ui",
+ org.eclipse.egit.core.settings;version="5.11.0",
+ org.eclipse.egit.core.storage;version="5.11.0";
uses:="org.eclipse.core.runtime,
org.eclipse.jgit.dircache,
org.eclipse.jgit.lib,
org.eclipse.core.resources",
- org.eclipse.egit.core.synchronize;version="5.10.0";x-friends:="org.eclipse.egit.ui,org.eclipse.egit.ui.test",
- org.eclipse.egit.core.synchronize.dto;version="5.10.0";x-friends:="org.eclipse.egit.ui"
+ org.eclipse.egit.core.synchronize;version="5.11.0";x-friends:="org.eclipse.egit.ui,org.eclipse.egit.ui.test",
+ org.eclipse.egit.core.synchronize.dto;version="5.11.0";x-friends:="org.eclipse.egit.ui"
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Import-Package: com.jcraft.jsch;bundle-version="[0.1.53,0.2.0)",
- org.eclipse.core.net.proxy;bundle-version="[1.3.0,2.0.0)",
- org.eclipse.jgit.annotations;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.api;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.api.errors;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.attributes;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.diff;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.dircache;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.errors;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.events;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.internal.storage.file;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.internal.transport.jsch;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.lfs;version="[5.10.0,5.11.0)";resolution:=optional,
- org.eclipse.jgit.lib;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.merge;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.revwalk;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.revwalk.filter;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.storage.file;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.submodule;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.transport;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.transport.http;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.transport.http.apache;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.transport.sshd;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.treewalk;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.treewalk.filter;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.util;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.util.io;version="[5.10.0,5.11.0)",
- org.eclipse.jsch.core;bundle-version="[1.3.0,2.0.0)"
+Import-Package: org.eclipse.core.net.proxy;bundle-version="[1.3.0,2.0.0)",
+ org.eclipse.jgit.annotations;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.api;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.api.errors;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.attributes;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.diff;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.dircache;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.errors;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.events;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.gpg.bc;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.internal.storage.file;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.lfs;version="[5.11.0,5.12.0)";resolution:=optional,
+ org.eclipse.jgit.lib;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.merge;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.revwalk;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.revwalk.filter;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.storage.file;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.submodule;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.transport;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.transport.http;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.transport.http.apache;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.transport.sshd;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.treewalk;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.treewalk.filter;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.util;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.util.io;version="[5.11.0,5.12.0)"
diff --git a/org.eclipse.egit.core/build.properties b/org.eclipse.egit.core/build.properties
index b1c16092c2..48575011a0 100644
--- a/org.eclipse.egit.core/build.properties
+++ b/org.eclipse.egit.core/build.properties
@@ -7,5 +7,4 @@ bin.includes = META-INF/,\
.options,\
plugin.properties,\
schema/
-src.includes = about.html
-extra.. = platform:/fragment/org.eclipse.jgit.ssh.jsch \ No newline at end of file
+src.includes = about.html \ No newline at end of file
diff --git a/org.eclipse.egit.core/pom.xml b/org.eclipse.egit.core/pom.xml
index 684b070509..6c3abcaa6c 100644
--- a/org.eclipse.egit.core/pom.xml
+++ b/org.eclipse.egit.core/pom.xml
@@ -19,7 +19,7 @@
<parent>
<groupId>org.eclipse.egit</groupId>
<artifactId>egit-parent</artifactId>
- <version>5.10.0-SNAPSHOT</version>
+ <version>5.11.0-SNAPSHOT</version>
</parent>
<artifactId>org.eclipse.egit.core</artifactId>
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 cd4b96a261..8176db10c1 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
@@ -61,6 +61,7 @@ import org.eclipse.egit.core.internal.ResourceRefreshHandler;
import org.eclipse.egit.core.internal.SshPreferencesMirror;
import org.eclipse.egit.core.internal.indexdiff.IndexDiffCache;
import org.eclipse.egit.core.internal.job.JobUtil;
+import org.eclipse.egit.core.internal.signing.ExternalGpgSigner;
import org.eclipse.egit.core.internal.trace.GitTraceLocation;
import org.eclipse.egit.core.internal.util.ResourceUtil;
import org.eclipse.egit.core.op.ConnectProviderOperation;
@@ -75,6 +76,7 @@ import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.events.ListenerHandle;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.GpgSigner;
import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.merge.MergeStrategy;
import org.eclipse.jgit.storage.file.FileBasedConfig;
@@ -85,13 +87,11 @@ import org.eclipse.jgit.transport.http.apache.HttpClientConnectionFactory;
import org.eclipse.jgit.transport.sshd.SshdSessionFactory;
import org.eclipse.jgit.util.FS;
import org.eclipse.jgit.util.SystemReader;
-import org.eclipse.jsch.core.IJSchService;
import org.eclipse.osgi.service.debug.DebugOptions;
import org.eclipse.osgi.service.debug.DebugOptionsListener;
import org.eclipse.osgi.util.NLS;
import org.eclipse.team.core.RepositoryProvider;
import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
import org.osgi.service.prefs.BackingStoreException;
import org.osgi.util.tracker.ServiceTracker;
@@ -101,16 +101,14 @@ import org.osgi.util.tracker.ServiceTracker;
*/
public class Activator extends Plugin implements DebugOptionsListener {
- private enum SshClientType {
- JSCH, APACHE
- }
+ /** The plug-in ID for Egit core. */
+ public static final String PLUGIN_ID = "org.eclipse.egit.core"; //$NON-NLS-1$
private enum HttpClientType {
JDK, APACHE
}
private static Activator plugin;
- private static String pluginId;
private RepositoryCache repositoryCache;
private IndexDiffCache indexDiffCache;
private RepositoryUtil repositoryUtil;
@@ -131,13 +129,6 @@ public class Activator extends Plugin implements DebugOptionsListener {
}
/**
- * @return the name of this plugin
- */
- public static String getPluginId() {
- return pluginId;
- }
-
- /**
* Utility to create an error status for this plug-in.
*
* @param message User comprehensible message
@@ -145,7 +136,7 @@ public class Activator extends Plugin implements DebugOptionsListener {
* @return an initialized error status
*/
public static IStatus error(final String message, final Throwable thr) {
- return new Status(IStatus.ERROR, getPluginId(), 0, message, thr);
+ return new Status(IStatus.ERROR, PLUGIN_ID, 0, message, thr);
}
/**
@@ -158,7 +149,7 @@ public class Activator extends Plugin implements DebugOptionsListener {
* @return an initialized cancel status
*/
public static IStatus cancel(final String message, final Throwable thr) {
- return new Status(IStatus.CANCEL, getPluginId(), 0, message, thr);
+ return new Status(IStatus.CANCEL, PLUGIN_ID, 0, message, thr);
}
/**
@@ -180,7 +171,7 @@ public class Activator extends Plugin implements DebugOptionsListener {
*/
public static void logInfo(final String message) {
getDefault().getLog().log(
- new Status(IStatus.INFO, getPluginId(), 0, message, null));
+ new Status(IStatus.INFO, PLUGIN_ID, 0, message, null));
}
/**
@@ -193,7 +184,7 @@ public class Activator extends Plugin implements DebugOptionsListener {
* @return an initialized warning status
*/
public static IStatus warning(final String message, final Throwable thr) {
- return new Status(IStatus.WARNING, getPluginId(), 0, message, thr);
+ return new Status(IStatus.WARNING, PLUGIN_ID, 0, message, thr);
}
/**
@@ -223,7 +214,6 @@ public class Activator extends Plugin implements DebugOptionsListener {
public void start(final BundleContext context) throws Exception {
super.start(context);
- pluginId = context.getBundle().getSymbolicName();
migratePreferences();
FS.FileStoreAttributes.setBackground(true);
@@ -234,25 +224,24 @@ public class Activator extends Plugin implements DebugOptionsListener {
Config.setTypedConfigGetter(new ReportingTypedConfigGetter());
// we want to be notified about debug options changes
Dictionary<String, String> props = new Hashtable<>(4);
- props.put(DebugOptions.LISTENER_SYMBOLICNAME, pluginId);
+ props.put(DebugOptions.LISTENER_SYMBOLICNAME, PLUGIN_ID);
context.registerService(DebugOptionsListener.class.getName(), this,
props);
+ GpgSigner.setDefault(new ExternalGpgSigner());
+
setupHttp();
SshPreferencesMirror.INSTANCE.start();
proxyServiceTracker = new ServiceTracker<>(context,
IProxyService.class.getName(), null);
proxyServiceTracker.open();
- setupSSH(context);
+ SshSessionFactory.setInstance(new EGitSshdSessionFactory());
preferenceChangeListener = event -> {
- if (GitCorePreferences.core_sshClient.equals(event.getKey())) {
- setupSSH(getBundle().getBundleContext());
- } else if (GitCorePreferences.core_httpClient
- .equals(event.getKey())) {
+ if (GitCorePreferences.core_httpClient.equals(event.getKey())) {
setupHttp();
}
};
- InstanceScope.INSTANCE.getNode(pluginId)
+ InstanceScope.INSTANCE.getNode(PLUGIN_ID)
.addPreferenceChangeListener(preferenceChangeListener);
setupProxy();
@@ -279,7 +268,7 @@ public class Activator extends Plugin implements DebugOptionsListener {
private void migratePreferences() {
IEclipsePreferences corePrefs = InstanceScope.INSTANCE
- .getNode(getPluginId());
+ .getNode(PLUGIN_ID);
boolean changed = false;
IEclipsePreferences uiPrefs = InstanceScope.INSTANCE
.getNode("org.eclipse.egit.ui"); //$NON-NLS-1$
@@ -306,47 +295,8 @@ public class Activator extends Plugin implements DebugOptionsListener {
}
}
- @SuppressWarnings("unchecked")
- private void setupSSH(final BundleContext context) {
- String sshClient = Platform.getPreferencesService().getString(pluginId,
- GitCorePreferences.core_sshClient, "apache", null); //$NON-NLS-1$
- SshSessionFactory previous = SshSessionFactory.getInstance();
- if (SshClientType.JSCH.name().equalsIgnoreCase(sshClient)) {
- if (previous instanceof EclipseSshSessionFactory) {
- return;
- }
- ServiceReference ssh = context
- .getServiceReference(IJSchService.class.getName());
- if (ssh != null) {
- SshSessionFactory.setInstance(new EclipseSshSessionFactory(
- (IJSchService) context.getService(ssh)));
- } else {
- // Should never happen
- logWarning(CoreText.Activator_SshClientNoJsch, null);
- if (previous instanceof EGitSshdSessionFactory) {
- return;
- }
- SshSessionFactory.setInstance(new EGitSshdSessionFactory());
- }
- } else {
- if (!SshClientType.APACHE.name().equalsIgnoreCase(sshClient)) {
- logWarning(
- MessageFormat.format(
- CoreText.Activator_SshClientUnknown, sshClient),
- null);
- }
- if (previous instanceof EGitSshdSessionFactory) {
- return;
- }
- SshSessionFactory.setInstance(new EGitSshdSessionFactory());
- }
- if (previous instanceof SshdSessionFactory) {
- ((SshdSessionFactory) previous).close();
- }
- }
-
private void setupHttp() {
- String sshClient = Platform.getPreferencesService().getString(pluginId,
+ String sshClient = Platform.getPreferencesService().getString(PLUGIN_ID,
GitCorePreferences.core_httpClient, "jdk", null); //$NON-NLS-1$
if (HttpClientType.APACHE.name().equalsIgnoreCase(sshClient)) {
HttpTransport.setConnectionFactory(new HttpClientConnectionFactory());
@@ -446,7 +396,7 @@ public class Activator extends Plugin implements DebugOptionsListener {
public MergeStrategy getPreferredMergeStrategy() {
// Get preferences set by user in the UI
final IEclipsePreferences prefs = InstanceScope.INSTANCE
- .getNode(Activator.getPluginId());
+ .getNode(PLUGIN_ID);
String preferredMergeStrategyKey = prefs.get(
GitCorePreferences.core_preferredMergeStrategy, null);
@@ -454,7 +404,7 @@ public class Activator extends Plugin implements DebugOptionsListener {
if (preferredMergeStrategyKey == null
|| preferredMergeStrategyKey.isEmpty()) {
final IEclipsePreferences defaultPrefs = DefaultScope.INSTANCE
- .getNode(Activator.getPluginId());
+ .getNode(PLUGIN_ID);
preferredMergeStrategyKey = defaultPrefs.get(
GitCorePreferences.core_preferredMergeStrategy, null);
}
@@ -533,7 +483,7 @@ public class Activator extends Plugin implements DebugOptionsListener {
public void stop(final BundleContext context) throws Exception {
SshPreferencesMirror.INSTANCE.stop();
if (preferenceChangeListener != null) {
- InstanceScope.INSTANCE.getNode(pluginId)
+ InstanceScope.INSTANCE.getNode(PLUGIN_ID)
.removePreferenceChangeListener(preferenceChangeListener);
preferenceChangeListener = null;
}
@@ -602,9 +552,9 @@ public class Activator extends Plugin implements DebugOptionsListener {
private boolean doAutoShare() {
IEclipsePreferences d = DefaultScope.INSTANCE.getNode(Activator
- .getPluginId());
+ .PLUGIN_ID);
IEclipsePreferences p = InstanceScope.INSTANCE.getNode(Activator
- .getPluginId());
+ .PLUGIN_ID);
return p.getBoolean(GitCorePreferences.core_autoShareProjects, d
.getBoolean(GitCorePreferences.core_autoShareProjects,
true));
@@ -836,9 +786,9 @@ public class Activator extends Plugin implements DebugOptionsListener {
*/
public static boolean autoIgnoreDerived() {
IEclipsePreferences d = DefaultScope.INSTANCE
- .getNode(Activator.getPluginId());
+ .getNode(Activator.PLUGIN_ID);
IEclipsePreferences p = InstanceScope.INSTANCE
- .getNode(Activator.getPluginId());
+ .getNode(Activator.PLUGIN_ID);
return p.getBoolean(GitCorePreferences.core_autoIgnoreDerivedResources,
d.getBoolean(GitCorePreferences.core_autoIgnoreDerivedResources,
true));
@@ -851,9 +801,9 @@ public class Activator extends Plugin implements DebugOptionsListener {
*/
public static boolean autoStageDeletion() {
IEclipsePreferences d = DefaultScope.INSTANCE
- .getNode(Activator.getPluginId());
+ .getNode(Activator.PLUGIN_ID);
IEclipsePreferences p = InstanceScope.INSTANCE
- .getNode(Activator.getPluginId());
+ .getNode(Activator.PLUGIN_ID);
boolean autoStageDeletion = p.getBoolean(
GitCorePreferences.core_autoStageDeletion,
d.getBoolean(GitCorePreferences.core_autoStageDeletion, false));
@@ -867,9 +817,9 @@ public class Activator extends Plugin implements DebugOptionsListener {
*/
public static boolean autoStageMoves() {
IEclipsePreferences d = DefaultScope.INSTANCE
- .getNode(Activator.getPluginId());
+ .getNode(Activator.PLUGIN_ID);
IEclipsePreferences p = InstanceScope.INSTANCE
- .getNode(Activator.getPluginId());
+ .getNode(Activator.PLUGIN_ID);
boolean autoStageMoves = p.getBoolean(
GitCorePreferences.core_autoStageMoves,
d.getBoolean(GitCorePreferences.core_autoStageMoves, false));
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/EclipseSshSessionFactory.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/EclipseSshSessionFactory.java
deleted file mode 100644
index 0b830ad7f5..0000000000
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/EclipseSshSessionFactory.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>
- * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
- * Copyright (C) 2009, Google, Inc.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License 2.0
- * which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-package org.eclipse.egit.core;
-
-import org.eclipse.egit.core.internal.trace.JSchLogger;
-import org.eclipse.jgit.transport.CredentialsProvider;
-import org.eclipse.jgit.transport.CredentialsProviderUserInfo;
-import org.eclipse.jgit.transport.JschConfigSessionFactory;
-import org.eclipse.jgit.transport.OpenSshConfig;
-import org.eclipse.jgit.util.FS;
-import org.eclipse.jsch.core.IJSchService;
-
-import com.jcraft.jsch.JSch;
-import com.jcraft.jsch.JSchException;
-import com.jcraft.jsch.Session;
-import com.jcraft.jsch.UserInfo;
-
-class EclipseSshSessionFactory extends JschConfigSessionFactory {
-
- private final IJSchService provider;
-
- EclipseSshSessionFactory(final IJSchService p) {
- provider = p;
- }
-
- @Override
- protected JSch createDefaultJSch(FS fs) throws JSchException {
- JSch.setConfig("ssh-rsa", JSch.getConfig("signature.rsa")); //$NON-NLS-1$ //$NON-NLS-2$
- JSch.setConfig("ssh-dss", JSch.getConfig("signature.dss")); //$NON-NLS-1$ //$NON-NLS-2$
- // Forcing a dummy session to be created will cause the known hosts
- // and configured private keys to be initialized. This is needed by
- // our parent class in case non-default JSch instances need to be made.
- //
- provider.createSession("127.0.0.1", 0, "eclipse"); //$NON-NLS-1$ //$NON-NLS-2$
- JSch.setLogger(new JSchLogger());
- return provider.getJSch();
- }
-
- @Override
- protected Session createSession(final OpenSshConfig.Host hc,
- final String user, final String host, final int port, FS fs)
- throws JSchException {
- final JSch jsch = getJSch(hc, FS.DETECTED);
- if (jsch == provider.getJSch()) {
- // If its the default JSch desired, let the provider
- // manage the session creation for us.
- //
- return provider.createSession(host, port, user);
- } else {
- // This host configuration is using a different IdentityFile,
- // one that is not available through the default JSch.
- //
- return jsch.getSession(user, host, port);
- }
- }
-
- @Override
- protected void configure(final OpenSshConfig.Host hc, final Session session) {
- UserInfo userInfo = session.getUserInfo();
- if (!hc.isBatchMode() && userInfo == null) {
- final CredentialsProvider cp = CredentialsProvider.getDefault();
- session.setUserInfo(new CredentialsProviderUserInfo(session, cp));
- }
- }
-}
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 953eac0d52..e8c9de96e4 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
@@ -22,7 +22,8 @@ public class GitCorePreferenceInitializer extends AbstractPreferenceInitializer
@Override
public void initializeDefaultPreferences() {
- final IEclipsePreferences p = DefaultScope.INSTANCE.getNode(Activator.getPluginId());
+ final IEclipsePreferences p = DefaultScope.INSTANCE
+ .getNode(Activator.PLUGIN_ID);
p.putInt(GitCorePreferences.core_packedGitWindowSize, 8 * 1024);
p.putInt(GitCorePreferences.core_packedGitLimit, 10 * MB);
@@ -39,9 +40,9 @@ public class GitCorePreferenceInitializer extends AbstractPreferenceInitializer
String defaultRepoDir = RepositoryUtil.getDefaultDefaultRepositoryDir();
p.put(GitCorePreferences.core_defaultRepositoryDir, defaultRepoDir);
p.putInt(GitCorePreferences.core_maxPullThreadsCount, 3);
- p.put(GitCorePreferences.core_sshClient, "apache"); //$NON-NLS-1$
p.put(GitCorePreferences.core_httpClient, "apache"); //$NON-NLS-1$
p.putInt(GitCorePreferences.core_remoteConnectionTimeout, 30);
+ p.put(GitCorePreferences.core_gpgSigner, "bc"); //$NON-NLS-1$
}
}
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 27b488ae7b..ac0771e924 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
@@ -93,16 +93,22 @@ public final class GitCorePreferences {
public static final String core_httpClient = "core_http_client"; //$NON-NLS-1$
/**
- * Ssh client library to use. Currently allowed values are "jsch" and
- * "apache", case insensitive, if undefined or any other value the default
- * "apache" will be used.
- */
- public static final String core_sshClient = "core_ssh_client"; //$NON-NLS-1$
-
- /**
* The timeout in seconds for establishing a remote connection for cloning,
* pushing, or fetching.
*/
public static final String core_remoteConnectionTimeout = "core_remote_connection_timeout"; //$NON-NLS-1$
+ /**
+ * The (absolute) path to an external GPG executable to use for signing
+ * commits or tags. If invalid or there is no executable file at the given
+ * location, it is ignored, and EGit tries to find a GPG executable itself
+ * on $PATH.
+ */
+ public static final String core_gpgExecutable = "core_gpg_executable"; //$NON-NLS-1$
+
+ /**
+ * The type of signer to use. Valid values are "bc" or "gpg".
+ */
+ public static final String core_gpgSigner = "core_gpg_signer"; //$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 255f6556a1..00bf8f7aac 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
@@ -114,7 +114,7 @@ class GitMoveDeleteHook implements IMoveDeleteHook {
if (next < dirc.getEntryCount())
edit.keep(next, dirc.getEntryCount() - next);
if (!edit.commit())
- tree.failed(new Status(IStatus.ERROR, Activator.getPluginId(),
+ tree.failed(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
0, CoreText.MoveDeleteHook_operationError, null));
tree.standardDeleteFile(file, updateFlags, monitor);
} catch (LockFailedException e) {
@@ -131,13 +131,13 @@ class GitMoveDeleteHook implements IMoveDeleteHook {
// needed, which won't happen for calls triggered by merge
// operations from the merge strategies.
Activator.getDefault().getLog()
- .log(new Status(IStatus.WARNING, Activator.getPluginId(),
+ .log(new Status(IStatus.WARNING, Activator.PLUGIN_ID,
MessageFormat
.format(CoreText.MoveDeleteHook_cannotAutoStageDeletion,
file.getLocation())));
return FINISH_FOR_ME;
} catch (IOException e) {
- tree.failed(new Status(IStatus.ERROR, Activator.getPluginId(), 0,
+ tree.failed(new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0,
CoreText.MoveDeleteHook_operationError, e));
} finally {
if (dirc != null)
@@ -190,7 +190,7 @@ class GitMoveDeleteHook implements IMoveDeleteHook {
return FINISH_FOR_ME;
if (!sEnt.isMerged()) {
- tree.failed(new Status(IStatus.WARNING, Activator.getPluginId(),
+ tree.failed(new Status(IStatus.WARNING, Activator.PLUGIN_ID,
CoreText.MoveDeleteHook_unmergedFileError));
return I_AM_DONE;
}
@@ -210,13 +210,13 @@ class GitMoveDeleteHook implements IMoveDeleteHook {
}
if (!sEdit.commit()) {
tree.failed(new Status(IStatus.ERROR,
- Activator.getPluginId(), 0,
+ Activator.PLUGIN_ID, 0,
CoreText.MoveDeleteHook_operationError, null));
}
}
tree.standardMoveFile(srcf, dstf, updateFlags, monitor);
} catch (IOException e) {
- tree.failed(new Status(IStatus.ERROR, Activator.getPluginId(), 0,
+ tree.failed(new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0,
CoreText.MoveDeleteHook_operationError, e));
} finally {
if (sCache != null)
@@ -252,21 +252,21 @@ class GitMoveDeleteHook implements IMoveDeleteHook {
case SUCCESS:
break;
case FAILED:
- tree.failed(new Status(IStatus.ERROR, Activator.getPluginId(),
+ tree.failed(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
0, CoreText.MoveDeleteHook_operationError, null));
return I_AM_DONE;
case UNTRACKED:
// we are not responsible for moving untracked files
return FINISH_FOR_ME;
case UNMERGED:
- tree.failed(new Status(IStatus.WARNING, Activator.getPluginId(),
+ tree.failed(new Status(IStatus.WARNING, Activator.PLUGIN_ID,
CoreText.MoveDeleteHook_unmergedFileInFolderError));
return I_AM_DONE;
}
}
tree.standardMoveFolder(srcf, dstf, updateFlags, monitor);
} catch (IOException e) {
- tree.failed(new Status(IStatus.ERROR, Activator.getPluginId(), 0,
+ tree.failed(new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0,
CoreText.MoveDeleteHook_operationError, e));
}
return true;
@@ -296,7 +296,7 @@ class GitMoveDeleteHook implements IMoveDeleteHook {
RepositoryProvider.unmap(source);
} catch (TeamException e) {
tree.failed(new Status(IStatus.ERROR, Activator
- .getPluginId(), 0,
+ .PLUGIN_ID, 0,
CoreText.MoveDeleteHook_operationError, e));
return true; // Do not let Eclipse complete the operation
}
@@ -324,7 +324,7 @@ class GitMoveDeleteHook implements IMoveDeleteHook {
// Graceful handling of bug, i.e. refuse to destroy your code
tree.failed(new Status(
IStatus.ERROR,
- Activator.getPluginId(),
+ Activator.PLUGIN_ID,
0,
"Cannot move project. See https://bugs.eclipse.org/bugs/show_bug.cgi?id=307140 (not resolved in 3.7)", //$NON-NLS-1$
null));
@@ -380,14 +380,14 @@ class GitMoveDeleteHook implements IMoveDeleteHook {
break;
case FAILED:
tree.failed(new Status(IStatus.ERROR, Activator
- .getPluginId(), 0,
+ .PLUGIN_ID, 0,
CoreText.MoveDeleteHook_operationError, null));
break;
case UNTRACKED:
// we are not responsible for moving untracked files
return FINISH_FOR_ME;
case UNMERGED:
- tree.failed(new Status(IStatus.WARNING, Activator.getPluginId(),
+ tree.failed(new Status(IStatus.WARNING, Activator.PLUGIN_ID,
CoreText.MoveDeleteHook_unmergedFileInFolderError));
return I_AM_DONE;
}
@@ -401,7 +401,7 @@ class GitMoveDeleteHook implements IMoveDeleteHook {
.getProject(description.getName()),
description, monitor, gitDir);
} catch (IOException | CoreException e) {
- tree.failed(new Status(IStatus.ERROR, Activator.getPluginId(),
+ tree.failed(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
0, CoreText.MoveDeleteHook_operationError, e));
}
return true;
@@ -431,7 +431,7 @@ class GitMoveDeleteHook implements IMoveDeleteHook {
try {
mapProject(source, description, monitor, newGitDir);
} catch (CoreException e) {
- tree.failed(new Status(IStatus.ERROR, Activator.getPluginId(),
+ tree.failed(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
0, CoreText.MoveDeleteHook_operationError, e));
}
return true; // We're done with the move
@@ -498,7 +498,7 @@ class GitMoveDeleteHook implements IMoveDeleteHook {
}
private boolean cannotModifyRepository(final IResourceTree tree) {
- tree.failed(new Status(IStatus.ERROR, Activator.getPluginId(), 0,
+ tree.failed(new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0,
CoreText.MoveDeleteHook_cannotModifyFolder, null));
return I_AM_DONE;
}
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/GitProvider.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/GitProvider.java
index 076ce27147..877c6482f3 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/GitProvider.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/GitProvider.java
@@ -72,7 +72,7 @@ public class GitProvider extends RepositoryProvider {
GitProjectData.deconfigure(getProject());
} catch (IOException e) {
throw new CoreException(new Status(IStatus.ERROR,
- Activator.getPluginId(), e.getMessage(), e));
+ Activator.PLUGIN_ID, e.getMessage(), e));
}
}
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/RepositoryUtil.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/RepositoryUtil.java
index ca61b07104..9f705a439f 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/RepositoryUtil.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/RepositoryUtil.java
@@ -45,8 +45,10 @@ import org.eclipse.jgit.annotations.NonNull;
import org.eclipse.jgit.annotations.Nullable;
import org.eclipse.jgit.api.GarbageCollectCommand;
import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
import org.eclipse.jgit.lib.CheckoutEntry;
+import org.eclipse.jgit.lib.ConfigConstants;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.ObjectId;
@@ -64,6 +66,7 @@ import org.eclipse.jgit.treewalk.WorkingTreeIterator;
import org.eclipse.jgit.treewalk.filter.PathFilterGroup;
import org.eclipse.jgit.util.FS;
import org.eclipse.jgit.util.FileUtils;
+import org.eclipse.jgit.util.SystemReader;
import org.osgi.service.prefs.BackingStoreException;
/**
@@ -94,7 +97,7 @@ public class RepositoryUtil {
private final Map<String, String> repositoryNameCache = new HashMap<>();
private final IEclipsePreferences prefs = InstanceScope.INSTANCE
- .getNode(Activator.getPluginId());
+ .getNode(Activator.PLUGIN_ID);
private final java.nio.file.Path workspacePath;
@@ -124,11 +127,11 @@ public class RepositoryUtil {
String key = GitCorePreferences.core_defaultRepositoryDir;
String dir = migrateRepoRootPreference();
IEclipsePreferences p = InstanceScope.INSTANCE
- .getNode(Activator.getPluginId());
+ .getNode(Activator.PLUGIN_ID);
if (dir == null) {
dir = Platform.getPreferencesService().getString(
- Activator.getPluginId(), key,
- getDefaultDefaultRepositoryDir(), null);
+ Activator.PLUGIN_ID, key, getDefaultDefaultRepositoryDir(),
+ null);
} else {
p.put(key, dir);
}
@@ -174,6 +177,24 @@ public class RepositoryUtil {
}
/**
+ * Get the configured default branch name configured with git option
+ * init.defaultBranch. Default is {@code master}.
+ *
+ * @return the configured default branch name configured with git option
+ * init.defaultBranch
+ * @throws ConfigInvalidException
+ * if global or system wide configuration is invalid
+ * @throws IOException
+ * if an IO error occurred when reading git configurations
+ */
+ public static String getDefaultBranchName()
+ throws ConfigInvalidException, IOException {
+ return SystemReader.getInstance().getUserConfig().getString(
+ ConfigConstants.CONFIG_INIT_SECTION, null,
+ ConfigConstants.CONFIG_KEY_DEFAULT_BRANCH);
+ }
+
+ /**
* Reads a reflog (in reverse), returning an empty list and logging
* exceptions if the reflog cannot be parsed.
*
@@ -589,7 +610,7 @@ public class RepositoryUtil {
try {
prefs.flush();
} catch (BackingStoreException e) {
- IStatus error = new Status(IStatus.ERROR, Activator.getPluginId(),
+ IStatus error = new Status(IStatus.ERROR, Activator.PLUGIN_ID,
e.getMessage(), e);
Activator.getDefault().getLog().log(error);
}
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/CoreText.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/CoreText.java
index 08108d442f..5b8e356e22 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/CoreText.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/CoreText.java
@@ -58,12 +58,6 @@ public class CoreText extends NLS {
public static String Activator_refreshFailed;
/** */
- public static String Activator_SshClientNoJsch;
-
- /** */
- public static String Activator_SshClientUnknown;
-
- /** */
public static String AssumeUnchangedOperation_adding;
/** */
@@ -166,6 +160,48 @@ public class CoreText extends NLS {
public static String DisconnectProviderOperation_disconnecting;
/** */
+ public static String ExternalGpgSigner_bufferError;
+
+ /** */
+ public static String ExternalGpgSigner_cannotSearch;
+
+ /** */
+ public static String ExternalGpgSigner_environmentError;
+
+ /** */
+ public static String ExternalGpgSigner_gpgNotFound;
+
+ /** */
+ public static String ExternalGpgSigner_noKeyFound;
+
+ /** */
+ public static String ExternalGpgSigner_noSignature;
+
+ /** */
+ public static String ExternalGpgSigner_processFailed;
+
+ /** */
+ public static String ExternalGpgSigner_processInterrupted;
+
+ /** */
+ public static String ExternalGpgSigner_signingCanceled;
+
+ /** */
+ public static String ExternalGpgSigner_skipNotAccessiblePath;
+
+ /** */
+ public static String ExternalGpgSigner_ttyInput;
+
+ /** */
+ public static String GitSettings_gpgInvalidExecutable;
+
+ /** */
+ public static String GitSettings_gpgNotExecutable;
+
+ /** */
+ public static String GpgSetup_signerUnknown;
+
+ /** */
public static String BlobStorage_blobNotFound;
/** */
@@ -400,6 +436,18 @@ public class CoreText extends NLS {
public static String RevertCommitOperation_reverting;
/** */
+ public static String RewordCommitOperation_cannotSign;
+
+ /** */
+ public static String RewordCommitOperation_cannotUpdateHead;
+
+ /** */
+ public static String RewordCommitOperation_noHead;
+
+ /** */
+ public static String RewordCommitOperation_notReachable;
+
+ /** */
public static String RewordCommitOperation_rewording;
/** */
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/EGitSshdSessionFactory.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/EGitSshdSessionFactory.java
index e42d48f8f4..3644e63d8f 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/EGitSshdSessionFactory.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/EGitSshdSessionFactory.java
@@ -165,7 +165,7 @@ public class EGitSshdSessionFactory extends SshdSessionFactory {
@NonNull State state) throws IOException {
if (attempt == 0) {
useSecureStore = Platform.getPreferencesService().getBoolean(
- Activator.getPluginId(),
+ Activator.PLUGIN_ID,
GitCorePreferences.core_saveCredentialsInSecureStore,
true, null);
// Obtain a password from secure store and return it if
@@ -288,7 +288,7 @@ public class EGitSshdSessionFactory extends SshdSessionFactory {
private void savePrefs() {
IEclipsePreferences prefs = InstanceScope.INSTANCE
- .getNode(Activator.getPluginId());
+ .getNode(Activator.PLUGIN_ID);
prefs.putBoolean(
GitCorePreferences.core_saveCredentialsInSecureStore,
useSecureStore);
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/GitURI.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/GitURI.java
index 743e16a332..774e3e5ccc 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/GitURI.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/GitURI.java
@@ -13,6 +13,8 @@
*******************************************************************************/
package org.eclipse.egit.core.internal;
+import static org.eclipse.team.core.ProjectSetCapability.SCHEME_SCM;
+
import java.net.URI;
import java.net.URISyntaxException;
@@ -28,9 +30,6 @@ import org.eclipse.osgi.util.NLS;
* http://maven.apache.org/scm/scm-url-format.html for the format description.
*/
public class GitURI {
- // TODO replace with org.eclipse.team.core.ProjectSetCapability.SCHEME_SCM
- // when we drop support for Galileo
- private static final String SCHEME_SCM = "scm"; //$NON-NLS-1$
private static final String SCHEME_GIT = "git"; //$NON-NLS-1$
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/coretext.properties b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/coretext.properties
index c5de21b017..36ac8cf8e2 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/coretext.properties
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/coretext.properties
@@ -44,6 +44,20 @@ DeleteResourcesOperation_deletingResources=Deleting resources
DeleteResourcesOperation_deleteFailed=Deleting resource {0} failed.
DeleteResourcesOperation_deleteFailedSeeLog=Deleting resources failed. See log for details
DisconnectProviderOperation_disconnecting=Disconnecting Git team provider.
+ExternalGpgSigner_bufferError=Error while getting output of external program
+ExternalGpgSigner_cannotSearch=Cannot find GPG executable on the bash $PATH
+ExternalGpgSigner_environmentError=Cannot prepare GPG environment properly
+ExternalGpgSigner_gpgNotFound=No GPG executable found; set it in the Git preferences in section "Committing", or define it in the git config gpg.program
+ExternalGpgSigner_noKeyFound=No GPG key found for key ID ''{0}''; check or set git config user.signingKey
+ExternalGpgSigner_noSignature=External GPG did not return a valid signature; got: {0}
+ExternalGpgSigner_processFailed=External program failed ({1}): {0}
+ExternalGpgSigner_processInterrupted=Call to external program was interrupted: {0}
+ExternalGpgSigner_signingCanceled=User canceled signing (no passphrase provided)
+ExternalGpgSigner_skipNotAccessiblePath=Looking for a GPG executable: path {0} from $PATH is not accessible; skipping
+ExternalGpgSigner_ttyInput=GPG requested user input from a terminal; this does not work within Eclipse. Configure GPG (gpg-agent) to use a GUI dialog for prompting.\nGPG reported: {0}
+GitSettings_gpgInvalidExecutable=The EGit preference for the GPG executable is invalid: {0}
+GitSettings_gpgNotExecutable=The file for the GPG executable in the EGit preferences is not executable: {0}
+GpgSetup_signerUnknown=Unknown GPG signer ''{0}'' configured; valid values are "bc" or "gpg". Using Bouncy Castle.
Activator_autoIgnoreDerivedResources=Auto-ignore derived resources
Activator_AutoShareJobName=Auto share git projects
@@ -52,8 +66,6 @@ Activator_HttpClientUnknown=Unknown HTTP library ''{0}'' configured; valid value
Activator_ignoreResourceFailed=Ignoring {0} failed
Activator_noBuiltinLfsSupportDetected=Built-in LFS support not present/detected
Activator_ReconfigureWindowCacheError=Exception when reconfiguring window cache from configuration, default configuration will be used
-Activator_SshClientNoJsch=JSch configured as SSH library, but JSch service cannot be found. Using Apache sshd library instead.
-Activator_SshClientUnknown=Unknown SSH library ''{0}'' configured; valid values are "jsch" or "apache". Using Apache.
AssumeUnchangedOperation_adding=Marking resources unchanged
AssumeUnchangedOperation_writingIndex=Writing index for {0}
@@ -168,6 +180,10 @@ OperationNotYetExecuted=Operation has not yet been executed and cannot return a
RemoteRefUpdateCantBeReused=The RemoteRefUpdate instance cannot be re-used
RenameBranchOperation_TaskName=Renaming branch {0} to {1}
RevertCommitOperation_reverting=Reverting {0,choice,1#1 commit|1<{0} commits}
+RewordCommitOperation_cannotSign=Rewording commit {0} from HEAD {1}: could not sign commit {2}. This and further rebased commits are not signed.
+RewordCommitOperation_cannotUpdateHead=Rewording commit {0} failed: could not update HEAD.
+RewordCommitOperation_noHead=Repository has no HEAD; cannot reword.
+RewordCommitOperation_notReachable=Commit {0} cannot be reworded because it is not in the currently checked out branch: it is not reachable from HEAD.
RewordCommitOperation_rewording=Rewording commit {0}
EditCommitOperation_editing=Editing commit {0}
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/signing/ExternalGpgSigner.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/signing/ExternalGpgSigner.java
new file mode 100644
index 0000000000..49790c8d08
--- /dev/null
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/signing/ExternalGpgSigner.java
@@ -0,0 +1,498 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Thomas Wolf <thomas.wolf@paranor.ch> and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.egit.core.internal.signing;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.text.MessageFormat;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.eclipse.egit.core.Activator;
+import org.eclipse.egit.core.internal.CoreText;
+import org.eclipse.egit.core.internal.trace.GitTraceLocation;
+import org.eclipse.jgit.api.errors.CanceledException;
+import org.eclipse.jgit.api.errors.JGitInternalException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.GpgConfig;
+import org.eclipse.jgit.lib.GpgObjectSigner;
+import org.eclipse.jgit.lib.GpgSignature;
+import org.eclipse.jgit.lib.GpgSignatureVerifier;
+import org.eclipse.jgit.lib.GpgSignatureVerifierFactory;
+import org.eclipse.jgit.lib.GpgSigner;
+import org.eclipse.jgit.lib.ObjectBuilder;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.transport.CredentialsProvider;
+import org.eclipse.jgit.util.FS;
+import org.eclipse.jgit.util.FS.ExecutionResult;
+import org.eclipse.jgit.util.StringUtils;
+import org.eclipse.jgit.util.SystemReader;
+import org.eclipse.jgit.util.TemporaryBuffer;
+
+/**
+ * A {@link GpgSigner}/{@link GpgObjectSigner} that calls out to an external GPG
+ * program. If no GPG program is given, it tries to find a GPG executable on the
+ * $PATH to use.
+ */
+public class ExternalGpgSigner extends GpgSigner implements GpgObjectSigner {
+
+ // A GPG environment variable name. We remove this environment variable when
+ // calling gpg.
+ private static final String PINENTRY_USER_DATA = "PINENTRY_USER_DATA"; //$NON-NLS-1$
+
+ // Another GPG environment variable name. We remove this environment
+ // variable when calling gpg.
+ private static final String GPG_TTY = "GPG_TTY"; //$NON-NLS-1$
+
+ // For sanity checking the returned signature.
+ private static final byte[] SIGNATURE_START = "-----BEGIN PGP SIGNATURE-----" //$NON-NLS-1$
+ .getBytes(StandardCharsets.US_ASCII);
+
+ private static final PathScanner FROM_PATH = new PathScanner();
+
+ private interface ResultHandler {
+ void accept(TemporaryBuffer b) throws IOException, CanceledException;
+ }
+
+ private static void runProcess(ProcessBuilder process, InputStream in,
+ ResultHandler stdout, ResultHandler stderr)
+ throws IOException, CanceledException {
+ String command = process.command().stream()
+ .collect(Collectors.joining(" ")); //$NON-NLS-1$
+ ExecutionResult result = null;
+ int code = 0;
+ try {
+ if (GitTraceLocation.GPG.isActive()) {
+ GitTraceLocation.getTrace().trace(
+ GitTraceLocation.GPG.getLocation(),
+ "Spawning process: " + command); //$NON-NLS-1$
+ GitTraceLocation.getTrace().trace(
+ GitTraceLocation.GPG.getLocation(),
+ "Environment: " + process.environment()); //$NON-NLS-1$
+ }
+ result = FS.DETECTED.execute(process, in);
+ code = result.getRc();
+ if (GitTraceLocation.GPG.isActive()) {
+ GitTraceLocation.getTrace().trace(
+ GitTraceLocation.GPG.getLocation(),
+ "stderr:\n" + toString(result.getStderr())); //$NON-NLS-1$
+ GitTraceLocation.getTrace().trace(
+ GitTraceLocation.GPG.getLocation(),
+ "stdout:\n" + toString(result.getStdout())); //$NON-NLS-1$
+ GitTraceLocation.getTrace().trace(
+ GitTraceLocation.GPG.getLocation(),
+ "Spawned process exited with exit code " + code); //$NON-NLS-1$
+ }
+ if (code != 0) {
+ if (stderr != null) {
+ stderr.accept(result.getStderr());
+ }
+ throw new IOException(
+ MessageFormat.format(
+ CoreText.ExternalGpgSigner_processFailed,
+ command, Integer.toString(code) + ": " //$NON-NLS-1$
+ + toString(result.getStderr())));
+ }
+ stdout.accept(result.getStdout());
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ throw new IOException(MessageFormat
+ .format(CoreText.ExternalGpgSigner_processInterrupted,
+ command),
+ e);
+ } catch (IOException e) {
+ if (GitTraceLocation.GPG.isActive()) {
+ if (result != null) {
+ GitTraceLocation.getTrace().trace(
+ GitTraceLocation.GPG.getLocation(),
+ "stderr:\n" + toString(result.getStderr())); //$NON-NLS-1$
+ GitTraceLocation.getTrace().trace(
+ GitTraceLocation.GPG.getLocation(),
+ "stdout:\n" + toString(result.getStdout())); //$NON-NLS-1$
+ }
+ GitTraceLocation.getTrace().trace(
+ GitTraceLocation.GPG.getLocation(),
+ "Spawned process failed: " + command, e); //$NON-NLS-1$
+ }
+ if (code != 0) {
+ throw e;
+ }
+ if (result != null) {
+ throw new IOException(
+ MessageFormat.format(
+ CoreText.ExternalGpgSigner_processFailed,
+ command, toString(result.getStderr())),
+ e);
+ }
+ throw new IOException(
+ MessageFormat.format(
+ CoreText.ExternalGpgSigner_processFailed,
+ command, e.getLocalizedMessage()),
+ e);
+ } finally {
+ if (result != null) {
+ if (result.getStderr() != null) {
+ result.getStderr().destroy();
+ }
+ if (result.getStdout() != null) {
+ result.getStdout().destroy();
+ }
+ }
+ }
+ }
+
+ private static String toString(TemporaryBuffer b) {
+ if (b != null) {
+ try {
+ return new String(b.toByteArray(4000),
+ Charset.defaultCharset());
+ } catch (IOException e) {
+ Activator.logWarning(CoreText.ExternalGpgSigner_bufferError, e);
+ }
+ }
+ return ""; //$NON-NLS-1$
+ }
+
+ @Override
+ public void sign(CommitBuilder commit, String gpgSigningKey,
+ PersonIdent committer, CredentialsProvider credentialsProvider)
+ throws CanceledException {
+ signObject(commit, gpgSigningKey, committer, null, null);
+ }
+
+ @Override
+ public void signObject(ObjectBuilder object, String gpgSigningKey,
+ PersonIdent committer, CredentialsProvider credentialsProvider,
+ GpgConfig config) throws CanceledException {
+ // Ignore the CredentialsProvider. We let GPG handle all this.
+ try {
+ String keySpec = gpgSigningKey;
+ if (StringUtils.isEmptyOrNull(gpgSigningKey)) {
+ keySpec = '<' + committer.getEmailAddress() + '>';
+ }
+ String program = config != null ? config.getProgram() : null;
+ object.setGpgSignature(new GpgSignature(
+ signWithGpg(object.build(), keySpec, program)));
+ } catch (IOException e) {
+ throw new JGitInternalException(e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public boolean canLocateSigningKey(String gpgSigningKey,
+ PersonIdent committer, CredentialsProvider credentialsProvider)
+ throws CanceledException {
+ return canLocateSigningKey(gpgSigningKey, committer, null, null);
+ }
+
+ @Override
+ public boolean canLocateSigningKey(String gpgSigningKey,
+ PersonIdent committer, CredentialsProvider credentialsProvider,
+ GpgConfig config) throws CanceledException {
+ // Ignore the CredentialsProvider. We let GPG handle all this.
+ String program = config != null ? config.getProgram() : null;
+ if (StringUtils.isEmptyOrNull(program)) {
+ program = FROM_PATH.getGpg();
+ if (StringUtils.isEmptyOrNull(program)) {
+ return false;
+ }
+ }
+ String keySpec = gpgSigningKey;
+ if (StringUtils.isEmptyOrNull(keySpec)) {
+ keySpec = '<' + committer.getEmailAddress() + '>';
+ }
+ ProcessBuilder process = new ProcessBuilder();
+ // For the output format, see
+ // https://github.com/gpg/gnupg/blob/master/doc/DETAILS
+ process.command(program, "--locate-keys", //$NON-NLS-1$
+ "--with-colons", //$NON-NLS-1$
+ "--batch", //$NON-NLS-1$
+ "--no-tty", //$NON-NLS-1$
+ keySpec);
+ gpgEnvironment(process);
+ try {
+ boolean[] result = { false };
+ runProcess(process, null, b -> {
+ try (BufferedReader r = new BufferedReader(
+ new InputStreamReader(b.openInputStream(),
+ StandardCharsets.UTF_8))) {
+ // --with-colons always writes UTF-8
+ boolean keyFound = false;
+ String line;
+ while ((line = r.readLine()) != null) {
+ if (line.startsWith("pub:") //$NON-NLS-1$
+ || line.startsWith("sub:")) { //$NON-NLS-1$
+ String[] fields = line.split(":"); //$NON-NLS-1$
+ if (fields.length > 11
+ && fields[11].indexOf('s') >= 0) {
+ // It's a signing key.
+ keyFound = true;
+ break;
+ }
+ }
+ }
+ result[0] = keyFound;
+ }
+ }, null);
+ if (!result[0]) {
+ if (!StringUtils.isEmptyOrNull(gpgSigningKey)) {
+ Activator.logWarning(MessageFormat.format(
+ CoreText.ExternalGpgSigner_noKeyFound,
+ gpgSigningKey), null);
+ }
+ }
+ return result[0];
+ } catch (IOException e) {
+ Activator.logError(e.getLocalizedMessage(), e);
+ return false;
+ }
+ }
+
+ 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(CoreText.ExternalGpgSigner_gpgNotFound);
+ }
+ }
+ ProcessBuilder process = new ProcessBuilder();
+ process.command(program,
+ // Detached signature, sign, armor, user
+ "-bsau", //$NON-NLS-1$
+ keySpec,
+ // No extra output
+ "--batch", //$NON-NLS-1$
+ "--no-tty", //$NON-NLS-1$
+ // Write extra status messages to stderr
+ "--status-fd", //$NON-NLS-1$
+ "2", //$NON-NLS-1$
+ // Force output of the signature to stdout
+ "--output", //$NON-NLS-1$
+ "-"); //$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 = false;
+ 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(
+ CoreText.ExternalGpgSigner_noSignature,
+ toString(b)));
+ }
+ }, e -> {
+ // Error handling: parse stderr to figure out whether we have a
+ // cancellation. Unfortunately, GPG does record cancellation not
+ // via a [GNUPG:] stable status but by printing "gpg: signing
+ // failed: Operation cancelled". Since we don't know whether
+ // this string is stable (or may even be localized), we check
+ // for a "[GNUPG:] PINENTRY_LAUNCHED" line followed by the next
+ // [GNUPG:] line being "[GNUPG:] FAILURE sign".
+ //
+ // The [GNUPG:] strings are part of GPG's public API. See
+ // 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")) { //$NON-NLS-1$
+ pinentry = true;
+ checkTerminalPrompt(line);
+ } else if (pinentry) {
+ if (line.startsWith("[GNUPG:] FAILURE sign")) { //$NON-NLS-1$
+ throw new CanceledException(
+ CoreText.ExternalGpgSigner_signingCanceled);
+ }
+ if (line.startsWith("[GNUPG:]")) { //$NON-NLS-1$
+ pinentry = false;
+ }
+ }
+ }
+ } catch (IOException ex) {
+ // Swallow it here; runProcess will raise one anyway.
+ }
+ });
+ return result.rawData;
+ }
+ }
+
+ private void gpgEnvironment(ProcessBuilder process) {
+ try {
+ Map<String, String> childEnv = process.environment();
+ // The map is "typically case sensitive on all platforms", whatever
+ // that means. "Typically"? Or really on all platforms? It would
+ // make more sense if it were case-insensitive on Windows.
+ //
+ // Remove the PINENTRY_USER_DATA variable. On Linux, some people use
+ // this sometimes in combination with a custom script configured as
+ // the gpg-agent's pinentry-program to force pinentry-tty or
+ // pinentry-curses to be used when in a shell, and a graphical
+ // prompt otherwise. When Eclipse gets started from the shell, it
+ // may inherit that environment variable, but when it calls gpg, it
+ // needs a graphical pinentry. So remove this variable.
+ //
+ // If the variable is not set, a well-written custom pinentry script
+ // should fall back to the default gpg pinentry which _is_ a
+ // graphical one (pinentry-mac on Mac, pinentry-qt on Windows,
+ // pinentry-gtk or pinentry-gnome or similar on Linux). Not sure if
+ // this PINENTRY_USER_DATA method is still needed or used with
+ // modern gpg; at least pinentry-gtk and pinentry-gnome should fall
+ // back to prompting on the terminal if $DISPLAY of the calling
+ // process is not set. $DISPLAY for Eclipse on Linux/OS X will
+ // always be set, and be inherited by the child process.
+ String value = childEnv.get(PINENTRY_USER_DATA);
+ if (!StringUtils.isEmptyOrNull(value)) {
+ childEnv.remove(PINENTRY_USER_DATA);
+ }
+ // If gpg-agent is not running already, gpg will start it. If
+ // GPG_TTY is set, the newly started gpg-agent may decide to use a
+ // terminal prompt (pinentry-tty or pinentry-curses) for
+ // passphrases, which doesn't work for us. So clear GPG_TTY, too.
+ //
+ // If gpg-agent is already running and is using a terminal prompt,
+ // the signing may fail. We detect this in checkTerminalPrompt()
+ // and throw an exception.
+ value = childEnv.get(GPG_TTY);
+ if (!StringUtils.isEmptyOrNull(value)) {
+ childEnv.remove(GPG_TTY);
+ }
+ } catch (SecurityException | UnsupportedOperationException
+ | IllegalArgumentException e) {
+ Activator.logWarning(CoreText.ExternalGpgSigner_environmentError,
+ e);
+ }
+ }
+
+ private void checkTerminalPrompt(String gpgTraceLine) {
+ // @formatter:off
+ // Expected format: [GNUPG:] PINENTRY_LAUNCHED <pid> <pinentry-type> <version> <tty> <tty-type> <display>
+ // Example: [GNUPG:] PINENTRY_LAUNCHED 22245 curses 1.1.1 - xterm-256color <$DISPLAY>
+ // @formatter:on
+ String[] parts = gpgTraceLine.split(" "); //$NON-NLS-1$
+ if (parts.length > 3 && "[GNUPG:]".equals(parts[0]) //$NON-NLS-1$
+ && "PINENTRY_LAUNCHED".equals(parts[1])) { //$NON-NLS-1$
+ String pinentryType = parts[3];
+ if ("tty".equals(pinentryType) || "curses".equals(pinentryType)) { //$NON-NLS-1$ //$NON-NLS-2$
+ throw new GpgConfigurationException(MessageFormat.format(
+ CoreText.ExternalGpgSigner_ttyInput, gpgTraceLine));
+ }
+ }
+ }
+
+ private static class PathScanner {
+
+ private String gpg;
+
+ synchronized String getGpg() {
+ if (gpg == null) {
+ gpg = findGpg();
+ }
+ return gpg.isEmpty() ? null : gpg;
+ }
+
+ private static String findGpg() {
+ SystemReader system = SystemReader.getInstance();
+ String path = system.getenv("PATH"); //$NON-NLS-1$
+ String exe = null;
+ if (system.isMacOS()) {
+ // On Mac, $PATH is typically much shorter in programs launched
+ // from the graphical UI than in the shell. Use the shell $PATH
+ // first.
+ String bash = searchPath(path, "bash"); //$NON-NLS-1$
+ if (bash != null) {
+ ProcessBuilder process = new ProcessBuilder();
+ process.command(bash, "--login", "-c", "which gpg"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ process.directory(FS.DETECTED.userHome());
+ String[] result = { null };
+ try {
+ runProcess(process, null, b -> {
+ try (BufferedReader r = new BufferedReader(
+ new InputStreamReader(b.openInputStream(),
+ Charset.defaultCharset()))) {
+ result[0] = r.readLine();
+ }
+ }, null);
+ } catch (IOException | CanceledException e) {
+ Activator.logWarning(
+ CoreText.ExternalGpgSigner_cannotSearch, e);
+ }
+ exe = result[0];
+ }
+ }
+ if (exe == null) {
+ exe = searchPath(path, system.isWindows() ? "gpg.exe" : "gpg"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ return exe == null ? "" : exe; //$NON-NLS-1$
+ }
+
+ private static String searchPath(String path, String name) {
+ if (StringUtils.isEmptyOrNull(path)) {
+ return null;
+ }
+ for (String p : path.split(File.pathSeparator)) {
+ File exe = new File(p, name);
+ try {
+ if (exe.isFile() && exe.canExecute()) {
+ return exe.getAbsolutePath();
+ }
+ } catch (SecurityException e) {
+ Activator.logWarning(MessageFormat.format(
+ CoreText.ExternalGpgSigner_skipNotAccessiblePath,
+ exe.getPath()), e);
+ }
+ }
+ return null;
+ }
+ }
+}
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/signing/GpgConfigurationException.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/signing/GpgConfigurationException.java
new file mode 100644
index 0000000000..e3ae7f180f
--- /dev/null
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/signing/GpgConfigurationException.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Thomas Wolf <thomas.wolf@paranor.ch> and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.egit.core.internal.signing;
+
+/**
+ * Exception indicating a problem with the GPG configuration.
+ */
+public class GpgConfigurationException extends RuntimeException {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Creates a new {@link GpgConfigurationException}.
+ */
+ public GpgConfigurationException() {
+ super();
+ }
+
+ /**
+ * Creates a new {@link GpgConfigurationException} with the given message.
+ *
+ * @param message
+ * to set
+ */
+ public GpgConfigurationException(String message) {
+ super(message);
+ }
+
+ /**
+ * Creates a new {@link GpgConfigurationException} with the given message
+ * and cause.
+ *
+ * @param message
+ * to set
+ * @param cause
+ * of the exception
+ */
+ public GpgConfigurationException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+}
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/signing/GpgSetup.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/signing/GpgSetup.java
new file mode 100644
index 0000000000..fbc689e40f
--- /dev/null
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/signing/GpgSetup.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Thomas Wolf <thomas.wolf@paranor.ch> and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.egit.core.internal.signing;
+
+import java.text.MessageFormat;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.egit.core.Activator;
+import org.eclipse.egit.core.GitCorePreferences;
+import org.eclipse.egit.core.internal.CoreText;
+import org.eclipse.jgit.gpg.bc.BouncyCastleGpgSignerFactory;
+import org.eclipse.jgit.lib.GpgSigner;
+
+/**
+ * Utility class to set up the selected GpgSigner.
+ */
+public final class GpgSetup {
+
+ private GpgSetup() {
+ // No instantiation
+ }
+
+ private enum Signer {
+ BC, GPG
+ }
+
+ private static final Object LOCK = new Object();
+
+ private static Signer current;
+
+ /**
+ * Ensures that the default {@link GpgSigner} is the one set from the
+ * preferences.
+ *
+ * @return the {@link GpgSigner}
+ */
+ public static GpgSigner getDefault() {
+ Signer signer = getSigner();
+ synchronized (LOCK) {
+ if (signer != current) {
+ current = signer;
+ switch (signer) {
+ case BC:
+ GpgSigner.setDefault(BouncyCastleGpgSignerFactory.create());
+ break;
+ case GPG:
+ GpgSigner.setDefault(new ExternalGpgSigner());
+ break;
+ default:
+ // Internal error, no translation
+ throw new IllegalStateException("Unknown signer " + signer); //$NON-NLS-1$
+ }
+ }
+ return GpgSigner.getDefault();
+ }
+ }
+
+ private static Signer getSigner() {
+ String pref = Platform.getPreferencesService().getString(
+ Activator.PLUGIN_ID, GitCorePreferences.core_gpgSigner, null,
+ null);
+ if (pref != null) {
+ for (Signer s : Signer.values()) {
+ if (pref.equalsIgnoreCase(s.name())) {
+ return s;
+ }
+ }
+ }
+ Activator.logWarning(
+ MessageFormat.format(CoreText.GpgSetup_signerUnknown, pref),
+ null);
+ return Signer.BC;
+ }
+}
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/trace/GitTraceLocation.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/trace/GitTraceLocation.java
index 0f98c45cc3..e506e48988 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/trace/GitTraceLocation.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/trace/GitTraceLocation.java
@@ -23,10 +23,10 @@ import org.eclipse.osgi.service.debug.DebugTrace;
public enum GitTraceLocation implements ITraceLocation {
/** Core */
CORE("/debug/core"), //$NON-NLS-1$
+ /** GPG signing */
+ GPG("/debug/core/gpg"), //$NON-NLS-1$
/** IndexDiffCache */
INDEXDIFFCACHE("/debug/core/indexdiffcache"), //$NON-NLS-1$
- /** JSch logging */
- JSCH("/debug/core/jsch"), //$NON-NLS-1$
/** refreshing resources */
REFRESH("/debug/core/refresh"); //$NON-NLS-1$
@@ -41,7 +41,7 @@ public enum GitTraceLocation implements ITraceLocation {
// we evaluate the plug-in switch
if (pluginIsDebugging) {
- myTrace = options.newDebugTrace(Activator.getPluginId());
+ myTrace = options.newDebugTrace(Activator.PLUGIN_ID);
for (GitTraceLocation loc : values()) {
boolean active = options.getBooleanOption(loc.getFullPath(),
false);
@@ -65,7 +65,7 @@ public enum GitTraceLocation implements ITraceLocation {
private static DebugTrace myTrace;
private GitTraceLocation(String path) {
- this.fullPath = Activator.getPluginId() + path;
+ this.fullPath = Activator.PLUGIN_ID + path;
this.location = path;
}
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/trace/JSchLogger.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/trace/JSchLogger.java
deleted file mode 100644
index 3ed9655d86..0000000000
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/trace/JSchLogger.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2018 Thomas Wolf <thomas.wolf@paranor.ch>
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License 2.0
- * which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-package org.eclipse.egit.core.internal.trace;
-
-import com.jcraft.jsch.Logger;
-
-/**
- * Simple low-level logger for JSch using an OSGi debug trace; intended for
- * analyzing Jsch connection problems.
- */
-public class JSchLogger implements Logger {
-
- @Override
- public boolean isEnabled(int level) {
- return GitTraceLocation.JSCH.isActive();
- }
-
- @Override
- public void log(int level, String message) {
- if (isEnabled(level)) {
- GitTraceLocation.getTrace().trace(
- GitTraceLocation.JSCH.getLocation(),
- levelToString(level) + ": " + message); //$NON-NLS-1$
- }
- }
-
- private String levelToString(int level) {
- switch (level) {
- case 0:
- return "DEBUG"; //$NON-NLS-1$
- case 1:
- return "INFO"; //$NON-NLS-1$
- case 2:
- return "WARN"; //$NON-NLS-1$
- case 3:
- return "ERROR"; //$NON-NLS-1$
- case 4:
- return "FATAL"; //$NON-NLS-1$
- default:
- return "UNKNOWN(" + level + ')'; //$NON-NLS-1$
- }
- }
-}
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/CommitOperation.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/CommitOperation.java
index 61483a8b84..314d540d01 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/CommitOperation.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/CommitOperation.java
@@ -18,6 +18,7 @@ package org.eclipse.egit.core.op;
import static java.lang.Boolean.FALSE;
import static java.lang.Boolean.TRUE;
+import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
@@ -38,12 +39,15 @@ import org.eclipse.egit.core.Activator;
import org.eclipse.egit.core.RepositoryUtil;
import org.eclipse.egit.core.internal.CoreText;
import org.eclipse.egit.core.internal.job.RuleUtil;
+import org.eclipse.egit.core.internal.signing.GpgConfigurationException;
import org.eclipse.egit.core.project.RepositoryMapping;
+import org.eclipse.egit.core.settings.GitSettings;
import org.eclipse.jgit.api.AddCommand;
import org.eclipse.jgit.api.CommitCommand;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
+import org.eclipse.jgit.lib.GpgConfig;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Repository;
@@ -253,6 +257,8 @@ public class CommitOperation implements IEGitOperation {
for(String path:commitFileList)
commitCommand.setOnly(path);
commit = commitCommand.call();
+ } catch (GpgConfigurationException e) {
+ throw new TeamException(e.getLocalizedMessage(), e);
} catch (Exception e) {
throw new TeamException(
CoreText.MergeOperation_InternalError, e);
@@ -358,5 +364,19 @@ public class CommitOperation implements IEGitOperation {
commitCommand.setAuthor(authorIdent);
commitCommand.setCommitter(committerIdent);
commitCommand.setSign(sign ? TRUE : FALSE);
+ if (sign) {
+ // Ensure the Eclipse preference, if set, overrides the git config
+ File gpg = GitSettings.getGpgExecutable();
+ if (gpg != null) {
+ GpgConfig cfg = new GpgConfig(repo.getConfig()) {
+
+ @Override
+ public String getProgram() {
+ return gpg.getAbsolutePath();
+ }
+ };
+ commitCommand.setGpgConfig(cfg);
+ }
+ }
}
}
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/ConnectProviderOperation.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/ConnectProviderOperation.java
index 8d9ffdb729..1cfeee8030 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/ConnectProviderOperation.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/ConnectProviderOperation.java
@@ -105,7 +105,7 @@ public class ConnectProviderOperation implements IEGitOperation {
public void execute(IProgressMonitor m) throws CoreException {
SubMonitor progress = SubMonitor.convert(m,
CoreText.ConnectProviderOperation_connecting, projects.size());
- MultiStatus ms = new MultiStatus(Activator.getPluginId(), 0,
+ MultiStatus ms = new MultiStatus(Activator.PLUGIN_ID, 0,
CoreText.ConnectProviderOperation_ConnectErrors, null);
for (Entry<IProject, File> entry : projects.entrySet()) {
connectProject(entry, ms, progress.newChild(1));
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/GarbageCollectOperation.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/GarbageCollectOperation.java
index 4cfb9f81a8..b0c7e1de58 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/GarbageCollectOperation.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/GarbageCollectOperation.java
@@ -49,7 +49,7 @@ public class GarbageCollectOperation implements IEGitOperation {
new EclipseGitProgressTransformer(monitor)).call();
} catch (IllegalStateException | GitAPIException e) {
throw new CoreException(new Status(IStatus.ERROR,
- Activator.getPluginId(), e.getMessage(), e));
+ Activator.PLUGIN_ID, e.getMessage(), e));
}
}
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/MergeOperation.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/MergeOperation.java
index 384abf48a7..46ea7d518a 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/MergeOperation.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/MergeOperation.java
@@ -153,7 +153,7 @@ public class MergeOperation implements IEGitOperation {
public void execute(IProgressMonitor m) throws CoreException {
if (mergeResult != null)
throw new CoreException(new Status(IStatus.ERROR, Activator
- .getPluginId(), CoreText.OperationAlreadyExecuted));
+ .PLUGIN_ID, CoreText.OperationAlreadyExecuted));
IWorkspaceRunnable action = new IWorkspaceRunnable() {
@Override
@@ -196,8 +196,7 @@ public class MergeOperation implements IEGitOperation {
if (MergeResult.MergeStatus.NOT_SUPPORTED
.equals(mergeResult.getMergeStatus())) {
throw new TeamException(new Status(IStatus.INFO,
- Activator.getPluginId(),
- mergeResult.toString()));
+ Activator.PLUGIN_ID, mergeResult.toString()));
}
} catch (IOException e) {
throw new TeamException(
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/PullOperation.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/PullOperation.java
index 2b65547231..6cf4d87ba0 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/PullOperation.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/PullOperation.java
@@ -163,7 +163,7 @@ public class PullOperation implements IEGitOperation {
public void execute(IProgressMonitor m) throws CoreException {
if (!results.isEmpty()) {
throw new CoreException(
- new Status(IStatus.ERROR, Activator.getPluginId(),
+ new Status(IStatus.ERROR, Activator.PLUGIN_ID,
CoreText.OperationAlreadyExecuted));
}
int workers = repositories.length;
@@ -194,9 +194,8 @@ public class PullOperation implements IEGitOperation {
private int getMaxPullThreadsCount() {
String key = GitCorePreferences.core_maxPullThreadsCount;
int defaultValue = 1;
- int value = Platform.getPreferencesService().getInt(
- Activator.getPluginId(), key,
- defaultValue, null);
+ int value = Platform.getPreferencesService().getInt(Activator.PLUGIN_ID,
+ key, defaultValue, null);
return Math.max(defaultValue, value);
}
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/RebaseOperation.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/RebaseOperation.java
index ef24a5612c..63772b5888 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/RebaseOperation.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/RebaseOperation.java
@@ -129,8 +129,8 @@ public class RebaseOperation implements IEGitOperation {
@Override
public void execute(IProgressMonitor m) throws CoreException {
if (result != null)
- throw new CoreException(new Status(IStatus.ERROR, Activator
- .getPluginId(), CoreText.OperationAlreadyExecuted));
+ throw new CoreException(new Status(IStatus.ERROR,
+ Activator.PLUGIN_ID, CoreText.OperationAlreadyExecuted));
final IProject[] validProjects = ProjectUtil.getValidOpenProjects(repository);
IWorkspaceRunnable action = new IWorkspaceRunnable() {
@Override
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/RewordCommitOperation.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/RewordCommitOperation.java
index 9e8d9c6b87..38f9808fa4 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/RewordCommitOperation.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/RewordCommitOperation.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* Copyright (c) 2014 Maik Schreiber
- * Copyright (C) 2015, Stephan Hackstedt <stephan.hackstedt@googlemail.com>
+ * Copyright (C) 2015 Stephan Hackstedt <stephan.hackstedt@googlemail.com>
+ * Copyright (C) 2020 Thomas Wolf <thomas.wolf@paranor.ch> and others
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -15,35 +16,55 @@
*******************************************************************************/
package org.eclipse.egit.core.op;
+import java.io.File;
+import java.io.IOException;
import java.text.MessageFormat;
-import java.util.List;
+import java.util.Deque;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.Map;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.egit.core.Activator;
import org.eclipse.egit.core.internal.CoreText;
+import org.eclipse.egit.core.internal.Utils;
import org.eclipse.egit.core.internal.job.RuleUtil;
-import org.eclipse.egit.core.internal.util.ProjectUtil;
-import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.api.RebaseCommand;
-import org.eclipse.jgit.api.RebaseCommand.InteractiveHandler;
-import org.eclipse.jgit.api.errors.GitAPIException;
-import org.eclipse.jgit.errors.IllegalTodoFileModification;
-import org.eclipse.jgit.lib.RebaseTodoLine;
+import org.eclipse.egit.core.internal.signing.GpgConfigurationException;
+import org.eclipse.egit.core.internal.signing.GpgSetup;
+import org.eclipse.egit.core.settings.GitSettings;
+import org.eclipse.jgit.api.errors.CanceledException;
+import org.eclipse.jgit.api.errors.JGitInternalException;
+import org.eclipse.jgit.api.errors.UnsupportedSigningFormatException;
+import org.eclipse.jgit.dircache.DirCache;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.GpgConfig;
+import org.eclipse.jgit.lib.GpgObjectSigner;
+import org.eclipse.jgit.lib.GpgSigner;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefUpdate;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevSort;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.CredentialsProvider;
import org.eclipse.team.core.TeamException;
/** An operation that rewords a commit's message. */
public class RewordCommitOperation implements IEGitOperation {
+
private Repository repository;
private RevCommit commit;
private String newMessage;
+ private ObjectId headId;
+
/**
* Constructs a new reword commit operation.
*
@@ -56,62 +77,214 @@ public class RewordCommitOperation implements IEGitOperation {
*/
public RewordCommitOperation(Repository repository, RevCommit commit,
String newMessage) {
- if (commit.getParentCount() != 1) {
- throw new UnsupportedOperationException(
- "commit is expected to have exactly one parent"); //$NON-NLS-1$
- }
-
this.repository = repository;
this.commit = commit;
this.newMessage = newMessage;
}
@Override
- public void execute(IProgressMonitor m) throws CoreException {
- IWorkspaceRunnable action = new IWorkspaceRunnable() {
- @Override
- public void run(IProgressMonitor pm) throws CoreException {
- SubMonitor progress = SubMonitor.convert(pm,2);
- progress.subTask(MessageFormat.format(CoreText.RewordCommitOperation_rewording,
- commit.name()));
+ public void execute(IProgressMonitor monitor) throws CoreException {
+ try (RevWalk walk = new RevWalk(repository)) {
+ // Lock the index. We don't touch the index, but this guards against
+ // most other operations that might interfere with the in-memory
+ // rebase that we're going to perform. (Would be good if HEAD
+ // remained unchanged while we rebase. If it does change all the
+ // same, the RefUpdate at the end will fail and we will have done
+ // the work in vain.)
+ DirCache index = repository.lockDirCache();
+ try {
+ reword(monitor, walk);
+ } finally {
+ index.unlock();
+ }
+ } catch (GpgConfigurationException | IOException e) {
+ throw new TeamException(e.getMessage(), e);
+ }
+ }
- InteractiveHandler handler = new InteractiveHandler() {
- @Override
- public void prepareSteps(List<RebaseTodoLine> steps) {
- for (RebaseTodoLine step : steps) {
- if (step.getCommit().prefixCompare(commit) == 0) {
- try {
- step.setAction(RebaseTodoLine.Action.REWORD);
- } catch (IllegalTodoFileModification e) {
- // shouldn't happen
- }
- }
- }
- }
+ private void reword(IProgressMonitor monitor, RevWalk walk)
+ throws IOException, CoreException {
+ SubMonitor progress = SubMonitor.convert(monitor, MessageFormat.format(
+ CoreText.RewordCommitOperation_rewording,
+ Utils.getShortObjectId(commit)), 100);
- @Override
- public String modifyCommitMessage(String oldMessage) {
- return newMessage;
- }
- };
- try (Git git = new Git(repository)) {
- git.rebase().setUpstream(commit.getParent(0))
- .runInteractively(handler)
- .setOperation(RebaseCommand.Operation.BEGIN).call();
- } catch (GitAPIException e) {
- throw new TeamException(e.getLocalizedMessage(),
- e.getCause());
+ commit = walk.parseCommit(commit);
+ if (newMessage.equals(commit.getFullMessage())) {
+ // Nothing to do.
+ return;
+ }
+ Ref ref = repository.exactRef(Constants.HEAD);
+ if (ref == null) {
+ // No HEAD: cannot reword
+ throw new TeamException(CoreText.RewordCommitOperation_noHead);
+ }
+ headId = ref.getObjectId();
+ if (headId == null || ObjectId.zeroId().equals(headId)) {
+ throw new TeamException(CoreText.RewordCommitOperation_noHead);
+ }
+ String headName = ref.isSymbolic() ? ref.getLeaf().getName()
+ : headId.name();
+ Deque<RevCommit> commits = new LinkedList<>();
+ walk.setRetainBody(true);
+ if (!commit.getId().equals(headId)) {
+ walk.sort(RevSort.TOPO);
+ walk.sort(RevSort.COMMIT_TIME_DESC, true);
+ walk.markStart(walk.parseCommit(headId));
+ for (RevCommit p : commit.getParents()) {
+ RevCommit parsed = walk.parseCommit(p);
+ walk.markUninteresting(parsed);
+ }
+ RevCommit c;
+ while ((c = walk.next()) != null) {
+ if (c.getId().equals(commit.getId())) {
+ break;
}
- progress.worked(1);
+ commits.push(c);
+ }
+ if (c == null) {
+ throw new TeamException(MessageFormat.format(
+ CoreText.RewordCommitOperation_notReachable,
+ Utils.getShortObjectId(commit)));
+ }
+ }
+ progress.worked(10);
+ progress.setWorkRemaining(commits.size() + 2);
+ PersonIdent committer = new PersonIdent(repository);
+ // Rewrite the message
+ CommitBuilder builder = copy(commit, commit.getParents(), committer,
+ newMessage);
+ // Signature will be invalid for the new commit. Try to re-sign.
+ File gpgProgram = GitSettings.getGpgExecutable();
+ GpgConfig gpgConfig = new GpgConfig(repository.getConfig()) {
- ProjectUtil.refreshValidProjects(
- ProjectUtil.getValidOpenProjects(repository),
- progress.newChild(1));
+ @Override
+ public String getProgram() {
+ return gpgProgram != null ? gpgProgram.getAbsolutePath()
+ : super.getProgram();
}
};
+ boolean signAllCommits = gpgConfig.isSignCommits();
+ GpgSigner gpgSigner = GpgSetup.getDefault();
+ if (gpgSigner != null
+ && (signAllCommits || commit.getRawGpgSignature() != null)) {
+ gpgSigner = sign(builder, gpgSigner, gpgConfig, committer, commit);
+ }
+ Map<ObjectId, ObjectId> rewritten = new HashMap<>();
+ String newCommitId = null;
+ try (ObjectInserter inserter = repository.newObjectInserter()) {
+ ObjectId newCommit = inserter.insert(builder);
+ rewritten.put(commit.getId(), newCommit);
+ newCommitId = newCommit.name();
+ progress.worked(1);
+ // Now rewrite all others: fill in new parents
+ for (RevCommit c : commits) {
+ RevCommit[] parents = c.getParents();
+ ObjectId[] newParents = new ObjectId[parents.length];
+ int i = 0;
+ boolean hadNew = false;
+ for (RevCommit p : parents) {
+ ObjectId newId = rewritten.get(p.getId());
+ if (newId != null) {
+ hadNew = true;
+ }
+ newParents[i++] = newId != null ? newId : p.getId();
+ }
+ if (!hadNew) {
+ continue;
+ }
+ committer = new PersonIdent(committer); // Update when
+ builder = copy(c, newParents, committer, c.getFullMessage());
+ if (gpgSigner != null
+ && (signAllCommits || c.getRawGpgSignature() != null)) {
+ gpgSigner = sign(builder, gpgSigner, gpgConfig, committer,
+ c);
+ }
+ rewritten.put(c.getId(), inserter.insert(builder));
+ progress.worked(1);
+ }
+ inserter.flush();
+ }
+ // Update HEAD, and write ORIG_HEAD
+ ObjectId newHeadId = rewritten.get(headId);
+ RefUpdate ru = repository.updateRef(Constants.HEAD);
+ ru.setExpectedOldObjectId(headId);
+ ru.setNewObjectId(newHeadId);
+ ru.setForceUpdate(true);
+ ru.setRefLogMessage("rebase finished: returning to " + headName //$NON-NLS-1$
+ + " after having reworded commit " + newCommitId, false); //$NON-NLS-1$
+ switch (ru.update(walk)) {
+ case NEW:
+ case NO_CHANGE:
+ case FORCED:
+ case FAST_FORWARD:
+ break;
+ default:
+ throw new TeamException(MessageFormat.format(
+ CoreText.RewordCommitOperation_cannotUpdateHead,
+ Utils.getShortObjectId(commit)));
+ }
+ ObjectId origHead = ru.getOldObjectId();
+ if (origHead != null) {
+ // TODO: JGit should handle ORIG_HEAD as a ref to guard against
+ // concurrent modifications, or there should be a way to copy
+ // the old head ObjectId atomically to ORIG_HEAD on the HEAD
+ // update.
+ repository.writeOrigHead(origHead);
+ }
+ progress.worked(1);
+ }
- ResourcesPlugin.getWorkspace().run(action, getSchedulingRule(),
- IWorkspace.AVOID_UPDATE, m);
+ private CommitBuilder copy(RevCommit toCopy, ObjectId[] parents,
+ PersonIdent committer, String message) {
+ CommitBuilder builder = new CommitBuilder();
+ builder.setParentIds(parents);
+ builder.setAuthor(toCopy.getAuthorIdent());
+ builder.setCommitter(committer);
+ builder.setEncoding(toCopy.getEncoding());
+ builder.setTreeId(toCopy.getTree());
+ builder.setMessage(message);
+ return builder;
+ }
+
+ private GpgSigner sign(CommitBuilder builder, GpgSigner signer,
+ GpgConfig config, PersonIdent committer, RevCommit original)
+ throws JGitInternalException {
+ PersonIdent oldCommitter = original.getCommitterIdent();
+ if (committer.getName().equals(oldCommitter.getName()) && committer
+ .getEmailAddress().equals(oldCommitter.getEmailAddress())) {
+ // We don't sign commits that were committed by someone else. If
+ // they were signed, the signature will be dropped.
+ try {
+ if (signer instanceof GpgObjectSigner) {
+ ((GpgObjectSigner) signer).signObject(builder,
+ config.getSigningKey(), committer,
+ CredentialsProvider.getDefault(), config);
+ } else {
+ signer.sign(builder, config.getSigningKey(), committer,
+ CredentialsProvider.getDefault());
+ }
+ } catch (CanceledException e) {
+ // User cancelled signing: don't sign and assume he doesn't want
+ // to sign any other commit.
+ return null;
+ } catch (JGitInternalException
+ | UnsupportedSigningFormatException e) {
+ if (config.isSignCommits()) {
+ if (e instanceof JGitInternalException) {
+ throw (JGitInternalException) e;
+ } else {
+ throw new JGitInternalException(e.getMessage(), e);
+ }
+ }
+ Activator.logWarning(MessageFormat.format(
+ CoreText.RewordCommitOperation_cannotSign,
+ Utils.getShortObjectId(commit),
+ Utils.getShortObjectId(headId),
+ Utils.getShortObjectId(original)), e);
+ return null;
+ }
+ }
+ return signer;
}
@Override
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/TagOperation.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/TagOperation.java
index 8c0ca09ad3..3d3ec56b8b 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/TagOperation.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/TagOperation.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (C) 2010, Dariusz Luksza <dariusz@luksza.org>
+ * Copyright (C) 2010, 2020 Dariusz Luksza <dariusz@luksza.org> and others
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,134 +10,354 @@
*******************************************************************************/
package org.eclipse.egit.core.op;
-import java.io.IOException;
+import java.io.File;
+import java.text.MessageFormat;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.egit.core.internal.CoreText;
+import org.eclipse.egit.core.internal.signing.GpgConfigurationException;
+import org.eclipse.egit.core.settings.GitSettings;
import org.eclipse.jgit.annotations.NonNull;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.annotations.Nullable;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.TagCommand;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.api.errors.RefAlreadyExistsException;
+import org.eclipse.jgit.lib.GpgConfig;
+import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.RefUpdate.Result;
import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.TagBuilder;
-import org.eclipse.osgi.util.NLS;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.transport.CredentialsProvider;
import org.eclipse.team.core.TeamException;
/**
- * Tags repository with given {@link TagBuilder} object.
+ * Creates a tag. Semantics are subtly different from JGit's {@link TagCommand}:
+ * <ul>
+ * <li>The {@code annotated} flag does not affect signing in any way. (In git,
+ * -a suppresses tags.forceSignAnnotated.)</li>
+ * <li>Creating a lightweight tag with the same name and pointing at the same
+ * commit is allowed without the {@code force} flag.</li>
+ * <li>For historical reasons, creating the every same annotated tag pointing at
+ * the same commit is also allowed without the {@code force} flag, although this
+ * looks more like it was allowed by accident, and it won't work for signed
+ * tags.</li>
+ * <li>If a lightweight tag is requested and no signing will take place, the
+ * message and tagger are silently ignored. JGit would throw an exception if a
+ * message or tagger are set for a lightweight tag.</li>
+ * </ul>
*/
public class TagOperation implements IEGitOperation {
- private final TagBuilder tag;
- private final Repository repo;
+ private final @NonNull Repository repository;
- private Result result;
+ private boolean force;
- private final boolean shouldMoveTag;
+ private boolean annotated = true;
- private final boolean annotated;
+ private Boolean sign;
+
+ private @NonNull String name = ""; //$NON-NLS-1$
+
+ private String message;
+
+ private RevCommit target;
+
+ private PersonIdent tagger;
+
+ private CredentialsProvider credentialsProvider;
+
+ /**
+ * Creates a new {@link TagOperation} to create a tag in a given
+ * {@link Repository}.
+ *
+ * @param repository
+ * the {@link Repository} to create the tag in
+ */
+ public TagOperation(@NonNull Repository repository) {
+ this.repository = repository;
+ }
+
+ /**
+ * Sets whether an already existing tag may be updated by this
+ * {@link TagOperation}.
+ *
+ * @param force
+ * whether to allow updating an existing tag
+ * @return {@code this}
+ */
+ public TagOperation setForce(boolean force) {
+ this.force = force;
+ return this;
+ }
+
+ /**
+ * Retrieves whether updating an existing is allowed in this
+ * {@link TagOperation}.
+ *
+ * @return {@code true} if allowed; {@code false} otherwise
+ */
+ public boolean isForce() {
+ return force;
+ }
/**
- * Construct TagOperation
+ * Sets whether this {@link TagOperation} shall create an annotated tag.
+ * <p>
+ * If set to {@code false}, a potentially set {@link #setMessage(String)
+ * message} or {@link #setTagger(PersonIdent) tagger} is ignored.
+ * </p>
*
- * @param repo
- * @param tag
- * @param shouldMoveTag
- * if <code>true</code> it will replace tag with same name
* @param annotated
- * <code>true</code> if tag is annotated
+ * {@code false} if a lightweight tag is to be created,
+ * {@code true} otherwise (default)
+ * @return {@code this}
+ * @see #setMessage(String)
+ * @see #setTagger(PersonIdent)
*/
- public TagOperation(Repository repo, TagBuilder tag, boolean shouldMoveTag,
- boolean annotated) {
- this.tag = tag;
- this.repo = repo;
- this.shouldMoveTag = shouldMoveTag;
+ public TagOperation setAnnotated(boolean annotated) {
this.annotated = annotated;
+ return this;
}
/**
- * Construct TagOperation
+ * Retrieves whether this {@link TagOperation} shall create an annotated
+ * tag.
*
- * @param repo
- * @param tag
- * @param shouldMoveTag
- * if <code>true</code> it will replace tag with same name
+ * @return {@code true} if allowed; {@code false} otherwise
*/
- public TagOperation(Repository repo, TagBuilder tag,
- boolean shouldMoveTag) {
- this(repo, tag, shouldMoveTag, true);
+ public boolean isAnnotated() {
+ return annotated;
}
- @Override
- public void execute(IProgressMonitor monitor) throws CoreException {
- SubMonitor progress = SubMonitor.convert(monitor, 2);
- progress.setTaskName(NLS.bind(CoreText.TagOperation_performingTagging,
- tag.getTag()));
- ObjectId tagId = annotated ? updateTagObject() : tag.getObjectId();
- progress.worked(1);
- updateRepo(tagId);
- progress.worked(1);
+ /**
+ * Sets whether this {@link TagOperation} shall create a signed tag.
+ *
+ * @param sign
+ * {@code true} to create a signed tag, {@code false} if not, or
+ * {@code null} to let the git config decide (default)
+ * @return {@code this}
+ */
+ public TagOperation setSign(Boolean sign) {
+ this.sign = sign;
+ return this;
}
/**
- * Obtains the result of the operation.
+ * Retrieves whether this {@link TagOperation} shall create a signed tag.
*
- * @return the result
+ * @return whether the tag will be signed; {@code null} means the git config
+ * decides
*/
- public @NonNull Result getResult() {
- Result r = result;
- return r == null ? Result.NOT_ATTEMPTED : r;
+ @Nullable
+ public Boolean getSign() {
+ return sign;
}
- private void updateRepo(ObjectId tagId) throws TeamException {
- String refName = Constants.R_TAGS + tag.getTag();
+ /**
+ * Sets the name of the tag to be created by this {@link TagOperation}.
+ *
+ * @param name
+ * of the tag to be created
+ * @return {@code this}
+ */
+ public TagOperation setName(@NonNull String name) {
+ this.name = name;
+ return this;
+ }
- try {
- RefUpdate tagRef = repo.updateRef(refName);
- tagRef.setNewObjectId(tagId);
+ /**
+ * Retrieves the name of the tag to be created by this {@link TagOperation}.
+ *
+ * @return the tag name
+ */
+ public String getName() {
+ return name;
+ }
- tagRef.setForceUpdate(shouldMoveTag);
- Result updateResult = tagRef.update();
+ /**
+ * Sets the message of the tag to be created by this {@link TagOperation}.
+ * <p>
+ * Any message set will be ignored if the tag is to be a lightweight tag.
+ * </p>
+ *
+ * @param message
+ * of the tag to be created
+ * @return {@code this}
+ */
+ public TagOperation setMessage(String message) {
+ this.message = message;
+ return this;
+ }
- result = updateResult;
- switch (updateResult) {
- case NEW:
- case FORCED:
- case NO_CHANGE:
- break; // OK
- default:
- throw new TeamException(NLS.bind(CoreText.TagOperation_taggingFailure,
- tag.getTag(), updateResult));
- }
- } catch (IOException e) {
- throw new TeamException(NLS.bind(CoreText.TagOperation_taggingFailure,
- tag.getTag(), e.getMessage()), e);
- }
+ /**
+ * Retrieves the message of the tag to be created by this
+ * {@link TagOperation}.
+ *
+ * @return the tag name
+ * @see #setAnnotated(boolean)
+ */
+ public String getMessage() {
+ return message;
+ }
+
+ /**
+ * Sets the target {@link RevCommit} for the tag to be created by this
+ * {@link TagOperation}.
+ *
+ * @param target
+ * {@link RevCommit} the tag shall point to
+ * @return {@code this}
+ */
+ public TagOperation setTarget(@NonNull RevCommit target) {
+ this.target = target;
+ return this;
+ }
+
+ /**
+ * Retrieves the target of the tag to be created by this
+ * {@link TagOperation}.
+ *
+ * @return the target {@link RevCommit}
+ */
+ public RevCommit getTarget() {
+ return target;
}
- private ObjectId updateTagObject() throws TeamException {
- ObjectId startPointRef = tag.getObjectId();
+ /**
+ * Sets the {@link PersonIdent} to use as the author of the tag to be
+ * created by this {@link TagOperation}.
+ * <p>
+ * A possibly set tagger will be ignored if the tag is to be a lightweight
+ * tag.
+ * </p>
+ *
+ * @param tagger
+ * the {@link PersonIdent} to use, or {@code null} to use a
+ * default author based on the repository configuration (default)
+ * @return {@code this}
+ * @see #setAnnotated(boolean)
+ */
+ public TagOperation setTagger(PersonIdent tagger) {
+ this.tagger = tagger;
+ return this;
+ }
- try {
- ObjectId tagId;
- repo.open(startPointRef);
- try (ObjectInserter inserter = repo.newObjectInserter()) {
- tagId = inserter.insert(tag);
- inserter.flush();
+ /**
+ * Retrieves the author of the tag to be created by this
+ * {@link TagOperation}.
+ *
+ * @return the {link PersonIdent} used as author, or {@code null} if none
+ * set
+ */
+ public PersonIdent getTagger() {
+ return tagger;
+ }
+
+ /**
+ * Sets a {@link CredentialsProvider} that may be used during signing.
+ *
+ * @param credentialsProvider
+ * @return {@code this}
+ */
+ public TagOperation setCredentialsProvider(
+ CredentialsProvider credentialsProvider) {
+ this.credentialsProvider = credentialsProvider;
+ return this;
+ }
+
+ /**
+ * Retrieves the {@link CredentialsProvider} set on this
+ * {@link TagOperation}.
+ *
+ * @return the {@link CredentialsProvider} or {@code null} if none is set
+ */
+ public CredentialsProvider getCredentialsProvider() {
+ return credentialsProvider;
+ }
+
+ @Override
+ public void execute(IProgressMonitor monitor) throws CoreException {
+ SubMonitor progress = SubMonitor.convert(monitor, 1);
+ progress.setTaskName(MessageFormat
+ .format(CoreText.TagOperation_performingTagging, getName()));
+ try (Git git = new Git(repository)) {
+ TagCommand command = git.tag()
+ .setName(getName())
+ .setForceUpdate(isForce())
+ .setObjectId(getTarget());
+ // Because of tag.forceSignAnnotated we have to be careful
+ // not to call setAnnotated(true) explicitly.
+ // TagCommand.setAnnotated() corresponds to the "-a"
+ // command-line option being given explicitly, which would
+ // force an unsigned tag unless tag.gpgSign was also true or
+ // the user also gave the -s option. "-s" (or "--no-sign")
+ // is sign != null here.
+ //
+ // So we must not setAnnotated(true) if sign == null,
+ // otherwise tag.forceSignAnnotated = true would be ignored.
+ if (!isAnnotated()) {
+ // We want a lightweight tag, unless it's signed
+ if (Boolean.FALSE.equals(sign)) {
+ setMessage(null);
+ setTagger(null);
+ command.setAnnotated(false);
+ } else if (sign == null) {
+ // User did not decide explicitly.
+ GpgConfig config = new GpgConfig(repository.getConfig());
+ if (!config.isSignAllTags()) {
+ setMessage(null);
+ setTagger(null);
+ command.setAnnotated(false);
+ }
+ }
+ }
+ command.setMessage(getMessage()).setTagger(getTagger());
+ if (sign != null) {
+ command.setSigned(sign.booleanValue());
+ }
+ // A CredentialsProvider might be needed when signing to
+ // get the passphrase for an encrypted key
+ CredentialsProvider provider = getCredentialsProvider();
+ if (provider != null) {
+ // If none is set explicitly, the command will fall back to
+ // CredentialsProvider.getDefault()
+ command.setCredentialsProvider(provider);
}
- return tagId;
- } catch (IOException e) {
- throw new TeamException(NLS.bind(CoreText.TagOperation_objectIdNotFound,
- tag.getTag(), e.getMessage()), e);
+ // Ensure the Eclipse preference, if set, overrides the git config
+ File gpg = GitSettings.getGpgExecutable();
+ if (gpg != null) {
+ GpgConfig cfg = new GpgConfig(repository.getConfig()) {
+
+ @Override
+ public String getProgram() {
+ return gpg.getAbsolutePath();
+ }
+ };
+ command.setGpgConfig(cfg);
+ }
+ command.call();
+ progress.worked(1);
+ } catch (GpgConfigurationException e) {
+ throw new TeamException(e.getLocalizedMessage(), e);
+ } catch (RefAlreadyExistsException e) {
+ // NO_CHANGE: update of existing lightweight tag to the same commit.
+ if (!RefUpdate.Result.NO_CHANGE.equals(e.getUpdateResult())) {
+ throw new TeamException(MessageFormat.format(
+ CoreText.TagOperation_taggingFailure, getName(),
+ e.getMessage()), e);
+ }
+ } catch (GitAPIException e) {
+ throw new TeamException(
+ MessageFormat.format(CoreText.TagOperation_taggingFailure,
+ getName(), e.getMessage()),
+ e);
}
}
-
@Override
public ISchedulingRule getSchedulingRule() {
return null;
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/project/GitProjectData.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/project/GitProjectData.java
index e5622c0122..e13307de4d 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/project/GitProjectData.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/project/GitProjectData.java
@@ -413,8 +413,10 @@ public class GitProjectData {
*/
public static void reconfigureWindowCache() {
final WindowCacheConfig c = new WindowCacheConfig();
- IEclipsePreferences d = DefaultScope.INSTANCE.getNode(Activator.getPluginId());
- IEclipsePreferences p = InstanceScope.INSTANCE.getNode(Activator.getPluginId());
+ IEclipsePreferences d = DefaultScope.INSTANCE
+ .getNode(Activator.PLUGIN_ID);
+ IEclipsePreferences p = InstanceScope.INSTANCE
+ .getNode(Activator.PLUGIN_ID);
c.setPackedGitLimit(p.getInt(GitCorePreferences.core_packedGitLimit, d.getInt(GitCorePreferences.core_packedGitLimit, 0)));
c.setPackedGitWindowSize(p.getInt(GitCorePreferences.core_packedGitWindowSize, d.getInt(GitCorePreferences.core_packedGitWindowSize, 0)));
if (SystemReader.getInstance().isWindows()) {
@@ -611,7 +613,7 @@ public class GitProjectData {
}
private static File propertyFile(IProject project) {
- return new File(project.getWorkingLocation(Activator.getPluginId())
+ return new File(project.getWorkingLocation(Activator.PLUGIN_ID)
.toFile(), "GitProjectData.properties"); //$NON-NLS-1$
}
@@ -771,7 +773,7 @@ public class GitProjectData {
RepositoryProvider.unmap(project);
return Status.OK_STATUS;
} catch (TeamException e) {
- return new Status(IStatus.ERROR, Activator.getPluginId(),
+ return new Status(IStatus.ERROR, Activator.PLUGIN_ID,
MessageFormat.format(
CoreText.GitProjectData_UnmappingGoneResourceFailed,
project.getName()),
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/settings/GitSettings.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/settings/GitSettings.java
index 9e3a5028bc..7f52f15c1a 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/settings/GitSettings.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/settings/GitSettings.java
@@ -10,8 +10,10 @@
*******************************************************************************/
package org.eclipse.egit.core.settings;
+import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
+import java.text.MessageFormat;
import java.util.Collection;
import java.util.Objects;
import java.util.stream.Collectors;
@@ -20,6 +22,8 @@ import org.eclipse.core.runtime.Platform;
import org.eclipse.egit.core.Activator;
import org.eclipse.egit.core.GitCorePreferences;
import org.eclipse.egit.core.RepositoryUtil;
+import org.eclipse.egit.core.internal.CoreText;
+import org.eclipse.jgit.util.StringUtils;
/**
* API to access some core EGit settings.
@@ -39,7 +43,7 @@ public final class GitSettings {
* default.
*/
public static int getRemoteConnectionTimeout() {
- return Platform.getPreferencesService().getInt(Activator.getPluginId(),
+ return Platform.getPreferencesService().getInt(Activator.PLUGIN_ID,
GitCorePreferences.core_remoteConnectionTimeout, 60, null);
}
@@ -54,6 +58,37 @@ public final class GitSettings {
}
/**
+ * Retrieves the {@link File} set in the EGit preferences for a GPG
+ * executable.
+ *
+ * @return the file, {@code null} if not set, invalid or not executable
+ * @since 5.11
+ */
+ public static File getGpgExecutable() {
+ String result = Platform.getPreferencesService().getString(
+ Activator.PLUGIN_ID, GitCorePreferences.core_gpgExecutable,
+ null, null);
+ if (!StringUtils.isEmptyOrNull(result)) {
+ try {
+ // Use Paths.get; it validates more.
+ File exe = Paths.get(result).toFile();
+ if (exe.isFile() && exe.canExecute()) {
+ return exe.getAbsoluteFile();
+ } else {
+ Activator.logError(MessageFormat.format(
+ CoreText.GitSettings_gpgNotExecutable, result),
+ null);
+ }
+ } catch (Exception e) {
+ Activator.logError(MessageFormat.format(
+ CoreText.GitSettings_gpgInvalidExecutable, result),
+ e);
+ }
+ }
+ return null;
+ }
+
+ /**
* Retrieves the set of absolute paths to all repositories configured in
* EGit.
* <p>
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/synchronize/GitResourceVariantComparator.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/synchronize/GitResourceVariantComparator.java
index 40f6621a02..2a686b397e 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/synchronize/GitResourceVariantComparator.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/synchronize/GitResourceVariantComparator.java
@@ -135,7 +135,7 @@ class GitResourceVariantComparator implements IResourceVariantComparator {
}
private void logException(Exception e) {
- IStatus error = new Status(IStatus.ERROR, Activator.getPluginId(),
+ IStatus error = new Status(IStatus.ERROR, Activator.PLUGIN_ID,
e.getMessage(), e);
Activator.getDefault().getLog().log(error);
}
diff --git a/org.eclipse.egit.doc/META-INF/MANIFEST.MF b/org.eclipse.egit.doc/META-INF/MANIFEST.MF
index 5a9ca46e8a..c7fab03879 100644
--- a/org.eclipse.egit.doc/META-INF/MANIFEST.MF
+++ b/org.eclipse.egit.doc/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name
Bundle-SymbolicName: org.eclipse.egit.doc;singleton:=true
-Bundle-Version: 5.10.0.qualifier
+Bundle-Version: 5.11.0.qualifier
Bundle-Vendor: %Bundle-Vendor
Bundle-ActivationPolicy: lazy
Bundle-Localization: plugin
diff --git a/org.eclipse.egit.doc/build-help.xml b/org.eclipse.egit.doc/build-help.xml
index b3a44ab976..c8e291b411 100644
--- a/org.eclipse.egit.doc/build-help.xml
+++ b/org.eclipse.egit.doc/build-help.xml
@@ -45,8 +45,8 @@
>
<path name="EGit/User_Guide" title="EGit User Guide" />
<path name="JGit/User_Guide" title="JGit User Guide" />
- <path name="EGit/New_and_Noteworthy/5.9" title="EGit 5.9 New and Noteworthy" />
- <path name="JGit/New_and_Noteworthy/5.9" title="JGit 5.9 New and Noteworthy" />
+ <path name="EGit/New_and_Noteworthy/5.10" title="EGit 5.10 New and Noteworthy" />
+ <path name="JGit/New_and_Noteworthy/5.10" title="JGit 5.10 New and Noteworthy" />
<path name="EGit/Git_For_Eclipse_Users" title="Git for Eclipse Users" />
<path name="EGit/Contributor_Guide" title="EGit Contributor Guide" />
<stylesheet url="book.css" />
diff --git a/org.eclipse.egit.doc/build.properties b/org.eclipse.egit.doc/build.properties
index 25b040dc47..ee88d761a4 100644
--- a/org.eclipse.egit.doc/build.properties
+++ b/org.eclipse.egit.doc/build.properties
@@ -7,4 +7,5 @@ bin.includes = META-INF/,\
images/,\
intro/,\
cheatsheets/,\
- contexts.xml
+ contexts.xml,\
+ contexts/
diff --git a/org.eclipse.egit.doc/contexts.xml b/org.eclipse.egit.doc/contexts.xml
index a1157471db..579473313f 100644
--- a/org.eclipse.egit.doc/contexts.xml
+++ b/org.eclipse.egit.doc/contexts.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2010, Philipp Thun <philipp.thun@sap.com>
+ Copyright (C) 2010, 2021 Philipp Thun <philipp.thun@sap.com> and others.
All rights reserved. This program and the accompanying materials
are made available under the terms of the Eclipse Public License 2.0
@@ -23,4 +23,7 @@
serialization="org.eclipse.ui.cheatsheets.openCheatSheet(cheatSheetId=org.eclipse.egit.cheatsheets.push)"
label="Pushing to another Git Repository" />
</context>
+ <context id="gpgSigning" title="Configuring GPG">
+ <topic href="contexts/GpgConfiguration.html" label="GPG Configuration" />
+ </context>
</contexts>
diff --git a/org.eclipse.egit.doc/contexts/GpgConfiguration.html b/org.eclipse.egit.doc/contexts/GpgConfiguration.html
new file mode 100644
index 0000000000..e0be065e5d
--- /dev/null
+++ b/org.eclipse.egit.doc/contexts/GpgConfiguration.html
@@ -0,0 +1,98 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--
+ Copyright (C) 2021 Thomas Wolf <thomas.wolf@paranor.ch> and others.
+
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License 2.0
+ which accompanies this distribution, and is available at
+ https://www.eclipse.org/legal/epl-2.0/
+
+ SPDX-License-Identifier: EPL-2.0
+-->
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+ <title>Configuring GPG for use with Eclipse</title>
+ <link type="text/css" rel="stylesheet" href="../help/book.css"/>
+</head>
+<body>
+<h1>Configuring GPG for use with Eclipse</h1>
+<p>
+For using an external GPG program with Eclipse, GPG must be configured to use a GUI
+pop-up dialog for user interaction, for instance when asking for key passphrases or
+smartcard PINs.
+</p>
+<p>
+Standard installations of GPG such as the distributions available from
+<a href="https://gnupg.org/download/index.html#sec-1-2">GnuPG</a> are normally
+set up correctly out of the box. But in some cases, GPG on a system may be configured
+to ask the user for passphrases and such always via a terminal (a command window).
+In that case, GPG cannot be used by Eclipse.
+</p>
+<h2>Getting a Passphrase Dialog</h2>
+<p>
+In GPG, it is not the <code>gpg</code> program itself that asks for passphrases.
+Instead, GPG uses a "hidden" system program <code>gpg-agent</code> to manage keys,
+and that <code>gpg-agent</code> program in turn uses yet another program called
+<em>pinentry</em> for actually asking the user for input. When <code>gpg</code>
+is invoked to sign something, it starts <code>gpg-agent</code> if that isn't
+running already. Once started, <code>gpg-agent</code> will continue running in
+the background, and will be re-used by future <code>gpg</code> operations.
+</p>
+<p>
+How GPG asks the user for passphrases is thus determined by how the <code>gpg-agent</code>
+is configured. There are several possible reasons why <code>gpg-agent</code> might
+use a terminal input instead of a GUI dialog:
+</p>
+<dl>
+<dt>Environment variable <b><tt>GPG_TTY</tt></b></dt>
+<dd>
+<p>
+The <code>gpg-agent</code> might have been started with environment variable
+<tt><b>GPG_TTY</b></tt> being set. In that case, it may be sufficient to terminate
+("kill") the currently running <code>gpg-agent</code> process. When called from
+Eclipse, <tt><b>GPG_TTY</b></tt> is <em>not</em> set, so if the Eclipse invokes
+GPG the next time, the <code>gpg-agent</code> should start normally and use a GUI
+dialog.
+</p>
+<p>If that works, figure out where in your system <tt>GPG_TTY</tt> is set and do
+<em>not</em> set it to prevent the problem from re-occurring.
+</p>
+</dd>
+<dt>Fixed <em>pinentry</em> configuration</dt>
+<dd>
+<p>
+The <code>gpg-agent</code> may be configured to use a particular <em>pinentry</em>
+program. This configuration is in a file <tt><b>gpg-agent.conf</b></tt> in the user's
+GPG directory, on Unix at <tt><b>~/.gnupg/gpg-agent.conf</b></tt>, on Windows at
+<tt><b>%APP_DATA%/gnupg/gpg-agent.conf</b></tt>. This file may contain a configuration
+for <code>pinentry-program</code>, which may be set to <code>pinentry-tty</code> or
+<code>pinentry-curses</code>. In this case, remove the line or configure a GUI
+pinentry explicitly, and terminate the currently running <code>gpg-agent</code> process
+and optionally restart it. (Otherwise it will be restarted on the next GPG operation
+automatically.)
+</p>
+</dd>
+<dt>Missing GUI <em>pinentry</em> program</dt>
+<dd>
+<p>
+Your system may not have a <em>pinentry</em> for a GUI dialog installed. This should
+rarely happen, and if so, only with third-party packages of GPG. Install the missing
+pinentry programs on your system using the system's package installation tool.
+</p>
+</dd>
+<dt>Custom <em>pinentry</em> script</dt>
+<dd>
+<p>
+For advanced users: some people reconfigure the GPG pinentry via <tt>gpg-agent.conf</tt>
+by setting <code>pinentry-program</code> to a custom script that decides based on the
+value of environment variable <tt><b>PINENTRY_USER_DATA</b></tt> whether to prompt via
+a GUI dialog or via a terminal. If you have such a setup, make sure the script uses a
+GUI dialog pinentry when the variable is not set. When called via Eclipse,
+<tt><b>PINENTRY_USER_DATA</b></tt> is <em>not</em> set.
+</p>
+</dd>
+</dl>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.9/5.9.html b/org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.10/5.10.html
index 26016c705a..7aaca02b5a 100644
--- a/org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.9/5.9.html
+++ b/org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.10/5.10.html
@@ -2,13 +2,13 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
- <title>EGit 5.9 New and Noteworthy</title>
+ <title>EGit 5.10 New and Noteworthy</title>
<link type="text/css" rel="stylesheet" href="../../../book.css"/>
</head>
<body>
<table class="navigation" style="width: 100%;" border="0" summary="navigation">
<tr>
- <th style="width: 100%" align="center" colspan="3">EGit 5.9 New and Noteworthy</th>
+ <th style="width: 100%" align="center" colspan="3">EGit 5.10 New and Noteworthy</th>
</tr>
<tr>
<td style="width: 20%" align="left"></td>
@@ -26,16 +26,13 @@
</tr>
</table><hr class="navigation-separator"/>
<h1 id="EGit">EGit</h1>
- <h2 id="New_Preference">New Preference</h2>
- <p>EGit 5.9 has a new preference for the "Commit and Push" button in the Git Staging view:</p>
- <p>
- <img alt="&quot;Screenshot showing the preference dialog and the git staging view.&quot;" border="0" src="images/EGit_5.9_Commit_And_Push_Preference.png"/>
+ <h2 id="SSH">SSH</h2>
+ <p>The Apache MINA sshd client that is used by default now supports the
+ <a href="https://man.openbsd.org/ssh_config#ProxyJump" target="egit_external">ProxyJump</a> directive in the SSH configuration file <tt>~/.ssh/config</tt>. This is useful to access git repositories behind a bastion server or jump host. The configuration must be done in the <tt>~/.ssh/config</tt> SSH configuration file; there is no UI for this.
</p>
- <p>With the new preference, users can make that button always show a push confirmation dialog, where the push target (upstream repository, or branch to push to) can be changed. If the preference is <em>not</em> checked, EGit will push directly to the upstream branch configured for the currently checked-out branch and will show the dialog only if there is no upstream branch configured.</p>
- <p>When there are no staged changes, the button reads "Push HEAD..." and will always show a dialog.</p>
<h2 id="Other_Changes">Other Changes</h2>
- <p>EGit 5.9 includes some of less noticeable improvements in the UI, plus a number of bug fixes. The complete list of new features and bug fixes is available in the
- <a href="https://projects.eclipse.org/projects/technology.egit/releases/5.9.0/" target="egit_external">release notes</a>.
+ <p>EGit 5.10 includes some less noticeable improvements in the UI, plus a number of bug fixes. The complete list of new features and bug fixes is available in the
+ <a href="https://projects.eclipse.org/projects/technology.egit/releases/5.10.0/" target="egit_external">release notes</a>.
</p><hr class="navigation-separator"/>
<table class="navigation" style="width: 100%;" border="0" summary="navigation">
<tr>
diff --git a/org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.9/Contributors.html b/org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.10/Contributors.html
index 638697caa2..18b6c248b6 100644
--- a/org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.9/Contributors.html
+++ b/org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.10/Contributors.html
@@ -2,7 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
- <title>EGit 5.9 New and Noteworthy - Contributors</title>
+ <title>EGit 5.10 New and Noteworthy - Contributors</title>
<link type="text/css" rel="stylesheet" href="../../../book.css"/>
</head>
<body>
@@ -12,7 +12,7 @@
</tr>
<tr>
<td style="width: 20%" align="left">
- <a href="5.9.html" title="EGit 5.9 New and Noteworthy">
+ <a href="5.10.html" title="EGit 5.10 New and Noteworthy">
<img alt="Previous" border="0" src="../../../images/prev.gif"/>
</a>
</td>
@@ -24,27 +24,27 @@
</td>
</tr>
<tr>
- <td style="width: 20%" align="left" valign="top">EGit 5.9 New and Noteworthy</td>
+ <td style="width: 20%" align="left" valign="top">EGit 5.10 New and Noteworthy</td>
<td style="width: 60%" align="center"></td>
<td style="width: 20%" align="right" valign="top">See Also</td>
</tr>
</table><hr class="navigation-separator"/>
<h1 id="Contributors">Contributors</h1>
<p>The following 4 developers worked on this release:</p>
- <p>Gunnar Wagenknecht,
+ <p>Chenhui Xu,
Matthias Sohn,
Michael Keppler,
Thomas Wolf</p><hr class="navigation-separator"/>
<table class="navigation" style="width: 100%;" border="0" summary="navigation">
<tr>
<td style="width: 20%" align="left">
- <a href="5.9.html" title="EGit 5.9 New and Noteworthy">
+ <a href="5.10.html" title="EGit 5.10 New and Noteworthy">
<img alt="Previous" border="0" src="../../../images/prev.gif"/>
</a>
</td>
<td style="width: 60%" align="center">
- <a href="5.9.html" title="EGit 5.9 New and Noteworthy">
- <img alt="EGit 5.9 New and Noteworthy" border="0" src="../../../images/home.gif"/>
+ <a href="5.10.html" title="EGit 5.10 New and Noteworthy">
+ <img alt="EGit 5.10 New and Noteworthy" border="0" src="../../../images/home.gif"/>
</a>
</td>
<td style="width: 20%" align="right">
@@ -54,7 +54,7 @@
</td>
</tr>
<tr>
- <td style="width: 20%" align="left" valign="top">EGit 5.9 New and Noteworthy</td>
+ <td style="width: 20%" align="left" valign="top">EGit 5.10 New and Noteworthy</td>
<td style="width: 60%" align="center"></td>
<td style="width: 20%" align="right" valign="top">See Also</td>
</tr>
diff --git a/org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.9/See-Also.html b/org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.10/See-Also.html
index b4d11f60b6..683dc5768f 100644
--- a/org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.9/See-Also.html
+++ b/org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.10/See-Also.html
@@ -2,7 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
- <title>EGit 5.9 New and Noteworthy - See Also</title>
+ <title>EGit 5.10 New and Noteworthy - See Also</title>
<link type="text/css" rel="stylesheet" href="../../../book.css"/>
</head>
<body>
@@ -31,7 +31,7 @@
</table><hr class="navigation-separator"/>
<h1 id="See_Also">See Also</h1>
<p>See also the
- <a href="../../../JGit/New_and_Noteworthy/5.9/5.9.html" title="JGit/New_and_Noteworthy/5.9">new features in JGit</a> for additional information.
+ <a href="../../../JGit/New_and_Noteworthy/5.10/5.10.html" title="JGit/New_and_Noteworthy/5.10">new features in JGit</a> for additional information.
</p><hr class="navigation-separator"/>
<table class="navigation" style="width: 100%;" border="0" summary="navigation">
<tr>
@@ -41,8 +41,8 @@
</a>
</td>
<td style="width: 60%" align="center">
- <a href="5.9.html" title="EGit 5.9 New and Noteworthy">
- <img alt="EGit 5.9 New and Noteworthy" border="0" src="../../../images/home.gif"/>
+ <a href="5.10.html" title="EGit 5.10 New and Noteworthy">
+ <img alt="EGit 5.10 New and Noteworthy" border="0" src="../../../images/home.gif"/>
</a>
</td>
<td style="width: 20%" align="right">
diff --git a/org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.9/Updating-This-Document.html b/org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.10/Updating-This-Document.html
index 425072ec5a..358bf902de 100644
--- a/org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.9/Updating-This-Document.html
+++ b/org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.10/Updating-This-Document.html
@@ -2,7 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
- <title>EGit 5.9 New and Noteworthy - Updating This Document</title>
+ <title>EGit 5.10 New and Noteworthy - Updating This Document</title>
<link type="text/css" rel="stylesheet" href="../../../book.css"/>
</head>
<body>
@@ -29,7 +29,7 @@
<p> This document is maintained in a collaborative wiki. If you wish to
update or modify this document please visit
- <a href="https://wiki.eclipse.org/EGit/New_and_Noteworthy/5.9" target="egit_external">https://wiki.eclipse.org/EGit/New_and_Noteworthy/5.9</a>
+ <a href="https://wiki.eclipse.org/EGit/New_and_Noteworthy/5.10" target="egit_external">https://wiki.eclipse.org/EGit/New_and_Noteworthy/5.10</a>
</p><hr class="navigation-separator"/>
<table class="navigation" style="width: 100%;" border="0" summary="navigation">
<tr>
@@ -39,8 +39,8 @@
</a>
</td>
<td style="width: 60%" align="center">
- <a href="5.9.html" title="EGit 5.9 New and Noteworthy">
- <img alt="EGit 5.9 New and Noteworthy" border="0" src="../../../images/home.gif"/>
+ <a href="5.10.html" title="EGit 5.10 New and Noteworthy">
+ <img alt="EGit 5.10 New and Noteworthy" border="0" src="../../../images/home.gif"/>
</a>
</td>
<td style="width: 20%" align="right"></td>
diff --git a/org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.9/images/EGit_5.9_Commit_And_Push_Preference.png b/org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.9/images/EGit_5.9_Commit_And_Push_Preference.png
deleted file mode 100644
index acebc574cc..0000000000
--- a/org.eclipse.egit.doc/help/EGit/New_and_Noteworthy/5.9/images/EGit_5.9_Commit_And_Push_Preference.png
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.egit.doc/help/JGit/New_and_Noteworthy/5.9/5.9.html b/org.eclipse.egit.doc/help/JGit/New_and_Noteworthy/5.10/5.10.html
index 5fe3bcb98e..4fa6199785 100644
--- a/org.eclipse.egit.doc/help/JGit/New_and_Noteworthy/5.9/5.9.html
+++ b/org.eclipse.egit.doc/help/JGit/New_and_Noteworthy/5.10/5.10.html
@@ -2,13 +2,13 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
- <title>JGit 5.9 New and Noteworthy</title>
+ <title>JGit 5.10 New and Noteworthy</title>
<link type="text/css" rel="stylesheet" href="../../../book.css"/>
</head>
<body>
<table class="navigation" style="width: 100%;" border="0" summary="navigation">
<tr>
- <th style="width: 100%" align="center" colspan="3">JGit 5.9 New and Noteworthy</th>
+ <th style="width: 100%" align="center" colspan="3">JGit 5.10 New and Noteworthy</th>
</tr>
<tr>
<td style="width: 20%" align="left"></td>
@@ -28,13 +28,17 @@
<h1 id="JGit">JGit</h1>
<h2 id="New_Features">New Features</h2>
<ul>
- <li>JGit 5.9.0 supports git repositories using
- <a href="https://github.com/git/git/blob/v2.28.0/Documentation/technical/index-format.txt#L116" target="egit_external">git index version 4</a>. In version 4 entry path names are prefix-compressed relative to the path name for the previous entry which reduces the size of the git index and improves performance.
+ <li>Bundle <code>org.eclipse.jgit.ssh.apache</code>: supports the
+ <a href="https://man.openbsd.org/ssh_config#ProxyJump" target="egit_external">ProxyJump</a> directive in the SSH configuration file <tt>~/.ssh/config</tt>. This is useful to access git repositories behind a bastion server or jump host. The configuration must be done in <tt>~/.ssh/config</tt>; there is no API for this.
+ </li>
+ <li>Support for git configs <tt>
+ <a href="https://git-scm.com/docs/git-config#Documentation/git-config.txt-httpuserAgent" target="egit_external">http.userAgent</a></tt> and <tt>
+ <a href="https://git-scm.com/docs/git-config#Documentation/git-config.txt-httpextraHeader" target="egit_external">http.extraHeader</a></tt>. The values are limited to 7-bit ASCII.
</li>
</ul>
<h2 id="Other_Changes">Other Changes</h2>
<p>The complete list of new features and bug fixes is available in the
- <a href="https://projects.eclipse.org/projects/technology.jgit/releases/5.9.0/" target="egit_external">release notes</a>.
+ <a href="https://projects.eclipse.org/projects/technology.jgit/releases/5.10.0/" target="egit_external">release notes</a>.
</p><hr class="navigation-separator"/>
<table class="navigation" style="width: 100%;" border="0" summary="navigation">
<tr>
diff --git a/org.eclipse.egit.doc/help/JGit/New_and_Noteworthy/5.9/Contributors.html b/org.eclipse.egit.doc/help/JGit/New_and_Noteworthy/5.10/Contributors.html
index d16ce1dbfe..8e81ae7a73 100644
--- a/org.eclipse.egit.doc/help/JGit/New_and_Noteworthy/5.9/Contributors.html
+++ b/org.eclipse.egit.doc/help/JGit/New_and_Noteworthy/5.10/Contributors.html
@@ -2,7 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
- <title>JGit 5.9 New and Noteworthy - Contributors</title>
+ <title>JGit 5.10 New and Noteworthy - Contributors</title>
<link type="text/css" rel="stylesheet" href="../../../book.css"/>
</head>
<body>
@@ -12,7 +12,7 @@
</tr>
<tr>
<td style="width: 20%" align="left">
- <a href="5.9.html" title="JGit 5.9 New and Noteworthy">
+ <a href="5.10.html" title="JGit 5.10 New and Noteworthy">
<img alt="Previous" border="0" src="../../../images/prev.gif"/>
</a>
</td>
@@ -24,35 +24,38 @@
</td>
</tr>
<tr>
- <td style="width: 20%" align="left" valign="top">JGit 5.9 New and Noteworthy</td>
+ <td style="width: 20%" align="left" valign="top">JGit 5.10 New and Noteworthy</td>
<td style="width: 60%" align="center"></td>
<td style="width: 20%" align="right" valign="top">Updating This Document</td>
</tr>
</table><hr class="navigation-separator"/>
<h1 id="Contributors">Contributors</h1>
- <p>The following 12 developers worked on this release:</p>
- <p>David Ostrovsky,
- David Pursehouse,
- Demetr Starshov,
- Jonathan Nieder,
- Marc Strapetz,
+ <p>The following 15 developers worked on this release:</p>
+ <p>Alexa Panfil,
+ Christian Halstrick,
+ David Ostrovsky,
+ James Wynn,
+ Jason Yeo,
+ John Dallaway,
+ Jonathan Tan,
+ Lee Worrall,
Marco Miller,
- Masaya Suzuki,
Matthias Sohn,
- Minh Thai,
+ Nail Samatov,
+ Petr Hrebejk,
Terry Parker,
Thomas Wolf,
Yunjie Li</p><hr class="navigation-separator"/>
<table class="navigation" style="width: 100%;" border="0" summary="navigation">
<tr>
<td style="width: 20%" align="left">
- <a href="5.9.html" title="JGit 5.9 New and Noteworthy">
+ <a href="5.10.html" title="JGit 5.10 New and Noteworthy">
<img alt="Previous" border="0" src="../../../images/prev.gif"/>
</a>
</td>
<td style="width: 60%" align="center">
- <a href="5.9.html" title="JGit 5.9 New and Noteworthy">
- <img alt="JGit 5.9 New and Noteworthy" border="0" src="../../../images/home.gif"/>
+ <a href="5.10.html" title="JGit 5.10 New and Noteworthy">
+ <img alt="JGit 5.10 New and Noteworthy" border="0" src="../../../images/home.gif"/>
</a>
</td>
<td style="width: 20%" align="right">
@@ -62,7 +65,7 @@
</td>
</tr>
<tr>
- <td style="width: 20%" align="left" valign="top">JGit 5.9 New and Noteworthy</td>
+ <td style="width: 20%" align="left" valign="top">JGit 5.10 New and Noteworthy</td>
<td style="width: 60%" align="center"></td>
<td style="width: 20%" align="right" valign="top">Updating This Document</td>
</tr>
diff --git a/org.eclipse.egit.doc/help/JGit/New_and_Noteworthy/5.9/Updating-This-Document.html b/org.eclipse.egit.doc/help/JGit/New_and_Noteworthy/5.10/Updating-This-Document.html
index 0a8cb339fe..2c5df45236 100644
--- a/org.eclipse.egit.doc/help/JGit/New_and_Noteworthy/5.9/Updating-This-Document.html
+++ b/org.eclipse.egit.doc/help/JGit/New_and_Noteworthy/5.10/Updating-This-Document.html
@@ -2,7 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
- <title>JGit 5.9 New and Noteworthy - Updating This Document</title>
+ <title>JGit 5.10 New and Noteworthy - Updating This Document</title>
<link type="text/css" rel="stylesheet" href="../../../book.css"/>
</head>
<body>
@@ -29,7 +29,7 @@
<p> This document is maintained in a collaborative wiki. If you wish to
update or modify this document please visit
- <a href="https://wiki.eclipse.org/JGit/New_and_Noteworthy/5.9" target="egit_external">https://wiki.eclipse.org/JGit/New_and_Noteworthy/5.9</a>
+ <a href="https://wiki.eclipse.org/JGit/New_and_Noteworthy/5.10" target="egit_external">https://wiki.eclipse.org/JGit/New_and_Noteworthy/5.10</a>
</p><hr class="navigation-separator"/>
<table class="navigation" style="width: 100%;" border="0" summary="navigation">
<tr>
@@ -39,8 +39,8 @@
</a>
</td>
<td style="width: 60%" align="center">
- <a href="5.9.html" title="JGit 5.9 New and Noteworthy">
- <img alt="JGit 5.9 New and Noteworthy" border="0" src="../../../images/home.gif"/>
+ <a href="5.10.html" title="JGit 5.10 New and Noteworthy">
+ <img alt="JGit 5.10 New and Noteworthy" border="0" src="../../../images/home.gif"/>
</a>
</td>
<td style="width: 20%" align="right"></td>
diff --git a/org.eclipse.egit.doc/help/toc.xml b/org.eclipse.egit.doc/help/toc.xml
index 7185589745..90a64a604a 100644
--- a/org.eclipse.egit.doc/help/toc.xml
+++ b/org.eclipse.egit.doc/help/toc.xml
@@ -447,22 +447,22 @@
</topic>
<topic href="help/JGit/User_Guide/Updating-This-Document.html" label="Updating This Document"></topic>
</topic>
- <topic href="help/EGit/New_and_Noteworthy/5.9/5.9.html" label="EGit 5.9 New and Noteworthy">
- <topic href="help/EGit/New_and_Noteworthy/5.9/5.9.html" label="EGit">
- <topic href="help/EGit/New_and_Noteworthy/5.9/5.9.html#New_Preference" label="New Preference"></topic>
- <topic href="help/EGit/New_and_Noteworthy/5.9/5.9.html#Other_Changes" label="Other Changes"></topic>
+ <topic href="help/EGit/New_and_Noteworthy/5.10/5.10.html" label="EGit 5.10 New and Noteworthy">
+ <topic href="help/EGit/New_and_Noteworthy/5.10/5.10.html" label="EGit">
+ <topic href="help/EGit/New_and_Noteworthy/5.10/5.10.html#SSH" label="SSH"></topic>
+ <topic href="help/EGit/New_and_Noteworthy/5.10/5.10.html#Other_Changes" label="Other Changes"></topic>
</topic>
- <topic href="help/EGit/New_and_Noteworthy/5.9/Contributors.html" label="Contributors"></topic>
- <topic href="help/EGit/New_and_Noteworthy/5.9/See-Also.html" label="See Also"></topic>
- <topic href="help/EGit/New_and_Noteworthy/5.9/Updating-This-Document.html" label="Updating This Document"></topic>
+ <topic href="help/EGit/New_and_Noteworthy/5.10/Contributors.html" label="Contributors"></topic>
+ <topic href="help/EGit/New_and_Noteworthy/5.10/See-Also.html" label="See Also"></topic>
+ <topic href="help/EGit/New_and_Noteworthy/5.10/Updating-This-Document.html" label="Updating This Document"></topic>
</topic>
- <topic href="help/JGit/New_and_Noteworthy/5.9/5.9.html" label="JGit 5.9 New and Noteworthy">
- <topic href="help/JGit/New_and_Noteworthy/5.9/5.9.html" label="JGit">
- <topic href="help/JGit/New_and_Noteworthy/5.9/5.9.html#New_Features" label="New Features"></topic>
- <topic href="help/JGit/New_and_Noteworthy/5.9/5.9.html#Other_Changes" label="Other Changes"></topic>
+ <topic href="help/JGit/New_and_Noteworthy/5.10/5.10.html" label="JGit 5.10 New and Noteworthy">
+ <topic href="help/JGit/New_and_Noteworthy/5.10/5.10.html" label="JGit">
+ <topic href="help/JGit/New_and_Noteworthy/5.10/5.10.html#New_Features" label="New Features"></topic>
+ <topic href="help/JGit/New_and_Noteworthy/5.10/5.10.html#Other_Changes" label="Other Changes"></topic>
</topic>
- <topic href="help/JGit/New_and_Noteworthy/5.9/Contributors.html" label="Contributors"></topic>
- <topic href="help/JGit/New_and_Noteworthy/5.9/Updating-This-Document.html" label="Updating This Document"></topic>
+ <topic href="help/JGit/New_and_Noteworthy/5.10/Contributors.html" label="Contributors"></topic>
+ <topic href="help/JGit/New_and_Noteworthy/5.10/Updating-This-Document.html" label="Updating This Document"></topic>
</topic>
<topic href="help/EGit/Git_For_Eclipse_Users/Git-For-Eclipse-Users.html" label="Git for Eclipse Users">
<topic href="help/EGit/Git_For_Eclipse_Users/Git-For-Eclipse-Users.html" label="Centralised version control systems"></topic>
diff --git a/org.eclipse.egit.doc/pom.xml b/org.eclipse.egit.doc/pom.xml
index 57ff146c55..5e6553c512 100644
--- a/org.eclipse.egit.doc/pom.xml
+++ b/org.eclipse.egit.doc/pom.xml
@@ -18,7 +18,7 @@
<parent>
<groupId>org.eclipse.egit</groupId>
<artifactId>egit-parent</artifactId>
- <version>5.10.0-SNAPSHOT</version>
+ <version>5.11.0-SNAPSHOT</version>
</parent>
<artifactId>org.eclipse.egit.doc</artifactId>
diff --git a/org.eclipse.egit.gitflow-feature/feature.properties b/org.eclipse.egit.gitflow-feature/feature.properties
index b82b2994bf..a93127be8a 100644
--- a/org.eclipse.egit.gitflow-feature/feature.properties
+++ b/org.eclipse.egit.gitflow-feature/feature.properties
@@ -1,5 +1,5 @@
###############################################################################
-# Copyright (c) 2000, 2010 IBM Corporation and others.
+# Copyright (c) 2000, 2021 IBM Corporation and others.
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License 2.0
# which accompanies this distribution, and is available at
@@ -19,7 +19,7 @@ description=GitFlow support for Git integration in Eclipse
# "copyright" property - text of the "Feature Update Copyright"
copyright=\
-Copyright (c) 2015, 2020 Max Hohenegger and others.\n\
+Copyright (c) 2015, 2021 Max Hohenegger and others.\n\
All rights reserved. This program and the accompanying materials\n\
are made available under the terms of the Eclipse Public License 2.0\n\
which accompanies this distribution, and is available at\n\
diff --git a/org.eclipse.egit.gitflow-feature/feature.xml b/org.eclipse.egit.gitflow-feature/feature.xml
index 1e2742ec4b..050acfe061 100644
--- a/org.eclipse.egit.gitflow-feature/feature.xml
+++ b/org.eclipse.egit.gitflow-feature/feature.xml
@@ -2,7 +2,7 @@
<feature
id="org.eclipse.egit.gitflow.feature"
label="%featureName"
- version="5.10.0.qualifier"
+ version="5.11.0.qualifier"
provider-name="%providerName"
plugin="org.eclipse.egit.gitflow"
license-feature="org.eclipse.license"
@@ -26,9 +26,9 @@
</url>
<requires>
- <import feature="org.eclipse.jgit" version="5.10.0" match="equivalent"/>
- <import plugin="org.eclipse.egit.core" version="5.10.0" match="equivalent"/>
- <import plugin="org.eclipse.egit.ui" version="5.10.0" match="equivalent"/>
+ <import feature="org.eclipse.jgit" version="5.11.0" match="equivalent"/>
+ <import plugin="org.eclipse.egit.core" version="5.11.0" match="equivalent"/>
+ <import plugin="org.eclipse.egit.ui" version="5.11.0" match="equivalent"/>
</requires>
<plugin
diff --git a/org.eclipse.egit.gitflow-feature/pom.xml b/org.eclipse.egit.gitflow-feature/pom.xml
index 1f8ef01417..9fd30f45d8 100644
--- a/org.eclipse.egit.gitflow-feature/pom.xml
+++ b/org.eclipse.egit.gitflow-feature/pom.xml
@@ -18,7 +18,7 @@
<parent>
<groupId>org.eclipse.egit</groupId>
<artifactId>egit-parent</artifactId>
- <version>5.10.0-SNAPSHOT</version>
+ <version>5.11.0-SNAPSHOT</version>
</parent>
<groupId>org.eclipse.egit.feature</groupId>
diff --git a/org.eclipse.egit.gitflow.test/META-INF/MANIFEST.MF b/org.eclipse.egit.gitflow.test/META-INF/MANIFEST.MF
index 203d2dd5df..5e797447b0 100644
--- a/org.eclipse.egit.gitflow.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.egit.gitflow.test/META-INF/MANIFEST.MF
@@ -3,13 +3,13 @@ Bundle-ManifestVersion: 2
Bundle-Name: GitFlow Test
Automatic-Module-Name: org.eclipse.egit.gitflow.test
Bundle-SymbolicName: org.eclipse.egit.gitflow.test;singleton:=true
-Bundle-Version: 5.10.0.qualifier
+Bundle-Version: 5.11.0.qualifier
Fragment-Host: org.eclipse.egit.gitflow
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Import-Package: org.eclipse.egit.core;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.junit;version="[5.10.0,5.11.0)",
+Import-Package: org.eclipse.egit.core;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.junit;version="[5.11.0,5.12.0)",
org.hamcrest;version="[1.1.0,1.2.0)",
org.junit.rules;version="[4.13.0,5.0.0)",
org.junit;version="[4.13.0,5.0.0)"
Require-Bundle: org.eclipse.core.resources;bundle-version="[3.11.0,4.0.0)",
- org.eclipse.egit.core.junit;bundle-version="[5.10.0,5.11.0)"
+ org.eclipse.egit.core.junit;bundle-version="[5.11.0,5.12.0)"
diff --git a/org.eclipse.egit.gitflow.test/pom.xml b/org.eclipse.egit.gitflow.test/pom.xml
index 95478c58b6..0ada2e062b 100644
--- a/org.eclipse.egit.gitflow.test/pom.xml
+++ b/org.eclipse.egit.gitflow.test/pom.xml
@@ -17,7 +17,7 @@
<parent>
<groupId>org.eclipse.egit</groupId>
<artifactId>egit-parent</artifactId>
- <version>5.10.0-SNAPSHOT</version>
+ <version>5.11.0-SNAPSHOT</version>
</parent>
<artifactId>org.eclipse.egit.gitflow.test</artifactId>
diff --git a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/ReleaseStartOperationTest.java b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/ReleaseStartOperationTest.java
index 220a896f81..3f05a90d1d 100644
--- a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/ReleaseStartOperationTest.java
+++ b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/ReleaseStartOperationTest.java
@@ -10,13 +10,15 @@
*******************************************************************************/
package org.eclipse.egit.gitflow.op;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.egit.core.op.TagOperation;
import org.eclipse.egit.gitflow.GitFlowRepository;
import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.TagBuilder;
import org.eclipse.jgit.revwalk.RevCommit;
import org.junit.Test;
@@ -125,10 +127,11 @@ public class ReleaseStartOperationTest extends AbstractGitFlowOperationTest {
protected void createTag(RevCommit head, String name, String message,
Repository repository) throws CoreException {
- TagBuilder tag = new TagBuilder();
- tag.setTag(name);
- tag.setMessage(message);
- tag.setObjectId(head);
- new TagOperation(repository, tag, false).execute(null);
+ TagOperation operation = new TagOperation(repository)
+ .setAnnotated(true)
+ .setName(name)
+ .setMessage(message)
+ .setTarget(head);
+ operation.execute(null);
}
}
diff --git a/org.eclipse.egit.gitflow.ui/META-INF/MANIFEST.MF b/org.eclipse.egit.gitflow.ui/META-INF/MANIFEST.MF
index fe641570cf..532aa42f70 100644
--- a/org.eclipse.egit.gitflow.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.egit.gitflow.ui/META-INF/MANIFEST.MF
@@ -3,39 +3,39 @@ Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name
Automatic-Module-Name: org.eclipse.egit.gitflow.ui
Bundle-SymbolicName: org.eclipse.egit.gitflow.ui;singleton:=true
-Bundle-Version: 5.10.0.qualifier
+Bundle-Version: 5.11.0.qualifier
Bundle-Activator: org.eclipse.egit.gitflow.ui.Activator
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ActivationPolicy: lazy
Bundle-Vendor: %Bundle-Vendor
Bundle-Localization: plugin
-Import-Package: org.eclipse.egit.core;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.internal;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.internal.job;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.op;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.project;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.settings;version="[5.10.0,5.11.0)",
- org.eclipse.egit.gitflow;version="[5.10.0,5.11.0)",
- org.eclipse.egit.gitflow.op;version="[5.10.0,5.11.0)",
- org.eclipse.egit.ui;version="[5.10.0,5.11.0)",
- org.eclipse.egit.ui.internal;version="[5.10.0,5.11.0)",
- org.eclipse.egit.ui.internal.actions;version="[5.10.0,5.11.0)",
- org.eclipse.egit.ui.internal.branch;version="[5.10.0,5.11.0)",
- org.eclipse.egit.ui.internal.commit;version="[5.10.0,5.11.0)",
- org.eclipse.egit.ui.internal.components;version="[5.10.0,5.11.0)",
- org.eclipse.egit.ui.internal.decorators;version="[5.10.0,5.11.0)",
- org.eclipse.egit.ui.internal.expressions;version="[5.10.0,5.11.0)",
- org.eclipse.egit.ui.internal.push;version="[5.10.0,5.11.0)",
- org.eclipse.egit.ui.internal.rebase;version="[5.10.0,5.11.0)",
- org.eclipse.egit.ui.internal.repository.tree;version="[5.10.0,5.11.0)",
- org.eclipse.egit.ui.internal.selection;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.annotations;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.api;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.api.errors;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.lib;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.revplot;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.revwalk;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.util;version="[5.10.0,5.11.0)"
+Import-Package: org.eclipse.egit.core;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.internal;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.internal.job;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.op;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.project;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.settings;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.gitflow;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.gitflow.op;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.ui;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.ui.internal;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.ui.internal.actions;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.ui.internal.branch;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.ui.internal.commit;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.ui.internal.components;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.ui.internal.decorators;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.ui.internal.expressions;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.ui.internal.push;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.ui.internal.rebase;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.ui.internal.repository.tree;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.ui.internal.selection;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.annotations;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.api;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.api.errors;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.lib;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.revplot;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.revwalk;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.util;version="[5.11.0,5.12.0)"
Require-Bundle: org.eclipse.core.resources;bundle-version="[3.11.0,4.0.0)",
org.eclipse.core.runtime;bundle-version="[3.12.0,4.0.0)",
org.eclipse.team.ui;bundle-version="[3.8.0,4.0.0)",
@@ -45,12 +45,12 @@ Require-Bundle: org.eclipse.core.resources;bundle-version="[3.11.0,4.0.0)",
org.eclipse.core.databinding.property;bundle-version="[1.6.0,2.0.0)",
org.eclipse.core.databinding.beans;bundle-version="[1.3.100,2.0.0)",
org.eclipse.core.databinding;bundle-version="[1.6.0,2.0.0)"
-Export-Package: org.eclipse.egit.gitflow.ui;version="5.10.0";x-friends:="org.eclipse.egit.ui.test",
- org.eclipse.egit.gitflow.ui.internal;version="5.10.0";x-friends:="org.eclipse.egit.ui.test",
- org.eclipse.egit.gitflow.ui.internal.actions;version="5.10.0";x-friends:="org.eclipse.egit.ui.test",
- org.eclipse.egit.gitflow.ui.internal.decorators;version="5.10.0";x-internal:=true,
- org.eclipse.egit.gitflow.ui.internal.dialogs;version="5.10.0";x-internal:=true,
- org.eclipse.egit.gitflow.ui.internal.factories;version="5.10.0";x-internal:=true,
- org.eclipse.egit.gitflow.ui.internal.menu;version="5.10.0";x-internal:=true,
- org.eclipse.egit.gitflow.ui.internal.properties;version="5.10.0";x-internal:=true,
- org.eclipse.egit.gitflow.ui.internal.validation;version="5.10.0";x-internal:=true
+Export-Package: org.eclipse.egit.gitflow.ui;version="5.11.0";x-friends:="org.eclipse.egit.ui.test",
+ org.eclipse.egit.gitflow.ui.internal;version="5.11.0";x-friends:="org.eclipse.egit.ui.test",
+ org.eclipse.egit.gitflow.ui.internal.actions;version="5.11.0";x-friends:="org.eclipse.egit.ui.test",
+ org.eclipse.egit.gitflow.ui.internal.decorators;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.gitflow.ui.internal.dialogs;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.gitflow.ui.internal.factories;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.gitflow.ui.internal.menu;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.gitflow.ui.internal.properties;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.gitflow.ui.internal.validation;version="5.11.0";x-internal:=true
diff --git a/org.eclipse.egit.gitflow.ui/pom.xml b/org.eclipse.egit.gitflow.ui/pom.xml
index 1b59f76bc6..61a509083f 100644
--- a/org.eclipse.egit.gitflow.ui/pom.xml
+++ b/org.eclipse.egit.gitflow.ui/pom.xml
@@ -18,7 +18,7 @@
<parent>
<groupId>org.eclipse.egit</groupId>
<artifactId>egit-parent</artifactId>
- <version>5.10.0-SNAPSHOT</version>
+ <version>5.11.0-SNAPSHOT</version>
</parent>
<artifactId>org.eclipse.egit.gitflow.ui</artifactId>
diff --git a/org.eclipse.egit.gitflow.ui/src/org/eclipse/egit/gitflow/ui/internal/uitext.properties b/org.eclipse.egit.gitflow.ui/src/org/eclipse/egit/gitflow/ui/internal/uitext.properties
index 2cc9b356b3..95eb770e45 100644
--- a/org.eclipse.egit.gitflow.ui/src/org/eclipse/egit/gitflow/ui/internal/uitext.properties
+++ b/org.eclipse.egit.gitflow.ui/src/org/eclipse/egit/gitflow/ui/internal/uitext.properties
@@ -41,7 +41,7 @@ HotfixFinishHandler_hotfixFinishConflicts=Finishing hotfix resulted in conflicts
HotfixStartHandler_pleaseProvideANameForTheNewHotfix=Please provide a name for the new hotfix.
HotfixStartHandler_provideHotfixName=Provide hotfix name
HotfixStartHandler_startingNewHotfix=Starting new Hotfix...
-InitDialog_branchDoesNotExistYetAndWillBeCreated=Branch ''{0}''does not yet exist, and will have to be created.
+InitDialog_branchDoesNotExistYetAndWillBeCreated=Branch ''{0}'' does not yet exist, and will have to be created.
InitDialog_chooseBranchNamesAndPrefixes=Choose branch names and prefixes for your Gitflow repository.
InitDialog_developBranch=Develop branch
InitDialog_featureBranchPrefix=Feature branch prefix
diff --git a/org.eclipse.egit.gitflow/META-INF/MANIFEST.MF b/org.eclipse.egit.gitflow/META-INF/MANIFEST.MF
index a3178a4d9b..68a4733817 100644
--- a/org.eclipse.egit.gitflow/META-INF/MANIFEST.MF
+++ b/org.eclipse.egit.gitflow/META-INF/MANIFEST.MF
@@ -3,21 +3,21 @@ Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name
Automatic-Module-Name: org.eclipse.egit.gitflow
Bundle-SymbolicName: org.eclipse.egit.gitflow;singleton:=true
-Bundle-Version: 5.10.0.qualifier
+Bundle-Version: 5.11.0.qualifier
Bundle-Vendor: %Bundle-Vendor
Bundle-Activator: org.eclipse.egit.gitflow.Activator
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ActivationPolicy: lazy
Bundle-Localization: plugin
Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.12.0,4.0.0)"
-Export-Package: org.eclipse.egit.gitflow;version="5.10.0";
+Export-Package: org.eclipse.egit.gitflow;version="5.11.0";
uses:="org.osgi.framework,
org.eclipse.jgit.transport,
org.eclipse.core.runtime,
org.eclipse.jgit.lib,
org.eclipse.jgit.revwalk",
org.eclipse.egit.gitflow.internal;x-internal:=true,
- org.eclipse.egit.gitflow.op;version="5.10.0";
+ org.eclipse.egit.gitflow.op;version="5.11.0";
uses:="org.eclipse.jgit.transport,
org.eclipse.core.runtime.jobs,
org.eclipse.core.runtime,
@@ -26,13 +26,13 @@ Export-Package: org.eclipse.egit.gitflow;version="5.10.0";
org.eclipse.jgit.revwalk,
org.eclipse.jgit.lib,
org.eclipse.egit.core.op"
-Import-Package: org.eclipse.egit.core.internal.job;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.op;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.api;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.api.errors;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.annotations;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.errors;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.lib;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.revwalk;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.revwalk.filter;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.transport;version="[5.10.0,5.11.0)"
+Import-Package: org.eclipse.egit.core.internal.job;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.op;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.api;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.api.errors;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.annotations;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.errors;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.lib;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.revwalk;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.revwalk.filter;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.transport;version="[5.11.0,5.12.0)"
diff --git a/org.eclipse.egit.gitflow/pom.xml b/org.eclipse.egit.gitflow/pom.xml
index 1f414a73dd..d6b3598dc2 100644
--- a/org.eclipse.egit.gitflow/pom.xml
+++ b/org.eclipse.egit.gitflow/pom.xml
@@ -18,7 +18,7 @@
<parent>
<groupId>org.eclipse.egit</groupId>
<artifactId>egit-parent</artifactId>
- <version>5.10.0-SNAPSHOT</version>
+ <version>5.11.0-SNAPSHOT</version>
</parent>
<artifactId>org.eclipse.egit.gitflow</artifactId>
diff --git a/org.eclipse.egit.gitflow/src/org/eclipse/egit/gitflow/op/AbstractVersionFinishOperation.java b/org.eclipse.egit.gitflow/src/org/eclipse/egit/gitflow/op/AbstractVersionFinishOperation.java
index 065d45e9cb..650400a9c8 100644
--- a/org.eclipse.egit.gitflow/src/org/eclipse/egit/gitflow/op/AbstractVersionFinishOperation.java
+++ b/org.eclipse.egit.gitflow/src/org/eclipse/egit/gitflow/op/AbstractVersionFinishOperation.java
@@ -21,7 +21,6 @@ import org.eclipse.egit.gitflow.GitFlowRepository;
import org.eclipse.egit.gitflow.WrongGitFlowStateException;
import org.eclipse.egit.gitflow.internal.CoreText;
import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.TagBuilder;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.osgi.util.NLS;
@@ -82,12 +81,12 @@ abstract public class AbstractVersionFinishOperation extends GitFlowOperation {
*/
protected void createTag(IProgressMonitor monitor, RevCommit head,
String name, String message) throws CoreException {
- TagBuilder tag = new TagBuilder();
- tag.setTag(name);
- tag.setTagger(new PersonIdent(repository.getRepository()));
- tag.setMessage(message);
- tag.setObjectId(head);
- new TagOperation(repository.getRepository(), tag, false)
- .execute(monitor);
+ TagOperation operation = new TagOperation(repository.getRepository())
+ .setAnnotated(true)
+ .setName(name)
+ .setMessage(message)
+ .setTarget(head)
+ .setTagger(new PersonIdent(repository.getRepository()));
+ operation.execute(monitor);
}
}
diff --git a/org.eclipse.egit.mylyn-feature/feature.properties b/org.eclipse.egit.mylyn-feature/feature.properties
index a71e264b7f..86005af486 100644
--- a/org.eclipse.egit.mylyn-feature/feature.properties
+++ b/org.eclipse.egit.mylyn-feature/feature.properties
@@ -1,5 +1,5 @@
###############################################################################
-# Copyright (c) 2011 Chris Aniszczyk and others.
+# Copyright (c) 2011, 2021 Chris Aniszczyk and others.
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License 2.0
# which accompanies this distribution, and is available at
@@ -19,7 +19,7 @@ description=Task-focused interface for Git integration in Eclipse
# "copyright" property - text of the "Feature Update Copyright"
copyright=\
-Copyright (c) 2011, 2020 Chris Aniszczyk, et.al.\n\
+Copyright (c) 2011, 2021 Chris Aniszczyk, et.al.\n\
All rights reserved. This program and the accompanying materials\n\
are made available under the terms of the Eclipse Public License 2.0\n\
which accompanies this distribution, and is available at\n\
diff --git a/org.eclipse.egit.mylyn-feature/feature.xml b/org.eclipse.egit.mylyn-feature/feature.xml
index 9f528b6709..e34c633b05 100644
--- a/org.eclipse.egit.mylyn-feature/feature.xml
+++ b/org.eclipse.egit.mylyn-feature/feature.xml
@@ -2,7 +2,7 @@
<feature
id="org.eclipse.egit.mylyn"
label="%featureName"
- version="5.10.0.qualifier"
+ version="5.11.0.qualifier"
provider-name="%providerName"
plugin="org.eclipse.egit"
license-feature="org.eclipse.license"
@@ -26,7 +26,7 @@
</url>
<requires>
- <import feature="org.eclipse.egit" version="5.10.0" match="equivalent"/>
+ <import feature="org.eclipse.egit" version="5.11.0" match="equivalent"/>
<import feature="org.eclipse.mylyn.team_feature" version="3.20.0" match="greaterOrEqual"/>
</requires>
diff --git a/org.eclipse.egit.mylyn-feature/pom.xml b/org.eclipse.egit.mylyn-feature/pom.xml
index 98683d159a..f400a0934c 100644
--- a/org.eclipse.egit.mylyn-feature/pom.xml
+++ b/org.eclipse.egit.mylyn-feature/pom.xml
@@ -18,7 +18,7 @@
<parent>
<groupId>org.eclipse.egit</groupId>
<artifactId>egit-parent</artifactId>
- <version>5.10.0-SNAPSHOT</version>
+ <version>5.11.0-SNAPSHOT</version>
</parent>
<groupId>org.eclipse.egit.feature</groupId>
diff --git a/org.eclipse.egit.mylyn.ui.test/META-INF/MANIFEST.MF b/org.eclipse.egit.mylyn.ui.test/META-INF/MANIFEST.MF
index c686aab3d3..bbf7518b7c 100644
--- a/org.eclipse.egit.mylyn.ui.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.egit.mylyn.ui.test/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2
Bundle-Name: Git Team Provider Mylyn UI Test Fragment
Automatic-Module-Name: org.eclipse.egit.mylyn.ui.test
Bundle-SymbolicName: org.eclipse.egit.mylyn.ui.test
-Bundle-Version: 5.10.0.qualifier
+Bundle-Version: 5.11.0.qualifier
Fragment-Host: org.eclipse.egit.mylyn.ui
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-Vendor: Eclipse.org
diff --git a/org.eclipse.egit.mylyn.ui.test/pom.xml b/org.eclipse.egit.mylyn.ui.test/pom.xml
index 58572ba3d3..e0287cc610 100644
--- a/org.eclipse.egit.mylyn.ui.test/pom.xml
+++ b/org.eclipse.egit.mylyn.ui.test/pom.xml
@@ -18,7 +18,7 @@
<parent>
<groupId>org.eclipse.egit</groupId>
<artifactId>egit-parent</artifactId>
- <version>5.10.0-SNAPSHOT</version>
+ <version>5.11.0-SNAPSHOT</version>
</parent>
<artifactId>org.eclipse.egit.mylyn.ui.test</artifactId>
diff --git a/org.eclipse.egit.mylyn.ui/META-INF/MANIFEST.MF b/org.eclipse.egit.mylyn.ui/META-INF/MANIFEST.MF
index a845d88f63..1b7b10f341 100644
--- a/org.eclipse.egit.mylyn.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.egit.mylyn.ui/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name
Automatic-Module-Name: org.eclipse.egit.mylyn.ui
Bundle-SymbolicName: org.eclipse.egit.mylyn.ui;singleton:=true
-Bundle-Version: 5.10.0.qualifier
+Bundle-Version: 5.11.0.qualifier
Bundle-Activator: org.eclipse.egit.internal.mylyn.ui.EGitMylynUI
Bundle-Vendor: %Bundle-Vendor
Require-Bundle: org.eclipse.jface;bundle-version="[3.12.0,4.0.0)",
@@ -19,17 +19,17 @@ Require-Bundle: org.eclipse.jface;bundle-version="[3.12.0,4.0.0)",
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ActivationPolicy: lazy
Bundle-Localization: plugin
-Export-Package: org.eclipse.egit.internal.mylyn.ui;version="5.10.0";x-friends:="org.eclipse.egit.ui.test",
- org.eclipse.egit.internal.mylyn.ui.commit;version="5.10.0";x-internal:=true
-Import-Package: org.eclipse.egit.core;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.internal;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.synchronize;version="[5.10.0,5.11.0)",
- org.eclipse.egit.ui;version="[5.10.0,5.11.0)",
- org.eclipse.egit.ui.internal.commit;version="[5.10.0,5.11.0)",
- org.eclipse.egit.ui.internal.staging;version="[5.10.0,5.11.0)",
- org.eclipse.egit.ui.internal.synchronize.model;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.errors;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.lib;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.revwalk;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.transport;version="[5.10.0,5.11.0)",
+Export-Package: org.eclipse.egit.internal.mylyn.ui;version="5.11.0";x-friends:="org.eclipse.egit.ui.test",
+ org.eclipse.egit.internal.mylyn.ui.commit;version="5.11.0";x-internal:=true
+Import-Package: org.eclipse.egit.core;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.internal;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.synchronize;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.ui;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.ui.internal.commit;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.ui.internal.staging;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.ui.internal.synchronize.model;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.errors;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.lib;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.revwalk;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.transport;version="[5.11.0,5.12.0)",
org.eclipse.ui.plugin;bundle-version="[3.108.0,4.0.0)"
diff --git a/org.eclipse.egit.mylyn.ui/pom.xml b/org.eclipse.egit.mylyn.ui/pom.xml
index 9bc236c936..1c73eb3263 100644
--- a/org.eclipse.egit.mylyn.ui/pom.xml
+++ b/org.eclipse.egit.mylyn.ui/pom.xml
@@ -18,7 +18,7 @@
<parent>
<groupId>org.eclipse.egit</groupId>
<artifactId>egit-parent</artifactId>
- <version>5.10.0-SNAPSHOT</version>
+ <version>5.11.0-SNAPSHOT</version>
</parent>
<artifactId>org.eclipse.egit.mylyn.ui</artifactId>
diff --git a/org.eclipse.egit.repository/category.xml b/org.eclipse.egit.repository/category.xml
index 1efb8211da..e6cd2de12e 100644
--- a/org.eclipse.egit.repository/category.xml
+++ b/org.eclipse.egit.repository/category.xml
@@ -39,6 +39,138 @@
<feature url="features/org.eclipse.egit.gitflow.feature_0.0.0.qualifier.jar" id="org.eclipse.egit.gitflow.feature" version="0.0.0">
<category name="EGit.additional"/>
</feature>
+ <bundle id="org.apache.commons.codec">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.apache.commons.codec.source">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="net.i2p.crypto.eddsa">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="net.i2p.crypto.eddsa.source">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.apache.ant">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.apache.ant.source">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.apache.httpcomponents.httpclient">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.apache.httpcomponents.httpclient.source">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.apache.httpcomponents.httpcore">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.apache.httpcomponents.httpcore.source">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.apache.sshd.osgi">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.apache.sshd.osgi.source">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.apache.sshd.sftp">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.apache.sshd.sftp.source">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="com.jcraft.jzlib">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="com.jcraft.jzlib.source">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.slf4j.api">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.slf4j.api.source">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.slf4j.binding.log4j12">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.slf4j.binding.log4j12.source">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.tukaani.xz">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.tukaani.xz.source">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.apache.commons.logging">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.apache.commons.logging.source">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="javaewah">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="javaewah.source">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.bouncycastle.bcpg">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.bouncycastle.bcpg.source">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.bouncycastle.bcpkix">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.bouncycastle.bcpkix.source">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.bouncycastle.bcprov">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.bouncycastle.bcprov.source">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="com.google.gson">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="com.google.gson.source">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="com.jcraft.jsch">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="com.jcraft.jsch.source">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="javax.servlet">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="javax.servlet.source">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.apache.commons.compress">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.apache.commons.compress.source">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.kohsuke.args4j">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.kohsuke.args4j.source">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.apache.log4j">
+ <category name="EGit.dependencies"/>
+ </bundle>
+ <bundle id="org.apache.log4j.source">
+ <category name="EGit.dependencies"/>
+ </bundle>
<category-def name="EGit" label="Git integration for Eclipse">
<description>
Versioning with Git and integration with Gerrit Code Review
@@ -54,4 +186,5 @@
Gitflow support and integration with Task repositories
</description>
</category-def>
+ <category-def name="EGit.dependencies" label="Git integration for Eclipse - dependencies"/>
</site>
diff --git a/org.eclipse.egit.repository/pom.xml b/org.eclipse.egit.repository/pom.xml
index 33e1f37142..9091b8a1ac 100644
--- a/org.eclipse.egit.repository/pom.xml
+++ b/org.eclipse.egit.repository/pom.xml
@@ -20,7 +20,7 @@
<parent>
<groupId>org.eclipse.egit</groupId>
<artifactId>egit-parent</artifactId>
- <version>5.10.0-SNAPSHOT</version>
+ <version>5.11.0-SNAPSHOT</version>
</parent>
<artifactId>org.eclipse.egit.repository</artifactId>
@@ -66,7 +66,7 @@
<site>https://download.eclipse.org/egit/github/updates</site>
<site>https://download.eclipse.org/egit/github/updates-nightly</site>
<site>https://download.eclipse.org/e4/snapshots/org.eclipse.e4.ui</site>
- <site>https://download.eclipse.org/tools/orbit/downloads/drops/S20201118210000/repository</site>
+ <site>https://download.eclipse.org/tools/orbit/downloads/drops/S20210223232630/repository</site>
</associateSites>
</configuration>
</execution>
diff --git a/org.eclipse.egit.source-feature/feature.properties b/org.eclipse.egit.source-feature/feature.properties
index 8813230eb2..86bfae3fab 100644
--- a/org.eclipse.egit.source-feature/feature.properties
+++ b/org.eclipse.egit.source-feature/feature.properties
@@ -1,5 +1,5 @@
###############################################################################
-# Copyright (c) 2000, 2010 IBM Corporation and others.
+# Copyright (c) 2000, 2021 IBM Corporation and others.
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License 2.0
# which accompanies this distribution, and is available at
@@ -22,7 +22,7 @@ Standalone: includes all the necessary bundles.
# "copyright" property - text of the "Feature Update Copyright"
copyright=\
-Copyright (c) 2005, 2020 Shawn Pearce, Robin Rosenberg, et.al.\n\
+Copyright (c) 2005, 2021 Shawn Pearce, Robin Rosenberg, et.al.\n\
All rights reserved. This program and the accompanying materials\n\
are made available under the terms of the Eclipse Public License 2.0\n\
which accompanies this distribution, and is available at\n\
diff --git a/org.eclipse.egit.source-feature/feature.xml b/org.eclipse.egit.source-feature/feature.xml
index c320dad1bf..a2ea233427 100644
--- a/org.eclipse.egit.source-feature/feature.xml
+++ b/org.eclipse.egit.source-feature/feature.xml
@@ -2,7 +2,7 @@
<feature
id="org.eclipse.egit.source"
label="%featureName"
- version="5.10.0.qualifier"
+ version="5.11.0.qualifier"
provider-name="%providerName"
plugin="org.eclipse.egit"
license-feature="org.eclipse.license"
@@ -26,7 +26,7 @@
</url>
<requires>
- <import feature="org.eclipse.egit" version="5.10.0" match="equivalent"/>
+ <import feature="org.eclipse.egit" version="5.11.0" match="equivalent"/>
</requires>
<plugin
diff --git a/org.eclipse.egit.source-feature/pom.xml b/org.eclipse.egit.source-feature/pom.xml
index b92f80c3c8..e58d8c679d 100644
--- a/org.eclipse.egit.source-feature/pom.xml
+++ b/org.eclipse.egit.source-feature/pom.xml
@@ -18,7 +18,7 @@
<parent>
<groupId>org.eclipse.egit</groupId>
<artifactId>egit-parent</artifactId>
- <version>5.10.0-SNAPSHOT</version>
+ <version>5.11.0-SNAPSHOT</version>
</parent>
<groupId>org.eclipse.egit.feature</groupId>
diff --git a/org.eclipse.egit.target/egit-4.10.target b/org.eclipse.egit.target/egit-4.10.target
index 6a5796dc7c..dbebf8ed8e 100644
--- a/org.eclipse.egit.target/egit-4.10.target
+++ b/org.eclipse.egit.target/egit-4.10.target
@@ -1,26 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde?>
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="egit-4.10" sequenceNumber="1605867339">
+<target name="egit-4.10" sequenceNumber="1614634201">
<locations>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="org.eclipse.jetty.client" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.client.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util.source" version="9.4.30.v20200611"/>
- <repository id="jetty-9.4.30" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.30.v20200611/"/>
+ <unit id="org.eclipse.jetty.client" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.client.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax.source" version="9.4.36.v20210114"/>
+ <repository id="jetty-9.4.36" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.36.v20210114/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.license.feature.group" version="0.0.0"/>
@@ -33,8 +35,8 @@
<repository id="swtbot-snapshot" location="https://download.eclipse.org/technology/swtbot/snapshots/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="com.google.gson" version="2.8.2.v20180104-1110"/>
- <unit id="com.google.gson.source" version="2.8.2.v20180104-1110"/>
+ <unit id="com.google.gson" version="2.8.6.v20201231-1626"/>
+ <unit id="com.google.gson.source" version="2.8.6.v20201231-1626"/>
<unit id="com.jcraft.jsch" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jsch.source" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jzlib" version="1.1.1.v201205102305"/>
@@ -62,16 +64,16 @@
<unit id="org.apache.commons.compress.source" version="1.19.0.v20200106-2343"/>
<unit id="org.apache.commons.logging" version="1.2.0.v20180409-1502"/>
<unit id="org.apache.commons.logging.source" version="1.2.0.v20180409-1502"/>
- <unit id="org.apache.httpcomponents.httpclient" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpcore" version="4.4.12.v20200108-1212"/>
- <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.12.v20200108-1212"/>
+ <unit id="org.apache.httpcomponents.httpclient" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore" version="4.4.14.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.14.v20210128-2225"/>
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
- <unit id="org.apache.sshd.osgi" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.osgi.source" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.sftp" version="2.4.0.v20200319-1547"/>
- <unit id="org.apache.sshd.sftp.source" version="2.4.0.v20200319-1547"/>
+ <unit id="org.apache.sshd.osgi" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.osgi.source" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp.source" version="2.6.0.v20210201-2003"/>
<unit id="org.assertj" version="3.14.0.v20200120-1926"/>
<unit id="org.assertj.source" version="3.14.0.v20200120-1926"/>
<unit id="org.bouncycastle.bcpg" version="1.65.0.v20200527-1955"/>
@@ -105,7 +107,7 @@
<unit id="org.slf4j.binding.log4j12.source" version="1.7.30.v20201108-2042"/>
<unit id="org.tukaani.xz" version="1.8.0.v20180207-1613"/>
<unit id="org.tukaani.xz.source" version="1.8.0.v20180207-1613"/>
- <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20201118210000/repository"/>
+ <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20210223232630/repository"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.sdk.ide" version="0.0.0"/>
diff --git a/org.eclipse.egit.target/egit-4.10.tpd b/org.eclipse.egit.target/egit-4.10.tpd
index e5c855b311..29d20a52c0 100644
--- a/org.eclipse.egit.target/egit-4.10.tpd
+++ b/org.eclipse.egit.target/egit-4.10.tpd
@@ -3,5 +3,5 @@ target "egit-4.10" with source configurePhase
include "projects/jetty-9.4.x.tpd"
include "projects/license.tpd"
include "projects/swtbot-snapshot.tpd"
-include "orbit/S20201118210000.tpd"
+include "orbit/S20210223232630.tpd"
include "releasetrain/4.10-2018-12.tpd"
diff --git a/org.eclipse.egit.target/egit-4.11.target b/org.eclipse.egit.target/egit-4.11.target
index cdff7b0b1f..e18b82fc01 100644
--- a/org.eclipse.egit.target/egit-4.11.target
+++ b/org.eclipse.egit.target/egit-4.11.target
@@ -1,26 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde?>
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="egit-4.11" sequenceNumber="1605867339">
+<target name="egit-4.11" sequenceNumber="1614634201">
<locations>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="org.eclipse.jetty.client" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.client.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util.source" version="9.4.30.v20200611"/>
- <repository id="jetty-9.4.30" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.30.v20200611/"/>
+ <unit id="org.eclipse.jetty.client" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.client.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax.source" version="9.4.36.v20210114"/>
+ <repository id="jetty-9.4.36" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.36.v20210114/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.license.feature.group" version="0.0.0"/>
@@ -33,8 +35,8 @@
<repository id="swtbot-snapshot" location="https://download.eclipse.org/technology/swtbot/snapshots/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="com.google.gson" version="2.8.2.v20180104-1110"/>
- <unit id="com.google.gson.source" version="2.8.2.v20180104-1110"/>
+ <unit id="com.google.gson" version="2.8.6.v20201231-1626"/>
+ <unit id="com.google.gson.source" version="2.8.6.v20201231-1626"/>
<unit id="com.jcraft.jsch" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jsch.source" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jzlib" version="1.1.1.v201205102305"/>
@@ -62,16 +64,16 @@
<unit id="org.apache.commons.compress.source" version="1.19.0.v20200106-2343"/>
<unit id="org.apache.commons.logging" version="1.2.0.v20180409-1502"/>
<unit id="org.apache.commons.logging.source" version="1.2.0.v20180409-1502"/>
- <unit id="org.apache.httpcomponents.httpclient" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpcore" version="4.4.12.v20200108-1212"/>
- <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.12.v20200108-1212"/>
+ <unit id="org.apache.httpcomponents.httpclient" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore" version="4.4.14.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.14.v20210128-2225"/>
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
- <unit id="org.apache.sshd.osgi" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.osgi.source" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.sftp" version="2.4.0.v20200319-1547"/>
- <unit id="org.apache.sshd.sftp.source" version="2.4.0.v20200319-1547"/>
+ <unit id="org.apache.sshd.osgi" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.osgi.source" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp.source" version="2.6.0.v20210201-2003"/>
<unit id="org.assertj" version="3.14.0.v20200120-1926"/>
<unit id="org.assertj.source" version="3.14.0.v20200120-1926"/>
<unit id="org.bouncycastle.bcpg" version="1.65.0.v20200527-1955"/>
@@ -105,7 +107,7 @@
<unit id="org.slf4j.binding.log4j12.source" version="1.7.30.v20201108-2042"/>
<unit id="org.tukaani.xz" version="1.8.0.v20180207-1613"/>
<unit id="org.tukaani.xz.source" version="1.8.0.v20180207-1613"/>
- <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20201118210000/repository"/>
+ <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20210223232630/repository"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.sdk.ide" version="0.0.0"/>
diff --git a/org.eclipse.egit.target/egit-4.11.tpd b/org.eclipse.egit.target/egit-4.11.tpd
index 60bcbfd617..b1602ff3f2 100644
--- a/org.eclipse.egit.target/egit-4.11.tpd
+++ b/org.eclipse.egit.target/egit-4.11.tpd
@@ -3,5 +3,5 @@ target "egit-4.11" with source configurePhase
include "projects/jetty-9.4.x.tpd"
include "projects/license.tpd"
include "projects/swtbot-snapshot.tpd"
-include "orbit/S20201118210000.tpd"
+include "orbit/S20210223232630.tpd"
include "releasetrain/4.11-2019-03.tpd"
diff --git a/org.eclipse.egit.target/egit-4.12.target b/org.eclipse.egit.target/egit-4.12.target
index c05a52ad9c..06d18439fa 100644
--- a/org.eclipse.egit.target/egit-4.12.target
+++ b/org.eclipse.egit.target/egit-4.12.target
@@ -1,26 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde?>
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="egit-4.12" sequenceNumber="1605867339">
+<target name="egit-4.12" sequenceNumber="1614634201">
<locations>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="org.eclipse.jetty.client" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.client.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util.source" version="9.4.30.v20200611"/>
- <repository id="jetty-9.4.30" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.30.v20200611/"/>
+ <unit id="org.eclipse.jetty.client" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.client.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax.source" version="9.4.36.v20210114"/>
+ <repository id="jetty-9.4.36" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.36.v20210114/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.license.feature.group" version="0.0.0"/>
@@ -33,8 +35,8 @@
<repository id="swtbot-snapshot" location="https://download.eclipse.org/technology/swtbot/snapshots/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="com.google.gson" version="2.8.2.v20180104-1110"/>
- <unit id="com.google.gson.source" version="2.8.2.v20180104-1110"/>
+ <unit id="com.google.gson" version="2.8.6.v20201231-1626"/>
+ <unit id="com.google.gson.source" version="2.8.6.v20201231-1626"/>
<unit id="com.jcraft.jsch" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jsch.source" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jzlib" version="1.1.1.v201205102305"/>
@@ -62,16 +64,16 @@
<unit id="org.apache.commons.compress.source" version="1.19.0.v20200106-2343"/>
<unit id="org.apache.commons.logging" version="1.2.0.v20180409-1502"/>
<unit id="org.apache.commons.logging.source" version="1.2.0.v20180409-1502"/>
- <unit id="org.apache.httpcomponents.httpclient" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpcore" version="4.4.12.v20200108-1212"/>
- <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.12.v20200108-1212"/>
+ <unit id="org.apache.httpcomponents.httpclient" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore" version="4.4.14.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.14.v20210128-2225"/>
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
- <unit id="org.apache.sshd.osgi" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.osgi.source" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.sftp" version="2.4.0.v20200319-1547"/>
- <unit id="org.apache.sshd.sftp.source" version="2.4.0.v20200319-1547"/>
+ <unit id="org.apache.sshd.osgi" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.osgi.source" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp.source" version="2.6.0.v20210201-2003"/>
<unit id="org.assertj" version="3.14.0.v20200120-1926"/>
<unit id="org.assertj.source" version="3.14.0.v20200120-1926"/>
<unit id="org.bouncycastle.bcpg" version="1.65.0.v20200527-1955"/>
@@ -105,7 +107,7 @@
<unit id="org.slf4j.binding.log4j12.source" version="1.7.30.v20201108-2042"/>
<unit id="org.tukaani.xz" version="1.8.0.v20180207-1613"/>
<unit id="org.tukaani.xz.source" version="1.8.0.v20180207-1613"/>
- <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20201118210000/repository"/>
+ <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20210223232630/repository"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.sdk.ide" version="0.0.0"/>
diff --git a/org.eclipse.egit.target/egit-4.12.tpd b/org.eclipse.egit.target/egit-4.12.tpd
index f3203e2525..817a2e2907 100644
--- a/org.eclipse.egit.target/egit-4.12.tpd
+++ b/org.eclipse.egit.target/egit-4.12.tpd
@@ -3,5 +3,5 @@ target "egit-4.12" with source configurePhase
include "projects/jetty-9.4.x.tpd"
include "projects/license.tpd"
include "projects/swtbot-snapshot.tpd"
-include "orbit/S20201118210000.tpd"
+include "orbit/S20210223232630.tpd"
include "releasetrain/4.12-2019-06.tpd"
diff --git a/org.eclipse.egit.target/egit-4.13.target b/org.eclipse.egit.target/egit-4.13.target
index f49be8235c..55f1ab60fc 100644
--- a/org.eclipse.egit.target/egit-4.13.target
+++ b/org.eclipse.egit.target/egit-4.13.target
@@ -1,26 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde?>
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="egit-4.13" sequenceNumber="1605867339">
+<target name="egit-4.13" sequenceNumber="1614634201">
<locations>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="org.eclipse.jetty.client" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.client.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util.source" version="9.4.30.v20200611"/>
- <repository id="jetty-9.4.30" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.30.v20200611/"/>
+ <unit id="org.eclipse.jetty.client" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.client.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax.source" version="9.4.36.v20210114"/>
+ <repository id="jetty-9.4.36" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.36.v20210114/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.license.feature.group" version="0.0.0"/>
@@ -33,8 +35,8 @@
<repository id="swtbot-snapshot" location="https://download.eclipse.org/technology/swtbot/snapshots/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="com.google.gson" version="2.8.2.v20180104-1110"/>
- <unit id="com.google.gson.source" version="2.8.2.v20180104-1110"/>
+ <unit id="com.google.gson" version="2.8.6.v20201231-1626"/>
+ <unit id="com.google.gson.source" version="2.8.6.v20201231-1626"/>
<unit id="com.jcraft.jsch" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jsch.source" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jzlib" version="1.1.1.v201205102305"/>
@@ -62,16 +64,16 @@
<unit id="org.apache.commons.compress.source" version="1.19.0.v20200106-2343"/>
<unit id="org.apache.commons.logging" version="1.2.0.v20180409-1502"/>
<unit id="org.apache.commons.logging.source" version="1.2.0.v20180409-1502"/>
- <unit id="org.apache.httpcomponents.httpclient" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpcore" version="4.4.12.v20200108-1212"/>
- <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.12.v20200108-1212"/>
+ <unit id="org.apache.httpcomponents.httpclient" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore" version="4.4.14.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.14.v20210128-2225"/>
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
- <unit id="org.apache.sshd.osgi" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.osgi.source" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.sftp" version="2.4.0.v20200319-1547"/>
- <unit id="org.apache.sshd.sftp.source" version="2.4.0.v20200319-1547"/>
+ <unit id="org.apache.sshd.osgi" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.osgi.source" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp.source" version="2.6.0.v20210201-2003"/>
<unit id="org.assertj" version="3.14.0.v20200120-1926"/>
<unit id="org.assertj.source" version="3.14.0.v20200120-1926"/>
<unit id="org.bouncycastle.bcpg" version="1.65.0.v20200527-1955"/>
@@ -105,7 +107,7 @@
<unit id="org.slf4j.binding.log4j12.source" version="1.7.30.v20201108-2042"/>
<unit id="org.tukaani.xz" version="1.8.0.v20180207-1613"/>
<unit id="org.tukaani.xz.source" version="1.8.0.v20180207-1613"/>
- <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20201118210000/repository"/>
+ <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20210223232630/repository"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.sdk.ide" version="0.0.0"/>
diff --git a/org.eclipse.egit.target/egit-4.13.tpd b/org.eclipse.egit.target/egit-4.13.tpd
index 3f4c2ee1b7..7734447a0e 100644
--- a/org.eclipse.egit.target/egit-4.13.tpd
+++ b/org.eclipse.egit.target/egit-4.13.tpd
@@ -3,5 +3,5 @@ target "egit-4.13" with source configurePhase
include "projects/jetty-9.4.x.tpd"
include "projects/license.tpd"
include "projects/swtbot-snapshot.tpd"
-include "orbit/S20201118210000.tpd"
+include "orbit/S20210223232630.tpd"
include "releasetrain/4.13-2019-09.tpd"
diff --git a/org.eclipse.egit.target/egit-4.14.target b/org.eclipse.egit.target/egit-4.14.target
index d423c4ad47..014c8d41c8 100644
--- a/org.eclipse.egit.target/egit-4.14.target
+++ b/org.eclipse.egit.target/egit-4.14.target
@@ -1,26 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde?>
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="egit-4.14" sequenceNumber="1605867339">
+<target name="egit-4.14" sequenceNumber="1614634201">
<locations>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="org.eclipse.jetty.client" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.client.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util.source" version="9.4.30.v20200611"/>
- <repository id="jetty-9.4.30" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.30.v20200611/"/>
+ <unit id="org.eclipse.jetty.client" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.client.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax.source" version="9.4.36.v20210114"/>
+ <repository id="jetty-9.4.36" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.36.v20210114/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.license.feature.group" version="0.0.0"/>
@@ -33,8 +35,8 @@
<repository id="swtbot-snapshot" location="https://download.eclipse.org/technology/swtbot/snapshots/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="com.google.gson" version="2.8.2.v20180104-1110"/>
- <unit id="com.google.gson.source" version="2.8.2.v20180104-1110"/>
+ <unit id="com.google.gson" version="2.8.6.v20201231-1626"/>
+ <unit id="com.google.gson.source" version="2.8.6.v20201231-1626"/>
<unit id="com.jcraft.jsch" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jsch.source" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jzlib" version="1.1.1.v201205102305"/>
@@ -62,16 +64,16 @@
<unit id="org.apache.commons.compress.source" version="1.19.0.v20200106-2343"/>
<unit id="org.apache.commons.logging" version="1.2.0.v20180409-1502"/>
<unit id="org.apache.commons.logging.source" version="1.2.0.v20180409-1502"/>
- <unit id="org.apache.httpcomponents.httpclient" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpcore" version="4.4.12.v20200108-1212"/>
- <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.12.v20200108-1212"/>
+ <unit id="org.apache.httpcomponents.httpclient" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore" version="4.4.14.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.14.v20210128-2225"/>
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
- <unit id="org.apache.sshd.osgi" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.osgi.source" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.sftp" version="2.4.0.v20200319-1547"/>
- <unit id="org.apache.sshd.sftp.source" version="2.4.0.v20200319-1547"/>
+ <unit id="org.apache.sshd.osgi" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.osgi.source" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp.source" version="2.6.0.v20210201-2003"/>
<unit id="org.assertj" version="3.14.0.v20200120-1926"/>
<unit id="org.assertj.source" version="3.14.0.v20200120-1926"/>
<unit id="org.bouncycastle.bcpg" version="1.65.0.v20200527-1955"/>
@@ -105,7 +107,7 @@
<unit id="org.slf4j.binding.log4j12.source" version="1.7.30.v20201108-2042"/>
<unit id="org.tukaani.xz" version="1.8.0.v20180207-1613"/>
<unit id="org.tukaani.xz.source" version="1.8.0.v20180207-1613"/>
- <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20201118210000/repository"/>
+ <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20210223232630/repository"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.sdk.ide" version="0.0.0"/>
diff --git a/org.eclipse.egit.target/egit-4.14.tpd b/org.eclipse.egit.target/egit-4.14.tpd
index b4ea6c3563..0df00402d0 100644
--- a/org.eclipse.egit.target/egit-4.14.tpd
+++ b/org.eclipse.egit.target/egit-4.14.tpd
@@ -3,5 +3,5 @@ target "egit-4.14" with source configurePhase
include "projects/jetty-9.4.x.tpd"
include "projects/license.tpd"
include "projects/swtbot-snapshot.tpd"
-include "orbit/S20201118210000.tpd"
+include "orbit/S20210223232630.tpd"
include "releasetrain/4.14-2019-12.tpd"
diff --git a/org.eclipse.egit.target/egit-4.15.target b/org.eclipse.egit.target/egit-4.15.target
index fcdba31537..ebb10613ad 100644
--- a/org.eclipse.egit.target/egit-4.15.target
+++ b/org.eclipse.egit.target/egit-4.15.target
@@ -1,26 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde?>
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="egit-4.15" sequenceNumber="1605867339">
+<target name="egit-4.15" sequenceNumber="1614634201">
<locations>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="org.eclipse.jetty.client" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.client.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util.source" version="9.4.30.v20200611"/>
- <repository id="jetty-9.4.30" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.30.v20200611/"/>
+ <unit id="org.eclipse.jetty.client" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.client.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax.source" version="9.4.36.v20210114"/>
+ <repository id="jetty-9.4.36" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.36.v20210114/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.license.feature.group" version="0.0.0"/>
@@ -33,8 +35,8 @@
<repository id="swtbot-snapshot" location="https://download.eclipse.org/technology/swtbot/snapshots/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="com.google.gson" version="2.8.2.v20180104-1110"/>
- <unit id="com.google.gson.source" version="2.8.2.v20180104-1110"/>
+ <unit id="com.google.gson" version="2.8.6.v20201231-1626"/>
+ <unit id="com.google.gson.source" version="2.8.6.v20201231-1626"/>
<unit id="com.jcraft.jsch" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jsch.source" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jzlib" version="1.1.1.v201205102305"/>
@@ -62,16 +64,16 @@
<unit id="org.apache.commons.compress.source" version="1.19.0.v20200106-2343"/>
<unit id="org.apache.commons.logging" version="1.2.0.v20180409-1502"/>
<unit id="org.apache.commons.logging.source" version="1.2.0.v20180409-1502"/>
- <unit id="org.apache.httpcomponents.httpclient" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpcore" version="4.4.12.v20200108-1212"/>
- <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.12.v20200108-1212"/>
+ <unit id="org.apache.httpcomponents.httpclient" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore" version="4.4.14.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.14.v20210128-2225"/>
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
- <unit id="org.apache.sshd.osgi" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.osgi.source" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.sftp" version="2.4.0.v20200319-1547"/>
- <unit id="org.apache.sshd.sftp.source" version="2.4.0.v20200319-1547"/>
+ <unit id="org.apache.sshd.osgi" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.osgi.source" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp.source" version="2.6.0.v20210201-2003"/>
<unit id="org.assertj" version="3.14.0.v20200120-1926"/>
<unit id="org.assertj.source" version="3.14.0.v20200120-1926"/>
<unit id="org.bouncycastle.bcpg" version="1.65.0.v20200527-1955"/>
@@ -105,7 +107,7 @@
<unit id="org.slf4j.binding.log4j12.source" version="1.7.30.v20201108-2042"/>
<unit id="org.tukaani.xz" version="1.8.0.v20180207-1613"/>
<unit id="org.tukaani.xz.source" version="1.8.0.v20180207-1613"/>
- <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20201118210000/repository"/>
+ <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20210223232630/repository"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.sdk.ide" version="0.0.0"/>
diff --git a/org.eclipse.egit.target/egit-4.15.tpd b/org.eclipse.egit.target/egit-4.15.tpd
index 38c6f42fcc..8e1dc106a1 100644
--- a/org.eclipse.egit.target/egit-4.15.tpd
+++ b/org.eclipse.egit.target/egit-4.15.tpd
@@ -3,5 +3,5 @@ target "egit-4.15" with source configurePhase
include "projects/jetty-9.4.x.tpd"
include "projects/license.tpd"
include "projects/swtbot-snapshot.tpd"
-include "orbit/S20201118210000.tpd"
+include "orbit/S20210223232630.tpd"
include "releasetrain/4.15-2020-03.tpd"
diff --git a/org.eclipse.egit.target/egit-4.16.target b/org.eclipse.egit.target/egit-4.16.target
index 252e32cac1..b685a2d1f1 100644
--- a/org.eclipse.egit.target/egit-4.16.target
+++ b/org.eclipse.egit.target/egit-4.16.target
@@ -1,26 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde?>
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="egit-4.16-staging" sequenceNumber="1605867339">
+<target name="egit-4.16-staging" sequenceNumber="1614634201">
<locations>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="org.eclipse.jetty.client" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.client.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util.source" version="9.4.30.v20200611"/>
- <repository id="jetty-9.4.30" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.30.v20200611/"/>
+ <unit id="org.eclipse.jetty.client" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.client.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax.source" version="9.4.36.v20210114"/>
+ <repository id="jetty-9.4.36" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.36.v20210114/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.license.feature.group" version="0.0.0"/>
@@ -33,8 +35,8 @@
<repository id="swtbot-snapshot" location="https://download.eclipse.org/technology/swtbot/snapshots/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="com.google.gson" version="2.8.2.v20180104-1110"/>
- <unit id="com.google.gson.source" version="2.8.2.v20180104-1110"/>
+ <unit id="com.google.gson" version="2.8.6.v20201231-1626"/>
+ <unit id="com.google.gson.source" version="2.8.6.v20201231-1626"/>
<unit id="com.jcraft.jsch" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jsch.source" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jzlib" version="1.1.1.v201205102305"/>
@@ -62,16 +64,16 @@
<unit id="org.apache.commons.compress.source" version="1.19.0.v20200106-2343"/>
<unit id="org.apache.commons.logging" version="1.2.0.v20180409-1502"/>
<unit id="org.apache.commons.logging.source" version="1.2.0.v20180409-1502"/>
- <unit id="org.apache.httpcomponents.httpclient" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpcore" version="4.4.12.v20200108-1212"/>
- <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.12.v20200108-1212"/>
+ <unit id="org.apache.httpcomponents.httpclient" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore" version="4.4.14.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.14.v20210128-2225"/>
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
- <unit id="org.apache.sshd.osgi" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.osgi.source" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.sftp" version="2.4.0.v20200319-1547"/>
- <unit id="org.apache.sshd.sftp.source" version="2.4.0.v20200319-1547"/>
+ <unit id="org.apache.sshd.osgi" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.osgi.source" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp.source" version="2.6.0.v20210201-2003"/>
<unit id="org.assertj" version="3.14.0.v20200120-1926"/>
<unit id="org.assertj.source" version="3.14.0.v20200120-1926"/>
<unit id="org.bouncycastle.bcpg" version="1.65.0.v20200527-1955"/>
@@ -105,7 +107,7 @@
<unit id="org.slf4j.binding.log4j12.source" version="1.7.30.v20201108-2042"/>
<unit id="org.tukaani.xz" version="1.8.0.v20180207-1613"/>
<unit id="org.tukaani.xz.source" version="1.8.0.v20180207-1613"/>
- <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20201118210000/repository"/>
+ <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20210223232630/repository"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.sdk.ide" version="0.0.0"/>
diff --git a/org.eclipse.egit.target/egit-4.16.tpd b/org.eclipse.egit.target/egit-4.16.tpd
index 798ca03632..effba93174 100644
--- a/org.eclipse.egit.target/egit-4.16.tpd
+++ b/org.eclipse.egit.target/egit-4.16.tpd
@@ -3,5 +3,5 @@ target "egit-4.16-staging" with source configurePhase
include "projects/jetty-9.4.x.tpd"
include "projects/license.tpd"
include "projects/swtbot-snapshot.tpd"
-include "orbit/S20201118210000.tpd"
+include "orbit/S20210223232630.tpd"
include "releasetrain/4.16-2020-06.tpd"
diff --git a/org.eclipse.egit.target/egit-4.17.target b/org.eclipse.egit.target/egit-4.17.target
index e1c0ae0ce2..0afc457988 100644
--- a/org.eclipse.egit.target/egit-4.17.target
+++ b/org.eclipse.egit.target/egit-4.17.target
@@ -1,26 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde?>
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="egit-4.17" sequenceNumber="1605867339">
+<target name="egit-4.17" sequenceNumber="1614634201">
<locations>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="org.eclipse.jetty.client" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.client.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util.source" version="9.4.30.v20200611"/>
- <repository id="jetty-9.4.30" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.30.v20200611/"/>
+ <unit id="org.eclipse.jetty.client" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.client.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax.source" version="9.4.36.v20210114"/>
+ <repository id="jetty-9.4.36" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.36.v20210114/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.license.feature.group" version="0.0.0"/>
@@ -33,8 +35,8 @@
<repository id="swtbot-snapshot" location="https://download.eclipse.org/technology/swtbot/snapshots/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="com.google.gson" version="2.8.2.v20180104-1110"/>
- <unit id="com.google.gson.source" version="2.8.2.v20180104-1110"/>
+ <unit id="com.google.gson" version="2.8.6.v20201231-1626"/>
+ <unit id="com.google.gson.source" version="2.8.6.v20201231-1626"/>
<unit id="com.jcraft.jsch" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jsch.source" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jzlib" version="1.1.1.v201205102305"/>
@@ -62,16 +64,16 @@
<unit id="org.apache.commons.compress.source" version="1.19.0.v20200106-2343"/>
<unit id="org.apache.commons.logging" version="1.2.0.v20180409-1502"/>
<unit id="org.apache.commons.logging.source" version="1.2.0.v20180409-1502"/>
- <unit id="org.apache.httpcomponents.httpclient" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpcore" version="4.4.12.v20200108-1212"/>
- <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.12.v20200108-1212"/>
+ <unit id="org.apache.httpcomponents.httpclient" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore" version="4.4.14.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.14.v20210128-2225"/>
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
- <unit id="org.apache.sshd.osgi" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.osgi.source" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.sftp" version="2.4.0.v20200319-1547"/>
- <unit id="org.apache.sshd.sftp.source" version="2.4.0.v20200319-1547"/>
+ <unit id="org.apache.sshd.osgi" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.osgi.source" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp.source" version="2.6.0.v20210201-2003"/>
<unit id="org.assertj" version="3.14.0.v20200120-1926"/>
<unit id="org.assertj.source" version="3.14.0.v20200120-1926"/>
<unit id="org.bouncycastle.bcpg" version="1.65.0.v20200527-1955"/>
@@ -105,7 +107,7 @@
<unit id="org.slf4j.binding.log4j12.source" version="1.7.30.v20201108-2042"/>
<unit id="org.tukaani.xz" version="1.8.0.v20180207-1613"/>
<unit id="org.tukaani.xz.source" version="1.8.0.v20180207-1613"/>
- <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20201118210000/repository"/>
+ <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20210223232630/repository"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.sdk.ide" version="0.0.0"/>
diff --git a/org.eclipse.egit.target/egit-4.17.tpd b/org.eclipse.egit.target/egit-4.17.tpd
index 9365d31c00..d8e25edc5a 100644
--- a/org.eclipse.egit.target/egit-4.17.tpd
+++ b/org.eclipse.egit.target/egit-4.17.tpd
@@ -3,5 +3,5 @@ target "egit-4.17" with source configurePhase
include "projects/jetty-9.4.x.tpd"
include "projects/license.tpd"
include "projects/swtbot-snapshot.tpd"
-include "orbit/S20201118210000.tpd"
+include "orbit/S20210223232630.tpd"
include "releasetrain/4.17-2020-09.tpd"
diff --git a/org.eclipse.egit.target/egit-4.18.target b/org.eclipse.egit.target/egit-4.18.target
new file mode 100644
index 0000000000..2bcffd6ccf
--- /dev/null
+++ b/org.eclipse.egit.target/egit-4.18.target
@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?pde?>
+<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
+<target name="egit-4.18" sequenceNumber="1614634201">
+ <locations>
+ <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
+ <unit id="org.eclipse.jetty.client" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.client.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax.source" version="9.4.36.v20210114"/>
+ <repository id="jetty-9.4.36" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.36.v20210114/"/>
+ </location>
+ <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
+ <unit id="org.eclipse.license.feature.group" version="0.0.0"/>
+ <repository id="eclipse-public-license" location="https://download.eclipse.org/cbi/updates/license/2.0.2.v20181016-2210"/>
+ </location>
+ <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
+ <unit id="org.eclipse.swtbot.eclipse.feature.group" version="0.0.0"/>
+ <unit id="org.eclipse.swtbot.feature.group" version="0.0.0"/>
+ <unit id="org.eclipse.swtbot.eclipse.test.junit.feature.group" version="0.0.0"/>
+ <repository id="swtbot-snapshot" location="https://download.eclipse.org/technology/swtbot/snapshots/"/>
+ </location>
+ <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
+ <unit id="com.google.gson" version="2.8.6.v20201231-1626"/>
+ <unit id="com.google.gson.source" version="2.8.6.v20201231-1626"/>
+ <unit id="com.jcraft.jsch" version="0.1.55.v20190404-1902"/>
+ <unit id="com.jcraft.jsch.source" version="0.1.55.v20190404-1902"/>
+ <unit id="com.jcraft.jzlib" version="1.1.1.v201205102305"/>
+ <unit id="com.jcraft.jzlib.source" version="1.1.1.v201205102305"/>
+ <unit id="javaewah" version="1.1.7.v20200107-0831"/>
+ <unit id="javaewah.source" version="1.1.7.v20200107-0831"/>
+ <unit id="javax.activation" version="1.1.0.v201211130549"/>
+ <unit id="javax.activation.source" version="1.1.0.v201211130549"/>
+ <unit id="javax.servlet" version="3.1.0.v201410161800"/>
+ <unit id="javax.servlet.source" version="3.1.0.v201410161800"/>
+ <unit id="javax.xml.bind" version="2.2.0.v201105210648"/>
+ <unit id="javax.xml.bind.source" version="2.2.0.v201105210648"/>
+ <unit id="javax.xml.stream" version="1.0.1.v201004272200"/>
+ <unit id="net.bytebuddy.byte-buddy" version="1.9.0.v20181107-1410"/>
+ <unit id="net.bytebuddy.byte-buddy-agent" version="1.9.0.v20181106-1534"/>
+ <unit id="net.bytebuddy.byte-buddy-agent.source" version="1.9.0.v20181106-1534"/>
+ <unit id="net.bytebuddy.byte-buddy.source" version="1.9.0.v20181107-1410"/>
+ <unit id="net.i2p.crypto.eddsa" version="0.3.0.v20181102-1323"/>
+ <unit id="net.i2p.crypto.eddsa.source" version="0.3.0.v20181102-1323"/>
+ <unit id="org.apache.ant" version="1.10.9.v20201106-1946"/>
+ <unit id="org.apache.ant.source" version="1.10.9.v20201106-1946"/>
+ <unit id="org.apache.commons.codec" version="1.14.0.v20200818-1422"/>
+ <unit id="org.apache.commons.codec.source" version="1.14.0.v20200818-1422"/>
+ <unit id="org.apache.commons.compress" version="1.19.0.v20200106-2343"/>
+ <unit id="org.apache.commons.compress.source" version="1.19.0.v20200106-2343"/>
+ <unit id="org.apache.commons.logging" version="1.2.0.v20180409-1502"/>
+ <unit id="org.apache.commons.logging.source" version="1.2.0.v20180409-1502"/>
+ <unit id="org.apache.httpcomponents.httpclient" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore" version="4.4.14.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.14.v20210128-2225"/>
+ <unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
+ <unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
+ <unit id="org.apache.sshd.osgi" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.osgi.source" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp.source" version="2.6.0.v20210201-2003"/>
+ <unit id="org.assertj" version="3.14.0.v20200120-1926"/>
+ <unit id="org.assertj.source" version="3.14.0.v20200120-1926"/>
+ <unit id="org.bouncycastle.bcpg" version="1.65.0.v20200527-1955"/>
+ <unit id="org.bouncycastle.bcpg.source" version="1.65.0.v20200527-1955"/>
+ <unit id="org.bouncycastle.bcpkix" version="1.65.0.v20200527-1955"/>
+ <unit id="org.bouncycastle.bcpkix.source" version="1.65.0.v20200527-1955"/>
+ <unit id="org.bouncycastle.bcprov" version="1.65.1.v20200529-1514"/>
+ <unit id="org.bouncycastle.bcprov.source" version="1.65.1.v20200529-1514"/>
+ <unit id="org.hamcrest" version="1.1.0.v20090501071000"/>
+ <unit id="org.hamcrest.core" version="1.3.0.v20180420-1519"/>
+ <unit id="org.hamcrest.core.source" version="1.3.0.v20180420-1519"/>
+ <unit id="org.hamcrest.generator" version="1.3.0.v201305210900"/>
+ <unit id="org.hamcrest.generator.source" version="1.3.0.v201305210900"/>
+ <unit id="org.hamcrest.integration" version="1.3.0.v201305210900"/>
+ <unit id="org.hamcrest.integration.source" version="1.3.0.v201305210900"/>
+ <unit id="org.hamcrest.library" version="1.3.0.v20180524-2246"/>
+ <unit id="org.hamcrest.library.source" version="1.3.0.v20180524-2246"/>
+ <unit id="org.hamcrest.text" version="1.1.0.v20090501071000"/>
+ <unit id="org.hamcrest.text.source" version="1.1.0.v20090501071000"/>
+ <unit id="org.junit" version="4.13.0.v20200204-1500"/>
+ <unit id="org.junit.source" version="4.13.0.v20200204-1500"/>
+ <unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/>
+ <unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/>
+ <unit id="org.mockito" version="2.23.0.v20200310-1642"/>
+ <unit id="org.mockito.source" version="2.23.0.v20200310-1642"/>
+ <unit id="org.objenesis" version="2.6.0.v20180420-1519"/>
+ <unit id="org.objenesis.source" version="2.6.0.v20180420-1519"/>
+ <unit id="org.slf4j.api" version="1.7.30.v20200204-2150"/>
+ <unit id="org.slf4j.api.source" version="1.7.30.v20200204-2150"/>
+ <unit id="org.slf4j.binding.log4j12" version="1.7.30.v20201108-2042"/>
+ <unit id="org.slf4j.binding.log4j12.source" version="1.7.30.v20201108-2042"/>
+ <unit id="org.tukaani.xz" version="1.8.0.v20180207-1613"/>
+ <unit id="org.tukaani.xz.source" version="1.8.0.v20180207-1613"/>
+ <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20210223232630/repository"/>
+ </location>
+ <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
+ <unit id="org.eclipse.sdk.ide" version="0.0.0"/>
+ <unit id="org.eclipse.ecf.core.feature.feature.group" version="0.0.0"/>
+ <unit id="org.eclipse.ecf.filetransfer.feature.feature.group" version="0.0.0"/>
+ <unit id="org.eclipse.emf.sdk.feature.group" version="0.0.0"/>
+ <unit id="org.eclipse.equinox.concurrent" version="0.0.0"/>
+ <unit id="org.eclipse.mylyn.ide_feature.feature.group" version="0.0.0"/>
+ <unit id="org.eclipse.mylyn.team_feature.feature.group" version="0.0.0"/>
+ <unit id="org.eclipse.mylyn_feature.feature.group" version="0.0.0"/>
+ <unit id="org.eclipse.mylyn.context_feature.feature.group" version="0.0.0"/>
+ <unit id="org.eclipse.mylyn.bugzilla_feature.feature.group" version="0.0.0"/>
+ <unit id="org.eclipse.tools.layout.spy" version="0.0.0"/>
+ <repository location="https://download.eclipse.org/releases/2020-12/"/>
+ </location>
+ <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
+ <unit id="org.eclipse.mylyn.commons.sdk.feature.group" version="0.0.0"/>
+ <repository location="https://download.eclipse.org/releases/2020-09/"/>
+ </location>
+ <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
+ <unit id="javax.xml" version="0.0.0"/>
+ <unit id="org.apache.lucene.analyzers-common" version="6.1.0.v20161115-1612"/>
+ <unit id="org.apache.lucene.core" version="6.1.0.v20170814-1820"/>
+ <unit id="org.apache.lucene.queryparser" version="6.1.0.v20161115-1612"/>
+ <unit id="org.apache.xerces" version="0.0.0"/>
+ <unit id="org.apache.xml.resolver" version="0.0.0"/>
+ <unit id="org.apache.xml.serializer" version="0.0.0"/>
+ <repository location="https://download.eclipse.org/mylyn/releases/latest"/>
+ </location>
+ </locations>
+</target>
diff --git a/org.eclipse.egit.target/egit-4.18-staging.tpd b/org.eclipse.egit.target/egit-4.18.tpd
index 5c2375a248..44430a8ac8 100644
--- a/org.eclipse.egit.target/egit-4.18-staging.tpd
+++ b/org.eclipse.egit.target/egit-4.18.tpd
@@ -1,7 +1,7 @@
-target "egit-4.18-staging" with source configurePhase
+target "egit-4.18" with source configurePhase
include "projects/jetty-9.4.x.tpd"
include "projects/license.tpd"
include "projects/swtbot-snapshot.tpd"
-include "orbit/S20201118210000.tpd"
+include "orbit/S20210223232630.tpd"
include "releasetrain/4.18-2020-12.tpd"
diff --git a/org.eclipse.egit.target/egit-4.18-staging.target b/org.eclipse.egit.target/egit-4.19-staging.target
index 5255d38bc2..4b8044af67 100644
--- a/org.eclipse.egit.target/egit-4.18-staging.target
+++ b/org.eclipse.egit.target/egit-4.19-staging.target
@@ -1,26 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde?>
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="egit-4.18-staging" sequenceNumber="1605867250">
+<target name="egit-4.19-staging" sequenceNumber="1614634201">
<locations>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="org.eclipse.jetty.client" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.client.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util.source" version="9.4.30.v20200611"/>
- <repository id="jetty-9.4.30" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.30.v20200611/"/>
+ <unit id="org.eclipse.jetty.client" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.client.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax.source" version="9.4.36.v20210114"/>
+ <repository id="jetty-9.4.36" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.36.v20210114/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.license.feature.group" version="0.0.0"/>
@@ -33,8 +35,8 @@
<repository id="swtbot-snapshot" location="https://download.eclipse.org/technology/swtbot/snapshots/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="com.google.gson" version="2.8.2.v20180104-1110"/>
- <unit id="com.google.gson.source" version="2.8.2.v20180104-1110"/>
+ <unit id="com.google.gson" version="2.8.6.v20201231-1626"/>
+ <unit id="com.google.gson.source" version="2.8.6.v20201231-1626"/>
<unit id="com.jcraft.jsch" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jsch.source" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jzlib" version="1.1.1.v201205102305"/>
@@ -62,16 +64,16 @@
<unit id="org.apache.commons.compress.source" version="1.19.0.v20200106-2343"/>
<unit id="org.apache.commons.logging" version="1.2.0.v20180409-1502"/>
<unit id="org.apache.commons.logging.source" version="1.2.0.v20180409-1502"/>
- <unit id="org.apache.httpcomponents.httpclient" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpcore" version="4.4.12.v20200108-1212"/>
- <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.12.v20200108-1212"/>
+ <unit id="org.apache.httpcomponents.httpclient" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore" version="4.4.14.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.14.v20210128-2225"/>
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
- <unit id="org.apache.sshd.osgi" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.osgi.source" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.sftp" version="2.4.0.v20200319-1547"/>
- <unit id="org.apache.sshd.sftp.source" version="2.4.0.v20200319-1547"/>
+ <unit id="org.apache.sshd.osgi" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.osgi.source" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp.source" version="2.6.0.v20210201-2003"/>
<unit id="org.assertj" version="3.14.0.v20200120-1926"/>
<unit id="org.assertj.source" version="3.14.0.v20200120-1926"/>
<unit id="org.bouncycastle.bcpg" version="1.65.0.v20200527-1955"/>
@@ -105,7 +107,7 @@
<unit id="org.slf4j.binding.log4j12.source" version="1.7.30.v20201108-2042"/>
<unit id="org.tukaani.xz" version="1.8.0.v20180207-1613"/>
<unit id="org.tukaani.xz.source" version="1.8.0.v20180207-1613"/>
- <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20201118210000/repository"/>
+ <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20210223232630/repository"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.sdk.ide" version="0.0.0"/>
@@ -113,14 +115,17 @@
<unit id="org.eclipse.ecf.filetransfer.feature.feature.group" version="0.0.0"/>
<unit id="org.eclipse.emf.sdk.feature.group" version="0.0.0"/>
<unit id="org.eclipse.equinox.concurrent" version="0.0.0"/>
- <unit id="org.eclipse.mylyn.commons.sdk.feature.group" version="0.0.0"/>
<unit id="org.eclipse.mylyn.ide_feature.feature.group" version="0.0.0"/>
<unit id="org.eclipse.mylyn.team_feature.feature.group" version="0.0.0"/>
<unit id="org.eclipse.mylyn_feature.feature.group" version="0.0.0"/>
<unit id="org.eclipse.mylyn.context_feature.feature.group" version="0.0.0"/>
<unit id="org.eclipse.mylyn.bugzilla_feature.feature.group" version="0.0.0"/>
<unit id="org.eclipse.tools.layout.spy" version="0.0.0"/>
- <repository location="https://download.eclipse.org/staging/2020-12/"/>
+ <repository location="https://download.eclipse.org/staging/2021-03/"/>
+ </location>
+ <location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
+ <unit id="org.eclipse.mylyn.commons.sdk.feature.group" version="0.0.0"/>
+ <repository location="https://download.eclipse.org/releases/2020-09/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="javax.xml" version="0.0.0"/>
diff --git a/org.eclipse.egit.target/egit-4.19-staging.tpd b/org.eclipse.egit.target/egit-4.19-staging.tpd
new file mode 100644
index 0000000000..09e6c5417e
--- /dev/null
+++ b/org.eclipse.egit.target/egit-4.19-staging.tpd
@@ -0,0 +1,7 @@
+target "egit-4.19-staging" with source configurePhase
+
+include "projects/jetty-9.4.x.tpd"
+include "projects/license.tpd"
+include "projects/swtbot-snapshot.tpd"
+include "orbit/S20210223232630.tpd"
+include "releasetrain/4.19-2021-03.tpd"
diff --git a/org.eclipse.egit.target/egit-4.6.target b/org.eclipse.egit.target/egit-4.6.target
index ed8910c47a..10ab22fdb7 100644
--- a/org.eclipse.egit.target/egit-4.6.target
+++ b/org.eclipse.egit.target/egit-4.6.target
@@ -1,26 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde?>
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="egit-4.6" sequenceNumber="1605867339">
+<target name="egit-4.6" sequenceNumber="1614634197">
<locations>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="org.eclipse.jetty.client" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.client.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util.source" version="9.4.30.v20200611"/>
- <repository id="jetty-9.4.30" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.30.v20200611/"/>
+ <unit id="org.eclipse.jetty.client" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.client.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax.source" version="9.4.36.v20210114"/>
+ <repository id="jetty-9.4.36" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.36.v20210114/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.license.feature.group" version="0.0.0"/>
@@ -33,8 +35,8 @@
<repository id="swtbot-snapshot" location="https://download.eclipse.org/technology/swtbot/snapshots/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="com.google.gson" version="2.8.2.v20180104-1110"/>
- <unit id="com.google.gson.source" version="2.8.2.v20180104-1110"/>
+ <unit id="com.google.gson" version="2.8.6.v20201231-1626"/>
+ <unit id="com.google.gson.source" version="2.8.6.v20201231-1626"/>
<unit id="com.jcraft.jsch" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jsch.source" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jzlib" version="1.1.1.v201205102305"/>
@@ -62,16 +64,16 @@
<unit id="org.apache.commons.compress.source" version="1.19.0.v20200106-2343"/>
<unit id="org.apache.commons.logging" version="1.2.0.v20180409-1502"/>
<unit id="org.apache.commons.logging.source" version="1.2.0.v20180409-1502"/>
- <unit id="org.apache.httpcomponents.httpclient" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpcore" version="4.4.12.v20200108-1212"/>
- <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.12.v20200108-1212"/>
+ <unit id="org.apache.httpcomponents.httpclient" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore" version="4.4.14.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.14.v20210128-2225"/>
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
- <unit id="org.apache.sshd.osgi" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.osgi.source" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.sftp" version="2.4.0.v20200319-1547"/>
- <unit id="org.apache.sshd.sftp.source" version="2.4.0.v20200319-1547"/>
+ <unit id="org.apache.sshd.osgi" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.osgi.source" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp.source" version="2.6.0.v20210201-2003"/>
<unit id="org.assertj" version="3.14.0.v20200120-1926"/>
<unit id="org.assertj.source" version="3.14.0.v20200120-1926"/>
<unit id="org.bouncycastle.bcpg" version="1.65.0.v20200527-1955"/>
@@ -105,7 +107,7 @@
<unit id="org.slf4j.binding.log4j12.source" version="1.7.30.v20201108-2042"/>
<unit id="org.tukaani.xz" version="1.8.0.v20180207-1613"/>
<unit id="org.tukaani.xz.source" version="1.8.0.v20180207-1613"/>
- <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20201118210000/repository"/>
+ <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20210223232630/repository"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.sdk.ide" version="0.0.0"/>
diff --git a/org.eclipse.egit.target/egit-4.6.tpd b/org.eclipse.egit.target/egit-4.6.tpd
index 4e34778bd7..efe44e79e0 100644
--- a/org.eclipse.egit.target/egit-4.6.tpd
+++ b/org.eclipse.egit.target/egit-4.6.tpd
@@ -3,5 +3,5 @@ target "egit-4.6" with source configurePhase
include "projects/jetty-9.4.x.tpd"
include "projects/license.tpd"
include "projects/swtbot-snapshot.tpd"
-include "orbit/S20201118210000.tpd"
+include "orbit/S20210223232630.tpd"
include "releasetrain/4.6-neon.tpd"
diff --git a/org.eclipse.egit.target/egit-4.7.target b/org.eclipse.egit.target/egit-4.7.target
index f60f6c3d88..aef41ae108 100644
--- a/org.eclipse.egit.target/egit-4.7.target
+++ b/org.eclipse.egit.target/egit-4.7.target
@@ -1,26 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde?>
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="egit-4.7" sequenceNumber="1605867339">
+<target name="egit-4.7" sequenceNumber="1614634197">
<locations>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="org.eclipse.jetty.client" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.client.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util.source" version="9.4.30.v20200611"/>
- <repository id="jetty-9.4.30" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.30.v20200611/"/>
+ <unit id="org.eclipse.jetty.client" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.client.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax.source" version="9.4.36.v20210114"/>
+ <repository id="jetty-9.4.36" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.36.v20210114/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.license.feature.group" version="0.0.0"/>
@@ -33,8 +35,8 @@
<repository id="swtbot-snapshot" location="https://download.eclipse.org/technology/swtbot/snapshots/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="com.google.gson" version="2.8.2.v20180104-1110"/>
- <unit id="com.google.gson.source" version="2.8.2.v20180104-1110"/>
+ <unit id="com.google.gson" version="2.8.6.v20201231-1626"/>
+ <unit id="com.google.gson.source" version="2.8.6.v20201231-1626"/>
<unit id="com.jcraft.jsch" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jsch.source" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jzlib" version="1.1.1.v201205102305"/>
@@ -62,16 +64,16 @@
<unit id="org.apache.commons.compress.source" version="1.19.0.v20200106-2343"/>
<unit id="org.apache.commons.logging" version="1.2.0.v20180409-1502"/>
<unit id="org.apache.commons.logging.source" version="1.2.0.v20180409-1502"/>
- <unit id="org.apache.httpcomponents.httpclient" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpcore" version="4.4.12.v20200108-1212"/>
- <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.12.v20200108-1212"/>
+ <unit id="org.apache.httpcomponents.httpclient" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore" version="4.4.14.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.14.v20210128-2225"/>
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
- <unit id="org.apache.sshd.osgi" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.osgi.source" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.sftp" version="2.4.0.v20200319-1547"/>
- <unit id="org.apache.sshd.sftp.source" version="2.4.0.v20200319-1547"/>
+ <unit id="org.apache.sshd.osgi" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.osgi.source" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp.source" version="2.6.0.v20210201-2003"/>
<unit id="org.assertj" version="3.14.0.v20200120-1926"/>
<unit id="org.assertj.source" version="3.14.0.v20200120-1926"/>
<unit id="org.bouncycastle.bcpg" version="1.65.0.v20200527-1955"/>
@@ -105,7 +107,7 @@
<unit id="org.slf4j.binding.log4j12.source" version="1.7.30.v20201108-2042"/>
<unit id="org.tukaani.xz" version="1.8.0.v20180207-1613"/>
<unit id="org.tukaani.xz.source" version="1.8.0.v20180207-1613"/>
- <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20201118210000/repository"/>
+ <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20210223232630/repository"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.sdk.ide" version="0.0.0"/>
diff --git a/org.eclipse.egit.target/egit-4.7.tpd b/org.eclipse.egit.target/egit-4.7.tpd
index 403024a71a..5f1c5334f0 100644
--- a/org.eclipse.egit.target/egit-4.7.tpd
+++ b/org.eclipse.egit.target/egit-4.7.tpd
@@ -3,5 +3,5 @@ target "egit-4.7" with source configurePhase
include "projects/jetty-9.4.x.tpd"
include "projects/license.tpd"
include "projects/swtbot-snapshot.tpd"
-include "orbit/S20201118210000.tpd"
+include "orbit/S20210223232630.tpd"
include "releasetrain/4.7-oxygen.tpd"
diff --git a/org.eclipse.egit.target/egit-4.8.target b/org.eclipse.egit.target/egit-4.8.target
index bf6fde7588..823f23983b 100644
--- a/org.eclipse.egit.target/egit-4.8.target
+++ b/org.eclipse.egit.target/egit-4.8.target
@@ -1,26 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde?>
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="egit-4.8" sequenceNumber="1605867339">
+<target name="egit-4.8" sequenceNumber="1614634197">
<locations>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="org.eclipse.jetty.client" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.client.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util.source" version="9.4.30.v20200611"/>
- <repository id="jetty-9.4.30" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.30.v20200611/"/>
+ <unit id="org.eclipse.jetty.client" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.client.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax.source" version="9.4.36.v20210114"/>
+ <repository id="jetty-9.4.36" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.36.v20210114/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.license.feature.group" version="0.0.0"/>
@@ -33,8 +35,8 @@
<repository id="swtbot-snapshot" location="https://download.eclipse.org/technology/swtbot/snapshots/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="com.google.gson" version="2.8.2.v20180104-1110"/>
- <unit id="com.google.gson.source" version="2.8.2.v20180104-1110"/>
+ <unit id="com.google.gson" version="2.8.6.v20201231-1626"/>
+ <unit id="com.google.gson.source" version="2.8.6.v20201231-1626"/>
<unit id="com.jcraft.jsch" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jsch.source" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jzlib" version="1.1.1.v201205102305"/>
@@ -62,16 +64,16 @@
<unit id="org.apache.commons.compress.source" version="1.19.0.v20200106-2343"/>
<unit id="org.apache.commons.logging" version="1.2.0.v20180409-1502"/>
<unit id="org.apache.commons.logging.source" version="1.2.0.v20180409-1502"/>
- <unit id="org.apache.httpcomponents.httpclient" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpcore" version="4.4.12.v20200108-1212"/>
- <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.12.v20200108-1212"/>
+ <unit id="org.apache.httpcomponents.httpclient" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore" version="4.4.14.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.14.v20210128-2225"/>
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
- <unit id="org.apache.sshd.osgi" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.osgi.source" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.sftp" version="2.4.0.v20200319-1547"/>
- <unit id="org.apache.sshd.sftp.source" version="2.4.0.v20200319-1547"/>
+ <unit id="org.apache.sshd.osgi" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.osgi.source" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp.source" version="2.6.0.v20210201-2003"/>
<unit id="org.assertj" version="3.14.0.v20200120-1926"/>
<unit id="org.assertj.source" version="3.14.0.v20200120-1926"/>
<unit id="org.bouncycastle.bcpg" version="1.65.0.v20200527-1955"/>
@@ -105,7 +107,7 @@
<unit id="org.slf4j.binding.log4j12.source" version="1.7.30.v20201108-2042"/>
<unit id="org.tukaani.xz" version="1.8.0.v20180207-1613"/>
<unit id="org.tukaani.xz.source" version="1.8.0.v20180207-1613"/>
- <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20201118210000/repository"/>
+ <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20210223232630/repository"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.sdk.ide" version="0.0.0"/>
diff --git a/org.eclipse.egit.target/egit-4.8.tpd b/org.eclipse.egit.target/egit-4.8.tpd
index 717363c728..c314ba3851 100644
--- a/org.eclipse.egit.target/egit-4.8.tpd
+++ b/org.eclipse.egit.target/egit-4.8.tpd
@@ -3,5 +3,5 @@ target "egit-4.8" with source configurePhase
include "projects/jetty-9.4.x.tpd"
include "projects/license.tpd"
include "projects/swtbot-snapshot.tpd"
-include "orbit/S20201118210000.tpd"
+include "orbit/S20210223232630.tpd"
include "releasetrain/4.8-photon.tpd"
diff --git a/org.eclipse.egit.target/egit-4.9.target b/org.eclipse.egit.target/egit-4.9.target
index 70f91f347d..9bccc38d20 100644
--- a/org.eclipse.egit.target/egit-4.9.target
+++ b/org.eclipse.egit.target/egit-4.9.target
@@ -1,26 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde?>
<!-- generated with https://github.com/eclipse-cbi/targetplatform-dsl -->
-<target name="egit-4.9" sequenceNumber="1605867339">
+<target name="egit-4.9" sequenceNumber="1614634201">
<locations>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="org.eclipse.jetty.client" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.client.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.continuation.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.http.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.io.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.security.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.server.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.servlet.source" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util" version="9.4.30.v20200611"/>
- <unit id="org.eclipse.jetty.util.source" version="9.4.30.v20200611"/>
- <repository id="jetty-9.4.30" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.30.v20200611/"/>
+ <unit id="org.eclipse.jetty.client" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.client.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.continuation.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.http.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.io.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.security.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.server.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.servlet.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.source" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax" version="9.4.36.v20210114"/>
+ <unit id="org.eclipse.jetty.util.ajax.source" version="9.4.36.v20210114"/>
+ <repository id="jetty-9.4.36" location="https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.36.v20210114/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.license.feature.group" version="0.0.0"/>
@@ -33,8 +35,8 @@
<repository id="swtbot-snapshot" location="https://download.eclipse.org/technology/swtbot/snapshots/"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
- <unit id="com.google.gson" version="2.8.2.v20180104-1110"/>
- <unit id="com.google.gson.source" version="2.8.2.v20180104-1110"/>
+ <unit id="com.google.gson" version="2.8.6.v20201231-1626"/>
+ <unit id="com.google.gson.source" version="2.8.6.v20201231-1626"/>
<unit id="com.jcraft.jsch" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jsch.source" version="0.1.55.v20190404-1902"/>
<unit id="com.jcraft.jzlib" version="1.1.1.v201205102305"/>
@@ -62,16 +64,16 @@
<unit id="org.apache.commons.compress.source" version="1.19.0.v20200106-2343"/>
<unit id="org.apache.commons.logging" version="1.2.0.v20180409-1502"/>
<unit id="org.apache.commons.logging.source" version="1.2.0.v20180409-1502"/>
- <unit id="org.apache.httpcomponents.httpclient" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.10.v20200830-2311"/>
- <unit id="org.apache.httpcomponents.httpcore" version="4.4.12.v20200108-1212"/>
- <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.12.v20200108-1212"/>
+ <unit id="org.apache.httpcomponents.httpclient" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpclient.source" version="4.5.13.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore" version="4.4.14.v20210128-2225"/>
+ <unit id="org.apache.httpcomponents.httpcore.source" version="4.4.14.v20210128-2225"/>
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/>
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/>
- <unit id="org.apache.sshd.osgi" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.osgi.source" version="2.4.0.v20200318-1614"/>
- <unit id="org.apache.sshd.sftp" version="2.4.0.v20200319-1547"/>
- <unit id="org.apache.sshd.sftp.source" version="2.4.0.v20200319-1547"/>
+ <unit id="org.apache.sshd.osgi" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.osgi.source" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp" version="2.6.0.v20210201-2003"/>
+ <unit id="org.apache.sshd.sftp.source" version="2.6.0.v20210201-2003"/>
<unit id="org.assertj" version="3.14.0.v20200120-1926"/>
<unit id="org.assertj.source" version="3.14.0.v20200120-1926"/>
<unit id="org.bouncycastle.bcpg" version="1.65.0.v20200527-1955"/>
@@ -105,7 +107,7 @@
<unit id="org.slf4j.binding.log4j12.source" version="1.7.30.v20201108-2042"/>
<unit id="org.tukaani.xz" version="1.8.0.v20180207-1613"/>
<unit id="org.tukaani.xz.source" version="1.8.0.v20180207-1613"/>
- <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20201118210000/repository"/>
+ <repository location="https://download.eclipse.org/tools/orbit/downloads/drops/S20210223232630/repository"/>
</location>
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit">
<unit id="org.eclipse.sdk.ide" version="0.0.0"/>
diff --git a/org.eclipse.egit.target/egit-4.9.tpd b/org.eclipse.egit.target/egit-4.9.tpd
index 1466d2724c..4a7ac03fd4 100644
--- a/org.eclipse.egit.target/egit-4.9.tpd
+++ b/org.eclipse.egit.target/egit-4.9.tpd
@@ -3,5 +3,5 @@ target "egit-4.9" with source configurePhase
include "projects/jetty-9.4.x.tpd"
include "projects/license.tpd"
include "projects/swtbot-snapshot.tpd"
-include "orbit/S20201118210000.tpd"
+include "orbit/S20210223232630.tpd"
include "releasetrain/4.9-2018-09.tpd"
diff --git a/org.eclipse.egit.target/orbit/S20201118210000.tpd b/org.eclipse.egit.target/orbit/R20201130205003-2020-12.tpd
index 69fc19ef9c..c54942d330 100644
--- a/org.eclipse.egit.target/orbit/S20201118210000.tpd
+++ b/org.eclipse.egit.target/orbit/R20201130205003-2020-12.tpd
@@ -1,7 +1,7 @@
-target "S20201118210000" with source configurePhase
+target "R20201130205003-2020-12" with source configurePhase
// see https://download.eclipse.org/tools/orbit/downloads/
-location "https://download.eclipse.org/tools/orbit/downloads/drops/S20201118210000/repository" {
+location "https://download.eclipse.org/tools/orbit/downloads/drops/R20201130205003/repository" {
com.google.gson [2.8.2.v20180104-1110,2.8.2.v20180104-1110]
com.google.gson.source [2.8.2.v20180104-1110,2.8.2.v20180104-1110]
com.jcraft.jsch [0.1.55.v20190404-1902,0.1.55.v20190404-1902]
diff --git a/org.eclipse.egit.target/orbit/S20210223232630.tpd b/org.eclipse.egit.target/orbit/S20210223232630.tpd
new file mode 100644
index 0000000000..07fa3a083c
--- /dev/null
+++ b/org.eclipse.egit.target/orbit/S20210223232630.tpd
@@ -0,0 +1,77 @@
+target "S20210223232630" with source configurePhase
+// see https://download.eclipse.org/tools/orbit/downloads/
+
+location "https://download.eclipse.org/tools/orbit/downloads/drops/S20210223232630/repository" {
+ com.google.gson [2.8.6.v20201231-1626,2.8.6.v20201231-1626]
+ com.google.gson.source [2.8.6.v20201231-1626,2.8.6.v20201231-1626]
+ com.jcraft.jsch [0.1.55.v20190404-1902,0.1.55.v20190404-1902]
+ com.jcraft.jsch.source [0.1.55.v20190404-1902,0.1.55.v20190404-1902]
+ com.jcraft.jzlib [1.1.1.v201205102305,1.1.1.v201205102305]
+ com.jcraft.jzlib.source [1.1.1.v201205102305,1.1.1.v201205102305]
+ javaewah [1.1.7.v20200107-0831,1.1.7.v20200107-0831]
+ javaewah.source [1.1.7.v20200107-0831,1.1.7.v20200107-0831]
+ javax.activation [1.1.0.v201211130549,1.1.0.v201211130549]
+ javax.activation.source [1.1.0.v201211130549,1.1.0.v201211130549]
+ javax.servlet [3.1.0.v201410161800,3.1.0.v201410161800]
+ javax.servlet.source [3.1.0.v201410161800,3.1.0.v201410161800]
+ javax.xml.bind [2.2.0.v201105210648,2.2.0.v201105210648]
+ javax.xml.bind.source [2.2.0.v201105210648,2.2.0.v201105210648]
+ javax.xml.stream [1.0.1.v201004272200,1.0.1.v201004272200]
+ net.bytebuddy.byte-buddy [1.9.0.v20181107-1410,1.9.0.v20181107-1410]
+ net.bytebuddy.byte-buddy-agent [1.9.0.v20181106-1534,1.9.0.v20181106-1534]
+ net.bytebuddy.byte-buddy-agent.source [1.9.0.v20181106-1534,1.9.0.v20181106-1534]
+ net.bytebuddy.byte-buddy.source [1.9.0.v20181107-1410,1.9.0.v20181107-1410]
+ net.i2p.crypto.eddsa [0.3.0.v20181102-1323,0.3.0.v20181102-1323]
+ net.i2p.crypto.eddsa.source [0.3.0.v20181102-1323,0.3.0.v20181102-1323]
+ org.apache.ant [1.10.9.v20201106-1946,1.10.9.v20201106-1946]
+ org.apache.ant.source [1.10.9.v20201106-1946,1.10.9.v20201106-1946]
+ org.apache.commons.codec [1.14.0.v20200818-1422,1.14.0.v20200818-1422]
+ org.apache.commons.codec.source [1.14.0.v20200818-1422,1.14.0.v20200818-1422]
+ org.apache.commons.compress [1.19.0.v20200106-2343,1.19.0.v20200106-2343]
+ org.apache.commons.compress.source [1.19.0.v20200106-2343,1.19.0.v20200106-2343]
+ org.apache.commons.logging [1.2.0.v20180409-1502,1.2.0.v20180409-1502]
+ org.apache.commons.logging.source [1.2.0.v20180409-1502,1.2.0.v20180409-1502]
+ org.apache.httpcomponents.httpclient [4.5.13.v20210128-2225,4.5.13.v20210128-2225]
+ org.apache.httpcomponents.httpclient.source [4.5.13.v20210128-2225,4.5.13.v20210128-2225]
+ org.apache.httpcomponents.httpcore [4.4.14.v20210128-2225,4.4.14.v20210128-2225]
+ org.apache.httpcomponents.httpcore.source [4.4.14.v20210128-2225,4.4.14.v20210128-2225]
+ org.apache.log4j [1.2.15.v201012070815,1.2.15.v201012070815]
+ org.apache.log4j.source [1.2.15.v201012070815,1.2.15.v201012070815]
+ org.apache.sshd.osgi [2.6.0.v20210201-2003,2.6.0.v20210201-2003]
+ org.apache.sshd.osgi.source [2.6.0.v20210201-2003,2.6.0.v20210201-2003]
+ org.apache.sshd.sftp [2.6.0.v20210201-2003,2.6.0.v20210201-2003]
+ org.apache.sshd.sftp.source [2.6.0.v20210201-2003,2.6.0.v20210201-2003]
+ org.assertj [3.14.0.v20200120-1926,3.14.0.v20200120-1926]
+ org.assertj.source [3.14.0.v20200120-1926,3.14.0.v20200120-1926]
+ org.bouncycastle.bcpg [1.65.0.v20200527-1955,1.65.0.v20200527-1955]
+ org.bouncycastle.bcpg.source [1.65.0.v20200527-1955,1.65.0.v20200527-1955]
+ org.bouncycastle.bcpkix [1.65.0.v20200527-1955,1.65.0.v20200527-1955]
+ org.bouncycastle.bcpkix.source [1.65.0.v20200527-1955,1.65.0.v20200527-1955]
+ org.bouncycastle.bcprov [1.65.1.v20200529-1514,1.65.1.v20200529-1514]
+ org.bouncycastle.bcprov.source [1.65.1.v20200529-1514,1.65.1.v20200529-1514]
+ org.hamcrest [1.1.0.v20090501071000,1.1.0.v20090501071000]
+ org.hamcrest.core [1.3.0.v20180420-1519,1.3.0.v20180420-1519]
+ org.hamcrest.core.source [1.3.0.v20180420-1519,1.3.0.v20180420-1519]
+ org.hamcrest.generator [1.3.0.v201305210900,1.3.0.v201305210900]
+ org.hamcrest.generator.source [1.3.0.v201305210900,1.3.0.v201305210900]
+ org.hamcrest.integration [1.3.0.v201305210900,1.3.0.v201305210900]
+ org.hamcrest.integration.source [1.3.0.v201305210900,1.3.0.v201305210900]
+ org.hamcrest.library [1.3.0.v20180524-2246,1.3.0.v20180524-2246]
+ org.hamcrest.library.source [1.3.0.v20180524-2246,1.3.0.v20180524-2246]
+ org.hamcrest.text [1.1.0.v20090501071000,1.1.0.v20090501071000]
+ org.hamcrest.text.source [1.1.0.v20090501071000,1.1.0.v20090501071000]
+ org.junit [4.13.0.v20200204-1500,4.13.0.v20200204-1500]
+ org.junit.source [4.13.0.v20200204-1500,4.13.0.v20200204-1500]
+ org.kohsuke.args4j [2.33.0.v20160323-2218,2.33.0.v20160323-2218]
+ org.kohsuke.args4j.source [2.33.0.v20160323-2218,2.33.0.v20160323-2218]
+ org.mockito [2.23.0.v20200310-1642,2.23.0.v20200310-1642]
+ org.mockito.source [2.23.0.v20200310-1642,2.23.0.v20200310-1642]
+ org.objenesis [2.6.0.v20180420-1519,2.6.0.v20180420-1519]
+ org.objenesis.source [2.6.0.v20180420-1519,2.6.0.v20180420-1519]
+ org.slf4j.api [1.7.30.v20200204-2150,1.7.30.v20200204-2150]
+ org.slf4j.api.source [1.7.30.v20200204-2150,1.7.30.v20200204-2150]
+ org.slf4j.binding.log4j12 [1.7.30.v20201108-2042,1.7.30.v20201108-2042]
+ org.slf4j.binding.log4j12.source [1.7.30.v20201108-2042,1.7.30.v20201108-2042]
+ org.tukaani.xz [1.8.0.v20180207-1613,1.8.0.v20180207-1613]
+ org.tukaani.xz.source [1.8.0.v20180207-1613,1.8.0.v20180207-1613]
+}
diff --git a/org.eclipse.egit.target/pom.xml b/org.eclipse.egit.target/pom.xml
index 1cfb3355be..9e5e298bcc 100644
--- a/org.eclipse.egit.target/pom.xml
+++ b/org.eclipse.egit.target/pom.xml
@@ -20,7 +20,7 @@
<parent>
<groupId>org.eclipse.egit</groupId>
<artifactId>egit-parent</artifactId>
- <version>5.10.0-SNAPSHOT</version>
+ <version>5.11.0-SNAPSHOT</version>
</parent>
<build>
diff --git a/org.eclipse.egit.target/projects/jetty-9.4.x.tpd b/org.eclipse.egit.target/projects/jetty-9.4.x.tpd
index 70c426c188..4eec8aa354 100644
--- a/org.eclipse.egit.target/projects/jetty-9.4.x.tpd
+++ b/org.eclipse.egit.target/projects/jetty-9.4.x.tpd
@@ -1,20 +1,22 @@
target "jetty-9.4.x" with source configurePhase
-location jetty-9.4.30 "https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.30.v20200611/" {
- org.eclipse.jetty.client [9.4.30.v20200611,9.4.30.v20200611]
- org.eclipse.jetty.client.source [9.4.30.v20200611,9.4.30.v20200611]
- org.eclipse.jetty.continuation [9.4.30.v20200611,9.4.30.v20200611]
- org.eclipse.jetty.continuation.source [9.4.30.v20200611,9.4.30.v20200611]
- org.eclipse.jetty.http [9.4.30.v20200611,9.4.30.v20200611]
- org.eclipse.jetty.http.source [9.4.30.v20200611,9.4.30.v20200611]
- org.eclipse.jetty.io [9.4.30.v20200611,9.4.30.v20200611]
- org.eclipse.jetty.io.source [9.4.30.v20200611,9.4.30.v20200611]
- org.eclipse.jetty.security [9.4.30.v20200611,9.4.30.v20200611]
- org.eclipse.jetty.security.source [9.4.30.v20200611,9.4.30.v20200611]
- org.eclipse.jetty.server [9.4.30.v20200611,9.4.30.v20200611]
- org.eclipse.jetty.server.source [9.4.30.v20200611,9.4.30.v20200611]
- org.eclipse.jetty.servlet [9.4.30.v20200611,9.4.30.v20200611]
- org.eclipse.jetty.servlet.source [9.4.30.v20200611,9.4.30.v20200611]
- org.eclipse.jetty.util [9.4.30.v20200611,9.4.30.v20200611]
- org.eclipse.jetty.util.source [9.4.30.v20200611,9.4.30.v20200611]
+location jetty-9.4.36 "https://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.4.36.v20210114/" {
+ org.eclipse.jetty.client [9.4.36.v20210114,9.4.36.v20210114]
+ org.eclipse.jetty.client.source [9.4.36.v20210114,9.4.36.v20210114]
+ org.eclipse.jetty.continuation [9.4.36.v20210114,9.4.36.v20210114]
+ org.eclipse.jetty.continuation.source [9.4.36.v20210114,9.4.36.v20210114]
+ org.eclipse.jetty.http [9.4.36.v20210114,9.4.36.v20210114]
+ org.eclipse.jetty.http.source [9.4.36.v20210114,9.4.36.v20210114]
+ org.eclipse.jetty.io [9.4.36.v20210114,9.4.36.v20210114]
+ org.eclipse.jetty.io.source [9.4.36.v20210114,9.4.36.v20210114]
+ org.eclipse.jetty.security [9.4.36.v20210114,9.4.36.v20210114]
+ org.eclipse.jetty.security.source [9.4.36.v20210114,9.4.36.v20210114]
+ org.eclipse.jetty.server [9.4.36.v20210114,9.4.36.v20210114]
+ org.eclipse.jetty.server.source [9.4.36.v20210114,9.4.36.v20210114]
+ org.eclipse.jetty.servlet [9.4.36.v20210114,9.4.36.v20210114]
+ org.eclipse.jetty.servlet.source [9.4.36.v20210114,9.4.36.v20210114]
+ org.eclipse.jetty.util [9.4.36.v20210114,9.4.36.v20210114]
+ org.eclipse.jetty.util.source [9.4.36.v20210114,9.4.36.v20210114]
+ org.eclipse.jetty.util.ajax [9.4.36.v20210114,9.4.36.v20210114]
+ org.eclipse.jetty.util.ajax.source [9.4.36.v20210114,9.4.36.v20210114]
}
diff --git a/org.eclipse.egit.target/releasetrain/4.18-2020-12.tpd b/org.eclipse.egit.target/releasetrain/4.18-2020-12.tpd
index 53302d73c2..8e10091dfc 100644
--- a/org.eclipse.egit.target/releasetrain/4.18-2020-12.tpd
+++ b/org.eclipse.egit.target/releasetrain/4.18-2020-12.tpd
@@ -1,6 +1,6 @@
target "4.18-2020-12" with source configurePhase
-location "https://download.eclipse.org/staging/2020-12/" {
+location "https://download.eclipse.org/releases/2020-12/" {
// Eclipse platform
org.eclipse.sdk.ide lazy
org.eclipse.ecf.core.feature.feature.group lazy
@@ -9,7 +9,8 @@ location "https://download.eclipse.org/staging/2020-12/" {
org.eclipse.equinox.concurrent lazy
// Mylyn integration
- org.eclipse.mylyn.commons.sdk.feature.group lazy
+ // TODO: removed temporarily in 2020-12 staging repo
+ // org.eclipse.mylyn.commons.sdk.feature.group lazy
org.eclipse.mylyn.ide_feature.feature.group lazy
org.eclipse.mylyn.team_feature.feature.group lazy
org.eclipse.mylyn_feature.feature.group lazy
@@ -20,6 +21,11 @@ location "https://download.eclipse.org/staging/2020-12/" {
org.eclipse.tools.layout.spy lazy
}
+location "https://download.eclipse.org/releases/2020-09/" {
+ // TODO: remove this workaround for temporarily removed feature in 2020-12
+ org.eclipse.mylyn.commons.sdk.feature.group lazy
+}
+
location "https://download.eclipse.org/mylyn/releases/latest" {
// some Mylyn dependencies as bundles, to avoid mylyn.trac, which would lead to conflicts
javax.xml lazy
diff --git a/org.eclipse.egit.target/releasetrain/4.19-2021-03.tpd b/org.eclipse.egit.target/releasetrain/4.19-2021-03.tpd
new file mode 100644
index 0000000000..0a398caa79
--- /dev/null
+++ b/org.eclipse.egit.target/releasetrain/4.19-2021-03.tpd
@@ -0,0 +1,38 @@
+target "4.19-2021-03" with source configurePhase
+
+location "https://download.eclipse.org/staging/2021-03/" {
+ // Eclipse platform
+ org.eclipse.sdk.ide lazy
+ org.eclipse.ecf.core.feature.feature.group lazy
+ org.eclipse.ecf.filetransfer.feature.feature.group lazy
+ org.eclipse.emf.sdk.feature.group lazy
+ org.eclipse.equinox.concurrent lazy
+
+ // Mylyn integration
+ // TODO: removed temporarily in 2020-12 staging repo
+ // org.eclipse.mylyn.commons.sdk.feature.group lazy
+ org.eclipse.mylyn.ide_feature.feature.group lazy
+ org.eclipse.mylyn.team_feature.feature.group lazy
+ org.eclipse.mylyn_feature.feature.group lazy
+ org.eclipse.mylyn.context_feature.feature.group lazy
+ org.eclipse.mylyn.bugzilla_feature.feature.group lazy
+
+ // debugging SWT layouts
+ org.eclipse.tools.layout.spy lazy
+}
+
+location "https://download.eclipse.org/releases/2020-09/" {
+ // TODO: remove this workaround for temporarily removed feature in 2020-12
+ org.eclipse.mylyn.commons.sdk.feature.group lazy
+}
+
+location "https://download.eclipse.org/mylyn/releases/latest" {
+ // some Mylyn dependencies as bundles, to avoid mylyn.trac, which would lead to conflicts
+ javax.xml lazy
+ org.apache.lucene.analyzers-common [6.1.0,6.2.0)
+ org.apache.lucene.core [6.1.0,6.2.0)
+ org.apache.lucene.queryparser [6.1.0,6.2.0)
+ org.apache.xerces lazy
+ org.apache.xml.resolver lazy
+ org.apache.xml.serializer lazy
+} \ No newline at end of file
diff --git a/org.eclipse.egit.ui.test/META-INF/MANIFEST.MF b/org.eclipse.egit.ui.test/META-INF/MANIFEST.MF
index e6117aa7fd..1dd83823f6 100644
--- a/org.eclipse.egit.ui.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.egit.ui.test/META-INF/MANIFEST.MF
@@ -5,7 +5,7 @@ Bundle-Vendor: Eclipse.org
Automatic-Module-Name: org.eclipse.egit.ui.test
Bundle-SymbolicName: org.eclipse.egit.ui.test;singleton:=true
Fragment-Host: org.eclipse.egit.ui
-Bundle-Version: 5.10.0.qualifier
+Bundle-Version: 5.11.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Require-Bundle: org.apache.log4j;bundle-version="[1.0.0,2.0.0)",
org.eclipse.core.runtime;bundle-version="[3.12.0,4.0.0)",
@@ -15,24 +15,24 @@ Require-Bundle: org.apache.log4j;bundle-version="[1.0.0,2.0.0)",
org.eclipse.ui;bundle-version="[3.108.0,4.0.0)",
org.hamcrest;bundle-version="[1.1.0,2.0.0)",
org.eclipse.jdt.launching;bundle-version="[3.8.100,4.0.0)",
- org.eclipse.egit.core.junit;bundle-version="[5.10.0,5.11.0)"
+ org.eclipse.egit.core.junit;bundle-version="[5.11.0,5.12.0)"
Import-Package: net.bytebuddy;version="[1.7.9,2.0.0)",
org.eclipse.core.net.proxy;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.egit.gitflow;version="[5.10.0,5.11.0)",
- org.eclipse.egit.gitflow.op;version="[5.10.0,5.11.0)",
- org.eclipse.egit.gitflow.ui;version="[5.10.0,5.11.0)",
- org.eclipse.egit.gitflow.ui.internal;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.api;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.api.errors;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.attributes;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.junit;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.junit.http;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.lib;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.revwalk;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.storage.file;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.transport;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.transport.resolver;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.util;version="[5.10.0,5.11.0)",
+ org.eclipse.egit.gitflow;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.gitflow.op;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.gitflow.ui;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.gitflow.ui.internal;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.api;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.api.errors;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.attributes;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.junit;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.junit.http;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.lib;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.revwalk;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.storage.file;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.transport;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.transport.resolver;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.util;version="[5.11.0,5.12.0)",
org.eclipse.swt.widgets,
org.eclipse.swtbot.eclipse.finder,
org.eclipse.swtbot.eclipse.finder.waits,
diff --git a/org.eclipse.egit.ui.test/pom.xml b/org.eclipse.egit.ui.test/pom.xml
index d30cfc33be..a0b35c20fa 100644
--- a/org.eclipse.egit.ui.test/pom.xml
+++ b/org.eclipse.egit.ui.test/pom.xml
@@ -18,7 +18,7 @@
<parent>
<groupId>org.eclipse.egit</groupId>
<artifactId>egit-parent</artifactId>
- <version>5.10.0-SNAPSHOT</version>
+ <version>5.11.0-SNAPSHOT</version>
</parent>
<artifactId>org.eclipse.egit.ui.test</artifactId>
diff --git a/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/common/LocalRepositoryTestCase.java b/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/common/LocalRepositoryTestCase.java
index 2b2e6f65cf..532ce97366 100644
--- a/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/common/LocalRepositoryTestCase.java
+++ b/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/common/LocalRepositoryTestCase.java
@@ -60,6 +60,7 @@ import org.eclipse.egit.ui.test.ContextMenuHelper;
import org.eclipse.egit.ui.test.Eclipse;
import org.eclipse.egit.ui.test.TestUtil;
import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jgit.junit.MockSystemReader;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.ConfigConstants;
@@ -205,7 +206,7 @@ public abstract class LocalRepositoryTestCase extends EGitTestCase {
FileUtils.mkdir(repoRoot, true);
// make sure the default directory for Repos is not the user home
IEclipsePreferences p = InstanceScope.INSTANCE
- .getNode(Activator.getPluginId());
+ .getNode(Activator.PLUGIN_ID);
p.put(GitCorePreferences.core_defaultRepositoryDir, repoRoot.getPath());
File configFile = File.createTempFile("gitconfigtest", "config");
@@ -255,21 +256,21 @@ public abstract class LocalRepositoryTestCase extends EGitTestCase {
@BeforeClass
public static void beforeClassBase() throws Exception {
+ FS.FileStoreAttributes.setBackground(false);
// suppress auto-ignoring and auto-sharing to avoid interference
IEclipsePreferences corePrefs = InstanceScope.INSTANCE
- .getNode(org.eclipse.egit.core.Activator.getPluginId());
+ .getNode(org.eclipse.egit.core.Activator.PLUGIN_ID);
corePrefs.putBoolean(
GitCorePreferences.core_autoIgnoreDerivedResources, false);
corePrefs.putBoolean(GitCorePreferences.core_autoShareProjects, false);
+ IPreferenceStore uiPrefs = org.eclipse.egit.ui.Activator.getDefault()
+ .getPreferenceStore();
// suppress the configuration dialog
- org.eclipse.egit.ui.Activator.getDefault().getPreferenceStore()
- .setValue(UIPreferences.SHOW_INITIAL_CONFIG_DIALOG, false);
+ uiPrefs.setValue(UIPreferences.SHOW_INITIAL_CONFIG_DIALOG, false);
// suppress the detached head warning dialog
- org.eclipse.egit.ui.Activator
- .getDefault()
- .getPreferenceStore()
- .setValue(UIPreferences.SHOW_DETACHED_HEAD_WARNING,
- false);
+ uiPrefs.setValue(UIPreferences.SHOW_DETACHED_HEAD_WARNING, false);
+ // suppress checking for external changes to git repositories
+ uiPrefs.setValue(UIPreferences.REFRESH_INDEX_INTERVAL, 0);
closeGitViews();
}
@@ -279,9 +280,8 @@ public abstract class LocalRepositoryTestCase extends EGitTestCase {
if (tempDir.toString().startsWith("/home") && tempDir.exists()) {
// see bug 440182: if test has left opened file streams on NFS
// mounted directories "delete" will fail because the directory
- // would contain "stolen NFS file handles"
- // (something like .nfs* files)
- // so the "first round" of delete can ignore failures.
+ // would contain "stolen NFS file handles" (something like .nfs*
+ // files) so the "first round" of delete can ignore failures.
FileUtils.delete(tempDir, FileUtils.IGNORE_ERRORS
| FileUtils.RECURSIVE | FileUtils.RETRY);
}
diff --git a/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/internal/commit/DiffEditorOutlinePageSortingTest.java b/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/internal/commit/DiffEditorOutlinePageSortingTest.java
new file mode 100644
index 0000000000..2958a553ad
--- /dev/null
+++ b/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/internal/commit/DiffEditorOutlinePageSortingTest.java
@@ -0,0 +1,23 @@
+package org.eclipse.egit.ui.internal.commit;
+
+import static org.junit.Assert.assertArrayEquals;
+
+import java.util.Arrays;
+
+import org.junit.Test;
+
+public class DiffEditorOutlinePageSortingTest {
+
+ @Test
+ public void testSort1() {
+ String[] input = { "/", "org.eclipse.egit", "org.eclipse.egit.core",
+ "org.eclipse.egit-feature", "org.eclipse.egit/META-INF",
+ "org.eclipse.egit.core/META-INF" };
+ String[] expected = { "/", "org.eclipse.egit",
+ "org.eclipse.egit/META-INF", "org.eclipse.egit-feature",
+ "org.eclipse.egit.core", "org.eclipse.egit.core/META-INF" };
+ Arrays.sort(input, DiffEditorOutlinePage.CMP);
+ assertArrayEquals(expected, input);
+ }
+
+}
diff --git a/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/test/team/actions/BranchAndResetActionTest.java b/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/test/team/actions/BranchAndResetActionTest.java
index 245d49ad3c..0b6a368f36 100644
--- a/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/test/team/actions/BranchAndResetActionTest.java
+++ b/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/test/team/actions/BranchAndResetActionTest.java
@@ -46,10 +46,8 @@ import org.eclipse.egit.ui.test.TestUtil;
import org.eclipse.jface.bindings.keys.KeyStroke;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.TagBuilder;
import org.eclipse.jgit.util.FileUtils;
import org.eclipse.jgit.util.RawParseUtils;
import org.eclipse.swt.graphics.Image;
@@ -86,13 +84,12 @@ public class BranchAndResetActionTest extends LocalRepositoryTestCase {
repositoryFile = createProjectAndCommitToRepository();
Repository repo = lookupRepository(repositoryFile);
- TagBuilder tag = new TagBuilder();
- tag.setTag("SomeTag");
- tag.setTagger(RawParseUtils.parsePersonIdent(TestUtil.TESTAUTHOR));
- tag.setMessage("I'm just a little tag");
- tag.setObjectId(repo.resolve(repo.getFullBranch()),
- Constants.OBJ_COMMIT);
- TagOperation top = new TagOperation(repo, tag, false);
+ TagOperation top = new TagOperation(repo)
+ .setAnnotated(true)
+ .setName("SomeTag")
+ .setTagger(RawParseUtils.parsePersonIdent(TestUtil.TESTAUTHOR))
+ .setMessage("I'm just a little tag")
+ .setTarget(repo.parseCommit(repo.resolve(repo.getFullBranch())));
top.execute(null);
touchAndSubmit(null);
diff --git a/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/test/team/actions/CompareActionsTest.java b/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/test/team/actions/CompareActionsTest.java
index 79a82907e7..77bde709aa 100644
--- a/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/test/team/actions/CompareActionsTest.java
+++ b/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/test/team/actions/CompareActionsTest.java
@@ -40,11 +40,9 @@ import org.eclipse.egit.ui.test.JobJoiner;
import org.eclipse.egit.ui.test.TestUtil;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.ResetCommand.ResetType;
-import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.TagBuilder;
import org.eclipse.jgit.util.RawParseUtils;
import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
import org.eclipse.swtbot.swt.finder.waits.Conditions;
@@ -80,14 +78,13 @@ public class CompareActionsTest extends LocalRepositoryTestCase {
disablePerspectiveSwitchPrompt();
setEnabledModelProvider(ModelProvider.RESOURCE_MODEL_PROVIDER_ID);
- TagBuilder tag = new TagBuilder();
- tag.setTag("SomeTag");
- tag.setTagger(RawParseUtils.parsePersonIdent(TestUtil.TESTAUTHOR));
- tag.setMessage("I'm just a little tag");
- tag.setObjectId(repo.resolve(repo.getFullBranch()),
- Constants.OBJ_COMMIT);
- commitOfTag = tag.getObjectId();
- TagOperation top = new TagOperation(repo, tag, false);
+ TagOperation top = new TagOperation(repo)
+ .setAnnotated(true)
+ .setName("SomeTag")
+ .setTagger(RawParseUtils.parsePersonIdent(TestUtil.TESTAUTHOR))
+ .setMessage("I'm just a little tag")
+ .setTarget(repo.parseCommit(repo.resolve(repo.getFullBranch())));
+ commitOfTag = top.getTarget();
top.execute(null);
touchAndSubmit(null);
diff --git a/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/test/team/actions/TagActionTest.java b/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/test/team/actions/TagActionTest.java
index 889bb83f21..2a6e86d907 100644
--- a/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/test/team/actions/TagActionTest.java
+++ b/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/test/team/actions/TagActionTest.java
@@ -15,20 +15,20 @@ package org.eclipse.egit.ui.test.team.actions;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import java.io.File;
-import org.eclipse.egit.core.op.TagOperation;
import org.eclipse.egit.ui.JobFamilies;
import org.eclipse.egit.ui.common.LocalRepositoryTestCase;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.test.ContextMenuHelper;
import org.eclipse.egit.ui.test.TestUtil;
+import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.TagBuilder;
import org.eclipse.jgit.revwalk.RevTag;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.util.RawParseUtils;
@@ -60,24 +60,25 @@ public class TagActionTest extends LocalRepositoryTestCase {
Repository repo = lookupRepository(repositoryFile);
someTagCommit = repo.exactRef(Constants.HEAD).getObjectId();
- TagBuilder tag = new TagBuilder();
- tag.setTag("SomeTag");
- tag.setTagger(RawParseUtils.parsePersonIdent(TestUtil.TESTAUTHOR));
- tag.setMessage("I'm just a little tag");
- tag.setObjectId(someTagCommit, Constants.OBJ_COMMIT);
- TagOperation top = new TagOperation(repo, tag, false, true);
- top.execute(null);
+ try (Git git = new Git(repo)) {
+ git.tag()
+ .setName("SomeTag")
+ .setTagger(RawParseUtils.parsePersonIdent(TestUtil.TESTAUTHOR))
+ .setMessage("I'm just a little tag")
+ .setObjectId(repo.parseCommit(someTagCommit))
+ .setSigned(false)
+ .call();
- touchAndSubmit(null);
-
- someLightTagCommit = repo.exactRef(Constants.HEAD).getObjectId();
- tag = new TagBuilder();
- tag.setTag("SomeLightTag");
- tag.setTagger(RawParseUtils.parsePersonIdent(TestUtil.TESTAUTHOR));
- tag.setObjectId(someLightTagCommit, Constants.OBJ_COMMIT);
- top = new TagOperation(repo, tag, false, false);
- top.execute(null);
+ touchAndSubmit(null);
+ someLightTagCommit = repo.exactRef(Constants.HEAD).getObjectId();
+ git.tag()
+ .setAnnotated(false)
+ .setName("SomeLightTag")
+ .setObjectId(repo.parseCommit(someLightTagCommit))
+ .setSigned(false)
+ .call();
+ }
touchAndSubmit(null);
headCommit = repo.exactRef(Constants.HEAD).getObjectId();
}
@@ -231,6 +232,23 @@ public class TagActionTest extends LocalRepositoryTestCase {
}
@Test
+ public void testForceOverwriteLightWeightTagWithTextInput()
+ throws Exception {
+ assertIsLightweight("SomeLightTag", someLightTagCommit);
+ SWTBotShell tagDialog = openTagDialog();
+ tagDialog.bot().textWithLabel(UIText.CreateTagDialog_tagName)
+ .setText("SomeLightTag");
+ assertFalse("Ok should be disabled", tagDialog.bot()
+ .button(UIText.CreateTagDialog_CreateTagButton).isEnabled());
+ assertTrue("Overwrite checkbox should be enabled", tagDialog.bot()
+ .checkBox(UIText.CreateTagDialog_overwriteTag).isEnabled());
+ tagDialog.bot().checkBox(UIText.CreateTagDialog_overwriteTag).click();
+ tagDialog.bot().button(UIText.CreateTagDialog_CreateTagButton).click();
+ TestUtil.joinJobs(JobFamilies.TAG);
+ assertIsLightweight("SomeLightTag", headCommit);
+ }
+
+ @Test
public void testConvertLightWeightIntoAnnotatedTag() throws Exception {
assertIsLightweight("SomeLightTag", someLightTagCommit);
diff --git a/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/test/trace/TraceConfigurationDialogTest.java b/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/test/trace/TraceConfigurationDialogTest.java
index 5f7da3baae..a4d806830e 100644
--- a/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/test/trace/TraceConfigurationDialogTest.java
+++ b/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/test/trace/TraceConfigurationDialogTest.java
@@ -15,10 +15,10 @@ package org.eclipse.egit.ui.test.trace;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.common.EGitTestCase;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.internal.dialogs.GitTraceConfigurationDialog;
+import org.eclipse.egit.ui.internal.trace.GitTraceLocation;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
@@ -45,13 +45,13 @@ public class TraceConfigurationDialogTest {
public static void beforeClass() throws Exception {
EGitTestCase.closeWelcomePage();
// make sure tracing is off globally
- Activator.getDefault().getDebugOptions().setDebugEnabled(false);
+ GitTraceLocation.getOptions().setDebugEnabled(false);
}
@AfterClass
public static void afterClass() throws Exception {
// make sure tracing is off globally
- Activator.getDefault().getDebugOptions().setDebugEnabled(false);
+ GitTraceLocation.getOptions().setDebugEnabled(false);
}
@Before
diff --git a/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/view/repositories/GitRepositoriesViewTestBase.java b/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/view/repositories/GitRepositoriesViewTestBase.java
index 89b98c401a..47f039fcb3 100644
--- a/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/view/repositories/GitRepositoriesViewTestBase.java
+++ b/org.eclipse.egit.ui.test/src/org/eclipse/egit/ui/view/repositories/GitRepositoriesViewTestBase.java
@@ -82,9 +82,9 @@ public abstract class GitRepositoriesViewTestBase extends
*/
@SuppressWarnings("deprecation")
protected static void clearView() {
- InstanceScope.INSTANCE.getNode(Activator.getPluginId())
+ InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID)
.remove(RepositoryUtil.PREFS_DIRECTORIES);
- InstanceScope.INSTANCE.getNode(Activator.getPluginId())
+ InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID)
.remove(RepositoryUtil.PREFS_DIRECTORIES_REL);
}
diff --git a/org.eclipse.egit.ui/.settings/.api_filters b/org.eclipse.egit.ui/.settings/.api_filters
new file mode 100644
index 0000000000..38cb7754ea
--- /dev/null
+++ b/org.eclipse.egit.ui/.settings/.api_filters
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<component id="org.eclipse.egit.ui" version="2">
+ <resource path="src/org/eclipse/egit/ui/internal/properties/GitPropertySheetPage.java" type="org.eclipse.egit.ui.internal.properties.GitPropertySheetPage">
+ <filter id="571473929">
+ <message_arguments>
+ <message_argument value="PropertySheetPage"/>
+ <message_argument value="GitPropertySheetPage"/>
+ </message_arguments>
+ </filter>
+ </resource>
+</component>
diff --git a/org.eclipse.egit.ui/META-INF/MANIFEST.MF b/org.eclipse.egit.ui/META-INF/MANIFEST.MF
index 3541439466..06532636f6 100644
--- a/org.eclipse.egit.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.egit.ui/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name
Automatic-Module-Name: org.eclipse.egit.ui
Bundle-SymbolicName: org.eclipse.egit.ui;singleton:=true
-Bundle-Version: 5.10.0.qualifier
+Bundle-Version: 5.11.0.qualifier
Bundle-Activator: org.eclipse.egit.ui.Activator
Bundle-Vendor: %Bundle-Vendor
Bundle-Localization: plugin
@@ -31,101 +31,109 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.12.0,4.0.0)",
org.eclipse.ui.views;bundle-version="[3.8.100,4.0.0)",
org.eclipse.osgi.services;bundle-version="[3.5.100,4.0.0)",
org.eclipse.e4.core.contexts;bundle-version="[1.5.1,2.0.0)",
+ org.eclipse.e4.core.services;bundle-version="[2.0.0,3.0.0)",
org.eclipse.e4.ui.workbench;bundle-version="[1.4.0,2.0.0)",
org.eclipse.ui.workbench;bundle-version="[3.108.0,4.0.0)"
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Import-Package: org.eclipse.egit.core;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.attributes;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.internal;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.internal.gerrit;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.internal.indexdiff;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.internal.job;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.internal.rebase;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.internal.storage;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.internal.util;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.op;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.project;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.securestorage;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.settings;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.synchronize;version="[5.10.0,5.11.0)",
- org.eclipse.egit.core.synchronize.dto;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.annotations;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.api;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.api.errors;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.attributes;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.blame;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.diff;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.dircache;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.errors;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.events;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.ignore;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.lib;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.merge;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.notes;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.revplot;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.revwalk;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.revwalk.filter;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.storage.file;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.submodule;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.transport;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.treewalk;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.treewalk.filter;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.util;version="[5.10.0,5.11.0)",
- org.eclipse.jgit.util.io;version="[5.10.0,5.11.0)"
-Export-Package: org.eclipse.egit.ui;version="5.10.0";x-friends:="org.eclipse.egit.mylyn.ui,org.eclipse.egit.gitflow.ui,org.eclipse.mylyn.github.ui",
- org.eclipse.egit.ui.history;version="5.10.0",
- org.eclipse.egit.ui.internal;version="5.10.0";x-friends:="org.eclipse.egit.import,org.eclipse.egit.gitflow.ui,org.eclipse.mylyn.github.ui",
- org.eclipse.egit.ui.internal.actions;version="5.10.0";x-friends:="org.eclipse.egit.gitflow.ui",
- org.eclipse.egit.ui.internal.blame;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.branch;version="5.10.0";x-friends:="org.eclipse.egit.gitflow.ui,org.eclipse.mylyn.github.ui",
- org.eclipse.egit.ui.internal.clean;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.clone;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.commands;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.commands.shared;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.commit;version="5.10.0";x-friends:="org.eclipse.egit.mylyn.ui,org.eclipse.egit.gitflow.ui,org.eclipse.mylyn.github.ui",
- org.eclipse.egit.ui.internal.commit.command;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.components;version="5.10.0";x-friends:="org.eclipse.mylyn.github.ui,org.eclipse.egit.gitflow.ui",
- org.eclipse.egit.ui.internal.credentials;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.decorators;version="5.10.0";x-friends:="org.eclipse.egit.gitflow.ui",
- org.eclipse.egit.ui.internal.dialogs;version="5.10.0";x-friends:="org.eclipse.egit.gitflow.ui",
- org.eclipse.egit.ui.internal.expressions;version="5.10.0";x-friends:="org.eclipse.egit.gitflow.ui",
- org.eclipse.egit.ui.internal.factories;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.fetch;version="5.10.0";x-friends:="org.eclipse.mylyn.github.ui",
- org.eclipse.egit.ui.internal.gerrit;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.groups;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.handler;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.history;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.history.command;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.importing;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.jobs;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.merge;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.operations;version="5.10.0";x-friends:="org.eclipse.egit.gitflow.ui",
- org.eclipse.egit.ui.internal.patch;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.preferences;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.provisional.wizards;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.pull;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.push;version="5.10.0";x-friends:="org.eclipse.egit.gitflow.ui",
- org.eclipse.egit.ui.internal.rebase;version="5.10.0";x-friends:="org.eclipse.egit.gitflow.ui",
- org.eclipse.egit.ui.internal.reflog;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.reflog.command;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.repository;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.repository.tree;version="5.10.0";x-friends:="org.eclipse.egit.gitflow.ui",
- org.eclipse.egit.ui.internal.repository.tree.command;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.repository.tree.filter;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.resources;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.revision;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.search;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.selection;version="5.10.0";x-friends:="org.eclipse.egit.gitflow.ui",
- org.eclipse.egit.ui.internal.sharing;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.staging;version="5.10.0";x-friends:="org.eclipse.egit.mylyn.ui",
- org.eclipse.egit.ui.internal.stash;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.submodule;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.synchronize;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.synchronize.action;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.synchronize.compare;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.synchronize.mapping;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.synchronize.model;version="5.10.0";x-friends:="org.eclipse.egit.mylyn.ui",
- org.eclipse.egit.ui.internal.trace;version="5.10.0";x-internal:=true,
- org.eclipse.egit.ui.internal.variables;version="5.10.0";x-internal:=true
-Service-Component: OSGI-INF/org.eclipse.egit.ui.internal.clone.GitCloneDropAdapter.xml
+Import-Package: org.eclipse.egit.core;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.attributes;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.internal;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.internal.gerrit;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.internal.indexdiff;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.internal.job;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.internal.rebase;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.internal.signing;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.internal.storage;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.internal.util;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.op;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.project;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.securestorage;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.settings;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.synchronize;version="[5.11.0,5.12.0)",
+ org.eclipse.egit.core.synchronize.dto;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.annotations;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.api;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.api.errors;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.attributes;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.blame;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.diff;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.dircache;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.errors;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.events;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.ignore;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.lib;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.merge;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.notes;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.revplot;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.revwalk;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.revwalk.filter;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.storage.file;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.submodule;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.transport;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.treewalk;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.treewalk.filter;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.util;version="[5.11.0,5.12.0)",
+ org.eclipse.jgit.util.io;version="[5.11.0,5.12.0)"
+Export-Package: org.eclipse.egit.ui;version="5.11.0";x-friends:="org.eclipse.egit.mylyn.ui,org.eclipse.egit.gitflow.ui,org.eclipse.mylyn.github.ui",
+ org.eclipse.egit.ui.history;version="5.11.0",
+ org.eclipse.egit.ui.internal;version="5.11.0";x-friends:="org.eclipse.egit.import,org.eclipse.egit.gitflow.ui,org.eclipse.mylyn.github.ui",
+ org.eclipse.egit.ui.internal.actions;version="5.11.0";x-friends:="org.eclipse.egit.gitflow.ui",
+ org.eclipse.egit.ui.internal.blame;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.branch;version="5.11.0";x-friends:="org.eclipse.egit.gitflow.ui,org.eclipse.mylyn.github.ui",
+ org.eclipse.egit.ui.internal.clean;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.clone;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.commands;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.commands.shared;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.commit;version="5.11.0";x-friends:="org.eclipse.egit.mylyn.ui,org.eclipse.egit.gitflow.ui,org.eclipse.mylyn.github.ui",
+ org.eclipse.egit.ui.internal.commit.command;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.components;version="5.11.0";x-friends:="org.eclipse.mylyn.github.ui,org.eclipse.egit.gitflow.ui",
+ org.eclipse.egit.ui.internal.credentials;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.decorators;version="5.11.0";x-friends:="org.eclipse.egit.gitflow.ui",
+ org.eclipse.egit.ui.internal.dialogs;version="5.11.0";x-friends:="org.eclipse.egit.gitflow.ui",
+ org.eclipse.egit.ui.internal.expressions;version="5.11.0";x-friends:="org.eclipse.egit.gitflow.ui",
+ org.eclipse.egit.ui.internal.factories;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.fetch;version="5.11.0";x-friends:="org.eclipse.mylyn.github.ui",
+ org.eclipse.egit.ui.internal.gerrit;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.groups;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.handler;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.history;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.history.command;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.importing;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.jobs;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.merge;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.operations;version="5.11.0";x-friends:="org.eclipse.egit.gitflow.ui",
+ org.eclipse.egit.ui.internal.patch;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.preferences;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.properties;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.provisional.wizards;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.pull;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.push;version="5.11.0";x-friends:="org.eclipse.egit.gitflow.ui",
+ org.eclipse.egit.ui.internal.rebase;version="5.11.0";x-friends:="org.eclipse.egit.gitflow.ui",
+ org.eclipse.egit.ui.internal.reflog;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.reflog.command;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.repository;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.repository.tree;version="5.11.0";x-friends:="org.eclipse.egit.gitflow.ui",
+ org.eclipse.egit.ui.internal.repository.tree.command;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.repository.tree.filter;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.resources;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.revision;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.search;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.selection;version="5.11.0";x-friends:="org.eclipse.egit.gitflow.ui",
+ org.eclipse.egit.ui.internal.sharing;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.staging;version="5.11.0";x-friends:="org.eclipse.egit.mylyn.ui",
+ org.eclipse.egit.ui.internal.stash;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.submodule;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.synchronize;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.synchronize.action;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.synchronize.compare;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.synchronize.mapping;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.synchronize.model;version="5.11.0";x-friends:="org.eclipse.egit.mylyn.ui",
+ org.eclipse.egit.ui.internal.trace;version="5.11.0";x-internal:=true,
+ org.eclipse.egit.ui.internal.variables;version="5.11.0";x-internal:=true
+Service-Component: OSGI-INF/org.eclipse.egit.ui.internal.clone.GitCloneDropAdapter.xml,
+ OSGI-INF/org.eclipse.egit.ui.internal.StartEventListener.xml,
+ OSGI-INF/org.eclipse.egit.ui.internal.ApplicationActiveListener.xml,
+ OSGI-INF/org.eclipse.egit.ui.internal.ExternalRepositoryScanner.xml,
+ OSGI-INF/org.eclipse.egit.ui.internal.trace.DebugOptionsHandler.xml,
+ OSGI-INF/org.eclipse.egit.ui.internal.ConfigurationChecker$Checker.xml
diff --git a/org.eclipse.egit.ui/OSGI-INF/org.eclipse.egit.ui.internal.ApplicationActiveListener.xml b/org.eclipse.egit.ui/OSGI-INF/org.eclipse.egit.ui.internal.ApplicationActiveListener.xml
new file mode 100644
index 0000000000..458e1336f7
--- /dev/null
+++ b/org.eclipse.egit.ui/OSGI-INF/org.eclipse.egit.ui.internal.ApplicationActiveListener.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" deactivate="shutDown" name="org.eclipse.egit.ui.internal.ApplicationActiveListener">
+ <property name="event.topics">org/eclipse/e4/ui/LifeCycle/appStartupComplete
+org/eclipse/e4/ui/LifeCycle/appShutdownStarted
+ </property>
+ <service>
+ <provide interface="org.osgi.service.event.EventHandler"/>
+ </service>
+ <implementation class="org.eclipse.egit.ui.internal.ApplicationActiveListener"/>
+</scr:component> \ No newline at end of file
diff --git a/org.eclipse.egit.ui/OSGI-INF/org.eclipse.egit.ui.internal.ConfigurationChecker$Checker.xml b/org.eclipse.egit.ui/OSGI-INF/org.eclipse.egit.ui.internal.ConfigurationChecker$Checker.xml
new file mode 100644
index 0000000000..16c071fe90
--- /dev/null
+++ b/org.eclipse.egit.ui/OSGI-INF/org.eclipse.egit.ui.internal.ConfigurationChecker$Checker.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" deactivate="stop" name="org.eclipse.egit.ui.internal.ConfigurationChecker$Checker">
+ <property name="event.topics" value="org/eclipse/e4/ui/LifeCycle/appStartupComplete"/>
+ <service>
+ <provide interface="org.osgi.service.event.EventHandler"/>
+ </service>
+ <implementation class="org.eclipse.egit.ui.internal.ConfigurationChecker$Checker"/>
+</scr:component> \ No newline at end of file
diff --git a/org.eclipse.egit.ui/OSGI-INF/org.eclipse.egit.ui.internal.ExternalRepositoryScanner.xml b/org.eclipse.egit.ui/OSGI-INF/org.eclipse.egit.ui.internal.ExternalRepositoryScanner.xml
new file mode 100644
index 0000000000..f51440dd4a
--- /dev/null
+++ b/org.eclipse.egit.ui/OSGI-INF/org.eclipse.egit.ui.internal.ExternalRepositoryScanner.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="startUp" deactivate="shutDown" name="org.eclipse.egit.ui.internal.ExternalRepositoryScanner">
+ <property name="event.topics" value="org/eclipse/egit/ui/APPLICATION_ACTIVE"/>
+ <service>
+ <provide interface="org.osgi.service.event.EventHandler"/>
+ </service>
+ <implementation class="org.eclipse.egit.ui.internal.ExternalRepositoryScanner"/>
+</scr:component> \ No newline at end of file
diff --git a/org.eclipse.egit.ui/OSGI-INF/org.eclipse.egit.ui.internal.StartEventListener.xml b/org.eclipse.egit.ui/OSGI-INF/org.eclipse.egit.ui.internal.StartEventListener.xml
new file mode 100644
index 0000000000..8d8f692db9
--- /dev/null
+++ b/org.eclipse.egit.ui/OSGI-INF/org.eclipse.egit.ui.internal.StartEventListener.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" deactivate="shutDown" name="org.eclipse.egit.ui.internal.StartEventListener">
+ <property name="event.topics" value="org/eclipse/e4/ui/LifeCycle/appStartupComplete"/>
+ <service>
+ <provide interface="org.osgi.service.event.EventHandler"/>
+ </service>
+ <implementation class="org.eclipse.egit.ui.internal.StartEventListener"/>
+</scr:component> \ No newline at end of file
diff --git a/org.eclipse.egit.ui/OSGI-INF/org.eclipse.egit.ui.internal.trace.DebugOptionsHandler.xml b/org.eclipse.egit.ui/OSGI-INF/org.eclipse.egit.ui.internal.trace.DebugOptionsHandler.xml
new file mode 100644
index 0000000000..07d9e00b16
--- /dev/null
+++ b/org.eclipse.egit.ui/OSGI-INF/org.eclipse.egit.ui.internal.trace.DebugOptionsHandler.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.egit.ui.internal.trace.DebugOptionsHandler">
+ <property name="listener.symbolic.name" value="org.eclipse.egit.ui"/>
+ <service>
+ <provide interface="org.eclipse.osgi.service.debug.DebugOptionsListener"/>
+ </service>
+ <implementation class="org.eclipse.egit.ui.internal.trace.DebugOptionsHandler"/>
+</scr:component> \ No newline at end of file
diff --git a/org.eclipse.egit.ui/plugin.properties b/org.eclipse.egit.ui/plugin.properties
index bebed97a19..30e2f3850b 100644
--- a/org.eclipse.egit.ui/plugin.properties
+++ b/org.eclipse.egit.ui/plugin.properties
@@ -79,11 +79,11 @@ WindowCachePreferencePage_keywords = git egit window cache
DateFormatPreferencePage_keywords = git egit date format commit time zone
GitDecoratorPreferencePage_keywords = git egit label decoration colors fonts icon
GlobalConfigurationPreferencePage_keywords = git egit configuration user system repository
-CommittingPreferencePage_keywords = git egit committing staging stage untracked track message history signed warning error
+CommittingPreferencePage_keywords = git egit committing staging stage untracked track message history signed warning error signing gpg signature
StagingViewPreferencePage_keywords = git egit staging stage
DialogsPreferencePage_keywords = git egit confirmation dialog configuration rebase checkout detached launch branch clone lfs fetch push log home
SynchronizePreferencePage_keywords = git egit synchronize fetch commit models merge
-HistoryPreferencePage_keywords = git egit history branches tags refs notes rename revision comment date author committer diff first parent
+HistoryPreferencePage_keywords = git egit history branches tags refs notes rename revision comment date author committer diff first parent signing signed signature
HistoryColumnsPreferencePage_keywords = git egit history columns id author committer date
GitActions_label=Git
diff --git a/org.eclipse.egit.ui/plugin.xml b/org.eclipse.egit.ui/plugin.xml
index 39d670fab7..a6118946a5 100644
--- a/org.eclipse.egit.ui/plugin.xml
+++ b/org.eclipse.egit.ui/plugin.xml
@@ -3055,7 +3055,6 @@
<iterate>
<instanceof value="org.eclipse.egit.ui.internal.history.SWTCommit" />
<test property="Git.isSafe" />
- <test property="Git.parentCount" value="1" />
</iterate>
</and>
</activeWhen>
diff --git a/org.eclipse.egit.ui/pom.xml b/org.eclipse.egit.ui/pom.xml
index 594ab549bf..3c72854201 100644
--- a/org.eclipse.egit.ui/pom.xml
+++ b/org.eclipse.egit.ui/pom.xml
@@ -18,7 +18,7 @@
<parent>
<groupId>org.eclipse.egit</groupId>
<artifactId>egit-parent</artifactId>
- <version>5.10.0-SNAPSHOT</version>
+ <version>5.11.0-SNAPSHOT</version>
</parent>
<artifactId>org.eclipse.egit.ui</artifactId>
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/Activator.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/Activator.java
index 6e909515d7..801596a695 100755
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/Activator.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/Activator.java
@@ -5,7 +5,7 @@
* Copyright (C) 2012, Matthias Sohn <matthias.sohn@sap.com>
* Copyright (C) 2015, Philipp Bumann <bumannp@gmail.com>
* Copyright (C) 2016, Dani Megert <daniel_megert@ch.ibm.com>
- * Copyright (C) 2018, Thomas Wolf <thomas.wolf@paranor.ch>
+ * Copyright (C) 2018, 2021 Thomas Wolf <thomas.wolf@paranor.ch>
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -16,70 +16,26 @@
*******************************************************************************/
package org.eclipse.egit.ui;
-import java.io.File;
-import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Dictionary;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubMonitor;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.egit.core.JobFamilies;
-import org.eclipse.egit.core.RepositoryCache;
import org.eclipse.egit.core.RepositoryUtil;
-import org.eclipse.egit.core.internal.ResourceRefreshHandler;
-import org.eclipse.egit.core.internal.job.RuleUtil;
-import org.eclipse.egit.core.project.RepositoryMapping;
-import org.eclipse.egit.ui.internal.ConfigurationChecker;
import org.eclipse.egit.ui.internal.KnownHosts;
-import org.eclipse.egit.ui.internal.RepositoryCacheRule;
-import org.eclipse.egit.ui.internal.UIIcons;
-import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.internal.credentials.EGitCredentialsProvider;
-import org.eclipse.egit.ui.internal.selection.SelectionRepositoryStateCache;
-import org.eclipse.egit.ui.internal.trace.GitTraceLocation;
-import org.eclipse.egit.ui.internal.variables.GitTemplateVariableResolver;
-import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.jface.resource.ResourceManager;
-import org.eclipse.jface.text.templates.ContextTypeRegistry;
-import org.eclipse.jface.text.templates.TemplateContextType;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jgit.events.IndexChangedListener;
-import org.eclipse.jgit.events.ListenerHandle;
-import org.eclipse.jgit.events.WorkingTreeModifiedEvent;
-import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.transport.CredentialsProvider;
-import org.eclipse.jgit.treewalk.FileTreeIterator;
-import org.eclipse.jgit.treewalk.TreeWalk;
-import org.eclipse.jgit.treewalk.filter.PathFilterGroup;
-import org.eclipse.osgi.service.debug.DebugOptions;
-import org.eclipse.osgi.service.debug.DebugOptionsListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWindowListener;
-import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.ui.progress.IProgressService;
-import org.eclipse.ui.progress.WorkbenchJob;
import org.eclipse.ui.statushandlers.StatusManager;
import org.eclipse.ui.themes.ITheme;
import org.osgi.framework.BundleContext;
@@ -87,7 +43,10 @@ import org.osgi.framework.BundleContext;
/**
* This is a plugin singleton mostly controlling logging.
*/
-public class Activator extends AbstractUIPlugin implements DebugOptionsListener {
+public class Activator extends AbstractUIPlugin {
+
+ /** The plug-in ID for the EGit UI. */
+ public static final String PLUGIN_ID = "org.eclipse.egit.ui"; //$NON-NLS-1$
/**
* The one and only instance
@@ -113,13 +72,6 @@ public class Activator extends AbstractUIPlugin implements DebugOptionsListener
}
/**
- * @return the id of the egit ui plugin
- */
- public static String getPluginId() {
- return getDefault().getBundle().getSymbolicName();
- }
-
- /**
* Creates an {@link IStatus} from the parameters. If the throwable is an
* {@link InvocationTargetException}, the status is created from the first
* exception that is either not an InvocationTargetException or that has a
@@ -151,7 +103,7 @@ public class Activator extends AbstractUIPlugin implements DebugOptionsListener
if (exc != null && (message == null || message.isEmpty())) {
message = exc.getLocalizedMessage();
}
- return new Status(severity, getPluginId(), message, exc);
+ return new Status(severity, PLUGIN_ID, message, exc);
}
/**
@@ -314,13 +266,6 @@ public class Activator extends AbstractUIPlugin implements DebugOptionsListener
}
private ResourceManager resourceManager;
- private RepositoryChangeScanner rcs;
-
- private ResourceRefreshJob refreshJob;
- private DebugOptions debugOptions;
-
- private volatile boolean uiIsActive;
- private IWindowListener focusListener;
/**
* Construct the {@link Activator} egit ui plugin singleton instance
@@ -337,171 +282,9 @@ public class Activator extends AbstractUIPlugin implements DebugOptionsListener
@Override
public void start(final BundleContext context) throws Exception {
super.start(context);
- // we want to be notified about debug options changes
- Dictionary<String, String> props = new Hashtable<>(4);
- props.put(DebugOptions.LISTENER_SYMBOLICNAME, context.getBundle()
- .getSymbolicName());
- context.registerService(DebugOptionsListener.class.getName(), this,
- props);
-
- SelectionRepositoryStateCache.INSTANCE.initialize();
- setupRepoChangeScanner();
- setupFocusHandling();
- setupCredentialsProvider();
- ConfigurationChecker.checkConfiguration();
-
- registerTemplateVariableResolvers();
- }
-
- private void setupCredentialsProvider() {
CredentialsProvider.setDefault(new EGitCredentialsProvider());
}
- private void registerTemplateVariableResolvers() {
- if (!hasJavaPlugin()) {
- return;
- }
- WorkbenchJob job = new WorkbenchJob(
- UIText.Activator_setupJdtTemplateResolver) {
-
- @Override
- public IStatus runInUIThread(IProgressMonitor monitor) {
- try {
- final ContextTypeRegistry codeTemplateContextRegistry = JavaPlugin
- .getDefault().getCodeTemplateContextRegistry();
- final Iterator<?> ctIter = codeTemplateContextRegistry
- .contextTypes();
-
- while (ctIter.hasNext()) {
- final TemplateContextType contextType = (TemplateContextType) ctIter
- .next();
- contextType.addResolver(new GitTemplateVariableResolver(
- "git_config", //$NON-NLS-1$
- UIText.GitTemplateVariableResolver_GitConfigDescription));
- }
- } catch (Throwable e) {
- // while catching Throwable is an anti-pattern, we may
- // experience NoClassDefFoundErrors here
- logError("Cannot register git support for Java templates", //$NON-NLS-1$
- e);
- }
- return Status.OK_STATUS;
- }
- };
- job.setSystem(true);
- job.setUser(false);
- job.schedule();
- }
-
- /**
- * @return true if at least one Eclipse window is active
- */
- static boolean isActive() {
- return getDefault().uiIsActive;
- }
-
-
- private void setupFocusHandling() {
- focusListener = new IWindowListener() {
-
- private void updateUiState() {
- Display.getCurrent().asyncExec(new Runnable() {
- @Override
- public void run() {
- boolean wasActive = uiIsActive;
- uiIsActive = Display.getCurrent().getActiveShell() != null;
- if (uiIsActive != wasActive
- && GitTraceLocation.REPOSITORYCHANGESCANNER
- .isActive())
- traceUiIsActive();
- }
-
- private void traceUiIsActive() {
- StringBuilder message = new StringBuilder(
- "workbench is "); //$NON-NLS-1$
- message.append(uiIsActive ? "active" : "inactive"); //$NON-NLS-1$//$NON-NLS-2$
- GitTraceLocation.getTrace().trace(
- GitTraceLocation.REPOSITORYCHANGESCANNER
- .getLocation(), message.toString());
- }
- });
- }
-
- @Override
- public void windowOpened(IWorkbenchWindow window) {
- updateUiState();
- }
-
- @Override
- public void windowDeactivated(IWorkbenchWindow window) {
- updateUiState();
- }
-
- @Override
- public void windowClosed(IWorkbenchWindow window) {
- updateUiState();
- }
-
- @Override
- public void windowActivated(IWorkbenchWindow window) {
- updateUiState();
- // 500: give the UI task a chance to update the active state
- rcs.schedule(500);
- }
- };
- Job job = new Job(UIText.Activator_setupFocusListener) {
- @Override
- protected IStatus run(IProgressMonitor monitor) {
- if (PlatformUI.isWorkbenchRunning()) {
- PlatformUI.getWorkbench().addWindowListener(focusListener);
- registerCoreJobFamilyIcons();
- } else {
- schedule(1000L);
- }
- return Status.OK_STATUS;
- }
-
- /**
- * register progress icons for jobs from core plugin
- */
- private void registerCoreJobFamilyIcons() {
- PlatformUI.getWorkbench().getDisplay()
- .asyncExec(() -> {
- IProgressService service = PlatformUI.getWorkbench()
- .getProgressService();
-
- service.registerIconForFamily(UIIcons.PULL,
- JobFamilies.PULL);
- service.registerIconForFamily(UIIcons.REPOSITORY,
- JobFamilies.AUTO_IGNORE);
- service.registerIconForFamily(UIIcons.REPOSITORY,
- JobFamilies.AUTO_SHARE);
- service.registerIconForFamily(UIIcons.REPOSITORY,
- JobFamilies.INDEX_DIFF_CACHE_UPDATE);
- service.registerIconForFamily(UIIcons.REPOSITORY,
- JobFamilies.REPOSITORY_CHANGED);
- });
- }
- };
- job.setSystem(true);
- job.setUser(false);
- job.schedule();
- }
-
- @Override
- public void optionsChanged(DebugOptions options) {
- // initialize the trace stuff
- debugOptions = options;
- GitTraceLocation.initializeFromOptions(options, isDebugging());
- }
-
- /**
- * @return the {@link DebugOptions}
- */
- public DebugOptions getDebugOptions() {
- return debugOptions;
- }
-
/**
* Register for changes made to Team properties.
*
@@ -535,399 +318,8 @@ public class Activator extends AbstractUIPlugin implements DebugOptionsListener
listener.propertyChange(event);
}
- /**
- * A Job that looks at the repository meta data and triggers a refresh of
- * the resources in the affected projects.
- */
- private static class RepositoryChangeScanner extends Job
- implements IPropertyChangeListener {
-
- // volatile in order to ensure thread synchronization
- private volatile boolean doReschedule;
-
- private int interval;
-
- private final ResourceRefreshJob refresher;
-
- private final RepositoryCache repositoryCache;
-
- private Collection<WorkingTreeModifiedEvent> events;
-
- private final IndexChangedListener listener = event -> {
- if (event.isInternal()) {
- return;
- }
- Repository repository = event.getRepository();
- if (repository.isBare()) {
- return;
- }
- List<String> directories = new ArrayList<>();
- for (IProject project : RuleUtil.getProjects(repository)) {
- if (project.isAccessible()) {
- RepositoryMapping mapping = RepositoryMapping
- .getMapping(project);
- if (mapping != null
- && repository == mapping.getRepository()) {
- String repoRelativePath = mapping
- .getRepoRelativePath(project);
- if (repoRelativePath == null) {
- continue;
- }
- if (GitTraceLocation.REPOSITORYCHANGESCANNER
- .isActive()) {
- GitTraceLocation.getTrace().trace(
- GitTraceLocation.REPOSITORYCHANGESCANNER
- .getLocation(),
- "Scanning project " + project.getName()); //$NON-NLS-1$
- }
- try (TreeWalk w = new TreeWalk(repository)) {
- w.addTree(new FileTreeIterator(repository));
- if (!repoRelativePath.isEmpty()) {
- w.setFilter(PathFilterGroup
- .createFromStrings(repoRelativePath));
- } else {
- directories.add("/"); //$NON-NLS-1$
- }
- w.setRecursive(false);
- while (w.next()) {
- if (w.isSubtree()) {
- FileTreeIterator iter = w.getTree(0,
- FileTreeIterator.class);
- if (iter != null
- && !iter.isEntryIgnored()) {
- directories
- .add(w.getPathString() + '/');
- w.enterSubtree();
- }
- }
- }
- } catch (IOException e) {
- // Ignore.
- }
- if (GitTraceLocation.REPOSITORYCHANGESCANNER
- .isActive()) {
- GitTraceLocation.getTrace().trace(
- GitTraceLocation.REPOSITORYCHANGESCANNER
- .getLocation(),
- "Scanned project " + project.getName()); //$NON-NLS-1$
- }
- }
- }
- }
- if (directories.isEmpty()) {
- return;
- }
- WorkingTreeModifiedEvent evt = new WorkingTreeModifiedEvent(
- directories, null);
- evt.setRepository(repository);
- events.add(evt);
- };
-
- public RepositoryChangeScanner(ResourceRefreshJob refresher) {
- super(UIText.Activator_repoScanJobName);
- this.refresher = refresher;
- setRule(new RepositoryCacheRule());
- setSystem(true);
- setUser(false);
- repositoryCache = org.eclipse.egit.core.Activator.getDefault()
- .getRepositoryCache();
- updateRefreshInterval();
- }
-
- @Override
- public boolean shouldSchedule() {
- return doReschedule;
- }
-
- @Override
- public boolean shouldRun() {
- return doReschedule;
- }
-
- public void setReschedule(boolean reschedule) {
- doReschedule = reschedule;
- }
-
- @Override
- protected IStatus run(IProgressMonitor monitor) {
- // When people use Git from the command line a lot of changes
- // may happen. Don't scan when inactive depending on the user's
- // choice.
- if (getDefault().getPreferenceStore()
- .getBoolean(UIPreferences.REFRESH_ONLY_WHEN_ACTIVE)
- && !isActive()) {
- monitor.done();
- return Status.OK_STATUS;
- }
-
- Repository[] repos = repositoryCache.getAllRepositories();
- if (repos.length == 0) {
- return Status.OK_STATUS;
- }
-
- monitor.beginTask(UIText.Activator_scanningRepositories,
- repos.length);
- try {
- events = new ArrayList<>();
- for (Repository repo : repos) {
- if (monitor.isCanceled()) {
- break;
- }
- if (GitTraceLocation.REPOSITORYCHANGESCANNER.isActive()) {
- GitTraceLocation.getTrace().trace(
- GitTraceLocation.REPOSITORYCHANGESCANNER
- .getLocation(),
- "Scanning " + repo + " for changes"); //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- if (!repo.isBare()) {
- // Set up index change listener for the repo and tear it
- // down afterwards
- ListenerHandle handle = null;
- try {
- handle = repo.getListenerList()
- .addIndexChangedListener(listener);
- repo.scanForRepoChanges();
- } finally {
- if (handle != null) {
- handle.remove();
- }
- }
- }
- monitor.worked(1);
- }
- if (!monitor.isCanceled()) {
- refresher.trigger(events);
- }
- events.clear();
- } catch (IOException e) {
- if (GitTraceLocation.REPOSITORYCHANGESCANNER.isActive()) {
- GitTraceLocation.getTrace().trace(
- GitTraceLocation.REPOSITORYCHANGESCANNER
- .getLocation(),
- "Stopped rescheduling " + getName() + " job"); //$NON-NLS-1$ //$NON-NLS-2$
- }
- return createErrorStatus(UIText.Activator_scanError, e);
- } finally {
- monitor.done();
- }
- if (GitTraceLocation.REPOSITORYCHANGESCANNER.isActive()) {
- GitTraceLocation.getTrace().trace(
- GitTraceLocation.REPOSITORYCHANGESCANNER.getLocation(),
- "Rescheduling " + getName() + " job"); //$NON-NLS-1$ //$NON-NLS-2$
- }
- schedule(interval);
- return Status.OK_STATUS;
- }
-
- @Override
- public void propertyChange(PropertyChangeEvent event) {
- if (!UIPreferences.REFRESH_INDEX_INTERVAL
- .equals(event.getProperty())) {
- return;
- }
- updateRefreshInterval();
- }
-
- private void updateRefreshInterval() {
- interval = getRefreshIndexInterval();
- setReschedule(interval > 0);
- cancel();
- schedule(interval);
- }
-
- /**
- * @return interval in milliseconds for automatic index check, 0 is if
- * check should be disabled
- */
- private static int getRefreshIndexInterval() {
- return 1000 * getDefault().getPreferenceStore()
- .getInt(UIPreferences.REFRESH_INDEX_INTERVAL);
- }
- }
-
- /**
- * Refreshes parts of the workspace changed by JGit operations. This will
- * not refresh any git-ignored resources since those are not reported in the
- * {@link WorkingTreeModifiedEvent}.
- */
- private static class ResourceRefreshJob extends Job {
-
- public ResourceRefreshJob() {
- super(UIText.Activator_refreshJobName);
- setUser(false);
- setSystem(true);
- }
-
- /**
- * Internal helper class to record batched accumulated results from
- * several {@link WorkingTreeModifiedEvent}s.
- */
- private static class WorkingTreeChanges {
-
- private final File workTree;
-
- private final Set<String> modified;
-
- private final Set<String> deleted;
-
- public WorkingTreeChanges(WorkingTreeModifiedEvent event) {
- workTree = event.getRepository().getWorkTree()
- .getAbsoluteFile();
- modified = new HashSet<>(event.getModified());
- deleted = new HashSet<>(event.getDeleted());
- }
-
- public File getWorkTree() {
- return workTree;
- }
-
- public Set<String> getModified() {
- return modified;
- }
-
- public Set<String> getDeleted() {
- return deleted;
- }
-
- public boolean isEmpty() {
- return modified.isEmpty() && deleted.isEmpty();
- }
-
- public WorkingTreeChanges merge(WorkingTreeModifiedEvent event) {
- modified.removeAll(event.getDeleted());
- deleted.removeAll(event.getModified());
- modified.addAll(event.getModified());
- deleted.addAll(event.getDeleted());
- return this;
- }
- }
-
- private Map<File, WorkingTreeChanges> repositoriesChanged = new LinkedHashMap<>();
-
- @Override
- public IStatus run(IProgressMonitor monitor) {
- try {
- List<WorkingTreeChanges> changes;
- synchronized (repositoriesChanged) {
- if (repositoriesChanged.isEmpty()) {
- return Status.OK_STATUS;
- }
- changes = new ArrayList<>(repositoriesChanged.values());
- repositoriesChanged.clear();
- }
-
- SubMonitor progress = SubMonitor.convert(monitor,
- changes.size());
- try {
- for (WorkingTreeChanges change : changes) {
- if (progress.isCanceled()) {
- return Status.CANCEL_STATUS;
- }
- ResourceRefreshHandler handler = new ResourceRefreshHandler();
- handler.refreshRepository(new WorkingTreeModifiedEvent(
- change.getModified(), change.getDeleted()),
- change.getWorkTree(), progress.newChild(1));
- }
- } catch (OperationCanceledException oe) {
- return Status.CANCEL_STATUS;
- } catch (CoreException e) {
- handleError(UIText.Activator_refreshFailed, e, false);
- return new Status(IStatus.ERROR, getPluginId(),
- e.getMessage());
- }
-
- if (!monitor.isCanceled()) {
- // re-schedule if we got some changes in the meantime
- synchronized (repositoriesChanged) {
- if (!repositoriesChanged.isEmpty()) {
- schedule(100);
- }
- }
- }
- } finally {
- monitor.done();
- }
- return Status.OK_STATUS;
- }
-
- /**
- * Record which projects have changes. Initiate a resource refresh job
- * if the user settings allow it.
- *
- * @param events
- * The {@link WorkingTreeModifiedEvent}s that triggered this
- * refresh
- */
- public void trigger(Collection<WorkingTreeModifiedEvent> events) {
- boolean haveChanges = false;
- for (WorkingTreeModifiedEvent event : events) {
- if (event.isEmpty()) {
- continue;
- }
- Repository repo = event.getRepository();
- if (repo == null || repo.isBare()) {
- continue; // Should never occur
- }
- File gitDir = repo.getDirectory();
- synchronized (repositoriesChanged) {
- WorkingTreeChanges changes = repositoriesChanged
- .get(gitDir);
- if (changes == null) {
- repositoriesChanged.put(gitDir,
- new WorkingTreeChanges(event));
- } else {
- changes.merge(event);
- if (changes.isEmpty()) {
- // Actually, this cannot happen.
- repositoriesChanged.remove(gitDir);
- }
- }
- }
- haveChanges = true;
- }
- if (haveChanges) {
- schedule();
- }
- }
- }
-
- private void setupRepoChangeScanner() {
- refreshJob = new ResourceRefreshJob();
- rcs = new RepositoryChangeScanner(refreshJob);
- getPreferenceStore().addPropertyChangeListener(rcs);
- }
-
@Override
public void stop(final BundleContext context) throws Exception {
- SelectionRepositoryStateCache.INSTANCE.dispose();
-
- if (focusListener != null) {
- if (PlatformUI.isWorkbenchRunning()) {
- PlatformUI.getWorkbench().removeWindowListener(focusListener);
- }
- focusListener = null;
- }
-
- if (GitTraceLocation.REPOSITORYCHANGESCANNER.isActive()) {
- GitTraceLocation.getTrace().trace(
- GitTraceLocation.REPOSITORYCHANGESCANNER.getLocation(),
- "Trying to cancel " + rcs.getName() + " job"); //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- getPreferenceStore().removePropertyChangeListener(rcs);
- rcs.setReschedule(false);
- rcs.cancel();
- refreshJob.cancel();
-
- rcs.join();
- refreshJob.join();
- if (GitTraceLocation.REPOSITORYCHANGESCANNER.isActive()) {
- GitTraceLocation.getTrace().trace(
- GitTraceLocation.REPOSITORYCHANGESCANNER.getLocation(),
- "Jobs terminated"); //$NON-NLS-1$
- }
-
if (resourceManager != null) {
resourceManager.dispose();
resourceManager = null;
@@ -941,6 +333,7 @@ public class Activator extends AbstractUIPlugin implements DebugOptionsListener
KnownHosts.store();
super.saveDialogSettings();
}
+
/**
* @return the {@link RepositoryUtil} instance
*/
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/PluginPreferenceInitializer.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/PluginPreferenceInitializer.java
index 21a1e963f6..231b02e8fb 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/PluginPreferenceInitializer.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/PluginPreferenceInitializer.java
@@ -112,7 +112,6 @@ public class PluginPreferenceInitializer extends AbstractPreferenceInitializer {
store.setDefault(UIPreferences.COMMIT_DIALOG_SIGNED_OFF_BY, false);
store.setDefault(UIPreferences.REFRESH_INDEX_INTERVAL, 5 * 60);
- store.setDefault(UIPreferences.REFRESH_ON_INDEX_CHANGE, true);
store.setDefault(UIPreferences.REFRESH_ONLY_WHEN_ACTIVE, true);
store.setDefault(UIPreferences.SHOW_REBASE_CONFIRM, false);
@@ -165,6 +164,8 @@ public class PluginPreferenceInitializer extends AbstractPreferenceInitializer {
store.setDefault(UIPreferences.HISTORY_COLUMN_AUTHOR_DATE, true);
store.setDefault(UIPreferences.HISTORY_COLUMN_COMMITTER, true);
store.setDefault(UIPreferences.HISTORY_COLUMN_COMMITTER_DATE, true);
+
+ store.setDefault(UIPreferences.HISTORY_VERIFY_SIGNATURES, false);
}
}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIPreferences.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIPreferences.java
index 2b1d1ce41c..1b280f13ba 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIPreferences.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIPreferences.java
@@ -186,8 +186,6 @@ public final class UIPreferences {
/** interval in seconds to check for repositories index changes */
public static final String REFRESH_INDEX_INTERVAL = "refesh_index_interval"; //$NON-NLS-1$
/** */
- public static final String REFRESH_ON_INDEX_CHANGE = "refesh_on_index_change"; //$NON-NLS-1$
- /** */
public static final String REFRESH_ONLY_WHEN_ACTIVE = "refesh_only_when_active"; //$NON-NLS-1$
/** Holds true if the logical model should be used. */
@@ -236,6 +234,8 @@ public final class UIPreferences {
public static final String HISTORY_SHOW_TAG_SEQUENCE = "HistoryView_ShowTagSequence"; //$NON-NLS-1$
/** */
public static final String HISTORY_SHOW_BRANCH_SEQUENCE = "HistoryView_ShowBranchSequence"; //$NON-NLS-1$
+ /** */
+ public final static String HISTORY_VERIFY_SIGNATURES = "HistoryView_VerifySignatures"; //$NON-NLS-1$
/** */
public static final String HISTORY_COLUMN_ID = "HistoryView_ColumnIdShow"; //$NON-NLS-1$
@@ -302,6 +302,9 @@ public final class UIPreferences {
/** */
public static final String STASH_INCLUDE_UNTRACKED = "stashIncludeUntracked"; //$NON-NLS-1$
+ /** */
+ public static final String DIFF_OUTLINE_PRESENTATION = "DiffEditorOutline.compactTree"; //$NON-NLS-1$
+
/**
* Converts a persisted String separated with commas to an integer array
*
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ActionUtils.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ActionUtils.java
index 2d2a5c3613..cb29bfc35f 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ActionUtils.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ActionUtils.java
@@ -21,9 +21,10 @@ import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.commands.ActionHandler;
import org.eclipse.jface.text.ITextOperationTarget;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.ActiveShellExpression;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
@@ -216,43 +217,50 @@ public final class ActionUtils {
*/
public static void setGlobalActions(Control control,
Collection<? extends IAction> actions, IHandlerService service) {
- Collection<IHandlerActivation> handlerActivations = new ArrayList<>();
- control.addDisposeListener(event -> {
- if (!handlerActivations.isEmpty()) {
- service.deactivateHandlers(handlerActivations);
- handlerActivations.clear();
- }
- });
- final ActiveShellExpression expression = new ActiveShellExpression(
+ ActiveShellExpression expression = new ActiveShellExpression(
control.getShell());
- control.addFocusListener(new FocusListener() {
+ class ActivationListener implements Listener {
- @Override
- public void focusLost(FocusEvent e) {
- if (!handlerActivations.isEmpty()) {
- service.deactivateHandlers(handlerActivations);
- handlerActivations.clear();
- }
- }
+ private Collection<IHandlerActivation> handlerActivations = new ArrayList<>();
@Override
- public void focusGained(FocusEvent e) {
- if (!handlerActivations.isEmpty()) {
- // Looks like sometimes we get two focusGained events.
- return;
- }
- for (IAction action : actions) {
- if (action != null) {
- handlerActivations.add(service.activateHandler(
- action.getActionDefinitionId(),
- new ActionHandler(action), expression, false));
- if (action instanceof IUpdate) {
- ((IUpdate) action).update();
+ public void handleEvent(Event event) {
+ switch (event.type) {
+ case SWT.Deactivate:
+ case SWT.FocusOut:
+ case SWT.Dispose:
+ if (!handlerActivations.isEmpty()) {
+ service.deactivateHandlers(handlerActivations);
+ handlerActivations.clear();
+ }
+ break;
+ case SWT.FocusIn:
+ if (!handlerActivations.isEmpty()) {
+ // Looks like sometimes we get two focusGained events.
+ return;
+ }
+ for (IAction action : actions) {
+ if (action != null) {
+ handlerActivations.add(service.activateHandler(
+ action.getActionDefinitionId(),
+ new ActionHandler(action), expression,
+ false));
+ if (action instanceof IUpdate) {
+ ((IUpdate) action).update();
+ }
}
}
+ break;
+ default:
+ break;
}
}
- });
+ }
+ ActivationListener activationListener = new ActivationListener();
+ control.addListener(SWT.Deactivate, activationListener);
+ control.addListener(SWT.FocusOut, activationListener);
+ control.addListener(SWT.FocusIn, activationListener);
+ control.addListener(SWT.Dispose, activationListener);
}
/**
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ApplicationActiveListener.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ApplicationActiveListener.java
new file mode 100644
index 0000000000..cb674be072
--- /dev/null
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ApplicationActiveListener.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Thomas Wolf <thomas.wolf@paranor.ch> and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Thomas Wolf - factored out of Activator
+ *******************************************************************************/
+package org.eclipse.egit.ui.internal;
+
+import org.eclipse.e4.core.services.events.IEventBroker;
+import org.eclipse.e4.ui.workbench.UIEvents;
+import org.eclipse.swt.SWTException;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IWindowListener;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+
+/**
+ * Determines whether any shell of the application is active and fires an event
+ * when the value changes.
+ */
+@Component(property = {
+ EventConstants.EVENT_TOPIC + '='
+ + UIEvents.UILifeCycle.APP_STARTUP_COMPLETE,
+ EventConstants.EVENT_TOPIC + '='
+ + UIEvents.UILifeCycle.APP_SHUTDOWN_STARTED })
+public class ApplicationActiveListener implements EventHandler {
+
+ /**
+ * Event topic for the events posted by this component.
+ */
+ public static final String TOPIC_APPLICATION_ACTIVE = "org/eclipse/egit/ui/APPLICATION_ACTIVE"; //$NON-NLS-1$
+
+ private volatile WindowTracker listener;
+
+ @Override
+ public void handleEvent(Event event) {
+ String topic = event.getTopic();
+ if (topic == null) {
+ return;
+ }
+ switch (topic) {
+ case UIEvents.UILifeCycle.APP_STARTUP_COMPLETE:
+ if (listener == null) {
+ listener = new WindowTracker();
+ listener.update();
+ PlatformUI.getWorkbench().addWindowListener(listener);
+ }
+ break;
+ case UIEvents.UILifeCycle.APP_SHUTDOWN_STARTED:
+ shutDown();
+ break;
+ default:
+ break;
+ }
+ }
+
+ @Deactivate
+ void shutDown() {
+ if (listener != null) {
+ PlatformUI.getWorkbench().removeWindowListener(listener);
+ listener = null;
+ }
+ }
+
+ private static class WindowTracker implements IWindowListener {
+
+ private boolean isActive;
+
+ void update() {
+ if (PlatformUI.isWorkbenchRunning()) {
+ Display display = PlatformUI.getWorkbench().getDisplay();
+ if (display != null && !display.isDisposed()) {
+ try {
+ display.asyncExec(() -> {
+ boolean wasActive = isActive;
+ isActive = !display.isDisposed()
+ && display.getActiveShell() != null;
+ if (wasActive != isActive) {
+ notify(isActive);
+ }
+ });
+ } catch (SWTException e) {
+ // Silently ignore -- display was disposed already
+ }
+ }
+ }
+ }
+
+ private void notify(boolean active) {
+ if (PlatformUI.isWorkbenchRunning()) {
+ IEventBroker broker = PlatformUI.getWorkbench()
+ .getService(IEventBroker.class);
+ if (broker != null) {
+ broker.post(TOPIC_APPLICATION_ACTIVE,
+ Boolean.valueOf(active));
+ }
+ }
+ }
+
+ @Override
+ public void windowActivated(IWorkbenchWindow window) {
+ update();
+ }
+
+ @Override
+ public void windowDeactivated(IWorkbenchWindow window) {
+ update();
+ }
+
+ @Override
+ public void windowClosed(IWorkbenchWindow window) {
+ update();
+ }
+
+ @Override
+ public void windowOpened(IWorkbenchWindow window) {
+ update();
+ }
+ }
+}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ConfigurationChecker.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ConfigurationChecker.java
index f718f3f6d2..9cc22df21d 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ConfigurationChecker.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ConfigurationChecker.java
@@ -16,7 +16,9 @@ import java.io.File;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.e4.ui.workbench.UIEvents;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.UIPreferences;
import org.eclipse.jface.preference.IPreferenceStore;
@@ -27,69 +29,87 @@ import org.eclipse.jgit.util.LfsFactory;
import org.eclipse.jgit.util.LfsFactory.LfsInstallCommand;
import org.eclipse.jgit.util.SystemReader;
import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.PlatformUI;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
/**
- * Checks the system configuration
- *
+ * Checks the system configuration.
*/
-public class ConfigurationChecker {
+public final class ConfigurationChecker {
+
+ private ConfigurationChecker() {
+ // No instantiation
+ }
/**
- * Checks the system configuration.
+ * OSGi DS component to run the configuration check
*/
- public static void checkConfiguration() {
- // Schedule a job
- // This avoids that the check is executed too early
- // because in startup phase the JobManager is suspended
- // and scheduled Jobs are executed later
- Job job = new Job(UIText.ConfigurationChecker_checkConfiguration) {
- @Override
- protected IStatus run(IProgressMonitor monitor) {
- if (PlatformUI.isWorkbenchRunning()) {
- PlatformUI.getWorkbench().getDisplay()
- .asyncExec(new Runnable() {
- @Override
- public void run() {
- check();
- }
- });
- } else {
- schedule(1000L);
- }
- return Status.OK_STATUS;
+ @Component(property = EventConstants.EVENT_TOPIC + '='
+ + UIEvents.UILifeCycle.APP_STARTUP_COMPLETE)
+ public static class Checker extends Job implements EventHandler {
+
+ /** Instantiated by DS. */
+ public Checker() {
+ super(UIText.ConfigurationChecker_checkConfiguration);
+ setSystem(true);
+ setUser(false);
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ SubMonitor progress = SubMonitor.convert(monitor, 2);
+ checkHome(progress.newChild(1));
+ checkLfs(progress.newChild(1));
+ return Status.OK_STATUS;
+ }
+
+ @Override
+ public void handleEvent(Event event) {
+ if (UIEvents.UILifeCycle.APP_STARTUP_COMPLETE
+ .equals(event.getTopic())) {
+ schedule();
}
- };
- job.schedule();
- }
+ }
- private static void check() {
- checkHome();
- checkLfs();
+ @Deactivate
+ void stop() {
+ cancel();
+ try {
+ join();
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ }
}
- private static void checkLfs() {
+ private static void checkLfs(IProgressMonitor monitor) {
IPreferenceStore store = Activator.getDefault().getPreferenceStore();
boolean auto = store.getBoolean(UIPreferences.LFS_AUTO_CONFIGURATION);
- if (auto && !isLfsConfigured()) {
+ if (auto && !isLfsConfigured(monitor)) {
try {
LfsInstallCommand cmd = LfsFactory.getInstance()
.getInstallCommand();
- if (cmd != null) {
+ if (cmd != null && !monitor.isCanceled()) {
cmd.call();
}
} catch (Exception e) {
Activator.handleIssue(IStatus.WARNING,
UIText.ConfigurationChecker_installLfsCannotInstall, e,
- true);
+ !monitor.isCanceled());
}
}
}
- private static boolean isLfsConfigured() {
+ private static boolean isLfsConfigured(IProgressMonitor monitor) {
try {
StoredConfig cfg = SystemReader.getInstance().openUserConfig(null,
FS.DETECTED);
+ if (monitor.isCanceled()) {
+ return true; // Don't do anything more if canceled
+ }
cfg.load();
return cfg.getSubsections(ConfigConstants.CONFIG_FILTER_SECTION)
.contains("lfs"); //$NON-NLS-1$
@@ -100,7 +120,7 @@ public class ConfigurationChecker {
return false;
}
- private static void checkHome() {
+ private static void checkHome(IProgressMonitor monitor) {
String home = System.getenv("HOME"); //$NON-NLS-1$
if (home != null)
return; // home is set => ok
@@ -108,8 +128,9 @@ public class ConfigurationChecker {
String message = NLS.bind(UIText.ConfigurationChecker_homeNotSet, home);
IPreferenceStore store = Activator.getDefault().getPreferenceStore();
boolean hidden = !store.getBoolean(UIPreferences.SHOW_HOME_DIR_WARNING);
- if (!hidden)
+ if (!hidden && !monitor.isCanceled()) {
Activator.handleIssue(IStatus.WARNING, message, null, false);
+ }
}
private static String calcHomeDir() {
@@ -135,5 +156,4 @@ public class ConfigurationChecker {
}
return os.contains("Windows"); //$NON-NLS-1$
}
-
}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ExternalRepositoryScanner.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ExternalRepositoryScanner.java
new file mode 100644
index 0000000000..49ed3ee041
--- /dev/null
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ExternalRepositoryScanner.java
@@ -0,0 +1,491 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Thomas Wolf <thomas.wolf@paranor.ch> and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Thomas Wolf - factored out of Activator
+ *******************************************************************************/
+package org.eclipse.egit.ui.internal;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.e4.core.services.events.IEventBroker;
+import org.eclipse.egit.core.RepositoryCache;
+import org.eclipse.egit.core.internal.ResourceRefreshHandler;
+import org.eclipse.egit.core.internal.job.RuleUtil;
+import org.eclipse.egit.core.project.RepositoryMapping;
+import org.eclipse.egit.ui.Activator;
+import org.eclipse.egit.ui.UIPreferences;
+import org.eclipse.egit.ui.internal.trace.GitTraceLocation;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jgit.events.IndexChangedListener;
+import org.eclipse.jgit.events.ListenerHandle;
+import org.eclipse.jgit.events.WorkingTreeModifiedEvent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.treewalk.FileTreeIterator;
+import org.eclipse.jgit.treewalk.TreeWalk;
+import org.eclipse.jgit.treewalk.filter.PathFilterGroup;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+
+/**
+ * A component that scans for external changes made to git repositories.
+ * Depending on user preference setting, this scanning is done only when the
+ * workbench is active.
+ */
+@Component(property = EventConstants.EVENT_TOPIC + '='
+ + ApplicationActiveListener.TOPIC_APPLICATION_ACTIVE)
+public class ExternalRepositoryScanner implements EventHandler {
+
+ private AtomicBoolean isActive = new AtomicBoolean();
+
+ private ResourceRefreshJob refreshJob;
+
+ private RepositoryChangeScanner scanner;
+
+ @Override
+ public void handleEvent(Event event) {
+ if (ApplicationActiveListener.TOPIC_APPLICATION_ACTIVE
+ .equals(event.getTopic())) {
+ Object value = event.getProperty(IEventBroker.DATA);
+ if (value instanceof Boolean) {
+ boolean newValue = ((Boolean) value).booleanValue();
+ if (isActive.compareAndSet(!newValue, newValue) && newValue) {
+ scanner.schedule();
+ }
+ }
+ }
+ }
+
+ @Activate
+ void startUp() {
+ refreshJob = new ResourceRefreshJob();
+ scanner = new RepositoryChangeScanner(refreshJob, isActive);
+ Activator.getDefault().getPreferenceStore()
+ .addPropertyChangeListener(scanner);
+ }
+
+ @Deactivate
+ void shutDown() {
+ if (GitTraceLocation.REPOSITORYCHANGESCANNER.isActive()) {
+ GitTraceLocation.getTrace().trace(
+ GitTraceLocation.REPOSITORYCHANGESCANNER.getLocation(),
+ "Trying to cancel " + scanner.getName() + " job"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ Activator.getDefault().getPreferenceStore()
+ .removePropertyChangeListener(scanner);
+ scanner.setReschedule(false);
+ scanner.cancel();
+ refreshJob.cancel();
+
+ try {
+ scanner.join();
+ refreshJob.join();
+ if (GitTraceLocation.REPOSITORYCHANGESCANNER.isActive()) {
+ GitTraceLocation.getTrace().trace(
+ GitTraceLocation.REPOSITORYCHANGESCANNER.getLocation(),
+ "Jobs terminated"); //$NON-NLS-1$
+ }
+ } catch (InterruptedException e) {
+ if (GitTraceLocation.REPOSITORYCHANGESCANNER.isActive()) {
+ GitTraceLocation.getTrace().trace(
+ GitTraceLocation.REPOSITORYCHANGESCANNER.getLocation(),
+ "Jobs termination interrupted"); //$NON-NLS-1$
+ }
+ Thread.currentThread().interrupt();
+ }
+ }
+
+ /**
+ * A Job that looks at the repository meta data and triggers a refresh of
+ * the resources in the affected projects.
+ */
+ private static class RepositoryChangeScanner extends Job
+ implements IPropertyChangeListener {
+
+ // volatile in order to ensure thread synchronization
+ private volatile boolean doReschedule;
+
+ private volatile int interval;
+
+ private final ResourceRefreshJob refresher;
+
+ private final AtomicBoolean workbenchActive;
+
+ private final RepositoryCache repositoryCache;
+
+ private Collection<WorkingTreeModifiedEvent> events;
+
+ private final IndexChangedListener listener = event -> {
+ if (event.isInternal()) {
+ return;
+ }
+ Repository repository = event.getRepository();
+ if (repository.isBare()) {
+ return;
+ }
+ List<String> directories = new ArrayList<>();
+ for (IProject project : RuleUtil.getProjects(repository)) {
+ if (project.isAccessible()) {
+ RepositoryMapping mapping = RepositoryMapping
+ .getMapping(project);
+ if (mapping != null
+ && repository == mapping.getRepository()) {
+ String repoRelativePath = mapping
+ .getRepoRelativePath(project);
+ if (repoRelativePath == null) {
+ continue;
+ }
+ if (GitTraceLocation.REPOSITORYCHANGESCANNER
+ .isActive()) {
+ GitTraceLocation.getTrace().trace(
+ GitTraceLocation.REPOSITORYCHANGESCANNER
+ .getLocation(),
+ "Scanning project " + project.getName()); //$NON-NLS-1$
+ }
+ try (TreeWalk w = new TreeWalk(repository)) {
+ w.addTree(new FileTreeIterator(repository));
+ if (!repoRelativePath.isEmpty()) {
+ w.setFilter(PathFilterGroup
+ .createFromStrings(repoRelativePath));
+ } else {
+ directories.add("/"); //$NON-NLS-1$
+ }
+ w.setRecursive(false);
+ while (w.next()) {
+ if (w.isSubtree()) {
+ FileTreeIterator iter = w.getTree(0,
+ FileTreeIterator.class);
+ if (iter != null
+ && !iter.isEntryIgnored()) {
+ directories
+ .add(w.getPathString() + '/');
+ w.enterSubtree();
+ }
+ }
+ }
+ } catch (IOException e) {
+ // Ignore.
+ }
+ if (GitTraceLocation.REPOSITORYCHANGESCANNER
+ .isActive()) {
+ GitTraceLocation.getTrace().trace(
+ GitTraceLocation.REPOSITORYCHANGESCANNER
+ .getLocation(),
+ "Scanned project " + project.getName()); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+ if (directories.isEmpty()) {
+ return;
+ }
+ WorkingTreeModifiedEvent evt = new WorkingTreeModifiedEvent(
+ directories, null);
+ evt.setRepository(repository);
+ events.add(evt);
+ };
+
+ public RepositoryChangeScanner(ResourceRefreshJob refresher,
+ AtomicBoolean workbenchActive) {
+ super(UIText.Activator_repoScanJobName);
+ this.refresher = refresher;
+ this.workbenchActive = workbenchActive;
+ setRule(new RepositoryCacheRule());
+ setSystem(true);
+ setUser(false);
+ repositoryCache = org.eclipse.egit.core.Activator.getDefault()
+ .getRepositoryCache();
+ updateRefreshInterval();
+ }
+
+ @Override
+ public boolean shouldSchedule() {
+ return doReschedule;
+ }
+
+ @Override
+ public boolean shouldRun() {
+ return doReschedule;
+ }
+
+ public void setReschedule(boolean reschedule) {
+ doReschedule = reschedule;
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ // When people use Git from the command line a lot of changes
+ // may happen. Don't scan when inactive depending on the user's
+ // choice.
+ if (Activator.getDefault().getPreferenceStore()
+ .getBoolean(UIPreferences.REFRESH_ONLY_WHEN_ACTIVE)
+ && !workbenchActive.get()) {
+ monitor.done();
+ return Status.OK_STATUS;
+ }
+
+ Repository[] repos = repositoryCache.getAllRepositories();
+ if (repos.length == 0) {
+ schedule(interval);
+ return Status.OK_STATUS;
+ }
+
+ monitor.beginTask(UIText.Activator_scanningRepositories,
+ repos.length);
+ try {
+ events = new ArrayList<>();
+ for (Repository repo : repos) {
+ if (monitor.isCanceled()) {
+ break;
+ }
+ if (GitTraceLocation.REPOSITORYCHANGESCANNER.isActive()) {
+ GitTraceLocation.getTrace()
+ .trace(GitTraceLocation.REPOSITORYCHANGESCANNER
+ .getLocation(),
+ "Scanning " + repo + " for changes"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ if (!repo.isBare()) {
+ // Set up index change listener for the repo and tear it
+ // down afterwards
+ ListenerHandle handle = null;
+ try {
+ handle = repo.getListenerList()
+ .addIndexChangedListener(listener);
+ repo.scanForRepoChanges();
+ } finally {
+ if (handle != null) {
+ handle.remove();
+ }
+ }
+ }
+ monitor.worked(1);
+ }
+ if (!monitor.isCanceled()) {
+ refresher.trigger(events);
+ }
+ events.clear();
+ } catch (IOException e) {
+ if (GitTraceLocation.REPOSITORYCHANGESCANNER.isActive()) {
+ GitTraceLocation.getTrace().trace(
+ GitTraceLocation.REPOSITORYCHANGESCANNER
+ .getLocation(),
+ "Stopped rescheduling " + getName() + " job"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ return Activator.createErrorStatus(UIText.Activator_scanError,
+ e);
+ } finally {
+ monitor.done();
+ }
+ if (GitTraceLocation.REPOSITORYCHANGESCANNER.isActive()) {
+ GitTraceLocation.getTrace().trace(
+ GitTraceLocation.REPOSITORYCHANGESCANNER.getLocation(),
+ "Rescheduling " + getName() + " job"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ schedule(interval);
+ return Status.OK_STATUS;
+ }
+
+ @Override
+ public void propertyChange(PropertyChangeEvent event) {
+ if (!UIPreferences.REFRESH_INDEX_INTERVAL
+ .equals(event.getProperty())) {
+ return;
+ }
+ updateRefreshInterval();
+ }
+
+ private void updateRefreshInterval() {
+ interval = getRefreshIndexInterval();
+ setReschedule(interval > 0);
+ cancel();
+ schedule(interval);
+ }
+
+ /**
+ * @return interval in milliseconds for automatic index check, 0 is if
+ * check should be disabled
+ */
+ private static int getRefreshIndexInterval() {
+ return 1000 * Activator.getDefault().getPreferenceStore()
+ .getInt(UIPreferences.REFRESH_INDEX_INTERVAL);
+ }
+ }
+
+ /**
+ * Refreshes parts of the workspace changed by JGit operations. This will
+ * not refresh any git-ignored resources since those are not reported in the
+ * {@link WorkingTreeModifiedEvent}.
+ */
+ private static class ResourceRefreshJob extends Job {
+
+ public ResourceRefreshJob() {
+ super(UIText.Activator_refreshJobName);
+ setUser(false);
+ setSystem(true);
+ }
+
+ /**
+ * Internal helper class to record batched accumulated results from
+ * several {@link WorkingTreeModifiedEvent}s.
+ */
+ private static class WorkingTreeChanges {
+
+ private final File workTree;
+
+ private final Set<String> modified;
+
+ private final Set<String> deleted;
+
+ public WorkingTreeChanges(WorkingTreeModifiedEvent event) {
+ workTree = event.getRepository().getWorkTree()
+ .getAbsoluteFile();
+ modified = new HashSet<>(event.getModified());
+ deleted = new HashSet<>(event.getDeleted());
+ }
+
+ public File getWorkTree() {
+ return workTree;
+ }
+
+ public Set<String> getModified() {
+ return modified;
+ }
+
+ public Set<String> getDeleted() {
+ return deleted;
+ }
+
+ public boolean isEmpty() {
+ return modified.isEmpty() && deleted.isEmpty();
+ }
+
+ public WorkingTreeChanges merge(WorkingTreeModifiedEvent event) {
+ modified.removeAll(event.getDeleted());
+ deleted.removeAll(event.getModified());
+ modified.addAll(event.getModified());
+ deleted.addAll(event.getDeleted());
+ return this;
+ }
+ }
+
+ private Map<File, WorkingTreeChanges> repositoriesChanged = new LinkedHashMap<>();
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ try {
+ List<WorkingTreeChanges> changes;
+ synchronized (repositoriesChanged) {
+ if (repositoriesChanged.isEmpty()) {
+ return Status.OK_STATUS;
+ }
+ changes = new ArrayList<>(repositoriesChanged.values());
+ repositoriesChanged.clear();
+ }
+
+ SubMonitor progress = SubMonitor.convert(monitor,
+ changes.size());
+ try {
+ for (WorkingTreeChanges change : changes) {
+ if (progress.isCanceled()) {
+ return Status.CANCEL_STATUS;
+ }
+ ResourceRefreshHandler handler = new ResourceRefreshHandler();
+ handler.refreshRepository(new WorkingTreeModifiedEvent(
+ change.getModified(), change.getDeleted()),
+ change.getWorkTree(), progress.newChild(1));
+ }
+ } catch (OperationCanceledException oe) {
+ return Status.CANCEL_STATUS;
+ } catch (CoreException e) {
+ Activator.handleError(UIText.Activator_refreshFailed, e,
+ false);
+ return new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ e.getMessage());
+ }
+
+ if (!monitor.isCanceled()) {
+ // re-schedule if we got some changes in the meantime
+ synchronized (repositoriesChanged) {
+ if (!repositoriesChanged.isEmpty()) {
+ schedule(100);
+ }
+ }
+ }
+ } finally {
+ monitor.done();
+ }
+ return Status.OK_STATUS;
+ }
+
+ /**
+ * Record which projects have changes. Initiate a resource refresh job
+ * if the user settings allow it.
+ *
+ * @param events
+ * The {@link WorkingTreeModifiedEvent}s that triggered this
+ * refresh
+ */
+ public void trigger(Collection<WorkingTreeModifiedEvent> events) {
+ boolean haveChanges = false;
+ for (WorkingTreeModifiedEvent event : events) {
+ if (event.isEmpty()) {
+ continue;
+ }
+ Repository repo = event.getRepository();
+ if (repo == null || repo.isBare()) {
+ continue; // Should never occur
+ }
+ File gitDir = repo.getDirectory();
+ synchronized (repositoriesChanged) {
+ WorkingTreeChanges changes = repositoriesChanged
+ .get(gitDir);
+ if (changes == null) {
+ repositoriesChanged.put(gitDir,
+ new WorkingTreeChanges(event));
+ } else {
+ changes.merge(event);
+ if (changes.isEmpty()) {
+ // Actually, this cannot happen.
+ repositoriesChanged.remove(gitDir);
+ }
+ }
+ }
+ haveChanges = true;
+ }
+ if (haveChanges) {
+ schedule();
+ }
+ }
+ }
+}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/StartEventListener.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/StartEventListener.java
new file mode 100644
index 0000000000..642c688afc
--- /dev/null
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/StartEventListener.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Thomas Wolf <thomas.wolf@paranor.ch> and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.egit.ui.internal;
+
+import java.util.Iterator;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.eclipse.e4.ui.workbench.UIEvents;
+import org.eclipse.egit.core.JobFamilies;
+import org.eclipse.egit.ui.Activator;
+import org.eclipse.egit.ui.internal.selection.SelectionRepositoryStateCache;
+import org.eclipse.egit.ui.internal.variables.GitTemplateVariableResolver;
+import org.eclipse.jface.text.templates.ContextTypeRegistry;
+import org.eclipse.jface.text.templates.TemplateContextType;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.progress.IProgressService;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+
+/**
+ * Initializes some EGit components that rely on the workbench having been
+ * created.
+ */
+@Component(property = EventConstants.EVENT_TOPIC + '='
+ + UIEvents.UILifeCycle.APP_STARTUP_COMPLETE)
+public class StartEventListener implements EventHandler {
+
+ private final AtomicBoolean started = new AtomicBoolean();
+
+ private void startInternalComponents() {
+ if (started.compareAndSet(false, true)) {
+ SelectionRepositoryStateCache.INSTANCE.initialize();
+ registerCoreJobFamilyIcons();
+ registerTemplateVariableResolvers();
+ }
+ }
+
+ @Override
+ public void handleEvent(Event event) {
+ if (UIEvents.UILifeCycle.APP_STARTUP_COMPLETE
+ .equals(event.getTopic())) {
+ startInternalComponents();
+ }
+ }
+
+ @Deactivate
+ void shutDown() {
+ if (started.get()) {
+ SelectionRepositoryStateCache.INSTANCE.dispose();
+ }
+ }
+
+ private void runAsync(Runnable action) {
+ Display display = PlatformUI.getWorkbench().getDisplay();
+ if (display != null && !display.isDisposed()) {
+ display.asyncExec(() -> {
+ if (!display.isDisposed() && PlatformUI.isWorkbenchRunning()) {
+ action.run();
+ }
+ });
+ }
+ }
+
+ private void registerCoreJobFamilyIcons() {
+ runAsync(() -> {
+ IProgressService service = PlatformUI.getWorkbench()
+ .getProgressService();
+ if (service == null) {
+ return;
+ }
+ service.registerIconForFamily(UIIcons.PULL, JobFamilies.PULL);
+ service.registerIconForFamily(UIIcons.REPOSITORY,
+ JobFamilies.AUTO_IGNORE);
+ service.registerIconForFamily(UIIcons.REPOSITORY,
+ JobFamilies.AUTO_SHARE);
+ service.registerIconForFamily(UIIcons.REPOSITORY,
+ JobFamilies.INDEX_DIFF_CACHE_UPDATE);
+ service.registerIconForFamily(UIIcons.REPOSITORY,
+ JobFamilies.REPOSITORY_CHANGED);
+ });
+ }
+
+ private void registerTemplateVariableResolvers() {
+ if (!Activator.hasJavaPlugin()) {
+ return;
+ }
+ runAsync(() -> {
+ try {
+ ContextTypeRegistry codeTemplateContextRegistry = org.eclipse.jdt.internal.ui.JavaPlugin
+ .getDefault().getCodeTemplateContextRegistry();
+ Iterator<?> ctIter = codeTemplateContextRegistry.contextTypes();
+
+ while (ctIter.hasNext()) {
+ TemplateContextType contextType = (TemplateContextType) ctIter
+ .next();
+ contextType.addResolver(new GitTemplateVariableResolver(
+ "git_config", //$NON-NLS-1$
+ UIText.GitTemplateVariableResolver_GitConfigDescription));
+ }
+ } catch (Throwable e) {
+ // while catching Throwable is an anti-pattern, we may
+ // experience NoClassDefFoundErrors here
+ Activator.logError(
+ "Cannot register git support for Java templates", //$NON-NLS-1$
+ e);
+ }
+ });
+ }
+}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIIcons.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIIcons.java
index fe794c36a3..48718be797 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIIcons.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIIcons.java
@@ -357,6 +357,12 @@ public class UIIcons {
public final static ImageDescriptor MERGE_TOOL;
/**
+ * Icon for opening the commit viewer. Don't confuse with {@link #COMMIT}
+ * operation icon.
+ */
+ public final static ImageDescriptor OPEN_COMMIT;
+
+ /**
* Icon for removing repositories from groups.
*/
public final static ImageDescriptor REMOVE_FROM_REPO_GROUP;
@@ -492,6 +498,7 @@ public class UIIcons {
OVR_CHECKEDOUT, IDecoration.TOP_LEFT);
SIGN_COMMIT = map("obj16/sign-commit.png"); //$NON-NLS-1$
MERGE_TOOL = map("obj16/mergetool.png"); //$NON-NLS-1$
+ OPEN_COMMIT = map("obj16/open-commit.png"); //$NON-NLS-1$
REMOVE_FROM_REPO_GROUP = map("obj16/clear.png"); //$NON-NLS-1$
}
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 c0ef84c2f0..4dee5adc07 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
@@ -2112,6 +2112,9 @@ public class UIText extends NLS {
public static String ResourceHistory_toggleRevComment;
/** */
+ public static String ResourceHistory_verifySignatures;
+
+ /** */
public static String HardResetToRevisionAction_hardReset;
/** */
@@ -2841,12 +2844,18 @@ public class UIText extends NLS {
public static String CreateRepositoryPage_BrowseButton;
/** */
+ public static String CreateRepositoryPage_DefaultBranchLabel;
+
+ /** */
public static String CreateRepositoryPage_DefaultRepositoryName;
/** */
public static String CreateRepositoryPage_DirectoryLabel;
/** */
+ public static String CreateRepositoryPage_InvalidBranchName;
+
+ /** */
public static String CreateRepositoryPage_NotEmptyMessage;
/** */
@@ -2859,6 +2868,9 @@ public class UIText extends NLS {
public static String CreateRepositoryPage_PleaseSelectDirectoryMessage;
/** */
+ public static String CreateRepositoryPage_ReadDefaultBranchFailed;
+
+ /** */
public static String PushResultDialog_ConfigureButton;
/** */
@@ -3450,6 +3462,27 @@ public class UIText extends NLS {
public static String CommittingPreferencePage_formatting;
/** */
+ public static String CommittingPreferencePage_gpgExecutableInvalid;
+
+ /** */
+ public static String CommittingPreferencePage_gpgExecutableLabel;
+
+ /** */
+ public static String CommittingPreferencePage_gpgExecutableNotExecutable;
+
+ /** */
+ public static String CommittingPreferencePage_gpgExecutableTooltip;
+
+ /** */
+ public static String CommittingPreferencePage_gpgSignerBouncyCastleLabel;
+
+ /** */
+ public static String CommittingPreferencePage_gpgSignerGpgLabel;
+
+ /** */
+ public static String CommittingPreferencePage_gpgSignerLabel;
+
+ /** */
public static String CommittingPreferencePage_includeUntrackedFiles;
/** */
@@ -3779,6 +3812,9 @@ public class UIText extends NLS {
public static String DeleteTagCommand_titleConfirm;
/** */
+ public static String FullWidthFileFieldEditor_buttonTooltipMac;
+
+ /** */
public static String IgnoreActionHandler_addToGitignore;
/** */
@@ -4022,6 +4058,9 @@ public class UIText extends NLS {
public static String DiffEditor_WarningNoDiffForMerge;
/** */
+ public static String DiffEditor_OutlineShowCompactTreeTooltip;
+
+ /** */
public static String DiffEditor_OutlineTreeToggle;
/** */
@@ -4559,27 +4598,87 @@ public class UIText extends NLS {
public static String TagAction_cannotGetBranchName;
/** */
+ public static String TagAction_cannotGetCommit;
+
+ /** */
public static String TagAction_repositoryState;
/** */
public static String TagAction_errorWhileGettingRevCommits;
/** */
- public static String TagAction_unableToResolveHeadObjectId;
+ public static String TagAction_creating;
/** */
- public static String TagAction_creating;
+ public static String TagAction_gpgConfigProblem;
/** */
public static String TagAction_taggingFailed;
/** */
+ public static String CommitPropertyDescriptor_OpenCommitLabel;
+
+ /** */
+ public static String CommitPropertyDescriptor_ShowInHistoryLabel;
+
+ /** */
+ public static String CommitPropertySource_CommitAuthor;
+
+ /** */
+ public static String CommitPropertySource_CommitId;
+
+ /** */
+ public static String CommitPropertySource_CommitCategory;
+
+ /** */
+ public static String CommitPropertySource_Committer;
+
+ /** */
+ public static String CommitPropertySource_CommitMessage;
+
+ /** */
+ public static String TagPropertySource_LightweightTag;
+
+ /** */
+ public static String TagPropertySource_TagCategory;
+
+ /** */
+ public static String TagPropertySource_TagId;
+
+ /** */
+ public static String TagPropertySource_TagMessage;
+
+ /** */
+ public static String TagPropertySource_TagName;
+
+ /** */
+ public static String TagPropertySource_TagTagger;
+
+ /** */
+ public static String TagPropertySource_TagTarget;
+
+ /** */
+ public static String PersonIdentPropertySource_Name;
+
+ /** */
+ public static String PersonIdentPropertySource_Email;
+
+ /** */
+ public static String PersonIdentPropertySource_Date;
+
+ /** */
public static String CreateTagDialog_tagName;
/** */
public static String CreateTagDialog_tagMessage;
/** */
+ public static String CreateTagDialog_noSigningKey;
+
+ /** */
+ public static String CreateTagDialog_noSigningKeyToolTip;
+
+ /** */
public static String CreateTagDialog_questionNewTagTitle;
/** */
@@ -4589,6 +4688,12 @@ public class UIText extends NLS {
public static String CreateTagDialog_overwriteTagToolTip;
/** */
+ public static String CreateTagDialog_signTag;
+
+ /** */
+ public static String CreateTagDialog_signTagToolTip;
+
+ /** */
public static String CreateTagDialog_tagMessageToolTip;
/** */
@@ -5098,9 +5203,6 @@ public class UIText extends NLS {
public static String RemoteConnectionPreferencePage_HttpClientLabel;
/** */
- public static String RemoteConnectionPreferencePage_SshClientLabel;
-
- /** */
public static String RemoteConnectionPreferencePage_TimeoutLabel;
/** */
@@ -5116,9 +5218,6 @@ public class UIText extends NLS {
public static String RefreshPreferencesPage_RefreshOnlyWhenActive;
/** */
- public static String RefreshPreferencesPage_RefreshWhenIndexChange;
-
- /** */
public static String RefUpdateElement_CommitCountDecoration;
/** */
@@ -5431,6 +5530,9 @@ public class UIText extends NLS {
public static String CommitJob_AbortedByHook;
/** */
+ public static String CommitJob_GpgConfigProblem;
+
+ /** */
public static String CommitResultLabelProvider_SectionAuthor;
/** */
@@ -5944,6 +6046,9 @@ public class UIText extends NLS {
public static String GitModelSynchronize_fetchGitDataJobName;
/** */
+ public static String GpgConfigProblemReportAction_Title;
+
+ /** */
public static String RebasePulldownAction_Continue;
/** */
@@ -5962,6 +6067,9 @@ public class UIText extends NLS {
public static String RewordHandler_ErrorCheckingIfCommitIsOnCurrentBranch;
/** */
+ public static String RewordHandler_GpgConfigProblem;
+
+ /** */
public static String RewordHandler_InternalError;
/** */
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/FetchActionHandler.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/FetchActionHandler.java
index 570f4aca08..1443b8ef1d 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/FetchActionHandler.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/FetchActionHandler.java
@@ -41,9 +41,9 @@ public class FetchActionHandler extends RepositoryActionHandler {
} catch (URISyntaxException x) {
ErrorDialog.openError(getShell(event),
UIText.FetchAction_wrongURITitle,
- UIText.FetchAction_wrongURIMessage, new Status(
- IStatus.ERROR, Activator.getPluginId(), x
- .getMessage(), x));
+ UIText.FetchAction_wrongURIMessage,
+ new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ x.getMessage(), x));
return null;
}
WizardDialog dlg = new WizardDialog(getShell(event), fetchWizard);
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/PushActionHandler.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/PushActionHandler.java
index 6294b24962..bfa45689ad 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/PushActionHandler.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/PushActionHandler.java
@@ -42,9 +42,9 @@ public class PushActionHandler extends RepositoryActionHandler {
} catch (URISyntaxException x) {
ErrorDialog.openError(getShell(event),
UIText.PushAction_wrongURITitle,
- UIText.PushAction_wrongURIDescription, new Status(
- IStatus.ERROR, Activator.getPluginId(), x
- .getMessage(), x));
+ UIText.PushAction_wrongURIDescription,
+ new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ x.getMessage(), x));
return null;
}
WizardDialog dlg = new WizardDialog(getShell(event), pushWizard);
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/TagActionHandler.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/TagActionHandler.java
index 327fa36f16..a5863045bf 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/TagActionHandler.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/TagActionHandler.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (C) 2010, 2019 Dariusz Luksza <dariusz@luksza.org> and others.
+ * Copyright (C) 2010, 2020 Dariusz Luksza <dariusz@luksza.org> and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -24,28 +24,28 @@ import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.egit.core.internal.IRepositoryCommit;
+import org.eclipse.egit.core.internal.signing.GpgConfigurationException;
import org.eclipse.egit.core.op.TagOperation;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.JobFamilies;
import org.eclipse.egit.ui.internal.UIText;
-import org.eclipse.egit.ui.internal.decorators.GitLightweightDecorator;
+import org.eclipse.egit.ui.internal.credentials.EGitCredentialsProvider;
import org.eclipse.egit.ui.internal.dialogs.CreateTagDialog;
+import org.eclipse.egit.ui.internal.jobs.GpgConfigProblemReportAction;
import org.eclipse.egit.ui.internal.push.PushTagsWizard;
+import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.TagBuilder;
-import org.eclipse.jgit.revwalk.RevObject;
+import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.ui.PlatformUI;
/**
* An action for creating a tag.
- *
- * @see TagOperation
*/
public class TagActionHandler extends RepositoryActionHandler {
@@ -80,52 +80,57 @@ public class TagActionHandler extends RepositoryActionHandler {
repo);
} else {
repo = commit.getRepository();
+ if (repo == null) {
+ return null;
+ }
dialog = new CreateTagDialog(getShell(event),
commit.getRevCommit().getId(), repo);
}
if (dialog.open() != Window.OK) {
return null;
}
- final TagBuilder tag = new TagBuilder();
- PersonIdent personIdent = new PersonIdent(repo);
- final String tagName = dialog.getTagName();
- tag.setTag(tagName);
- tag.setTagger(personIdent);
- tag.setMessage(dialog.getTagMessage());
-
- RevObject tagTarget;
+ RevCommit tagTarget;
if (commit == null) {
try {
tagTarget = getTagTarget(repo, dialog.getTagCommit());
- } catch (IOException e1) {
+ } catch (IOException e) {
Activator.handleError(
- UIText.TagAction_unableToResolveHeadObjectId, e1, true);
+ UIText.TagAction_cannotGetCommit, e, true);
return null;
}
} else {
tagTarget = commit.getRevCommit();
}
- tag.setObjectId(tagTarget);
+ String tagName = dialog.getTagName();
+
+ assert tagName != null;
+ assert tagTarget != null;
+
+ TagOperation operation = new TagOperation(repo)
+ .setName(tagName)
+ .setTarget(tagTarget)
+ .setAnnotated(dialog.isAnnotated())
+ .setForce(dialog.shouldOverWriteTag())
+ .setSign(dialog.shouldSign())
+ .setMessage(dialog.getTagMessage())
+ .setCredentialsProvider(new EGitCredentialsProvider());
String tagJobName = MessageFormat.format(UIText.TagAction_creating,
tagName);
- final boolean shouldMoveTag = dialog.shouldOverWriteTag();
- final boolean isAnnotated = dialog.isAnnotated();
+ Job job = new Job(tagJobName) {
- Job tagJob = new Job(tagJobName) {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
- new TagOperation(repo, tag, shouldMoveTag, isAnnotated)
- .execute(monitor);
+ operation.execute(monitor);
} catch (CoreException e) {
- return Activator.createErrorStatus(
- UIText.TagAction_taggingFailed, e);
- } finally {
- GitLightweightDecorator.refresh();
+ if (e.getCause() instanceof GpgConfigurationException) {
+ showGpgProblem(e.getStatus());
+ return Status.CANCEL_STATUS;
+ }
+ return e.getStatus();
}
-
return Status.OK_STATUS;
}
@@ -135,30 +140,36 @@ public class TagActionHandler extends RepositoryActionHandler {
|| super.belongsTo(family);
}
};
-
+ job.setRule(operation.getSchedulingRule());
+ job.setUser(true);
if (dialog.shouldStartPushWizard()) {
- tagJob.addJobChangeListener(new JobChangeAdapter() {
+ job.addJobChangeListener(new JobChangeAdapter() {
@Override
- public void done(IJobChangeEvent jobChangeEvent) {
- if (jobChangeEvent.getResult().isOK())
+ public void done(IJobChangeEvent jobEvent) {
+ if (jobEvent.getResult().isOK()) {
PushTagsWizard.openWizardDialog(repo, tagName);
+ }
}
});
}
-
- tagJob.setUser(true);
- tagJob.schedule();
+ job.schedule();
return null;
}
- private RevObject getTagTarget(Repository repo, ObjectId objectId)
+ private void showGpgProblem(IStatus status) {
+ IAction action = new GpgConfigProblemReportAction(status,
+ UIText.TagAction_gpgConfigProblem);
+ PlatformUI.getWorkbench().getDisplay().asyncExec(action::run);
+ }
+
+ private RevCommit getTagTarget(Repository repo, ObjectId objectId)
throws IOException {
try (RevWalk rw = new RevWalk(repo)) {
- if (objectId == null)
- return rw.parseAny(repo.resolve(Constants.HEAD));
- else
- return rw.parseAny(objectId);
+ if (objectId == null) {
+ return rw.parseCommit(repo.resolve(Constants.HEAD));
+ }
+ return rw.parseCommit(objectId);
}
}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/AbstractGitCloneWizard.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/AbstractGitCloneWizard.java
index f57f830f1f..6bcde8f617 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/AbstractGitCloneWizard.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/AbstractGitCloneWizard.java
@@ -249,7 +249,7 @@ public abstract class AbstractGitCloneWizard extends Wizard {
UIText.GitCloneWizard_errorCannotCreate, workdir.getPath());
ErrorDialog.openError(getShell(), getWindowTitle(),
UIText.GitCloneWizard_failed, new Status(IStatus.ERROR,
- Activator.getPluginId(), 0, errorMessage, null));
+ Activator.PLUGIN_ID, errorMessage, null));
// let's give user a chance to fix this minor problem
return false;
}
@@ -462,8 +462,8 @@ public abstract class AbstractGitCloneWizard extends Wizard {
return Status.CANCEL_STATUS;
} catch (InvocationTargetException e) {
Throwable thr = e.getCause();
- return new Status(IStatus.ERROR, Activator.getPluginId(),
- 0, thr.getMessage(), thr);
+ return new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ thr.getMessage(), thr);
}
}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commands/shared/AbstractRebaseCommandHandler.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commands/shared/AbstractRebaseCommandHandler.java
index ce6de8adc9..a702cff8bf 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commands/shared/AbstractRebaseCommandHandler.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commands/shared/AbstractRebaseCommandHandler.java
@@ -268,7 +268,7 @@ public abstract class AbstractRebaseCommandHandler extends AbstractSharedCommand
} catch (CoreException e1) {
IStatus childStatus = Activator.createErrorStatus(
e1.getMessage(), e1);
- IStatus mStatus = new MultiStatus(Activator.getPluginId(),
+ IStatus mStatus = new MultiStatus(Activator.PLUGIN_ID,
IStatus.ERROR, new IStatus[] { childStatus },
t.getMessage(), t);
CoreException mStatusException = new CoreException(mStatus);
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/CommitEditor.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/CommitEditor.java
index 72f10eeca9..833d90802a 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/CommitEditor.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/CommitEditor.java
@@ -20,11 +20,14 @@ import org.eclipse.core.runtime.Adapters;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
+import org.eclipse.egit.core.internal.IRepositoryCommit;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.internal.CommonUtils;
import org.eclipse.egit.ui.internal.UIIcons;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.internal.actions.ActionCommands;
+import org.eclipse.egit.ui.internal.properties.CommitPropertySource;
+import org.eclipse.egit.ui.internal.properties.GitPropertySheetPage;
import org.eclipse.egit.ui.internal.repository.RepositoriesView;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
@@ -41,7 +44,7 @@ import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.StashListCommand;
import org.eclipse.jgit.events.ListenerHandle;
import org.eclipse.jgit.events.RefsChangedEvent;
import org.eclipse.jgit.events.RefsChangedListener;
@@ -80,6 +83,9 @@ import org.eclipse.ui.part.ShowInContext;
import org.eclipse.ui.progress.UIJob;
import org.eclipse.ui.services.IEvaluationService;
import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+import org.eclipse.ui.views.properties.IPropertySheetPage;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.PropertySheetPage;
/**
* Editor class to view a commit in a form editor.
@@ -442,11 +448,12 @@ public class CommitEditor extends SharedHeaderFormEditor implements
private int getStashIndex(Repository repo, ObjectId id) {
int index = 0;
try {
- for (RevCommit commit : Git.wrap(repo).stashList().call())
- if (commit.getId().equals(id))
+ for (RevCommit commit : new StashListCommand(repo).call()) {
+ if (commit.getId().equals(id)) {
return index;
- else
- index++;
+ }
+ index++;
+ }
throw new IllegalStateException(
UIText.CommitEditor_couldNotFindStashCommit);
} catch (Exception e) {
@@ -482,6 +489,19 @@ public class CommitEditor extends SharedHeaderFormEditor implements
return Adapters.adapt(getEditorInput(), adapter);
} else if (IContentOutlinePage.class == adapter) {
return adapter.cast(getOutlinePage());
+ } else if (IPropertySheetPage.class == adapter) {
+ PropertySheetPage page = new GitPropertySheetPage();
+ page.setPropertySourceProvider(object -> {
+ if (object instanceof IPropertySource) {
+ return (IPropertySource) object;
+ }
+ if (object instanceof IRepositoryCommit) {
+ return new CommitPropertySource(
+ ((IRepositoryCommit) object).getRevCommit(), page);
+ }
+ return null;
+ });
+ return adapter.cast(page);
}
return super.getAdapter(adapter);
}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/CommitJob.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/CommitJob.java
index 998490e617..62ef0b29fa 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/CommitJob.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/CommitJob.java
@@ -22,6 +22,7 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.egit.core.internal.signing.GpgConfigurationException;
import org.eclipse.egit.core.op.CommitOperation;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.JobFamilies;
@@ -29,10 +30,12 @@ import org.eclipse.egit.ui.UIPreferences;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.internal.decorators.GitLightweightDecorator;
import org.eclipse.egit.ui.internal.dialogs.CommitMessageComponentStateManager;
+import org.eclipse.egit.ui.internal.jobs.GpgConfigProblemReportAction;
import org.eclipse.egit.ui.internal.push.PushMode;
import org.eclipse.egit.ui.internal.push.PushOperationUI;
import org.eclipse.egit.ui.internal.push.PushWizardDialog;
import org.eclipse.egit.ui.internal.push.SimpleConfigurePushDialog;
+import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jgit.api.errors.AbortedByHookException;
@@ -103,7 +106,15 @@ public class CommitJob extends Job {
commit = commitOperation.getCommit();
CommitMessageComponentStateManager.deleteState(repository);
} catch (CoreException e) {
- if (e.getCause() instanceof JGitInternalException) {
+ if (e.getCause() instanceof GpgConfigurationException) {
+ showGpgProblem(e.getStatus());
+ return Status.CANCEL_STATUS;
+ } else if (e.getCause() instanceof JGitInternalException) {
+ if (e.getCause()
+ .getCause() instanceof GpgConfigurationException) {
+ showGpgProblem(e.getStatus());
+ return Status.CANCEL_STATUS;
+ }
return Activator.createErrorStatus(e.getLocalizedMessage(),
e.getCause());
} else if (e.getCause() instanceof AbortedByHookException) {
@@ -130,6 +141,12 @@ public class CommitJob extends Job {
return Status.OK_STATUS;
}
+ private void showGpgProblem(IStatus status) {
+ IAction action = new GpgConfigProblemReportAction(status,
+ UIText.CommitJob_GpgConfigProblem);
+ PlatformUI.getWorkbench().getDisplay().asyncExec(action::run);
+ }
+
private void showAbortedByHook(final AbortedByHookException cause) {
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
@@ -141,8 +158,8 @@ public class CommitJob extends Job {
@Override
public void run() {
MessageDialog.openWarning(PlatformUI.getWorkbench()
- .getDisplay().getActiveShell(), createTitle(),
- cause.getHookStdErr());
+ .getModalDialogShellProvider().getShell(),
+ createTitle(), cause.getHookStdErr());
}
});
}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffEditor.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffEditor.java
index 98201daf53..7a0a1e0df4 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffEditor.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffEditor.java
@@ -26,7 +26,6 @@ import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Adapters;
import org.eclipse.core.runtime.CoreException;
@@ -74,6 +73,7 @@ import org.eclipse.jface.text.source.projection.ProjectionViewer;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.window.Window;
import org.eclipse.jgit.annotations.NonNull;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
@@ -83,7 +83,6 @@ import org.eclipse.jgit.treewalk.filter.TreeFilter;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
import org.eclipse.team.ui.history.IHistoryView;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.PlatformUI;
@@ -217,10 +216,8 @@ public class DiffEditor extends TextEditor
@Override
protected void performSaveAs(IProgressMonitor progressMonitor) {
- Shell shell = getSite().getShell();
- SaveAsDialog dialog = new SaveAsDialog(shell);
- dialog.open();
- IPath path = dialog.getResult();
+ SaveAsDialog dialog = new SaveAsDialog(getSite().getShell());
+ IPath path = dialog.open() == Window.CANCEL ? null : dialog.getResult();
if (path == null) {
if (progressMonitor != null) {
@@ -229,11 +226,11 @@ public class DiffEditor extends TextEditor
return;
}
- IWorkspace workspace = ResourcesPlugin.getWorkspace();
- IFile file = workspace.getRoot().getFile(path);
+ IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
IEditorInput newInput = new FileEditorInput(file);
WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
+
@Override
public void execute(final IProgressMonitor monitor)
throws CoreException {
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffEditorOutlinePage.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffEditorOutlinePage.java
index c887c575a6..01cfea2a22 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffEditorOutlinePage.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffEditorOutlinePage.java
@@ -14,6 +14,7 @@ import java.io.File;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
@@ -24,8 +25,8 @@ import java.util.stream.Collectors;
import org.eclipse.core.runtime.Path;
import org.eclipse.egit.core.internal.Utils;
import org.eclipse.egit.ui.Activator;
+import org.eclipse.egit.ui.UIPreferences;
import org.eclipse.egit.ui.UIUtils;
-import org.eclipse.egit.ui.internal.CommonUtils;
import org.eclipse.egit.ui.internal.UIIcons;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.internal.commit.DiffRegionFormatter.FileDiffRegion;
@@ -97,6 +98,13 @@ import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
*/
public class DiffEditorOutlinePage extends ContentOutlinePage {
+ static final Comparator<String> CMP = (left, right) -> {
+ String l = left.startsWith("/") ? left.substring(1) : left; //$NON-NLS-1$
+ String r = right.startsWith("/") ? right.substring(1) : right; //$NON-NLS-1$
+ return l.replace('/', '\001')
+ .compareToIgnoreCase(r.replace('/', '\001'));
+ };
+
private IDocument input;
private CopyOnWriteArrayList<IOpenListener> openListeners = new CopyOnWriteArrayList<>();
@@ -105,6 +113,10 @@ public class DiffEditorOutlinePage extends ContentOutlinePage {
private ActionHandler collapseHandler;
+ private IAction collapseAction;
+
+ private IAction togglePresentationAction;
+
@Override
public void createControl(Composite parent) {
super.createControl(parent);
@@ -114,7 +126,7 @@ public class DiffEditorOutlinePage extends ContentOutlinePage {
viewer.setContentProvider(new DiffContentProvider());
viewer.setLabelProvider(new DiffLabelProvider());
viewer.setComparator(
- new ViewerComparator(CommonUtils.STRING_ASCENDING_COMPARATOR) {
+ new ViewerComparator(CMP) {
@Override
public int category(Object element) {
if (element instanceof DiffContentProvider.Folder) {
@@ -129,6 +141,7 @@ public class DiffEditorOutlinePage extends ContentOutlinePage {
viewer.addOpenListener(this::fireOpenEvent);
if (input != null) {
viewer.setInput(input);
+ updateToolbarActions();
}
createContextMenu(viewer);
if (selection != null) {
@@ -147,6 +160,7 @@ public class DiffEditorOutlinePage extends ContentOutlinePage {
TreeViewer viewer = getTreeViewerChecked();
if (viewer != null) {
viewer.setInput(input);
+ updateToolbarActions();
}
}
@@ -385,7 +399,7 @@ public class DiffEditorOutlinePage extends ContentOutlinePage {
}
private void addToolbarActions(IToolBarManager toolbarManager) {
- Action collapseAction = new Action(UIText.UIUtils_CollapseAll,
+ collapseAction = new Action(UIText.UIUtils_CollapseAll,
PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
ISharedImages.IMG_ELCL_COLLAPSEALL)) {
@Override
@@ -401,34 +415,49 @@ public class DiffEditorOutlinePage extends ContentOutlinePage {
handlerService.activateHandler(collapseAction.getActionDefinitionId(),
collapseHandler);
- Action toggleTreeModeAction = new Action(
- UIText.DiffEditor_OutlineTreeToggle) {
+ IPreferenceStore preferences = Activator.getDefault()
+ .getPreferenceStore();
+ togglePresentationAction = new Action(
+ UIText.DiffEditor_OutlineTreeToggle, IAction.AS_CHECK_BOX) {
@Override
public void run() {
- updateOutlineTreeMode(true, this);
+ boolean compact = isChecked();
+ preferences.setValue(UIPreferences.DIFF_OUTLINE_PRESENTATION,
+ compact);
+ ((DiffContentProvider) getTreeViewer().getContentProvider())
+ .setCompactTree(compact);
+ getTreeViewer().setInput(getTreeViewer().getInput());
}
};
- updateOutlineTreeMode(false, toggleTreeModeAction);
+ togglePresentationAction.setImageDescriptor(UIIcons.COMPACT);
+ togglePresentationAction.setToolTipText(
+ UIText.DiffEditor_OutlineShowCompactTreeTooltip);
+ boolean compact = preferences
+ .getBoolean(UIPreferences.DIFF_OUTLINE_PRESENTATION);
+ togglePresentationAction.setChecked(compact);
+ updateToolbarActions();
toolbarManager.add(collapseAction);
- toolbarManager.add(toggleTreeModeAction);
- }
-
- private void updateOutlineTreeMode(boolean doToggle, Action toggleAction) {
- IPreferenceStore preference = Activator.getDefault()
- .getPreferenceStore();
- String prefID = "DiffEditorOutline.compactTree"; //$NON-NLS-1$
- boolean compact = preference.getBoolean(prefID);
- if (doToggle) {
- compact = !compact;
- }
+ toolbarManager.add(togglePresentationAction);
((DiffContentProvider) getTreeViewer().getContentProvider())
.setCompactTree(compact);
- toggleAction
- .setImageDescriptor(compact ? UIIcons.COMPACT : UIIcons.FLAT);
- preference.setValue(prefID, compact);
getTreeViewer().setInput(getTreeViewer().getInput());
}
+ private void updateToolbarActions() {
+ TreeViewer viewer = getTreeViewerChecked();
+ if (viewer == null) {
+ return;
+ }
+ boolean hasElements = ((DiffContentProvider) viewer
+ .getContentProvider()).hasElements();
+ if (collapseAction != null) {
+ collapseAction.setEnabled(hasElements);
+ }
+ if (togglePresentationAction != null) {
+ togglePresentationAction.setEnabled(hasElements);
+ }
+ }
+
@Override
public void dispose() {
if (collapseHandler != null) {
@@ -484,6 +513,10 @@ public class DiffEditorOutlinePage extends ContentOutlinePage {
parents.clear();
}
+ public boolean hasElements() {
+ return !rootFolders.isEmpty();
+ }
+
@Override
public Object[] getElements(Object inputElement) {
if (inputElement instanceof DiffDocument) {
@@ -558,6 +591,9 @@ public class DiffEditorOutlinePage extends ContentOutlinePage {
private void compactify() {
Folder root = rootFolders.get(SLASH);
+ if (root == null) {
+ return;
+ }
compactify(root);
if (root.files.isEmpty()) {
rootFolders.clear();
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/HeaderText.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/HeaderText.java
index cffeeb916d..ef3a8c5059 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/HeaderText.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/HeaderText.java
@@ -19,8 +19,6 @@ import org.eclipse.egit.ui.UIUtils;
import org.eclipse.egit.ui.internal.ClipboardUtils;
import org.eclipse.egit.ui.internal.UIIcons;
import org.eclipse.egit.ui.internal.UIText;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.TextViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.ControlAdapter;
@@ -72,18 +70,17 @@ public class HeaderText {
field.setAccessible(true);
TitleRegion titleRegion = (TitleRegion) field.get(heading);
- for (Control child : titleRegion.getChildren())
+ for (Control child : titleRegion.getChildren()) {
if (child instanceof BusyIndicator) {
busyLabel = (BusyIndicator) child;
break;
}
- if (busyLabel == null)
+ }
+ if (busyLabel == null) {
throw new IllegalArgumentException();
-
- final TextViewer titleViewer = new TextViewer(titleRegion, SWT.READ_ONLY);
- titleViewer.setDocument(new Document(text));
-
- titleLabel = titleViewer.getTextWidget();
+ }
+ titleLabel = new StyledText(titleRegion, SWT.READ_ONLY);
+ titleLabel.setText(text);
titleLabel.setForeground(heading.getForeground());
titleLabel.setFont(heading.getFont());
titleLabel.addFocusListener(new FocusAdapter() {
@@ -130,6 +127,7 @@ public class HeaderText {
Point size = titleLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
int y = (titleLabel.getParent().getSize().y - size.y) / 2;
titleLabel.setBounds(busyLabel.getLocation().x, y, size.x, size.y);
+ busyLabel.setBounds(titleLabel.getBounds());
}
private static void createContextMenu(final StyledText styledText, final String sha1String) {
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/command/CherryPickUI.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/command/CherryPickUI.java
index 7fc0e5accd..9966ce1ed6 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/command/CherryPickUI.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/command/CherryPickUI.java
@@ -305,8 +305,7 @@ public class CherryPickUI {
private static IStatus getErrorList(
Map<String, MergeFailureReason> failingPaths) {
- MultiStatus result = new MultiStatus(Activator.getPluginId(),
- IStatus.ERROR,
+ MultiStatus result = new MultiStatus(Activator.PLUGIN_ID, IStatus.ERROR,
UIText.CherryPickHandler_CherryPickFailedMessage, null);
for (Entry<String, MergeFailureReason> entry : failingPaths.entrySet()) {
String path = entry.getKey();
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/command/RewordHandler.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/command/RewordHandler.java
index 24330301fb..5a27191033 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/command/RewordHandler.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/command/RewordHandler.java
@@ -1,5 +1,6 @@
/*******************************************************************************
- * Copyright (c) 2014 Maik Schreiber
+ * Copyright (c) 2014, 2020 Maik Schreiber and others.
+ *
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
@@ -16,21 +17,21 @@ import java.text.MessageFormat;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.egit.core.internal.signing.GpgConfigurationException;
import org.eclipse.egit.core.op.RewordCommitOperation;
-import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.JobFamilies;
-import org.eclipse.egit.ui.internal.UIRepositoryUtils;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.internal.handler.SelectionHandler;
+import org.eclipse.egit.ui.internal.jobs.GpgConfigProblemReportAction;
+import org.eclipse.egit.ui.internal.jobs.RepositoryJob;
import org.eclipse.egit.ui.internal.rebase.CommitMessageEditorDialog;
+import org.eclipse.jface.action.IAction;
import org.eclipse.jface.window.Window;
-import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.swt.widgets.Shell;
@@ -52,31 +53,34 @@ public class RewordHandler extends SelectionHandler {
Shell shell = getPart(event).getSite().getShell();
- try {
- if (!UIRepositoryUtils.handleUncommittedFiles(repo, shell))
- return null;
- } catch (GitAPIException e) {
- Activator.logError(e.getMessage(), e);
- return null;
- }
-
String newMessage = promptCommitMessage(shell, commit);
- if (newMessage == null)
+ if (newMessage == null || newMessage.equals(commit.getFullMessage())) {
return null;
+ }
final RewordCommitOperation op = new RewordCommitOperation(repo,
commit, newMessage);
- Job job = new WorkspaceJob(MessageFormat.format(
- UIText.RewordHandler_JobName,
- commit.name())) {
+ Job job = new RepositoryJob(MessageFormat.format(
+ UIText.RewordHandler_JobName, commit.name()), null) {
+
+ private IStatus gpgConfigProblem;
@Override
- public IStatus runInWorkspace(IProgressMonitor monitor) {
+ protected IStatus performJob(IProgressMonitor monitor) {
try {
op.execute(monitor);
} catch (CoreException e) {
- Activator.logError(UIText.RewordHandler_InternalError, e);
+ IStatus status = e.getStatus();
+ if (status
+ .getException() instanceof GpgConfigurationException) {
+ gpgConfigProblem = e.getStatus();
+ // We're going to show our own dialog
+ return Status.OK_STATUS;
+ }
+ return status;
+ } finally {
+ monitor.done();
}
return Status.OK_STATUS;
}
@@ -87,6 +91,15 @@ public class RewordHandler extends SelectionHandler {
return true;
return super.belongsTo(family);
}
+
+ @Override
+ protected IAction getAction() {
+ if (gpgConfigProblem == null || gpgConfigProblem.isOK()) {
+ return null;
+ }
+ return new GpgConfigProblemReportAction(gpgConfigProblem,
+ UIText.RewordHandler_GpgConfigProblem);
+ }
};
job.setUser(true);
job.setRule(op.getSchedulingRule());
@@ -95,18 +108,8 @@ public class RewordHandler extends SelectionHandler {
}
private String promptCommitMessage(final Shell shell, RevCommit commit) {
- final String[] message = { commit.getFullMessage() };
- shell.getDisplay().syncExec(new Runnable() {
- @Override
- public void run() {
- CommitMessageEditorDialog dialog = new CommitMessageEditorDialog(
- shell, message[0]);
- if (dialog.open() == Window.OK)
- message[0] = dialog.getCommitMessage();
- else
- message[0] = null;
- }
- });
- return message[0];
+ CommitMessageEditorDialog dialog = new CommitMessageEditorDialog(shell,
+ commit.getFullMessage());
+ return dialog.open() == Window.OK ? dialog.getCommitMessage() : null;
}
}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/command/SquashHandler.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/command/SquashHandler.java
index 57f972c773..93e290a37c 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/command/SquashHandler.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/command/SquashHandler.java
@@ -39,6 +39,7 @@ import org.eclipse.jgit.lib.RebaseTodoLine;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
/** Handler to squash multiple commits into one. */
public class SquashHandler extends SelectionHandler {
@@ -75,7 +76,7 @@ public class SquashHandler extends SelectionHandler {
@Override
public String modifyCommitMessage(String oldMessage) {
- return promptCommitMessage(shell, oldMessage);
+ return promptCommitMessage(oldMessage);
}
};
@@ -106,19 +107,16 @@ public class SquashHandler extends SelectionHandler {
return null;
}
- private String promptCommitMessage(final Shell shell, final String message) {
- final String[] msg = { message };
- shell.getDisplay().syncExec(new Runnable() {
- @Override
- public void run() {
- CommitMessageEditorDialog dialog = new CommitMessageEditorDialog(
- shell, msg[0],
- UIText.CommitMessageEditorDialog_OkButton,
- UIText.SquashHandler_EditMessageDialogCancelButton);
- if (dialog.open() == Window.OK)
- msg[0] = dialog.getCommitMessage();
- else
- msg[0] = message;
+ private String promptCommitMessage(String message) {
+ String[] msg = { message };
+ PlatformUI.getWorkbench().getDisplay().syncExec(() -> {
+ Shell shell = PlatformUI.getWorkbench()
+ .getModalDialogShellProvider().getShell();
+ CommitMessageEditorDialog dialog = new CommitMessageEditorDialog(
+ shell, msg[0], UIText.CommitMessageEditorDialog_OkButton,
+ UIText.SquashHandler_EditMessageDialogCancelButton);
+ if (dialog.open() == Window.OK) {
+ msg[0] = dialog.getCommitMessage();
}
});
return msg[0];
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/command/StashApplyHandler.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/command/StashApplyHandler.java
index aa5f5e2f73..a91f127a84 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/command/StashApplyHandler.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/command/StashApplyHandler.java
@@ -46,14 +46,15 @@ public class StashApplyHandler extends SelectionHandler {
final StashApplyOperation op = new StashApplyOperation(repo, commit);
Job job = new WorkspaceJob(MessageFormat.format(
- UIText.StashApplyCommand_jobTitle, commit.name())) {
+ UIText.StashApplyCommand_jobTitle,
+ Utils.getShortObjectId(commit))) {
@Override
public IStatus runInWorkspace(IProgressMonitor monitor) {
try {
op.execute(monitor);
} catch (CoreException e) {
- return new Status(IStatus.ERROR, Activator.getPluginId(),
+ return new Status(IStatus.ERROR, Activator.PLUGIN_ID,
MessageFormat.format(
UIText.StashApplyCommand_applyFailed,
Utils.getShortObjectId(commit),
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/credentials/SignatureUtils.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/credentials/SignatureUtils.java
new file mode 100644
index 0000000000..f5f358696b
--- /dev/null
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/credentials/SignatureUtils.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (C) 2019, 2020 Salesforce and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Gunnar Wagenknecht 2019 - initial API
+ * Thomas Wolf 2020 - extracted from CommmitMessageComponent
+ *******************************************************************************/
+package org.eclipse.egit.ui.internal.credentials;
+
+import org.eclipse.egit.core.internal.signing.GpgSetup;
+import org.eclipse.jgit.annotations.NonNull;
+import org.eclipse.jgit.api.errors.CanceledException;
+import org.eclipse.jgit.api.errors.UnsupportedSigningFormatException;
+import org.eclipse.jgit.errors.UnsupportedCredentialItem;
+import org.eclipse.jgit.lib.GpgConfig;
+import org.eclipse.jgit.lib.GpgObjectSigner;
+import org.eclipse.jgit.lib.GpgSigner;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.transport.CredentialItem;
+import org.eclipse.jgit.transport.CredentialsProvider;
+import org.eclipse.jgit.transport.URIish;
+
+/**
+ * Utilities for working with signatures.
+ */
+public final class SignatureUtils {
+
+ private SignatureUtils() {
+ // No instantiation
+ }
+
+ /**
+ * Checks whether a signing key for the given identification can be found by
+ * the default {@link GpgSigner#getDefault() GpgSigner}.
+ *
+ * @param config
+ * to use
+ * @param personIdent
+ * to use as a fallback if no {@link GpgConfig#getSigningKey()
+ * signing key ID} is provided by {@code config}
+ * @return {@code true} if signing appears to be possible, {@code false}
+ * otherwise
+ */
+ public static boolean checkSigningKey(@NonNull GpgConfig config,
+ @NonNull PersonIdent personIdent) {
+ return checkSigningKey(GpgSetup.getDefault(), config, personIdent);
+ }
+
+ /**
+ * Checks whether a signing key for the given identification can be found by
+ * the given {@link GpgSigner}.
+ *
+ * @param signer
+ * to use for the check
+ * @param config
+ * to use
+ * @param personIdent
+ * to use as a fallback if no {@link GpgConfig#getSigningKey()
+ * signing key ID} is provided by {@code config}
+ * @return {@code true} if signing appears to be possible, {@code false}
+ * otherwise
+ */
+ public static boolean checkSigningKey(GpgSigner signer,
+ @NonNull GpgConfig config, @NonNull PersonIdent personIdent) {
+ if (signer != null) {
+ try {
+ CredentialsProvider credentials = new CredentialsProvider() {
+
+ @Override
+ public boolean supports(CredentialItem... items) {
+ return true;
+ }
+
+ @Override
+ public boolean isInteractive() {
+ return false;
+ }
+
+ @Override
+ public boolean get(URIish uri, CredentialItem... items)
+ throws UnsupportedCredentialItem {
+ return false;
+ }
+ };
+ if (signer instanceof GpgObjectSigner) {
+ return ((GpgObjectSigner) signer).canLocateSigningKey(
+ config.getSigningKey(), personIdent, credentials,
+ config);
+ }
+ return signer.canLocateSigningKey(config.getSigningKey(),
+ personIdent, credentials);
+ } catch (CanceledException e) {
+ // interpret this as "ok" - a passphrase was asked and canceled
+ // by our no-op CredentialsProvider
+ return true;
+ } catch (UnsupportedSigningFormatException e) {
+ return false;
+ }
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/decorators/GitLightweightDecorator.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/decorators/GitLightweightDecorator.java
index 4d1054fdc7..3bbd2ab91d 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/decorators/GitLightweightDecorator.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/decorators/GitLightweightDecorator.java
@@ -94,7 +94,7 @@ public class GitLightweightDecorator extends GitDecorator
* Collector for keeping the error view from filling up with exceptions
*/
private static final ExceptionCollector EXCEPTION_COLLECTOR = new ExceptionCollector(
- UIText.Decorator_exceptionMessageCommon, Activator.getPluginId(),
+ UIText.Decorator_exceptionMessageCommon, Activator.PLUGIN_ID,
IStatus.ERROR, Activator.getDefault().getLog());
/** ID of the new symbolic font for trees and tables since Eclipse 4.17. */
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CommitDialog.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CommitDialog.java
index b0bc951131..ae9ade32d5 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CommitDialog.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CommitDialog.java
@@ -36,6 +36,7 @@ import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.egit.core.internal.signing.GpgSetup;
import org.eclipse.egit.core.internal.util.ResourceUtil;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.UIPreferences;
@@ -91,7 +92,6 @@ import org.eclipse.jgit.api.AddCommand;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.FileMode;
-import org.eclipse.jgit.lib.GpgSigner;
import org.eclipse.jgit.lib.IndexDiff;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryState;
@@ -340,8 +340,8 @@ public class CommitDialog extends TitleAreaDialog {
private static final String SHOW_UNTRACKED_PREF = "CommitDialog.showUntracked"; //$NON-NLS-1$
- private static final String DIALOG_SETTINGS_SECTION_NAME = Activator
- .getPluginId() + ".COMMIT_DIALOG_SECTION"; //$NON-NLS-1$
+ private static final String DIALOG_SETTINGS_SECTION_NAME = Activator.PLUGIN_ID
+ + ".COMMIT_DIALOG_SECTION"; //$NON-NLS-1$
/**
* A constant used for the 'commit and push button' button
@@ -1157,7 +1157,7 @@ public class CommitDialog extends TitleAreaDialog {
}
});
- boolean canSign = GpgSigner.getDefault() != null;
+ boolean canSign = GpgSetup.getDefault() != null;
signCommitItem.setEnabled(canSign);
if (!canSign) {
signCommitItem
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 99205650e1..3fbc30002f 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
@@ -20,13 +20,16 @@
*******************************************************************************/
package org.eclipse.egit.ui.internal.dialogs;
+import java.io.File;
import java.io.IOException;
+import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.regex.Pattern;
import org.eclipse.egit.core.RevUtils;
import org.eclipse.egit.core.internal.gerrit.GerritUtil;
+import org.eclipse.egit.core.settings.GitSettings;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.CommitMessageWithCaretPosition;
import org.eclipse.egit.ui.UIPreferences;
@@ -36,6 +39,7 @@ import org.eclipse.egit.ui.internal.CommonUtils;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.internal.commit.CommitHelper;
import org.eclipse.egit.ui.internal.commit.CommitHelper.CommitInfo;
+import org.eclipse.egit.ui.internal.credentials.SignatureUtils;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.text.BadLocationException;
@@ -44,23 +48,18 @@ import org.eclipse.jface.text.DocumentEvent;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentListener;
import org.eclipse.jface.text.IRegion;
-import org.eclipse.jgit.annotations.NonNull;
-import org.eclipse.jgit.api.errors.CanceledException;
-import org.eclipse.jgit.errors.UnsupportedCredentialItem;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.GpgConfig;
-import org.eclipse.jgit.lib.GpgSigner;
+import org.eclipse.jgit.lib.GpgConfig.GpgFormat;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryState;
import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.transport.CredentialItem;
-import org.eclipse.jgit.transport.CredentialsProvider;
-import org.eclipse.jgit.transport.URIish;
import org.eclipse.jgit.util.ChangeIdUtil;
import org.eclipse.jgit.util.RawParseUtils;
+import org.eclipse.jgit.util.StringUtils;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.widgets.Shell;
@@ -581,15 +580,34 @@ public class CommitMessageComponent {
}
if (signCommit) {
- String signingKey = repository != null
- ? new GpgConfig(repository.getConfig()).getSigningKey()
- : null;
- boolean signingKeyAvailable = checkSigningKey(signingKey,
- committerPersonIdent);
+ // Ensure the Eclipse preference, if set, overrides the git config
+ File gpg = GitSettings.getGpgExecutable();
+ GpgConfig gpgConfig;
+ if (repository != null) {
+ gpgConfig = new GpgConfig(repository.getConfig()) {
+
+ @Override
+ public String getProgram() {
+ return gpg != null ? gpg.getAbsolutePath()
+ : super.getProgram();
+ }
+ };
+ } else {
+ gpgConfig = new GpgConfig(null, GpgFormat.OPENPGP,
+ gpg != null ? gpg.getAbsolutePath() : null);
+ }
+ boolean signingKeyAvailable = SignatureUtils
+ .checkSigningKey(gpgConfig, committerPersonIdent);
if (!signingKeyAvailable) {
+ String signingKey = gpgConfig.getSigningKey();
+ if (StringUtils.isEmptyOrNull(signingKey)) {
+ signingKey = committerPersonIdent.getEmailAddress();
+ }
MessageDialog.openWarning(getShell(),
UIText.CommitMessageComponent_ErrorMissingSigningKey,
- UIText.CommitMessageComponent_ErrorNoSigningKeyFound);
+ MessageFormat.format(
+ UIText.CommitMessageComponent_ErrorNoSigningKeyFound,
+ signingKey));
return false;
}
}
@@ -598,41 +616,6 @@ public class CommitMessageComponent {
return true;
}
- private boolean checkSigningKey(String signingKey,
- @NonNull PersonIdent personIdent) {
- GpgSigner signer = GpgSigner.getDefault();
- if (signer != null) {
- try {
- return signer.canLocateSigningKey(signingKey,
- personIdent,
- new CredentialsProvider() {
-
- @Override
- public boolean supports(CredentialItem... items) {
- return true;
- }
-
- @Override
- public boolean isInteractive() {
- return false;
- }
-
- @Override
- public boolean get(URIish uri,
- CredentialItem... items)
- throws UnsupportedCredentialItem {
- return false;
- }
- });
- } catch (CanceledException e) {
- // interpret this as "ok" - a passphrase was asked and canceled
- // by our no-op CredentialsProvider
- return true;
- }
- }
- return false;
- }
-
/**
* @param commitText
* @param authorText
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CreateTagDialog.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CreateTagDialog.java
index 277c623297..b1943aa1cb 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CreateTagDialog.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CreateTagDialog.java
@@ -12,8 +12,10 @@
*******************************************************************************/
package org.eclipse.egit.ui.internal.dialogs;
+import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
+import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
@@ -24,6 +26,8 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.egit.core.internal.signing.GpgSetup;
+import org.eclipse.egit.core.settings.GitSettings;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.JobFamilies;
import org.eclipse.egit.ui.UIUtils;
@@ -33,6 +37,7 @@ import org.eclipse.egit.ui.internal.UIIcons;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.internal.ValidationUtils;
import org.eclipse.egit.ui.internal.components.BranchNameNormalizer;
+import org.eclipse.egit.ui.internal.credentials.SignatureUtils;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.TitleAreaDialog;
@@ -51,10 +56,15 @@ import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.jgit.annotations.Nullable;
import org.eclipse.jgit.errors.RevisionSyntaxException;
import org.eclipse.jgit.lib.AnyObjectId;
import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.GpgConfig;
+import org.eclipse.jgit.lib.GpgObjectSigner;
+import org.eclipse.jgit.lib.GpgSigner;
import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
@@ -62,8 +72,10 @@ import org.eclipse.jgit.revwalk.RevObject;
import org.eclipse.jgit.revwalk.RevSort;
import org.eclipse.jgit.revwalk.RevTag;
import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.util.StringUtils;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
@@ -81,6 +93,7 @@ import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
@@ -132,6 +145,20 @@ public class CreateTagDialog extends TitleAreaDialog {
private Button overwriteButton;
+ private Button signButton;
+
+ /**
+ * Set to {@code true} once the user explicitly checks or unchecks the
+ * signButton.
+ */
+ private boolean signExplicit;
+
+ private boolean signAll;
+
+ private boolean signAnnotated;
+
+ private boolean signUser;
+
private TableViewer tagViewer;
private CommitCombo commitCombo;
@@ -299,6 +326,20 @@ public class CreateTagDialog extends TitleAreaDialog {
}
/**
+ * Indicates whether the tag should be signed.
+ *
+ * @return whether tag should be signed, {@code null} means the user made no
+ * choice and the git config decides.
+ */
+ @Nullable
+ public Boolean shouldSign() {
+ if (signButton == null) {
+ return Boolean.FALSE;
+ }
+ return signExplicit ? Boolean.valueOf(signUser) : null;
+ }
+
+ /**
* @return true if the user wants to start the push wizard after creating
* the tag, false otherwise
*/
@@ -448,6 +489,7 @@ public class CreateTagDialog extends TitleAreaDialog {
}
overwriteTag = overwriteButton.getSelection();
annotated = !tagMessageText.getCommitMessage().isEmpty();
+ signUser = signButton != null && signButton.getSelection();
okPressed();
} else {
super.buttonPressed(buttonId);
@@ -522,6 +564,11 @@ public class CreateTagDialog extends TitleAreaDialog {
@Override
public void modifyText(ModifyEvent e) {
validateInput();
+ if (signButton != null && !signExplicit && !signAll) {
+ String message = tagMessageText.getText();
+ signButton
+ .setSelection(!message.isEmpty() && signAnnotated);
+ }
}
});
@@ -537,6 +584,50 @@ public class CreateTagDialog extends TitleAreaDialog {
}
});
+ GpgSigner signer = GpgSetup.getDefault();
+ if (signer instanceof GpgObjectSigner) {
+ PersonIdent tagger = new PersonIdent(repo);
+ // Ensure the Eclipse preference, if set, overrides the git config
+ File gpg = GitSettings.getGpgExecutable();
+ GpgConfig gpgConfig = new GpgConfig(repo.getConfig()) {
+
+ @Override
+ public String getProgram() {
+ return gpg != null ? gpg.getAbsolutePath()
+ : super.getProgram();
+ }
+ };
+ if (SignatureUtils.checkSigningKey(signer, gpgConfig, tagger)) {
+ // We can sign at all.
+ signAll = gpgConfig.isSignAllTags();
+ signAnnotated = gpgConfig.isSignAnnotated();
+ signButton = new Button(left, SWT.CHECK);
+ signButton.setText(UIText.CreateTagDialog_signTag);
+ signButton
+ .setToolTipText(UIText.CreateTagDialog_signTagToolTip);
+ signButton.setSelection(signAll);
+ signButton.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ signExplicit = true;
+ }
+ });
+ } else {
+ String signingKey = gpgConfig.getSigningKey();
+ if (!StringUtils.isEmptyOrNull(signingKey)) {
+ CLabel warning = new CLabel(left, SWT.WRAP);
+ warning.setText(MessageFormat.format(
+ UIText.CreateTagDialog_noSigningKey, signingKey));
+ warning.setToolTipText(
+ UIText.CreateTagDialog_noSigningKeyToolTip);
+ warning.setImage(PlatformUI.getWorkbench().getSharedImages()
+ .getImage(ISharedImages.IMG_OBJS_WARN_TSK));
+ }
+ }
+ }
+
createAdvancedSection(left);
}
@@ -715,13 +806,20 @@ public class CreateTagDialog extends TitleAreaDialog {
private void setExistingTagFromText(String tagName) {
try {
- ObjectId tagObjectId = repo.resolve(Constants.R_TAGS + tagName);
- if (tagObjectId != null) {
- try (RevWalk revWalk = new RevWalk(repo)) {
- RevObject tagObject = revWalk.parseAny(tagObjectId);
- setExistingTag(tagObject);
+ Ref tagRef = repo.exactRef(Constants.R_TAGS + tagName);
+ if (tagRef != null) {
+ ObjectId tagObjectId = tagRef.getObjectId();
+ if (tagObjectId != null) {
+ try (RevWalk revWalk = new RevWalk(repo)) {
+ RevObject tagObject = revWalk.parseAny(tagObjectId);
+ if (tagObject.getType() == Constants.OBJ_TAG) {
+ setExistingTag(tagObject);
+ } else {
+ setExistingTag(tagRef);
+ }
+ }
+ return;
}
- return;
}
} catch (IOException e) {
// ignore
@@ -736,20 +834,32 @@ public class CreateTagDialog extends TitleAreaDialog {
}
private void setExistingTag(Object tagObject) {
- if (tagObject instanceof RevTag)
+ if (tagObject instanceof RevTag) {
existingTag = new TagWrapper((RevTag) tagObject);
- else if (tagObject instanceof Ref) {
+ } else if (tagObject instanceof Ref) {
existingTag = new TagWrapper((Ref) tagObject);
} else {
setNoExistingTag();
return;
}
- if (!tagNameText.getText().equals(existingTag.getName()))
- tagNameText.setText(existingTag.getName());
- if (commitCombo != null)
+ String newText = existingTag.getName();
+ String oldText = tagNameText.getText();
+ if (!oldText.equals(newText)) {
+ // Try to keep the caret where it is
+ int oldCaretPos = tagNameText.getSelection().y;
+
+ tagNameText.setText(newText);
+ if (oldCaretPos == oldText.length()
+ || oldCaretPos > newText.length()) {
+ tagNameText.setSelection(newText.length());
+ } else {
+ tagNameText.setSelection(oldCaretPos);
+ }
+ }
+ if (commitCombo != null) {
commitCombo.setSelectedElement(existingTag.getId());
-
+ }
// handle un-annotated tags
String message = existingTag.getMessage();
tagMessageText.setText(message != null ? message : ""); //$NON-NLS-1$
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/ErrorDialogWithHelp.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/ErrorDialogWithHelp.java
new file mode 100644
index 0000000000..76e2591606
--- /dev/null
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/ErrorDialogWithHelp.java
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Thomas Wolf <thomas.wolf@paranor.ch> and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.egit.ui.internal.dialogs;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * An {@link ErrorDialog} with a optional help context.
+ */
+public class ErrorDialogWithHelp extends ErrorDialog {
+
+ private String helpId;
+
+ /**
+ * Creates a new error dialog to show the given status.
+ *
+ * @param parent
+ * shell to parent the new dialog off
+ * @param title
+ * of the dialog
+ * @param message
+ * for the dialog
+ * @param status
+ * {@link IStatus} to show
+ * @param helpId
+ * if not {@code null} the ID of a help context to show via a
+ * help button
+ */
+ public ErrorDialogWithHelp(Shell parent, String title,
+ String message, IStatus status, String helpId) {
+ super(parent, title, message, status, ~0); // Show all
+ this.helpId = helpId;
+ }
+
+ @Override
+ protected void configureShell(Shell shell) {
+ super.configureShell(shell);
+ if (helpId != null) {
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(shell,
+ helpId);
+ }
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite result = (Composite) super.createDialogArea(parent);
+ GridLayout layout = (GridLayout) result.getLayout();
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ return result;
+ }
+
+ // Code below is based on org.eclipse.jface.dialogs.TrayDialog
+
+ @Override
+ protected Control createButtonBar(Composite parent) {
+ if (helpId == null) {
+ return super.createButtonBar(parent);
+ }
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayoutFactory.fillDefaults().numColumns(3)
+ .applyTo(composite);
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER)
+ .span(2, 1).applyTo(composite);
+ composite.setFont(parent.getFont());
+
+ createHelpControl(composite);
+ Control buttonSection = super.createButtonBar(composite);
+ ((GridData) buttonSection
+ .getLayoutData()).grabExcessHorizontalSpace = true;
+ return composite;
+ }
+
+ private void createHelpControl(Composite parent) {
+ Image helpImage = JFaceResources.getImage(DLG_IMG_HELP);
+ if (helpImage != null) {
+ createHelpImageButton(parent, helpImage);
+ } else {
+ createHelpLink(parent);
+ }
+ }
+
+ private void createHelpImageButton(Composite parent, Image image) {
+ ToolBar toolBar = new ToolBar(parent, SWT.FLAT | SWT.NO_FOCUS);
+ GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.CENTER)
+ .applyTo(toolBar);
+ toolBar.setCursor(
+ parent.getDisplay().getSystemCursor(SWT.CURSOR_HAND));
+ // Use SWT.PUSH instead of SWT.CHECK. This is not a TrayDialog, so
+ // we'll just get a link in a pop-up, and then the button state is
+ // inconsistent. Moreover, if the help context identified by the ID
+ // has no description and only one topic, that help page is opened
+ // directly.
+ ToolItem button = new ToolItem(toolBar, SWT.PUSH);
+ button.setImage(image);
+ button.setToolTipText(JFaceResources.getString("helpToolTip")); //$NON-NLS-1$
+ button.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ helpPressed();
+ }
+ });
+ }
+
+ private void createHelpLink(Composite parent) {
+ Link link = new Link(parent, SWT.WRAP | SWT.NO_FOCUS);
+ link.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));
+ link.setText("<a>" + IDialogConstants.HELP_LABEL + "</a>"); //$NON-NLS-1$ //$NON-NLS-2$
+ link.setToolTipText(JFaceResources.getString("helpToolTip")); //$NON-NLS-1$
+ link.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ helpPressed();
+ }
+ });
+ }
+
+ private void helpPressed() {
+ Control c = getShell().getDisplay().getFocusControl();
+ while (c != null) {
+ if (c.isListening(SWT.Help)) {
+ c.notifyListeners(SWT.Help, new Event());
+ break;
+ }
+ c = c.getParent();
+ }
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/GitTraceConfigurationDialog.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/GitTraceConfigurationDialog.java
index 923508adce..2d756552c9 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/GitTraceConfigurationDialog.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/GitTraceConfigurationDialog.java
@@ -10,6 +10,7 @@
*******************************************************************************/
package org.eclipse.egit.ui.internal.dialogs;
+import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
@@ -28,6 +29,7 @@ import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.internal.UIText;
+import org.eclipse.egit.ui.internal.trace.GitTraceLocation;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IMessageProvider;
@@ -225,8 +227,8 @@ public class GitTraceConfigurationDialog extends TitleAreaDialog {
private static final String MAINSWITCH = "/debug"; //$NON-NLS-1$
private static final PluginNode[] PLUGIN_LIST = new PluginNode[] {
- new PluginNode(Activator.getPluginId()),
- new PluginNode(org.eclipse.egit.core.Activator.getPluginId()) };
+ new PluginNode(Activator.PLUGIN_ID),
+ new PluginNode(org.eclipse.egit.core.Activator.PLUGIN_ID) };
private static final int APPLY_ID = 77;
@@ -240,6 +242,8 @@ public class GitTraceConfigurationDialog extends TitleAreaDialog {
private Text traceFileLocation;
+ private Button openButton;
+
private CheckboxTreeViewer tv;
/**
@@ -253,6 +257,7 @@ public class GitTraceConfigurationDialog extends TitleAreaDialog {
@Override
protected Control createDialogArea(Composite parent) {
Composite main = new Composite(parent, SWT.NONE);
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(main);
main.setLayout(new GridLayout(3, false));
platformSwitch = new Button(main, SWT.CHECK);
@@ -289,7 +294,7 @@ public class GitTraceConfigurationDialog extends TitleAreaDialog {
GridDataFactory.defaultsFor(traceFileLocation).grab(true, false)
.applyTo(traceFileLocation);
- Button openButton = new Button(main, SWT.PUSH);
+ openButton = new Button(main, SWT.PUSH);
openButton
.setText(UIText.GitTraceConfigurationDialog_OpenInEditorButton);
openButton.addSelectionListener(new SelectionAdapter() {
@@ -389,7 +394,13 @@ public class GitTraceConfigurationDialog extends TitleAreaDialog {
platformSwitch.setSelection(options.isDebugEnabled());
}
- traceFileLocation.setText(getOptions().getFile().getPath());
+ File traceFile = getOptions().getFile();
+ if (traceFile == null) {
+ traceFileLocation.setEnabled(false);
+ openButton.setEnabled(false);
+ } else {
+ traceFileLocation.setText(traceFile.getPath());
+ }
updateEnablement();
}
@@ -552,6 +563,6 @@ public class GitTraceConfigurationDialog extends TitleAreaDialog {
}
private DebugOptions getOptions() {
- return Activator.getDefault().getDebugOptions();
+ return GitTraceLocation.getOptions();
}
}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/fetch/FetchGerritChangePage.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/fetch/FetchGerritChangePage.java
index b2151d614d..fd0559bef2 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/fetch/FetchGerritChangePage.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/fetch/FetchGerritChangePage.java
@@ -84,7 +84,6 @@ import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.TagBuilder;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.transport.FetchResult;
@@ -987,6 +986,8 @@ public class FetchGerritChangePage extends WizardPage {
innerProgress.newChild(1));
break;
case CREATE_TAG:
+ assert spec != null;
+ assert textForTag != null;
createTag(spec, textForTag, commit,
innerProgress.newChild(1));
checkout(commit.name(),
@@ -1132,19 +1133,22 @@ public class FetchGerritChangePage extends WizardPage {
}
}
- private void createTag(final RefSpec spec, final String textForTag,
- RevCommit commit, IProgressMonitor monitor) throws CoreException {
+ private void createTag(@NonNull RefSpec spec, @NonNull String textForTag,
+ @NonNull RevCommit commit, IProgressMonitor monitor)
+ throws CoreException {
monitor.subTask(UIText.FetchGerritChangePage_CreatingTagTaskName);
- final TagBuilder tag = new TagBuilder();
PersonIdent personIdent = new PersonIdent(repository);
- tag.setTag(textForTag);
- tag.setTagger(personIdent);
- tag.setMessage(NLS.bind(
- UIText.FetchGerritChangePage_GeneratedTagMessage,
- spec.getSource()));
- tag.setObjectId(commit);
- new TagOperation(repository, tag, false).execute(monitor);
+ TagOperation operation = new TagOperation(repository)
+ .setAnnotated(true)
+ .setName(textForTag)
+ .setTagger(personIdent)
+ .setMessage(NLS.bind(
+ UIText.FetchGerritChangePage_GeneratedTagMessage,
+ spec.getSource()))
+ .setTarget(commit)
+ .setSign(Boolean.FALSE);
+ operation.execute(monitor);
monitor.worked(1);
}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/fetch/FetchWizard.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/fetch/FetchWizard.java
index edc32598fd..1f2e186d05 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/fetch/FetchWizard.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/fetch/FetchWizard.java
@@ -157,9 +157,9 @@ public class FetchWizard extends Wizard {
config.save();
} catch (final IOException e) {
ErrorDialog.openError(getShell(), UIText.FetchWizard_cantSaveTitle,
- UIText.FetchWizard_cantSaveMessage, new Status(
- IStatus.WARNING, Activator.getPluginId(), e
- .getMessage(), e));
+ UIText.FetchWizard_cantSaveMessage,
+ new Status(IStatus.WARNING, Activator.PLUGIN_ID,
+ e.getMessage(), e));
// Continue, it's not critical.
}
}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitInfoBuilder.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitInfoBuilder.java
index bae4881567..b8ef702962 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitInfoBuilder.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitInfoBuilder.java
@@ -34,10 +34,16 @@ import org.eclipse.egit.ui.internal.PreferenceBasedDateFormatter;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.internal.history.FormatJob.FormatResult;
import org.eclipse.egit.ui.internal.trace.GitTraceLocation;
+import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.Region;
+import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.GpgConfig;
+import org.eclipse.jgit.lib.GpgSignatureVerifier;
+import org.eclipse.jgit.lib.GpgSignatureVerifier.SignatureVerification;
+import org.eclipse.jgit.lib.GpgSignatureVerifierFactory;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Ref;
@@ -47,6 +53,7 @@ import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevObject;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.revwalk.RevWalkUtils;
+import org.eclipse.jgit.util.SignatureUtils;
import org.eclipse.osgi.util.NLS;
/**
@@ -93,10 +100,13 @@ public class CommitInfoBuilder {
*/
public FormatResult format(IProgressMonitor monitor) throws IOException {
boolean trace = GitTraceLocation.HISTORYVIEW.isActive();
- if (trace)
+ if (trace) {
GitTraceLocation.getTrace().traceEntry(
GitTraceLocation.HISTORYVIEW.getLocation());
+ }
monitor.setTaskName(UIText.CommitMessageViewer_FormattingMessageTaskName);
+ IPreferenceStore preferences = Activator.getDefault()
+ .getPreferenceStore();
final StringBuilder d = new StringBuilder();
final PersonIdent author = commit.getAuthorIdent();
final PersonIdent committer = commit.getCommitterIdent();
@@ -106,6 +116,34 @@ public class CommitInfoBuilder {
d.append(commit.getId().name());
d.append(LF);
+ RevCommit c = commit;
+ if (preferences.getBoolean(UIPreferences.HISTORY_VERIFY_SIGNATURES)
+ && c.getRawGpgSignature() != null) {
+ GpgSignatureVerifierFactory factory = GpgSignatureVerifierFactory
+ .getDefault();
+ if (factory != null) {
+ GpgSignatureVerifier verifier = factory.getVerifier();
+ GpgConfig config = new GpgConfig(db.getConfig());
+ try {
+ SignatureVerification verification = verifier
+ .verifySignature(c, config);
+ if (verification != null) {
+ String[] text = SignatureUtils
+ .toString(verification, committer,
+ dateFormatter)
+ .split(LF);
+ String prefix = verifier.getName();
+ for (String line : text) {
+ d.append(prefix).append(": ").append(line) //$NON-NLS-1$
+ .append(LF);
+ }
+ }
+ } catch (IOException | JGitInternalException e) {
+ Activator.logError("Cannot verify signature on commit " //$NON-NLS-1$
+ + commit.name(), e);
+ }
+ }
+ }
addPersonIdent(d, author, UIText.CommitMessageViewer_author);
addPersonIdent(d, committer, UIText.CommitMessageViewer_committer);
@@ -119,8 +157,8 @@ public class CommitInfoBuilder {
UIText.CommitMessageViewer_child, hyperlinks);
}
- if(Activator.getDefault().getPreferenceStore().getBoolean(
- UIPreferences.HISTORY_SHOW_BRANCH_SEQUENCE)) {
+ if (preferences
+ .getBoolean(UIPreferences.HISTORY_SHOW_BRANCH_SEQUENCE)) {
try (RevWalk rw = new RevWalk(db)) {
List<Ref> branches = getBranches(commit, allRefs, db, monitor);
Collections.sort(branches,
@@ -158,8 +196,7 @@ public class CommitInfoBuilder {
d.append(LF);
}
- if (Activator.getDefault().getPreferenceStore().getBoolean(
- UIPreferences.HISTORY_SHOW_TAG_SEQUENCE)) {
+ if (preferences.getBoolean(UIPreferences.HISTORY_SHOW_TAG_SEQUENCE)) {
try (RevWalk rw = new RevWalk(db)) {
monitor.setTaskName(UIText.CommitMessageViewer_GettingPreviousTagTaskName);
addTag(d, UIText.CommitMessageViewer_follows, rw,
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitMessageViewer.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitMessageViewer.java
index 336e10d50c..3e1d4a678b 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitMessageViewer.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitMessageViewer.java
@@ -131,6 +131,7 @@ class CommitMessageViewer extends HyperlinkSourceViewer {
} else if (UIPreferences.HISTORY_SHOW_TAG_SEQUENCE.equals(property)
|| UIPreferences.HISTORY_SHOW_BRANCH_SEQUENCE
.equals(property)
+ || UIPreferences.HISTORY_VERIFY_SIGNATURES.equals(property)
|| UIPreferences.DATE_FORMAT.equals(property)
|| UIPreferences.DATE_FORMAT_CHOICE.equals(property)) {
format();
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GenerateHistoryJob.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GenerateHistoryJob.java
index 79ee446321..2c558be48c 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GenerateHistoryJob.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GenerateHistoryJob.java
@@ -122,7 +122,7 @@ class GenerateHistoryJob extends Job {
Integer.valueOf(oldsz)));
}
} catch (IOException e) {
- status = new Status(IStatus.ERROR, Activator.getPluginId(),
+ status = new Status(IStatus.ERROR, Activator.PLUGIN_ID,
UIText.GenerateHistoryJob_errorComputingHistory, e);
}
if (trace)
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GitHistoryPage.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GitHistoryPage.java
index 383f60ba7d..e392d03f61 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GitHistoryPage.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GitHistoryPage.java
@@ -1483,7 +1483,7 @@ public class GitHistoryPage extends HistoryPage implements RefsChangedListener,
.addRefsChangedListener(this);
InstanceScope.INSTANCE
- .getNode(org.eclipse.egit.core.Activator.getPluginId())
+ .getNode(org.eclipse.egit.core.Activator.PLUGIN_ID)
.addPreferenceChangeListener(prefListener);
IToolBarManager manager = getSite().getActionBars().getToolBarManager();
@@ -1741,7 +1741,7 @@ public class GitHistoryPage extends HistoryPage implements RefsChangedListener,
.removePropertyChangeListener(listener);
InstanceScope.INSTANCE
- .getNode(org.eclipse.egit.core.Activator.getPluginId())
+ .getNode(org.eclipse.egit.core.Activator.PLUGIN_ID)
.removePreferenceChangeListener(prefListener);
if (myRefsChangedHandle != null) {
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/command/RewordHandler.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/command/RewordHandler.java
index f791a4cb45..d6d274ccb0 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/command/RewordHandler.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/command/RewordHandler.java
@@ -1,5 +1,6 @@
/*******************************************************************************
- * Copyright (c) 2014 Maik Schreiber
+ * Copyright (c) 2014, 2020 Maik Schreiber and others.
+ *
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
@@ -31,6 +32,7 @@ import org.eclipse.ui.handlers.HandlerUtil;
/** Prompts to enter a new commit message for a commit. */
public class RewordHandler extends AbstractHistoryCommandHandler {
+
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
Repository repository = getRepository(event);
@@ -63,15 +65,14 @@ public class RewordHandler extends AbstractHistoryCommandHandler {
@Override
public boolean isEnabled() {
GitHistoryPage page = getPage();
- if (page == null)
+ if (page == null) {
return false;
+ }
IStructuredSelection selection = getSelection(page);
- if (selection.size() != 1)
+ if (selection.size() != 1) {
return false;
+ }
Repository repository = getRepository(page);
- if (repository.getRepositoryState() != RepositoryState.SAFE)
- return false;
- RevCommit commit = (RevCommit) selection.getFirstElement();
- return (commit.getParentCount() == 1);
+ return RepositoryState.SAFE.equals(repository.getRepositoryState());
}
}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/jobs/GpgConfigProblemReportAction.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/jobs/GpgConfigProblemReportAction.java
new file mode 100644
index 0000000000..a17c344b41
--- /dev/null
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/jobs/GpgConfigProblemReportAction.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Thomas Wolf <thomas.wolf@paranor.ch> and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.egit.ui.internal.jobs;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.egit.ui.internal.UIText;
+import org.eclipse.egit.ui.internal.dialogs.ErrorDialogWithHelp;
+import org.eclipse.jface.action.Action;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * An action to show a dedicated status dialog for problems relating to the GPG
+ * configuration.
+ */
+public class GpgConfigProblemReportAction extends Action {
+
+ private IStatus status;
+
+ private String message;
+
+ /**
+ * Create a new instance.
+ *
+ * @param status
+ * to report
+ * @param message
+ * for the dialog
+ */
+ public GpgConfigProblemReportAction(IStatus status, String message) {
+ super(UIText.GpgConfigProblemReportAction_Title);
+ this.status = status;
+ this.message = message;
+ }
+
+ @Override
+ public void run() {
+ ErrorDialogWithHelp dialog = new ErrorDialogWithHelp(
+ PlatformUI.getWorkbench().getModalDialogShellProvider()
+ .getShell(),
+ UIText.GpgConfigProblemReportAction_Title, message, status,
+ "org.eclipse.egit.ui.gpgSigning"); //$NON-NLS-1$
+ dialog.open();
+ }
+}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/jobs/RepositoryJob.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/jobs/RepositoryJob.java
index eadbce43a5..eecc25a4a3 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/jobs/RepositoryJob.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/jobs/RepositoryJob.java
@@ -120,7 +120,7 @@ public abstract class RepositoryJob extends Job {
*/
@NonNull
protected IStatus getDeferredStatus() {
- return new Status(IStatus.OK, Activator.getPluginId(), IStatus.OK, "", //$NON-NLS-1$
+ return new Status(IStatus.OK, Activator.PLUGIN_ID, IStatus.OK, "", //$NON-NLS-1$
null);
}
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 f1df218e57..9ce7c5b0ec 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
@@ -1,7 +1,7 @@
/*******************************************************************************
* Copyright (C) 2010, 2013 Robin Stocker <robin@nibor.org> and others.
* Copyright (C) 2015 SAP SE (Christian Georgi <christian.georgi@sap.com>)
- * Copyright (C) 2016, 2017 Thomas Wolf <thomas.wolf@paranor.ch>
+ * Copyright (C) 2016, 2021 Thomas Wolf <thomas.wolf@paranor.ch>
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -12,6 +12,10 @@
*******************************************************************************/
package org.eclipse.egit.ui.internal.preferences;
+import java.nio.file.Files;
+import java.nio.file.InvalidPathException;
+import java.nio.file.Paths;
+
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.egit.core.GitCorePreferences;
import org.eclipse.egit.ui.Activator;
@@ -23,6 +27,7 @@ import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.ComboFieldEditor;
import org.eclipse.jface.preference.FieldEditor;
+import org.eclipse.jface.preference.FileFieldEditor;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.util.IPropertyChangeListener;
@@ -35,6 +40,7 @@ import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.preferences.ScopedPreferenceStore;
@@ -43,6 +49,15 @@ import org.eclipse.ui.preferences.ScopedPreferenceStore;
public class CommittingPreferencePage extends DoublePreferencesPreferencePage
implements IWorkbenchPreferencePage {
+ private final static String[][] GPG_SIGNER_NAMES_AND_VALUES = new String[2][2];
+
+ static {
+ GPG_SIGNER_NAMES_AND_VALUES[0][0] = UIText.CommittingPreferencePage_gpgSignerBouncyCastleLabel;
+ GPG_SIGNER_NAMES_AND_VALUES[0][1] = "bc"; //$NON-NLS-1$
+ GPG_SIGNER_NAMES_AND_VALUES[1][0] = UIText.CommittingPreferencePage_gpgSignerGpgLabel;
+ GPG_SIGNER_NAMES_AND_VALUES[1][1] = "gpg"; //$NON-NLS-1$
+ }
+
private BooleanFieldEditor useStagingView;
private BooleanFieldEditor autoStage;
@@ -59,6 +74,10 @@ public class CommittingPreferencePage extends DoublePreferencesPreferencePage
private Group generalGroup;
+ private ComboFieldEditor gpgSigner;
+
+ private FileFieldEditor gpgExecutable;
+
/** */
public CommittingPreferencePage() {
super(GRID);
@@ -78,7 +97,7 @@ public class CommittingPreferencePage extends DoublePreferencesPreferencePage
@Override
protected IPreferenceStore doGetSecondaryPreferenceStore() {
return new ScopedPreferenceStore(InstanceScope.INSTANCE,
- org.eclipse.egit.core.Activator.getPluginId());
+ org.eclipse.egit.core.Activator.PLUGIN_ID);
}
@Override
@@ -145,6 +164,55 @@ public class CommittingPreferencePage extends DoublePreferencesPreferencePage
generalGroup);
addField(historySize);
+ gpgSigner = new ComboFieldEditor(GitCorePreferences.core_gpgSigner,
+ UIText.CommittingPreferencePage_gpgSignerLabel,
+ GPG_SIGNER_NAMES_AND_VALUES, generalGroup) {
+
+ @Override
+ public void setPreferenceStore(IPreferenceStore store) {
+ super.setPreferenceStore(
+ store == null ? null : getSecondaryPreferenceStore());
+ }
+ };
+ addField(gpgSigner);
+ gpgExecutable = new FullWidthFileFieldEditor(
+ GitCorePreferences.core_gpgExecutable,
+ UIText.CommittingPreferencePage_gpgExecutableLabel, true,
+ generalGroup) {
+
+ @Override
+ public void setPreferenceStore(IPreferenceStore store) {
+ super.setPreferenceStore(
+ store == null ? null : getSecondaryPreferenceStore());
+ }
+
+ @Override
+ protected boolean doCheckState() {
+ Text text = getTextControl();
+ if (text != null) {
+ String value = text.getText().trim();
+ if (!value.isEmpty()) {
+ try {
+ // Super class resolves symlinks.
+ if (!Files.isExecutable(Paths.get(value))) {
+ setErrorMessage(
+ UIText.CommittingPreferencePage_gpgExecutableNotExecutable);
+ return false;
+ }
+ } catch (InvalidPathException e) {
+ setErrorMessage(
+ UIText.CommittingPreferencePage_gpgExecutableInvalid);
+ return false;
+ }
+ }
+ }
+ return super.doCheckState();
+ }
+ };
+ addField(gpgExecutable);
+ gpgExecutable.getLabelControl(generalGroup).setToolTipText(
+ UIText.CommittingPreferencePage_gpgExecutableTooltip);
+
updateMargins(generalGroup);
Group formattingGroup = new Group(main, SWT.SHADOW_ETCHED_IN);
@@ -236,6 +304,8 @@ public class CommittingPreferencePage extends DoublePreferencesPreferencePage
handleWarnCheckboxSelection(warnCheckbox.getSelection());
handleBlockCheckboxSelection(blockCheckbox.getSelection());
updateMargins(buildProblemsGroup);
+ gpgExecutable.setEnabled("gpg".equals(getSecondaryPreferenceStore() //$NON-NLS-1$
+ .getString(GitCorePreferences.core_gpgSigner)), generalGroup);
}
@Override
@@ -251,6 +321,12 @@ public class CommittingPreferencePage extends DoublePreferencesPreferencePage
}
}
});
+ gpgSigner.setPropertyChangeListener(event -> {
+ if (FieldEditor.VALUE.equals(event.getProperty())) {
+ gpgExecutable.setEnabled("gpg".equals(event.getNewValue()), //$NON-NLS-1$
+ generalGroup);
+ }
+ });
}
@Override
@@ -262,6 +338,10 @@ public class CommittingPreferencePage extends DoublePreferencesPreferencePage
getPreferenceStore().getDefaultBoolean(
UIPreferences.ALWAYS_USE_STAGING_VIEW),
generalGroup);
+ gpgExecutable.setEnabled(
+ "gpg".equals(getSecondaryPreferenceStore() //$NON-NLS-1$
+ .getDefaultString(GitCorePreferences.core_gpgSigner)),
+ generalGroup);
}
private void updateMargins(Group group) {
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/DoublePreferencesPreferencePage.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/DoublePreferencesPreferencePage.java
index 57245c7605..fcdf310d9f 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/DoublePreferencesPreferencePage.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/DoublePreferencesPreferencePage.java
@@ -107,6 +107,15 @@ public abstract class DoublePreferencesPreferencePage
}
@Override
+ public void setValid(boolean b) {
+ super.setValid(b);
+ // Super class forgets to clear the error message.
+ if (b) {
+ setErrorMessage(null);
+ }
+ }
+
+ @Override
public boolean performOk() {
boolean isOk = super.performOk();
if (isOk) {
@@ -132,8 +141,8 @@ public abstract class DoublePreferencesPreferencePage
"PreferenceDialog.saveErrorMessage", //$NON-NLS-1$
new Object[] { getTitle(), e.getMessage() });
Policy.getStatusHandler().show(
- new Status(IStatus.ERROR, Activator.getPluginId(),
- message, e),
+ new Status(IStatus.ERROR, Activator.PLUGIN_ID, message,
+ e),
JFaceResources
.getString("PreferenceDialog.saveErrorTitle")); //$NON-NLS-1$
}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/FullWidthFileFieldEditor.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/FullWidthFileFieldEditor.java
new file mode 100644
index 0000000000..bfade53fcd
--- /dev/null
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/FullWidthFileFieldEditor.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (C) 2021 Thomas Wolf <thomas.wolf@paranor.ch>
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.egit.ui.internal.preferences;
+
+import org.eclipse.egit.ui.internal.UIText;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.preference.FileFieldEditor;
+import org.eclipse.jgit.util.SystemReader;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * A {@link FileFieldEditor} that is wrapped inside another composite so
+ * that it can always fill a whole row and the columns for the three
+ * controls are independent of the global grid layout of the page.
+ */
+class FullWidthFileFieldEditor extends FileFieldEditor {
+
+ private Composite wrapper;
+
+ private GridData layoutData;
+
+ public FullWidthFileFieldEditor(String configName, String label,
+ boolean enforceAbsolute, Composite parent) {
+ super(configName, label, enforceAbsolute, parent);
+ }
+
+ @Override
+ protected void createControl(Composite parent) {
+ wrapper = new Composite(parent, SWT.NONE);
+ layoutData = GridDataFactory.fillDefaults().grab(true, false)
+ .create();
+ wrapper.setLayoutData(layoutData);
+ GridLayoutFactory.fillDefaults()
+ .numColumns(super.getNumberOfControls()).applyTo(wrapper);
+ doFillIntoGrid(wrapper, super.getNumberOfControls());
+ if (SystemReader.getInstance().isMacOS()) {
+ // The default "Open File" dialog on Mac does not show
+ // hidden files, even if the user has enabled showing them
+ // in the Finder. GPG is normally installed under /usr,
+ // which is a hidden directory on Mac. There is a keyboard
+ // shortcut to make it show hidden files and directories
+ // (Cmd-Shift-.), but that's not obvious. Tell the user
+ // about that shortcut in a tooltip.
+ getChangeControl(wrapper).setToolTipText(
+ UIText.FullWidthFileFieldEditor_buttonTooltipMac);
+ }
+ }
+
+ @Override
+ protected void doFillIntoGrid(Composite parent, int numColumns) {
+ if (parent != wrapper) {
+ layoutData.horizontalSpan = numColumns;
+ }
+ super.doFillIntoGrid(wrapper, super.getNumberOfControls());
+ }
+
+ @Override
+ protected void adjustForNumColumns(int numColumns) {
+ layoutData.horizontalSpan = numColumns;
+ }
+
+ @Override
+ public Label getLabelControl(Composite parent) {
+ return super.getLabelControl(wrapper);
+ }
+
+ @Override
+ public Text getTextControl(Composite parent) {
+ return super.getTextControl(wrapper);
+ }
+
+ @Override
+ protected Button getChangeControl(Composite parent) {
+ return super.getChangeControl(wrapper);
+ }
+
+ @Override
+ public int getNumberOfControls() {
+ return 1;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/GitPreferenceRoot.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/GitPreferenceRoot.java
index fdc4820dd9..381f7d0f1c 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/GitPreferenceRoot.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/GitPreferenceRoot.java
@@ -54,8 +54,6 @@ public class GitPreferenceRoot extends DoublePreferencesPreferencePage
private final static String[][] MERGE_MODE_NAMES_AND_VALUES = new String[3][2];
- private final static String[][] SSH_CLIENT_NAMES_AND_VALUES = new String[2][2];
-
private final static String[][] HTTP_CLIENT_NAMES_AND_VALUES = new String[2][2];
private final static boolean HAS_DEBUG_UI = hasDebugUiBundle();
@@ -68,11 +66,6 @@ public class GitPreferenceRoot extends DoublePreferencesPreferencePage
MERGE_MODE_NAMES_AND_VALUES[2][0] = UIText.GitPreferenceRoot_MergeMode_2_Label;
MERGE_MODE_NAMES_AND_VALUES[2][1] = "2"; //$NON-NLS-1$
- SSH_CLIENT_NAMES_AND_VALUES[0][0] = UIText.GitPreferenceRoot_SshClient_Jsch_Label;
- SSH_CLIENT_NAMES_AND_VALUES[0][1] = "jsch"; //$NON-NLS-1$
- SSH_CLIENT_NAMES_AND_VALUES[1][0] = UIText.GitPreferenceRoot_SshClient_Apache_Label;
- SSH_CLIENT_NAMES_AND_VALUES[1][1] = "apache"; //$NON-NLS-1$
-
HTTP_CLIENT_NAMES_AND_VALUES[0][0] = UIText.GitPreferenceRoot_HttpClient_Jdk_Label;
HTTP_CLIENT_NAMES_AND_VALUES[0][1] = "jdk"; //$NON-NLS-1$
HTTP_CLIENT_NAMES_AND_VALUES[1][0] = UIText.GitPreferenceRoot_HttpClient_Apache_Label;
@@ -94,7 +87,7 @@ public class GitPreferenceRoot extends DoublePreferencesPreferencePage
@Override
protected IPreferenceStore doGetSecondaryPreferenceStore() {
return new ScopedPreferenceStore(InstanceScope.INSTANCE,
- org.eclipse.egit.core.Activator.getPluginId());
+ org.eclipse.egit.core.Activator.PLUGIN_ID);
}
@Override
@@ -229,18 +222,6 @@ public class GitPreferenceRoot extends DoublePreferencesPreferencePage
timeoutEditor.getLabelControl(remoteConnectionsGroup).setToolTipText(
UIText.RemoteConnectionPreferencePage_ZeroValueTooltip);
addField(timeoutEditor);
- ComboFieldEditor sshClient = new ComboFieldEditor(
- GitCorePreferences.core_sshClient,
- UIText.RemoteConnectionPreferencePage_SshClientLabel,
- SSH_CLIENT_NAMES_AND_VALUES, remoteConnectionsGroup) {
-
- @Override
- public void setPreferenceStore(IPreferenceStore store) {
- super.setPreferenceStore(
- store == null ? null : getSecondaryPreferenceStore());
- }
- };
- addField(sshClient);
ComboFieldEditor httpClient = new ComboFieldEditor(
GitCorePreferences.core_httpClient,
UIText.RemoteConnectionPreferencePage_HttpClientLabel,
@@ -268,14 +249,6 @@ public class GitPreferenceRoot extends DoublePreferencesPreferencePage
intervalField.getLabelControl(repoChangeScannerGroup).setToolTipText(
UIText.RefreshPreferencesPage_RefreshIndexIntervalTooltip);
addField(intervalField);
- addField(new BooleanFieldEditor(UIPreferences.REFRESH_ON_INDEX_CHANGE,
- UIText.RefreshPreferencesPage_RefreshWhenIndexChange,
- repoChangeScannerGroup) {
- @Override
- public int getNumberOfControls() {
- return 2;
- }
- });
addField(new BooleanFieldEditor(UIPreferences.REFRESH_ONLY_WHEN_ACTIVE,
UIText.RefreshPreferencesPage_RefreshOnlyWhenActive,
repoChangeScannerGroup) {
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/HistoryPreferencePage.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/HistoryPreferencePage.java
index f02c06ff54..c7c43ba042 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/HistoryPreferencePage.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/HistoryPreferencePage.java
@@ -117,6 +117,9 @@ public class HistoryPreferencePage extends FieldEditorPreferencePage implements
UIPreferences.HISTORY_SHOW_TAG_SEQUENCE,
UIText.ResourceHistory_ShowTagSequence, commentGroup));
addField(new BooleanFieldEditor(
+ UIPreferences.HISTORY_VERIFY_SIGNATURES,
+ UIText.ResourceHistory_verifySignatures, commentGroup));
+ addField(new BooleanFieldEditor(
UIPreferences.RESOURCEHISTORY_SHOW_COMMENT_WRAP,
UIText.ResourceHistory_toggleCommentWrap,
commentGroup));
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/ProjectsPreferencePage.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/ProjectsPreferencePage.java
index 1ad9142343..90643a4c22 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/ProjectsPreferencePage.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/ProjectsPreferencePage.java
@@ -38,7 +38,7 @@ public class ProjectsPreferencePage extends DoublePreferencesPreferencePage
@Override
protected IPreferenceStore doGetPreferenceStore() {
return new ScopedPreferenceStore(InstanceScope.INSTANCE,
- Activator.getPluginId());
+ Activator.PLUGIN_ID);
}
@Override
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/SynchronizePreferencePage.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/SynchronizePreferencePage.java
index 3816d7b207..cb26650359 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/SynchronizePreferencePage.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/SynchronizePreferencePage.java
@@ -121,7 +121,7 @@ public class SynchronizePreferencePage extends FieldEditorPreferencePage
if (corePreferenceStore == null) {
corePreferenceStore = new ScopedPreferenceStore(
InstanceScope.INSTANCE,
- org.eclipse.egit.core.Activator.getPluginId());
+ org.eclipse.egit.core.Activator.PLUGIN_ID);
}
return corePreferenceStore;
}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/WindowCachePreferencePage.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/WindowCachePreferencePage.java
index 2bf360a153..aab6da80a7 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/WindowCachePreferencePage.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/preferences/WindowCachePreferencePage.java
@@ -34,7 +34,7 @@ public class WindowCachePreferencePage extends FieldEditorPreferencePage
super(GRID);
setTitle(UIText.WindowCachePreferencePage_title);
ScopedPreferenceStore store = new ScopedPreferenceStore(
- InstanceScope.INSTANCE, Activator.getPluginId());
+ InstanceScope.INSTANCE, Activator.PLUGIN_ID);
setPreferenceStore(store);
}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/CommitPropertyDescriptor.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/CommitPropertyDescriptor.java
new file mode 100644
index 0000000000..abf6099c61
--- /dev/null
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/CommitPropertyDescriptor.java
@@ -0,0 +1,283 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Thomas Wolf <thomas.wolf@paranor.ch> and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.egit.ui.internal.properties;
+
+import org.eclipse.egit.ui.Activator;
+import org.eclipse.egit.ui.internal.UIIcons;
+import org.eclipse.egit.ui.internal.UIText;
+import org.eclipse.egit.ui.internal.commit.CommitEditor;
+import org.eclipse.egit.ui.internal.commit.RepositoryCommit;
+import org.eclipse.jface.layout.LayoutConstants;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Layout;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.team.ui.history.IHistoryView;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+/**
+ * A {@link PropertyDescriptor} for commit IDs. It provides a read-only cell
+ * editor with two buttons for opening the commit in the EGit commit viewer or
+ * to show the commit in the EGit history view.
+ */
+public class CommitPropertyDescriptor extends GitPropertyDescriptor {
+
+ static final int COLUMN_INDEX = 1;
+
+ private final RepositoryCommit commit;
+
+ /**
+ * Creates a new {@link CommitPropertyDescriptor}.
+ *
+ * @param id
+ * for the property
+ * @param label
+ * for the property
+ * @param commit
+ * to open
+ */
+ public CommitPropertyDescriptor(Object id, String label,
+ RepositoryCommit commit) {
+ super(id, label);
+ this.commit = commit;
+ }
+
+ @Override
+ public CellEditor createPropertyEditor(Composite parent) {
+ return new ButtonCellEditor(parent);
+ }
+
+ private class ButtonCellEditor extends CellEditor {
+
+ private Composite editor;
+
+ private Object content;
+
+ private Button openCommit;
+
+ private Button showInHistory;
+
+ private FocusListener listener;
+
+ private Listener parentListener;
+
+ ButtonCellEditor(Composite parent) {
+ super(parent);
+ }
+
+ @Override
+ protected Control createControl(Composite parent) {
+ editor = new Composite(parent, SWT.NONE);
+ openCommit = new Button(editor, SWT.PUSH);
+ openCommit.setImage(UIIcons.getImage(
+ Activator.getDefault().getResourceManager(),
+ UIIcons.OPEN_COMMIT));
+ openCommit.setToolTipText(
+ UIText.CommitPropertyDescriptor_OpenCommitLabel);
+ openCommit.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent evenet) {
+ try {
+ CommitEditor.open(commit);
+ } catch (PartInitException e) {
+ Activator.showError(e.getLocalizedMessage(), e);
+ }
+ }
+ });
+ showInHistory = new Button(editor, SWT.PUSH);
+ showInHistory.setImage(UIIcons.getImage(
+ Activator.getDefault().getResourceManager(),
+ UIIcons.HISTORY));
+ showInHistory.setToolTipText(
+ UIText.CommitPropertyDescriptor_ShowInHistoryLabel);
+ showInHistory.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ try {
+ IHistoryView view = (IHistoryView) PlatformUI
+ .getWorkbench().getActiveWorkbenchWindow()
+ .getActivePage().showView(IHistoryView.VIEW_ID);
+ view.showHistoryFor(commit);
+ } catch (PartInitException e) {
+ Activator.showError(e.getLocalizedMessage(), e);
+ }
+ }
+ });
+ KeyListener closeEditor = new KeyAdapter() {
+
+ @Override
+ public void keyReleased(KeyEvent e) {
+ if (e.character == SWT.ESC) {
+ fireCancelEditor();
+ }
+ }
+ };
+ openCommit.addKeyListener(closeEditor);
+ showInHistory.addKeyListener(closeEditor);
+ Tree tree = (Tree) parent;
+ TreeItem[] selected = tree.getSelection();
+ TreeItem item = selected == null || selected.length == 0 ? null
+ : selected[0];
+ editor.setLayout(new ToolbarLayout(item, COLUMN_INDEX));
+ return editor;
+ }
+
+ @Override
+ protected Object doGetValue() {
+ return content;
+ }
+
+ @Override
+ protected void doSetValue(Object value) {
+ content = value;
+ }
+
+ @Override
+ protected void doSetFocus() {
+ if (listener == null) {
+ listener = new FocusListener() {
+
+ @Override
+ public void focusGained(FocusEvent e) {
+ // Nothing
+ }
+
+ @Override
+ public void focusLost(FocusEvent e) {
+ editor.getDisplay().asyncExec(() -> {
+ if (!openCommit.isFocusControl()
+ && !showInHistory.isFocusControl()) {
+ ButtonCellEditor.this.focusLost();
+ }
+ });
+ }
+ };
+ }
+ openCommit.addFocusListener(listener);
+ showInHistory.addFocusListener(listener);
+ if (parentListener == null) {
+ parentListener = event -> {
+ switch (event.type) {
+ case SWT.Collapse:
+ case SWT.Expand:
+ fireCancelEditor();
+ break;
+ default:
+ break;
+ }
+ };
+ }
+ editor.getParent().addListener(SWT.Collapse, parentListener);
+ editor.getParent().addListener(SWT.Expand, parentListener);
+ editor.setFocus();
+ }
+
+ @Override
+ public void deactivate() {
+ if (listener != null) {
+ openCommit.removeFocusListener(listener);
+ showInHistory.removeFocusListener(listener);
+ }
+ if (parentListener != null) {
+ editor.getParent().removeListener(SWT.Collapse, parentListener);
+ editor.getParent().removeListener(SWT.Expand, parentListener);
+ }
+ super.deactivate();
+ }
+
+ private class ToolbarLayout extends Layout {
+
+ private final TreeItem item;
+
+ private final int idx;
+
+ ToolbarLayout(TreeItem item, int columnIndex) {
+ this.item = item;
+ this.idx = columnIndex;
+ }
+
+ @Override
+ public void layout(Composite cellEditor, boolean force) {
+ Point size = openCommit.computeSize(SWT.DEFAULT, SWT.DEFAULT,
+ force);
+ Point size2 = showInHistory.computeSize(SWT.DEFAULT,
+ SWT.DEFAULT, force);
+ int width = size.x + size2.x;
+ int height = Math.max(size.y, size2.y);
+ // Adjust the cellEditor's bounds as needed
+ Rectangle editorBounds = cellEditor.getBounds();
+ if (item != null) {
+ Point textSize;
+ GC gc = null;
+ try {
+ gc = new GC(cellEditor.getDisplay());
+ gc.setFont(item.getFont(idx));
+ textSize = gc.stringExtent(item.getText(idx));
+ } finally {
+ if (gc != null) {
+ gc.dispose();
+ }
+ }
+ if (textSize.x >= 0 && textSize.x < editorBounds.width) {
+ editorBounds.width = textSize.x == 0 ? 0
+ : textSize.x + LayoutConstants.getSpacing().x;
+ editorBounds.width += width;
+ }
+ }
+ editorBounds.x += editorBounds.width - width;
+ editorBounds.width = width;
+ if (height > editorBounds.height) {
+ editorBounds.y -= (height - editorBounds.height) / 2;
+ editorBounds.height = height;
+ } else if (height < editorBounds.height) {
+ // Center vertically
+ editorBounds.y += (editorBounds.height - height) / 2;
+ editorBounds.height = height;
+ }
+ cellEditor.setBounds(editorBounds);
+ openCommit.setBounds(0, 0, size.x, size.y);
+ showInHistory.setBounds(size.x, 0, size2.x, size2.y);
+ }
+
+ @Override
+ public Point computeSize(Composite cellEditor, int wHint, int hHint,
+ boolean force) {
+ if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT) {
+ return new Point(wHint, hHint);
+ }
+ Point size = openCommit.computeSize(SWT.DEFAULT, SWT.DEFAULT,
+ force);
+ Point size2 = showInHistory.computeSize(SWT.DEFAULT,
+ SWT.DEFAULT, force);
+ return new Point(size.x + size2.x, Math.max(size.y, size2.y));
+ }
+ }
+ }
+}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/CommitPropertySource.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/CommitPropertySource.java
new file mode 100644
index 0000000000..3319362634
--- /dev/null
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/CommitPropertySource.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Thomas Wolf <thomas.wolf@paranor.ch> and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.egit.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.egit.ui.internal.UIText;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.ui.views.properties.PropertySheetPage;
+
+/**
+ * Properties for a commit (read-only).
+ */
+public class CommitPropertySource implements IPropertySource {
+
+ private static final String PROPERTY_COMMIT_MESSAGE = "commit_message"; //$NON-NLS-1$
+
+ private static final String PROPERTY_COMMIT_ID = "commit_id"; //$NON-NLS-1$
+
+ private static final String PROPERTY_COMMIT_AUTHOR = "commit_author"; //$NON-NLS-1$
+
+ private static final String PROPERTY_COMMITTER = "committer"; //$NON-NLS-1$
+
+ private RevCommit commit;
+
+ private final IPropertyDescriptor[] descriptors;
+
+ /**
+ * Create a property source for a tag.
+ *
+ * @param commit
+ * to show
+ * @param page
+ * to show the commit in
+ */
+ public CommitPropertySource(RevCommit commit, PropertySheetPage page) {
+ this.commit = commit;
+ List<PropertyDescriptor> result = new ArrayList<>();
+ result.add(new PropertyDescriptor(PROPERTY_COMMIT_ID,
+ UIText.CommitPropertySource_CommitId));
+ result.add(new MessagePropertyDescriptor(PROPERTY_COMMIT_MESSAGE,
+ UIText.CommitPropertySource_CommitMessage,
+ commit.getFullMessage(), page));
+ result.add(new PropertyDescriptor(PROPERTY_COMMIT_AUTHOR,
+ UIText.CommitPropertySource_CommitAuthor));
+ result.add(new PropertyDescriptor(PROPERTY_COMMITTER,
+ UIText.CommitPropertySource_Committer));
+ for (PropertyDescriptor p : result) {
+ p.setCategory(UIText.CommitPropertySource_CommitCategory);
+ }
+ descriptors = result.toArray(new IPropertyDescriptor[0]);
+ }
+
+ @Override
+ public Object getEditableValue() {
+ return this;
+ }
+
+ @Override
+ public IPropertyDescriptor[] getPropertyDescriptors() {
+ return descriptors;
+ }
+
+ @Override
+ public Object getPropertyValue(Object id) {
+ switch (id.toString()) {
+ case PROPERTY_COMMIT_ID:
+ return commit.getName();
+ case PROPERTY_COMMIT_MESSAGE:
+ return commit.getShortMessage();
+ case PROPERTY_COMMIT_AUTHOR:
+ return new PersonIdentPropertySource(commit.getAuthorIdent());
+ case PROPERTY_COMMITTER:
+ return new PersonIdentPropertySource(commit.getCommitterIdent());
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ public boolean isPropertySet(Object id) {
+ return false;
+ }
+
+ @Override
+ public void resetPropertyValue(Object id) {
+ // read only
+ }
+
+ @Override
+ public void setPropertyValue(Object id, Object value) {
+ // read only
+ }
+
+ @Override
+ public String toString() {
+ return Constants.TYPE_COMMIT + ' ' + commit.name();
+ }
+}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/GitPropertyDescriptor.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/GitPropertyDescriptor.java
new file mode 100644
index 0000000000..d590c32cc2
--- /dev/null
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/GitPropertyDescriptor.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Thomas Wolf <thomas.wolf@paranor.ch> and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.egit.ui.internal.properties;
+
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+/**
+ * A {@link PropertyDescriptor} that uses the label as description if no
+ * explicit description is set.
+ */
+public class GitPropertyDescriptor extends PropertyDescriptor {
+
+ /**
+ * Creates a new {@link GitPropertyDescriptor}.
+ *
+ * @param id
+ * for the property
+ * @param label
+ * for the property
+ */
+ public GitPropertyDescriptor(Object id, String label) {
+ super(id, label);
+ }
+
+ @Override
+ public String getDescription() {
+ String description = super.getDescription();
+ if (description == null) {
+ description = getDisplayName();
+ }
+ return description;
+ }
+}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/GitPropertySheetPage.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/GitPropertySheetPage.java
new file mode 100644
index 0000000000..8bcc2f50b3
--- /dev/null
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/GitPropertySheetPage.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Thomas Wolf <thomas.wolf@paranor.ch> and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.egit.ui.internal.properties;
+
+import org.eclipse.egit.ui.Activator;
+import org.eclipse.egit.ui.UIPreferences;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.ui.views.properties.PropertySheetPage;
+
+/**
+ * A {@link PropertySheetPage} that listens to git date format preference
+ * changes and refreshes itself when they change.
+ */
+public class GitPropertySheetPage extends PropertySheetPage {
+
+ private final IPropertyChangeListener dateFormatListener = event -> {
+ String property = event.getProperty();
+ if (property == null) {
+ return;
+ }
+ switch (property) {
+ case UIPreferences.DATE_FORMAT:
+ case UIPreferences.DATE_FORMAT_CHOICE:
+ refreshInUiThread();
+ break;
+ default:
+ break;
+ }
+ };
+
+ private final IPreferenceStore store;
+
+ private volatile boolean disposed;
+
+ /**
+ * Creates a new instance.
+ */
+ public GitPropertySheetPage() {
+ super();
+ store = Activator.getDefault().getPreferenceStore();
+ store.addPropertyChangeListener(dateFormatListener);
+ }
+
+ /**
+ * Refreshes the page in the UI thread.
+ */
+ public void refreshInUiThread() {
+ getSite().getShell().getDisplay().asyncExec(() -> {
+ if (!isDisposed()) {
+ refresh();
+ }
+ });
+ }
+
+ /**
+ * Tells whether the page is disposed.
+ *
+ * @return {@code true} is {@link #dispose()} has been called,
+ * {@code false} otherwise
+ */
+ public boolean isDisposed() {
+ return disposed;
+ }
+
+ @Override
+ public void dispose() {
+ disposed = true;
+ store.removePropertyChangeListener(dateFormatListener);
+ super.dispose();
+ }
+}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/ListPropertySource.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/ListPropertySource.java
new file mode 100644
index 0000000000..e01a72af52
--- /dev/null
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/ListPropertySource.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Thomas Wolf <thomas.wolf@paranor.ch> and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.egit.ui.internal.properties;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+/**
+ * Property source to display a list of values.
+ */
+public class ListPropertySource implements IPropertySource {
+
+ private final List<?> values;
+
+ private final IPropertyDescriptor[] descriptors;
+
+ /**
+ * Creates a new {@link ListPropertySource}.
+ *
+ * @param values
+ * to show
+ */
+ public ListPropertySource(List<?> values) {
+ this.values = values == null ? Collections.emptyList() : values;
+ IPropertyDescriptor[] result = new IPropertyDescriptor[this.values
+ .size()];
+ for (int i = 1; i <= result.length; i++) {
+ result[i - 1] = new PropertyDescriptor(Integer.valueOf(i),
+ Integer.toString(i));
+ }
+ descriptors = result;
+ }
+
+ @Override
+ public IPropertyDescriptor[] getPropertyDescriptors() {
+ return descriptors;
+ }
+
+ @Override
+ public Object getPropertyValue(Object id) {
+ if (id instanceof Integer) {
+ int index = ((Integer) id).intValue() - 1;
+ if (index >= 0 && index < values.size()) {
+ return values.get(index);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isPropertySet(Object id) {
+ return false;
+ }
+
+ @Override
+ public Object getEditableValue() {
+ return this;
+ }
+
+ @Override
+ public void resetPropertyValue(Object id) {
+ // Read-only
+ }
+
+ @Override
+ public void setPropertyValue(Object id, Object value) {
+ // Read-only
+ }
+
+ @Override
+ public String toString() {
+ return values.isEmpty() ? "" : values.toString(); //$NON-NLS-1$
+ }
+}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/MessagePropertyDescriptor.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/MessagePropertyDescriptor.java
new file mode 100644
index 0000000000..e4163fb681
--- /dev/null
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/MessagePropertyDescriptor.java
@@ -0,0 +1,404 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Thomas Wolf <thomas.wolf@paranor.ch> and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.egit.ui.internal.properties;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.AbstractInformationControlManager;
+import org.eclipse.jface.text.AbstractInformationControlManager.IInformationControlCloser;
+import org.eclipse.jface.text.DefaultInformationControl;
+import org.eclipse.jface.text.IInformationControl;
+import org.eclipse.jface.text.IInformationControlCreator;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jgit.util.StringUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.ScrollBar;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.contexts.IContextActivation;
+import org.eclipse.ui.contexts.IContextService;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.ui.texteditor.ITextEditorActionConstants;
+import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.ui.views.properties.PropertySheetPage;
+
+/**
+ * A {@link PropertyDescriptor} for a property that shows a message when
+ * selected. The message is shown via the {@link IInformationControl} mechanism
+ * from the JFace text editor framework.
+ */
+public class MessagePropertyDescriptor extends GitPropertyDescriptor {
+
+ private final String message;
+
+ private final PropertySheetPage page;
+
+ /**
+ * Creates a new {@link MessagePropertyDescriptor}.
+ *
+ * @param id
+ * for the property
+ * @param label
+ * for the property
+ * @param message
+ * to show when the property is selected
+ * @param page
+ * to show the property and the message on
+ */
+ public MessagePropertyDescriptor(Object id, String label, String message,
+ PropertySheetPage page) {
+ super(id, label);
+ this.message = message;
+ this.page = page;
+ }
+
+ @Override
+ public CellEditor createPropertyEditor(Composite parent) {
+ if (StringUtils.isEmptyOrNull(message)) {
+ return null;
+ }
+ return new PopupCellEditor(parent);
+ }
+
+ /**
+ * A dummy {@link CellEditor} that it invisible and that doesn't allow
+ * editing. It gives us a defined moment to start showing the pop-up, and it
+ * gives us access to the cell's rectangle so that we know where to show the
+ * pop-up.
+ */
+ private class PopupCellEditor extends CellEditor {
+
+ private Label editor;
+
+ private Tree tree;
+
+ private TreeItem mySelf;
+
+ private Object content;
+
+ private AbstractInformationControlManager popupControlManager;
+
+ PopupCellEditor(Composite parent) {
+ super(parent);
+ }
+
+ @Override
+ protected Control createControl(Composite parent) {
+ tree = (Tree) parent;
+ // Use a transparent label on which there is never any text, so the
+ // original selected cell is still visible. Additionally, the editor
+ // deactivates itself when focused as transparency doesn't work on
+ // Windows.
+ editor = new Label(parent, SWT.LEFT);
+ editor.setBackground(
+ parent.getDisplay().getSystemColor(SWT.COLOR_TRANSPARENT));
+ return editor;
+ }
+
+ @Override
+ protected Object doGetValue() {
+ return content;
+ }
+
+ @Override
+ protected void doSetValue(Object value) {
+ content = value;
+ }
+
+ @Override
+ protected void doSetFocus() {
+ if (popupControlManager != null) {
+ deactivate();
+ return;
+ }
+ // The label can't take the focus. But this is a good time to show
+ // the pop-up.
+ Rectangle bounds = editor.getBounds();
+ Composite parent = editor.getParent();
+ deactivate();
+ // Create a "Show information" action like in text editors, and
+ // activate the text editor context to get the key binding (F2 by
+ // default, to focus the pop-up.)
+ FocusPopupAction focusAction;
+ IActionBars bars = page.getSite().getActionBars();
+ IAction existingAction = bars.getGlobalActionHandler(
+ ITextEditorActionConstants.SHOW_INFORMATION);
+ if (existingAction == null
+ || !(existingAction instanceof FocusPopupAction)) {
+ focusAction = new FocusPopupAction();
+ bars.setGlobalActionHandler(focusAction.getId(), focusAction);
+ bars.updateActionBars();
+ } else {
+ existingAction.setEnabled(true);
+ focusAction = (FocusPopupAction) existingAction;
+ }
+ IContextService ctxSrv = page.getSite()
+ .getService(IContextService.class);
+ IContextActivation[] ctxActivation = { null };
+ ctxActivation[0] = ctxSrv
+ .activateContext("org.eclipse.ui.textEditorScope"); //$NON-NLS-1$
+ // Set up the IInformationControl framework. This needs a manager
+ // configured with a pop-up creator and a pop-up closer.
+ IInformationControlCreator popupCreator = parentShell -> new DefaultInformationControl(
+ parentShell, EditorsUI.getTooltipAffordanceString(), null);
+ class Manager extends AbstractInformationControlManager {
+
+ Manager(IInformationControlCreator creator) {
+ super(creator);
+ }
+
+ @Override
+ protected void setCloser(IInformationControlCloser closer) {
+ // Make this method accessible
+ super.setCloser(closer);
+ }
+
+ @Override
+ protected void computeInformation() {
+ setInformation(message, bounds);
+ }
+
+ }
+ Manager popupManager = new Manager(popupCreator);
+ IInformationControlCloser closer = new IInformationControlCloser() {
+
+ private Control subject;
+
+ private IInformationControl popup;
+
+ private Listener subjectListener;
+
+ private FocusListener focusListener;
+
+ private Display display;
+
+ @Override
+ public void setSubjectControl(Control subject) {
+ this.subject = subject;
+ if (subject != null) {
+ display = subject.getDisplay();
+ }
+ }
+
+ @Override
+ public void setInformationControl(IInformationControl control) {
+ focusAction.setPopup(control);
+ if (control != null) {
+ popup = control;
+ } else if (ctxActivation[0] != null) {
+ ctxSrv.deactivateContext(ctxActivation[0]);
+ ctxActivation[0] = null;
+ }
+ }
+
+ @Override
+ public void start(Rectangle subjectArea) {
+ if (subject != null && popup != null) {
+ hookSubject();
+ popup.addDisposeListener(event -> {
+ focusAction.setPopup(null);
+ unhookSubject();
+ if (popupControlManager != null) {
+ popupControlManager.dispose();
+ popupControlManager = null;
+ }
+ });
+ focusListener = new FocusListener() {
+
+ @Override
+ public void focusGained(FocusEvent e) {
+ // Nothing
+ }
+
+ @Override
+ public void focusLost(FocusEvent e) {
+ popup.dispose();
+ }
+ };
+ popup.addFocusListener(focusListener);
+ }
+ }
+
+ @Override
+ public void stop() {
+ unhookSubject();
+ if (popup != null) {
+ if (focusListener != null) {
+ popup.removeFocusListener(focusListener);
+ focusListener = null;
+ }
+ popup = null;
+ }
+ }
+
+ private void hookSubject() {
+ if (subject == null || popup == null) {
+ return;
+ }
+ subjectListener = event -> {
+ switch (event.type) {
+ case SWT.Selection:
+ // The focus remains on the tree initially. Close
+ // the pop-up if another item is selected.
+ if (event.item != mySelf && popup != null) {
+ popup.dispose();
+ popup = null;
+ }
+ break;
+ case SWT.Dispose:
+ case SWT.Expand:
+ case SWT.Collapse:
+ case SWT.Resize:
+ case SWT.Move:
+ case SWT.MouseWheel:
+ // Close the popup if the subject is scrolled,
+ // resized, or moved, or tree nodes are expanded or
+ // collapsed.
+ if (popup != null) {
+ popup.dispose();
+ popup = null;
+ }
+ break;
+ case SWT.Deactivate:
+ case SWT.FocusOut:
+ // If the focus goes anywhere else but the pop-up
+ // itself, close the pop-up.
+ //
+ // Must run async, otherwise the popup itself may
+ // not be focused yet.
+ display.asyncExec(() -> {
+ if (popup != null && !popup.isFocusControl()) {
+ popup.dispose();
+ popup = null;
+ }
+ });
+ break;
+ default:
+ break;
+ }
+ };
+ subject.addListener(SWT.Selection, subjectListener);
+ subject.addListener(SWT.Dispose, subjectListener);
+ subject.addListener(SWT.Deactivate, subjectListener);
+ subject.addListener(SWT.FocusOut, subjectListener);
+ subject.addListener(SWT.MouseWheel, subjectListener);
+ subject.addListener(SWT.Resize, subjectListener);
+ subject.addListener(SWT.Move, subjectListener);
+ subject.addListener(SWT.Expand, subjectListener);
+ subject.addListener(SWT.Collapse, subjectListener);
+ if (subject instanceof Composite) {
+ Composite composite = (Composite) subject;
+ ScrollBar scroll = composite.getHorizontalBar();
+ if (scroll != null) {
+ scroll.addListener(SWT.Selection, subjectListener);
+ }
+ scroll = composite.getVerticalBar();
+ if (scroll != null) {
+ scroll.addListener(SWT.Selection, subjectListener);
+ }
+ }
+ subject.getShell().addListener(SWT.Deactivate,
+ subjectListener);
+ }
+
+ private void unhookSubject() {
+ if (subject == null || subjectListener == null) {
+ return;
+ }
+ subject.removeListener(SWT.Selection, subjectListener);
+ subject.removeListener(SWT.Dispose, subjectListener);
+ subject.removeListener(SWT.Deactivate, subjectListener);
+ subject.removeListener(SWT.FocusOut, subjectListener);
+ subject.removeListener(SWT.MouseWheel, subjectListener);
+ subject.removeListener(SWT.Resize, subjectListener);
+ subject.removeListener(SWT.Move, subjectListener);
+ subject.removeListener(SWT.Expand, subjectListener);
+ subject.removeListener(SWT.Collapse, subjectListener);
+ if (subject instanceof Composite) {
+ Composite composite = (Composite) subject;
+ ScrollBar scroll = composite.getHorizontalBar();
+ if (scroll != null) {
+ scroll.removeListener(SWT.Selection,
+ subjectListener);
+ }
+ scroll = composite.getVerticalBar();
+ if (scroll != null) {
+ scroll.removeListener(SWT.Selection,
+ subjectListener);
+ }
+ }
+ Shell shell = subject.getShell();
+ if (shell != null) {
+ shell.removeListener(SWT.Deactivate, subjectListener);
+ }
+ subjectListener = null;
+ }
+ };
+ popupManager.setCloser(closer);
+ popupControlManager = popupManager;
+ TreeItem[] selection = tree.getSelection();
+ mySelf = selection == null || selection.length == 0 ? null
+ : selection[0];
+ popupManager.install(parent);
+ popupManager.showInformation();
+ }
+ }
+
+ /**
+ * This action gets installed globally (once) and subsequently enabled and
+ * disabled depending on there being a pop-up. It uses the action definition
+ * ID from the editor framework so getting the status line via
+ * {@link EditorsUI#getTooltipAffordanceString()} works. The action focuses
+ * the pop-up, if present.
+ */
+ private static class FocusPopupAction extends Action {
+
+ private IInformationControl popup;
+
+ FocusPopupAction() {
+ super();
+ }
+
+ void setPopup(IInformationControl control) {
+ popup = control;
+ setEnabled(control != null);
+ }
+
+ @Override
+ public String getId() {
+ return ITextEditorActionConstants.SHOW_INFORMATION;
+ }
+
+ @Override
+ public String getActionDefinitionId() {
+ return ITextEditorActionDefinitionIds.SHOW_INFORMATION;
+ }
+
+ @Override
+ public void run() {
+ if (popup != null) {
+ popup.setFocus();
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/PersonIdentPropertySource.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/PersonIdentPropertySource.java
new file mode 100644
index 0000000000..493a9956d4
--- /dev/null
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/PersonIdentPropertySource.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Thomas Wolf <thomas.wolf@paranor.ch> and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.egit.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.egit.ui.internal.PreferenceBasedDateFormatter;
+import org.eclipse.egit.ui.internal.UIText;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+/**
+ * An {@link IPropertySource} to show a {@link PersonIdent} in a property sheet.
+ */
+public class PersonIdentPropertySource implements IPropertySource {
+
+ private static final String PROPERTY_NAME = "name"; //$NON-NLS-1$
+
+ private static final String PROPERTY_EMAIL = "e-mail"; //$NON-NLS-1$
+
+ private static final String PROPERTY_DATE = "date"; //$NON-NLS-1$
+
+ private final PersonIdent person;
+
+ private final IPropertyDescriptor[] descriptors;
+
+ /**
+ * Creates a new {@link PersonIdentPropertySource}.
+ *
+ * @param ident
+ * to show
+ */
+ public PersonIdentPropertySource(PersonIdent ident) {
+ person = ident;
+ List<PropertyDescriptor> result = new ArrayList<>(3);
+ result.add(new PropertyDescriptor(PROPERTY_NAME,
+ UIText.PersonIdentPropertySource_Name));
+ result.add(new PropertyDescriptor(PROPERTY_EMAIL,
+ UIText.PersonIdentPropertySource_Email));
+ result.add(new PropertyDescriptor(PROPERTY_DATE,
+ UIText.PersonIdentPropertySource_Date));
+ String category = ident.toExternalString();
+ for (PropertyDescriptor desc : result) {
+ desc.setCategory(category);
+ }
+ descriptors = result.toArray(new IPropertyDescriptor[0]);
+ }
+
+ @Override
+ public Object getEditableValue() {
+ return this;
+ }
+
+ @Override
+ public IPropertyDescriptor[] getPropertyDescriptors() {
+ return descriptors;
+ }
+
+ @Override
+ public Object getPropertyValue(Object id) {
+ switch (id.toString()) {
+ case PROPERTY_NAME:
+ return person.getName();
+ case PROPERTY_EMAIL:
+ return person.getEmailAddress();
+ case PROPERTY_DATE:
+ return PreferenceBasedDateFormatter.create().formatDate(person);
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ public boolean isPropertySet(Object id) {
+ return false;
+ }
+
+ @Override
+ public void resetPropertyValue(Object id) {
+ // read-only
+ }
+
+ @Override
+ public void setPropertyValue(Object id, Object value) {
+ // read-only
+ }
+
+ @Override
+ public String toString() {
+ return person.toExternalString();
+ }
+}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/TagPropertySource.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/TagPropertySource.java
new file mode 100644
index 0000000000..7b1de4f8d7
--- /dev/null
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/properties/TagPropertySource.java
@@ -0,0 +1,218 @@
+/*******************************************************************************
+ * Copyright (c) 2018, 2021 Michael Keppler and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Michael Keppler - initial implementation
+ *******************************************************************************/
+package org.eclipse.egit.ui.internal.properties;
+
+import java.io.IOException;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.egit.ui.Activator;
+import org.eclipse.egit.ui.internal.UIText;
+import org.eclipse.egit.ui.internal.commit.RepositoryCommit;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevObject;
+import org.eclipse.jgit.revwalk.RevTag;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.ui.views.properties.PropertySheetPage;
+
+/**
+ * Properties for a tag (read-only).
+ */
+public class TagPropertySource implements IPropertySource {
+
+ private static final String PROPERTY_TAG_ID = "tag_id"; //$NON-NLS-1$
+
+ private static final String PROPERTY_TAG_MESSAGE = "tag_message"; //$NON-NLS-1$
+
+ private static final String PROPERTY_TAG_NAME = "tag_name"; //$NON-NLS-1$
+
+ private static final String PROPERTY_TAG_TAGGER = "tag_tagger"; //$NON-NLS-1$
+
+ private static final String PROPERTY_TAG_TARGET = "tag_target"; //$NON-NLS-1$
+
+ private RevTag tag;
+
+ private RevCommit commit;
+
+ private Repository repository;
+
+ private final String name;
+
+ private final IPropertyDescriptor[] descriptors;
+
+ private final PropertySheetPage page;
+
+ /**
+ * Create a property source for a tag from a {@link Ref}.
+ *
+ * @param repo
+ * repository
+ * @param ref
+ * ref of the tag
+ * @param page
+ * to show the property in
+ */
+ public TagPropertySource(Repository repo, Ref ref, PropertySheetPage page) {
+ this.repository = repo;
+ this.page = page;
+ try (RevWalk refWalk = new RevWalk(repo)) {
+ ObjectId objectId = repo.resolve(ref.getName());
+ RevObject any = refWalk.parseAny(objectId);
+ if (any instanceof RevTag) {
+ tag = (RevTag) any;
+ refWalk.parseBody(tag.getObject());
+ } else {
+ RevObject peeledObject = refWalk.peel(any);
+ if (peeledObject instanceof RevCommit) {
+ commit = (RevCommit) peeledObject;
+ }
+ }
+ } catch (IOException e) {
+ Activator.handleError(e.getMessage(), e, true);
+ }
+ name = tag != null ? tag.getTagName() : Repository.shortenRefName(ref.getName());
+ descriptors = createDescriptors();
+ }
+
+ /**
+ * Create a property source for a {@link RevTag}.
+ *
+ * @param repo
+ * repository
+ * @param tag
+ * to show
+ * @param page
+ * to show the property in
+ */
+ public TagPropertySource(Repository repo, RevTag tag,
+ PropertySheetPage page) {
+ this.repository = repo;
+ this.tag = tag;
+ this.page = page;
+ name = tag.getName();
+ try (RevWalk refWalk = new RevWalk(repo)) {
+ refWalk.parseBody(tag.getObject());
+ } catch (IOException e) {
+ Activator.handleError(e.getMessage(), e, true);
+ }
+ descriptors = createDescriptors();
+ }
+
+ private IPropertyDescriptor[] createDescriptors() {
+ List<PropertyDescriptor> result = new ArrayList<>();
+ result.add(new PropertyDescriptor(PROPERTY_TAG_NAME,
+ UIText.TagPropertySource_TagName));
+ if (tag == null) {
+ if (commit != null) {
+ result.add(new CommitPropertyDescriptor(PROPERTY_TAG_TARGET,
+ UIText.TagPropertySource_TagTarget,
+ new RepositoryCommit(repository, commit)));
+ }
+ } else {
+ result.add(new PropertyDescriptor(PROPERTY_TAG_ID,
+ UIText.TagPropertySource_TagId));
+ result.add(
+ new MessagePropertyDescriptor(PROPERTY_TAG_MESSAGE,
+ UIText.TagPropertySource_TagMessage,
+ tag.getFullMessage(), page));
+ result.add(new PropertyDescriptor(PROPERTY_TAG_TAGGER,
+ UIText.TagPropertySource_TagTagger));
+ if (tag.getObject() instanceof RevCommit) {
+ result.add(new CommitPropertyDescriptor(PROPERTY_TAG_TARGET,
+ UIText.TagPropertySource_TagTarget,
+ new RepositoryCommit(repository,
+ (RevCommit) tag.getObject())));
+ } else {
+ result.add(new PropertyDescriptor(PROPERTY_TAG_TARGET,
+ UIText.TagPropertySource_TagTarget));
+ }
+ }
+ for (PropertyDescriptor p : result) {
+ p.setCategory(UIText.TagPropertySource_TagCategory);
+ }
+ return result.toArray(new IPropertyDescriptor[0]);
+ }
+
+ @Override
+ public Object getEditableValue() {
+ return this;
+ }
+
+ @Override
+ public IPropertyDescriptor[] getPropertyDescriptors() {
+ return descriptors;
+ }
+
+ @Override
+ public Object getPropertyValue(Object id) {
+ switch (id.toString()) {
+ case PROPERTY_TAG_ID:
+ return tag.name();
+ case PROPERTY_TAG_NAME:
+ return name;
+ case PROPERTY_TAG_TARGET:
+ if (tag != null) {
+ RevObject target = tag.getObject();
+ if (target instanceof RevTag) {
+ return new TagPropertySource(repository, (RevTag) target,
+ page);
+ } else if (target instanceof RevCommit) {
+ return new CommitPropertySource((RevCommit) target, page);
+ }
+ return Constants.typeString(target.getType()) + ' '
+ + target.name();
+ }
+ if (commit != null) {
+ return new CommitPropertySource(commit, page);
+ }
+ return null;
+ case PROPERTY_TAG_TAGGER:
+ return new PersonIdentPropertySource(tag.getTaggerIdent());