From f73b2a9990495587d514aa1856919c21170a3940 Mon Sep 17 00:00:00 2001 From: Lluis Sanchez Date: Mon, 20 Jan 2014 16:32:53 +0100 Subject: Initial drop of the new project model --- .../addins/AspNet/Commands/AddControllerDialog.cs | 6 +- main/src/addins/AspNet/Commands/AddViewDialog.cs | 19 +- .../AddViewFromControllerCommandHandler.cs | 7 +- .../Commands/GoToControllerCommandHandler.cs | 8 +- .../AspNet/Commands/MvcCommandsCommonHandler.cs | 8 +- .../AspNet/Execution/AspNetExecutionHandler.cs | 2 +- .../src/addins/AspNet/Execution/BrowserLauncher.cs | 2 +- .../src/addins/AspNet/Execution/XspOptionsPanel.cs | 4 +- .../AspNet/Execution/XspOptionsPanelWidget.cs | 4 +- main/src/addins/AspNet/Makefile.am | 2 +- main/src/addins/AspNet/MonoDevelop.AspNet.csproj | 10 +- .../ProjectPad/AspNetFolderNodeCommandHandler.cs | 20 +- .../AspNetProjectNodeBuilderExtension.cs | 3 +- .../ProjectPad/AspNetProjectNodeCommandHandler.cs | 18 +- main/src/addins/AspNet/Projects/AspMvcProject.cs | 88 +-- .../src/addins/AspNet/Projects/AspNetAppProject.cs | 742 --------------------- .../AspNet/Projects/AspNetAppProjectBinding.cs | 84 --- main/src/addins/AspNet/Projects/AspNetFlavor.cs | 723 ++++++++++++++++++++ .../Projects/AspNetMvcFileTemplateCondition.cs | 2 +- .../AspNet/Properties/MonoDevelop.AspNet.addin.xml | 43 +- .../Razor/Generator/RazorTemplatePreprocessor.cs | 9 +- main/src/addins/AspNet/Razor/RazorCSharpParser.cs | 6 +- .../AspNet/Tests/Razor/RazorCompletionTesting.cs | 2 +- .../AspNet/Tests/WebForms/WebFormsTesting.cs | 2 +- .../MasterContentFileDescriptionTemplate.cs | 6 +- .../addins/AspNet/WebForms/WebFormsCodeBehind.cs | 17 +- .../WebForms/WebFormsCodeBehindTypeNameCache.cs | 7 +- .../AspNet/WebForms/WebFormsDirectiveCompletion.cs | 9 +- .../AspNet/WebForms/WebFormsEditorExtension.cs | 5 +- main/src/addins/AspNet/WebForms/WebFormsParser.cs | 2 +- .../AspNet/WebForms/WebFormsRegistrationCache.cs | 19 +- .../addins/AspNet/WebForms/WebFormsToolboxNode.cs | 4 +- .../addins/AspNet/WebForms/WebFormsTypeContext.cs | 22 +- main/src/addins/CBinding/CBinding.addin.xml | 12 +- main/src/addins/CBinding/CBinding.csproj | 2 - main/src/addins/CBinding/Compiler/CCompiler.cs | 4 +- main/src/addins/CBinding/Compiler/GNUCompiler.cs | 47 +- main/src/addins/CBinding/Compiler/ICompiler.cs | 4 +- main/src/addins/CBinding/Gui/EditPackagesDialog.cs | 2 +- main/src/addins/CBinding/Project/CProject.cs | 55 +- .../src/addins/CBinding/Project/CProjectBinding.cs | 85 --- .../CBinding/Project/CProjectServiceExtension.cs | 70 -- .../ProjectPad/ProjectPackageNodeBuilder.cs | 2 +- .../ProjectPad/ProjectPackagesFolderNodeBuilder.cs | 14 +- .../CSharpBinding/AspNet/ASPNetReferenceFinder.cs | 2 +- .../Autotools/CSharpAutotoolsSetup.cs | 2 +- .../addins/CSharpBinding/CSharpBinding.addin.xml | 15 +- main/src/addins/CSharpBinding/CSharpBinding.csproj | 3 +- .../CSharpCompletionTextEditorExtension.cs | 16 +- .../CSharpTextEditorIndentation.cs | 72 +- .../CSharpSyntaxMode.cs | 48 ++ .../TypeSystemProvider.cs | 8 +- .../CSharpCompilerParameters.cs | 61 +- .../CSharpProjectExtension.cs | 149 +++++ .../CSharpProjectParameters.cs | 84 --- .../CompilerOptionsPanelWidget.cs | 20 +- .../PortableCSharpProjectFlavor.cs | 49 ++ .../Actions/MoveTypeToFile.cs | 4 +- .../MDRefactoringContext.cs | 2 +- .../MDRefactoringScript.cs | 8 +- .../CSharpReferenceFinder.cs | 2 +- .../CSharpBindingCompilerManager.cs | 12 +- .../MonoDevelop.CSharp/CSharpLanguageBinding.cs | 9 +- .../PathedDocumentTextEditorExtension.cs | 47 +- main/src/addins/CSharpBinding/gtk-gui/gui.stetic | 1 + .../templates/PortableLibrary.xpt.xml | 4 +- main/src/addins/ChangeLogAddIn/ChangeLogService.cs | 10 +- .../ChangeLogAddIn/CommitDialogExtensionWidget.cs | 4 +- .../ChangeLogAddIn/ProjectOptionPanelWidget.cs | 2 +- .../BasicOptionPanelWidget.cs | 4 +- .../LinuxDeployData.cs | 10 +- .../LinuxIntegrationProjectFeature.cs | 14 +- .../MonoDevelop.Deployment.Commands/Commands.cs | 10 +- .../MonoDevelop.Deployment.Gui/DeployDialog.cs | 13 +- .../MonoDevelop.Deployment.Gui/DeployOperations.cs | 36 +- .../EditPackageDialog.cs | 2 +- .../EntrySelectionTree.cs | 53 +- .../MonoDevelop.Deployment.Gui/InstallDialog.cs | 2 +- .../MonoDevelop.Deployment.Gui/PackagingFeature.cs | 8 +- .../PackagingFeatureWidget.cs | 13 +- .../PackageNodeBuilder.cs | 2 +- .../BaseFuseFileCopyHandler.cs | 19 +- .../BinariesZipPackageBuilder.cs | 26 +- .../CommandPackageBuilder.cs | 16 +- .../LocalFileCopyHandler.cs | 8 +- .../SourcesZipPackageBuilder.cs | 21 +- .../SshFuseFileCopyHandler.cs | 2 +- .../DefaultDeployServiceExtension.cs | 2 +- .../MonoDevelop.Deployment/DeployFile.cs | 8 +- .../MonoDevelop.Deployment/DeployService.cs | 23 +- .../DeployServiceExtension.cs | 4 +- .../FileCopyConfiguration.cs | 2 +- .../MonoDevelop.Deployment/FileCopyHandler.cs | 2 +- .../MonoDevelop.Deployment/IFileCopyHandler.cs | 2 +- .../MonoDevelop.Deployment/InstallResolver.cs | 10 +- .../MonoDevelop.Deployment/Package.cs | 9 +- .../MonoDevelop.Deployment/PackageBuilder.cs | 57 +- .../MonoDevelop.Deployment/PackagingProject.cs | 23 +- .../UnknownPackageBuilder.cs | 2 +- main/src/addins/GnomePlatform/GnomePlatform.cs | 2 +- .../addins/ILAsmBinding/ILAsmCompilerManager.cs | 2 +- .../addins/ILAsmBinding/ILAsmLanguageBinding.cs | 4 +- .../Project/ILAsmCompilerParameters.cs | 2 +- .../Dialogs/SelectEncodingPopUpButton.cs | 6 +- .../MacPlatform/MacExternalConsoleProcess.cs | 65 +- main/src/addins/MacPlatform/MacMenu/MDMenuItem.cs | 2 + main/src/addins/MacPlatform/MacPlatform.cs | 41 +- .../AssemblyBrowserWidget.cs | 77 ++- .../MonoDevelop.AssemblyBrowser/AssemblyLoader.cs | 11 +- .../IAssemblyBrowserNodeBuilder.cs | 1 + .../TreeNodes/AssemblyNodeBuilder.cs | 16 +- .../TreeNodes/DomEventNodeBuilder.cs | 10 +- .../TreeNodes/DomFieldNodeBuilder.cs | 10 +- .../TreeNodes/DomMethodNodeBuilder.cs | 75 ++- .../TreeNodes/DomPropertyNodeBuilder.cs | 8 + .../TreeNodes/DomTypeNodeBuilder.cs | 18 +- .../TreeNodes/NamespaceBuilder.cs | 6 + .../MonoDevelop.Autotools/AutotoolsContext.cs | 8 +- main/src/addins/MonoDevelop.Autotools/Commands.cs | 10 +- .../FileNodeBuilderExtension.cs | 4 +- main/src/addins/MonoDevelop.Autotools/Handler.cs | 25 +- .../MonoDevelop.Autotools/IMakefileHandler.cs | 4 +- .../addins/MonoDevelop.Autotools/MakefileData.cs | 27 +- .../MonoDevelop.Autotools/MakefileGeneratorTool.cs | 2 +- .../MakefileIntegrationFeature.cs | 8 +- .../MakefileOptionPanelWidget.cs | 2 +- .../MonoDevelop.Autotools/MakefileProject.cs | 6 +- .../MakefileProjectServiceExtension.cs | 151 ++--- .../MonoDevelop.Autotools.addin.xml | 6 + .../MonoDevelop.Autotools.csproj | 1 + .../SimpleProjectMakefileHandler.cs | 10 +- .../MonoDevelop.Autotools/SolutionDeployer.cs | 16 +- .../SolutionMakefileHandler.cs | 58 +- .../TarballBuilderEditorWidget.cs | 2 +- .../addins/MonoDevelop.Debugger.Gdb/GdbSession.cs | 2 +- .../CustomSoftDebuggerEngine.cs | 4 +- .../SoftDebuggerEngine.cs | 10 +- .../MonoDevelop.Debugger.Win32/CorObjectAdaptor.cs | 2 + .../TextVisualizer.cs | 17 +- .../MonoDevelop.Debugger.addin.xml | 17 +- .../MonoDevelop.Debugger/BreakpointPad.cs | 3 + .../BreakpointPropertiesDialog.cs | 73 +- .../MonoDevelop.Debugger/DebugCommands.cs | 115 ++-- .../DebugExecutionHandlerFactory.cs | 100 +-- .../MonoDevelop.Debugger/DebuggingService.cs | 34 +- .../MonoDevelop.Debugger/ExceptionCaughtDialog.cs | 51 +- .../MonoDevelop.Debugger/Extensions.cs | 43 +- .../MonoDevelop.Debugger/ObjectValueTreeView.cs | 12 +- .../MonoDevelop.Debugger/ThreadsPad.cs | 7 +- .../MonoDevelop.Debugger.BusyEvaluatorDialog.cs | 5 +- .../addins/MonoDevelop.Debugger/gtk-gui/gui.stetic | 5 +- .../ComponentNodeBuilder.cs | 4 +- .../PropertyPadTextEditorExtension.cs | 2 +- .../SolutionItemDescriptor.cs | 8 +- .../SolutionItemPropertyProvider.cs | 4 +- .../ComponentSelectorDialog.cs | 2 +- .../CodeBehindWriter.cs | 6 +- .../MonoDevelop.DesignerSupport/ToolboxService.cs | 8 +- .../GettextEditorDisplayBinding.cs | 2 +- .../MonoDevelop.Gettext.Editor/POEditorWidget.cs | 8 +- .../ProjectFileNodeBuilderExtension.cs | 4 +- .../TranslationNodeBuilder.cs | 16 +- .../TranslationProjectNodeBuilder.cs | 18 +- .../MonoDevelop.Gettext/Catalog.cs | 6 +- .../MonoDevelop.Gettext/GettextFeature.cs | 10 +- .../MonoDevelop.Gettext/GettextFeatureWidget.cs | 6 +- .../MonoDevelop.Gettext/GettextTool.cs | 6 +- .../MonoDevelop.Gettext/IFileScanner.cs | 2 +- .../MonoDevelop.Gettext/MakefileHandler.cs | 4 +- .../MonoDevelop.Gettext/RegexFileScanner.cs | 2 +- .../MonoDevelop.Gettext/Translation.cs | 2 +- .../MonoDevelop.Gettext/TranslationProject.cs | 76 +-- .../TranslationProjectOptionsDialog.cs | 16 +- .../GtkFeatureWidget.cs | 10 +- .../GtkProjectServiceExtension.cs | 49 +- .../GuiBuilderProject.cs | 2 +- .../GuiBuilderService.cs | 13 +- .../ActionGroupNodeBuilder.cs | 2 +- .../ProjectFolderNodeBuilderExtension.cs | 2 +- .../WidgetNodeBuilder.cs | 2 +- .../MonoDevelop.GtkCore.addin.xml | 4 +- .../MonoDevelop.GtkCore/ProjectResourceProvider.cs | 4 +- .../WidgetFileDescriptionTemplate.cs | 6 +- .../MonoDevelop.GtkCore/libstetic/ImageInfo.cs | 2 + .../libstetic/editor/SelectImageDialog.cs | 3 +- .../libsteticui/Metacity/ButtonFunction.cs | 20 - .../libsteticui/Metacity/ButtonLayout.cs | 36 - .../libsteticui/Metacity/FrameFlags.cs | 30 - .../libsteticui/Metacity/FrameType.cs | 22 - .../libsteticui/Metacity/ObjectManager.cs | 19 - .../libsteticui/Metacity/Preview.cs | 226 ------- .../libsteticui/Metacity/Theme.cs | 41 -- .../libsteticui/WidgetDesignerBackend.cs | 7 +- .../libsteticui/libsteticui.csproj | 7 - .../Mono.MHex.Rendering/TextEditorMargin.cs | 2 +- .../MonoDevelop.HexEditor/HexEditorVisualizer.cs | 19 +- .../RestorePackagesInProjectHandler.cs | 63 ++ .../AddPackagesDialog.cs | 3 +- .../PackageReferenceNode.cs | 49 +- .../PackageReferenceNodeBuilder.cs | 3 + .../ProjectPackagesFolderNodeBuilder.cs | 4 +- .../ProjectPackagesProjectNodeBuilderExtension.cs | 11 +- .../ExceptionThrowingPackageRepository.cs | 53 ++ .../FakeFileRemover.cs | 41 ++ .../FakeOperationAwareRepository.cs | 10 + .../FakePackage.cs | 3 + .../FakePackageManagementProject.cs | 25 +- .../FakePackageManagementSolution.cs | 20 + .../FakePackageManager.cs | 14 +- .../FakePackageManagerFactory.cs | 8 + .../FakePackageRepository.cs | 2 +- .../FakePackageRepositoryFactory.cs | 7 + .../FakePackageRepositoryWithConstraintProvider.cs | 47 ++ .../FakeProgressMonitor.cs | 23 +- .../FakeProgressMonitorFactory.cs | 2 +- .../FakeProject.cs | 5 + .../FakeSolutionPackageRepository.cs | 27 + .../TestableBackgroundPackageActionRunner.cs | 2 +- .../TestableLocalPackageRepository.cs | 59 ++ .../TestablePackageCompatibilityRunner.cs | 4 +- .../TestablePackageManagementEventsMonitor.cs | 6 +- .../TestableSolutionPackageRepository.cs | 51 ++ .../MonoDevelop.PackageManagement.Tests.csproj | 8 +- .../AvailablePackagesViewModelTests.cs | 313 ++++++++- .../InstallPackageActionTests.cs | 2 - .../MonoDevelopAggregateRepositoryTests.cs | 194 ++++++ .../NuGetPackageRestoreCommandLineTests.cs | 86 --- .../PackageManagementProjectTests.cs | 22 + .../PackageManagementSolutionTests.cs | 14 + .../PackageReferenceNodeTests.cs | 149 ++++- .../PackageRepositoryCacheTests.cs | 75 ++- .../PackageViewModelTests.cs | 5 +- .../PackagesViewModelTests.cs | 23 +- .../ProjectPackagesFolderNodeTests.cs | 9 +- .../RecentPackageRepositoryTests.cs | 15 + .../RegisteredPackageRepositoriesTests.cs | 54 ++ .../ReinstallPackageActionTests.cs | 4 +- .../ReinstallProjectPackagesActionTests.cs | 4 +- .../RestorePackagesActionTests.cs | 322 +++++++++ .../SettingProviderTests.cs | 14 + .../SolutionPackageRepositoryTests.cs | 67 +- .../UpdatePackageActionTests.cs | 59 +- .../UpdatedPackagesInSolutionTests.cs | 21 +- .../UpdatedPackagesTests.cs | 37 +- .../MonoDevelop.PackageManagement.addin.xml | 3 +- .../MonoDevelop.PackageManagement.csproj | 19 +- .../AggregateExceptionErrorMessage.cs | 14 +- .../AvailablePackagesViewModel.cs | 79 ++- .../BackgroundPackageActionRunner.cs | 17 +- .../DotNetProjectExtensions.cs | 28 +- .../FailingPackageRepository.cs | 76 +++ .../FilePathExtensions.cs | 45 ++ .../MonoDevelop.PackageManagement/FileRemover.cs | 40 ++ .../FileRemovingEventArgs.cs | 47 ++ .../MonoDevelop.PackageManagement/IFileRemover.cs | 36 + .../IPackageFromRepository.cs | 1 + .../IPackageManagementEvents.cs | 3 + .../IPackageManagementProgressMonitorFactory.cs | 2 +- .../IPackageManagementProject.cs | 2 + .../IPackageManagementProjectOperations.cs | 48 ++ .../IPackageManagementSolution.cs | 1 + .../IPackageManagerFactory.cs | 4 + .../IPackageRepositoryCache.cs | 1 + .../IPackageRepositoryExtensions.cs | 5 + .../MonoDevelop.PackageManagement/IProject.cs | 2 + .../ISolutionPackageRepository.cs | 4 +- .../MonoDevelopAggregateRepository.cs | 68 ++ .../MonoDevelop.PackageManagement/NuGetExePath.cs | 46 -- .../NuGetPackageRestoreCommandLine.cs | 108 --- .../PackageCompatibilityHandler.cs | 2 +- .../PackageCompatibilityRunner.cs | 10 +- .../PackageFromRepository.cs | 10 + .../PackageManagementEvents.cs | 13 + .../PackageManagementEventsMonitor.cs | 6 +- .../PackageManagementFileService.cs | 4 +- .../PackageManagementPackageReference.cs | 43 ++ .../PackageManagementPackageReferenceEventArgs.cs | 44 ++ .../PackageManagementProgressMonitor.cs | 131 +--- .../PackageManagementProgressMonitorFactory.cs | 8 +- .../PackageManagementProgressProvider.cs | 2 +- .../PackageManagementProject.cs | 10 + .../PackageManagementProjectOperations.cs | 151 +++++ .../PackageManagementServices.cs | 25 +- .../PackageManagementSolution.cs | 5 + .../PackageRepositoryCache.cs | 34 +- .../PackageRestoreRunner.cs | 119 ++-- .../PackageRestorer.cs | 8 +- .../PackageUpdateChecker.cs | 15 +- .../PackageUpdatesEventMonitor.cs | 14 +- .../PackagesViewModel.cs | 23 +- .../PackagesViewModels.cs | 2 +- ...ackagesConfigFileBeingRemovedOnUpdateMonitor.cs | 71 ++ .../ProcessPackageAction.cs | 17 +- .../ProgressMonitorExtensions.cs | 2 +- .../ProgressMonitorStatusMessageFactory.cs | 12 +- .../ProjectExtensions.cs | 2 +- .../MonoDevelop.PackageManagement/ProjectProxy.cs | 5 + .../ProjectTemplateNuGetPackageInstaller.cs | 5 +- .../ProjectTemplatePackageRepositoryCache.cs | 5 + .../RecentPackageRepository.cs | 12 + .../RegisteredPackageRepositories.cs | 17 +- .../RestoreBeforeUpdateAction.cs | 20 +- .../RestorePackagesAction.cs | 192 ++++++ .../SettingsProvider.cs | 8 +- .../SharpDevelopPackageManagerFactory.cs | 11 + .../SharpDevelopPackageRepositoryFactory.cs | 3 +- .../SolutionExtensions.cs | 4 +- .../SolutionPackageRepository.cs | 25 + .../ThreadSafePackageManagementEvents.cs | 11 + .../UpdatePackageAction.cs | 32 +- .../UpdatedPackages.cs | 25 +- .../UpdatedPackagesInSolution.cs | 1 + .../MonoDevelop.AnalysisCore/AnalysisCommands.cs | 16 +- .../CodeActionEditorExtension.cs | 8 +- .../MonoDevelop.CodeIssues/BatchFixer.cs | 4 +- .../Runner/ProgressMonitorWrapperJob.cs | 2 +- .../RenameItemDialog.cs | 6 +- .../RenameRefactoring.cs | 8 +- .../MonoDevelop.Refactoring/Change.cs | 18 +- .../RefactoringPreviewDialog.cs | 2 +- .../MonoDevelop.Refactoring/RefactoringService.cs | 20 +- .../ResolveCommandHandler.cs | 23 +- .../BehaviorPanel.cs | 9 +- .../AbstractUsagesExtension.cs | 3 +- .../MonoDevelop.SourceEditor/ErrorText.cs | 4 +- .../MessageBubbleTextMarker.cs | 6 +- .../SourceEditorOptions.cs | 75 ++- .../MonoDevelop.SourceEditor/SourceEditorView.cs | 4 +- .../WebReferenceCommandHandler.cs | 8 +- .../WCFConfigWidget.cs | 2 +- .../WebReferenceDialog.cs | 4 +- ...evelop.WebReferences.Dialogs.WCFConfigWidget.cs | 9 + ...lop.WebReferences.Dialogs.WebReferenceDialog.cs | 26 +- .../src/addins/MonoDeveloperExtensions/Commands.cs | 4 +- .../MonoDeveloperExtensions/MakefileProject.cs | 405 +++++++++++ .../MonoDeveloperExtensions.csproj | 1 + .../MonoDeveloperExtensions/MonoMakefileFormat.cs | 164 +++-- .../MonoSolutionItemHandler.cs | 42 +- .../NUnit/MonoTestProvider.cs | 23 +- main/src/addins/NUnit/Commands/NUnitCommands.cs | 4 +- .../NUnitAssemblyGroupConfigurationNodeBuilder.cs | 2 +- .../NUnit/Gui/NUnitAssemblyGroupNodeBuilder.cs | 2 +- main/src/addins/NUnit/Gui/TestPad.cs | 16 +- main/src/addins/NUnit/Gui/TestResultsPad.cs | 36 +- main/src/addins/NUnit/Makefile.am | 1 - main/src/addins/NUnit/MonoDevelop.NUnit.csproj | 28 +- main/src/addins/NUnit/MonoDevelopNUnit.addin.xml | 16 +- .../addins/NUnit/NUnitRunner/NUnitRunner.csproj | 22 +- main/src/addins/NUnit/NUnitRunner/packages.config | 5 + .../NUnit/Project/NUnitAssemblyGroupProject.cs | 26 +- main/src/addins/NUnit/Services/ITestProvider.cs | 2 +- .../NUnit/Services/NUnitAssemblyTestSuite.cs | 11 +- .../NUnit/Services/NUnitProjectServiceExtension.cs | 40 +- main/src/addins/NUnit/Services/NUnitService.cs | 141 ++-- .../NUnit/Services/SolutionFolderTestGroup.cs | 2 +- .../addins/NUnit/Services/SystemTestProvider.cs | 2 +- main/src/addins/NUnit/Services/UnitTest.cs | 29 +- main/src/addins/NUnit/Services/UnitTestGroup.cs | 11 +- main/src/addins/NUnit/lib/nunit.core.dll | Bin 147456 -> 0 bytes .../src/addins/NUnit/lib/nunit.core.interfaces.dll | Bin 57344 -> 0 bytes main/src/addins/NUnit/lib/nunit.framework.dll | Bin 143360 -> 0 bytes main/src/addins/NUnit/lib/nunit.util.dll | Bin 135168 -> 0 bytes main/src/addins/NUnit/packages.config | 5 + .../addins/NUnit/templates/NUnitProject.xpt.xml | 7 +- .../TemplateEnginePreprocessTemplateTests.cs | 44 ++ .../TextTransformation.cs | 9 +- .../Mono.TextTemplating/RecyclableAppDomain.cs | 6 + .../Mono.TextTemplating/TemplatingEngine.cs | 49 +- .../TextTemplatingFileGenerator.cs | 7 +- .../TextTemplatingFilePreprocessor.cs | 7 +- .../TextTemplatingService.cs | 2 +- .../VBNetBinding/Gui/ProjectOptionsPanelWidget.cs | 4 +- main/src/addins/VBNetBinding/Project/Import.cs | 6 +- .../VBNetBinding/Project/VBCompilerParameters.cs | 2 +- .../VBNetBinding/Project/VBProjectExtension.cs | 118 ++++ .../VBNetBinding/Project/VBProjectParameters.cs | 109 --- .../VBNetBinding/VBBindingCompilerServices.cs | 10 +- main/src/addins/VBNetBinding/VBLanguageBinding.cs | 9 +- main/src/addins/VBNetBinding/VBNetBinding.csproj | 2 +- .../BaseGitRepositoryTests.cs | 24 +- .../BaseRepositoryTests.cs | 44 +- .../MonoDevelop.VersionControl.Git/Commands.cs | 4 +- .../GitNodeBuilderExtension.cs | 14 +- .../GitRepository.cs | 210 +++--- .../MonoDevelop.VersionControl.Git/GitService.cs | 20 +- .../GitSupportFeature.cs | 11 +- .../MonoDevelop.VersionControl.Git/GitUtil.cs | 3 +- .../MonoDevelop.VersionControl.Git/Stash.cs | 2 +- .../StashManagerDialog.cs | 8 +- .../LibSvnClient.cs | 53 +- .../SvnClient.cs | 606 ++++++++--------- .../SubversionRepository.cs | 47 +- .../SubversionVersionControl.cs | 49 +- .../MonoDevelop.VersionControl.Views/StatusView.cs | 56 +- .../SubviewAttachmentHandler.cs | 4 +- .../MonoDevelop.VersionControl.csproj | 2 +- .../AddRemoveMoveCommand.cs | 6 +- .../MonoDevelop.VersionControl/CheckoutCommand.cs | 6 +- .../MonoDevelop.VersionControl/Commands.cs | 2 +- .../MonoDevelop.VersionControl/CommitCommand.cs | 2 +- .../MonoDevelop.VersionControl/IgnoreCommand.cs | 4 +- .../MonoDevelop.VersionControl/LockCommand.cs | 2 +- .../MonoDevelop.VersionControl/PublishCommand.cs | 6 +- .../MonoDevelop.VersionControl/Repository.cs | 89 ++- .../MonoDevelop.VersionControl/RevertCommand.cs | 2 +- .../RevertRevisionsCommands.cs | 2 +- .../MonoDevelop.VersionControl/Task.cs | 79 --- .../UnknownRepository.cs | 24 +- .../MonoDevelop.VersionControl/UnlockCommand.cs | 2 +- .../MonoDevelop.VersionControl/UpdateCommand.cs | 2 +- .../VersionControlCommandHandler.cs | 6 +- .../VersionControlFileSystemExtension.cs | 10 +- .../VersionControlItem.cs | 6 +- .../VersionControlNodeExtension.cs | 12 +- .../VersionControlService.cs | 37 +- .../VersionControlTask.cs | 79 +++ .../VersionControl.addin.xml | 2 +- .../Subversion.Win32/SvnSharpClient.cs | 224 ++++--- .../VersionControl.Subversion.Win32.csproj | 22 +- .../Subversion.Win32/packages.config | 4 + .../Dialogs/OpenFileDialogHandler.cs | 25 +- .../WindowsPlatform/WindowsPlatform/Enums.cs | 573 ---------------- .../WindowsPlatform/WindowsPlatform/JumpList.cs | 2 +- .../WindowsPlatform/WindowsPlatform/Win32.cs | 90 +-- .../WindowsPlatform/WindowsPlatform.cs | 13 +- .../WindowsPlatform/WindowsPlatform.csproj | 2 - .../WindowsPlatform/WindowsPlatform/structs.cs | 178 ----- .../addins/Xml/Editor/BaseXmlEditorExtension.cs | 16 +- main/src/addins/Xml/Editor/XmlEditorService.cs | 12 +- .../addins/Xml/Editor/XmlTextEditorExtension.cs | 6 +- 430 files changed, 7770 insertions(+), 5694 deletions(-) delete mode 100644 main/src/addins/AspNet/Projects/AspNetAppProject.cs delete mode 100644 main/src/addins/AspNet/Projects/AspNetAppProjectBinding.cs create mode 100644 main/src/addins/AspNet/Projects/AspNetFlavor.cs delete mode 100644 main/src/addins/CBinding/Project/CProjectBinding.cs delete mode 100644 main/src/addins/CBinding/Project/CProjectServiceExtension.cs create mode 100644 main/src/addins/CSharpBinding/MonoDevelop.CSharp.Project/CSharpProjectExtension.cs delete mode 100644 main/src/addins/CSharpBinding/MonoDevelop.CSharp.Project/CSharpProjectParameters.cs create mode 100644 main/src/addins/CSharpBinding/MonoDevelop.CSharp.Project/PortableCSharpProjectFlavor.cs delete mode 100644 main/src/addins/MonoDevelop.GtkCore/libsteticui/Metacity/ButtonFunction.cs delete mode 100644 main/src/addins/MonoDevelop.GtkCore/libsteticui/Metacity/ButtonLayout.cs delete mode 100644 main/src/addins/MonoDevelop.GtkCore/libsteticui/Metacity/FrameFlags.cs delete mode 100644 main/src/addins/MonoDevelop.GtkCore/libsteticui/Metacity/FrameType.cs delete mode 100644 main/src/addins/MonoDevelop.GtkCore/libsteticui/Metacity/ObjectManager.cs delete mode 100644 main/src/addins/MonoDevelop.GtkCore/libsteticui/Metacity/Preview.cs delete mode 100644 main/src/addins/MonoDevelop.GtkCore/libsteticui/Metacity/Theme.cs create mode 100644 main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesInProjectHandler.cs create mode 100644 main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/ExceptionThrowingPackageRepository.cs create mode 100644 main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeFileRemover.cs create mode 100644 main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakePackageRepositoryWithConstraintProvider.cs create mode 100644 main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableLocalPackageRepository.cs create mode 100644 main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableSolutionPackageRepository.cs create mode 100644 main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopAggregateRepositoryTests.cs delete mode 100644 main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/NuGetPackageRestoreCommandLineTests.cs create mode 100644 main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/RestorePackagesActionTests.cs create mode 100644 main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/FailingPackageRepository.cs create mode 100644 main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/FilePathExtensions.cs create mode 100644 main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/FileRemover.cs create mode 100644 main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/FileRemovingEventArgs.cs create mode 100644 main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IFileRemover.cs create mode 100644 main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IPackageManagementProjectOperations.cs create mode 100644 main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MonoDevelopAggregateRepository.cs delete mode 100644 main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/NuGetExePath.cs delete mode 100644 main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/NuGetPackageRestoreCommandLine.cs create mode 100644 main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementPackageReference.cs create mode 100644 main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementPackageReferenceEventArgs.cs create mode 100644 main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectOperations.cs create mode 100644 main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PreventPackagesConfigFileBeingRemovedOnUpdateMonitor.cs create mode 100644 main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestorePackagesAction.cs create mode 100644 main/src/addins/MonoDeveloperExtensions/MakefileProject.cs create mode 100644 main/src/addins/NUnit/NUnitRunner/packages.config delete mode 100644 main/src/addins/NUnit/lib/nunit.core.dll delete mode 100644 main/src/addins/NUnit/lib/nunit.core.interfaces.dll delete mode 100644 main/src/addins/NUnit/lib/nunit.framework.dll delete mode 100644 main/src/addins/NUnit/lib/nunit.util.dll create mode 100644 main/src/addins/NUnit/packages.config create mode 100644 main/src/addins/VBNetBinding/Project/VBProjectExtension.cs delete mode 100644 main/src/addins/VBNetBinding/Project/VBProjectParameters.cs delete mode 100644 main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/Task.cs create mode 100644 main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlTask.cs create mode 100644 main/src/addins/VersionControl/Subversion.Win32/packages.config delete mode 100644 main/src/addins/WindowsPlatform/WindowsPlatform/Enums.cs delete mode 100644 main/src/addins/WindowsPlatform/WindowsPlatform/structs.cs (limited to 'main/src/addins') diff --git a/main/src/addins/AspNet/Commands/AddControllerDialog.cs b/main/src/addins/AspNet/Commands/AddControllerDialog.cs index 603e60dbf0..c3af4ed5db 100644 --- a/main/src/addins/AspNet/Commands/AddControllerDialog.cs +++ b/main/src/addins/AspNet/Commands/AddControllerDialog.cs @@ -29,6 +29,7 @@ using System.Collections.Generic; using Gtk; using MonoDevelop.Core; using MonoDevelop.AspNet.Projects; +using MonoDevelop.Projects; namespace MonoDevelop.AspNet.Commands { @@ -57,13 +58,14 @@ namespace MonoDevelop.AspNet.Commands } } - public AddControllerDialog (AspNetAppProject project) + public AddControllerDialog (DotNetProject project) { Build (); + var ext = project.GetService (); provider = project.LanguageBinding.GetCodeDomProvider (); - loadedTemplateList = project.GetCodeTemplates ("AddController"); + loadedTemplateList = ext.GetCodeTemplates ("AddController"); bool foundEmptyTemplate = false; int templateIndex = 0; foreach (string file in loadedTemplateList) { diff --git a/main/src/addins/AspNet/Commands/AddViewDialog.cs b/main/src/addins/AspNet/Commands/AddViewDialog.cs index c9d4c56a21..ef54af54bb 100644 --- a/main/src/addins/AspNet/Commands/AddViewDialog.cs +++ b/main/src/addins/AspNet/Commands/AddViewDialog.cs @@ -37,12 +37,14 @@ using MonoDevelop.AspNet.Projects; using MonoDevelop.AspNet.WebForms.Dom; using MonoDevelop.AspNet.WebForms; using Gtk; +using MonoDevelop.Projects; namespace MonoDevelop.AspNet.Commands { class AddViewDialog : Dialog { - readonly AspNetAppProject project; + readonly DotNetProject project; + readonly AspNetFlavor aspFlavor; IDictionary> loadedTemplateList; IDictionary templateStore; ListStore dataClassStore; @@ -61,9 +63,10 @@ namespace MonoDevelop.AspNet.Commands CheckButton partialCheck, stronglyTypedCheck, masterCheck; Alignment typePanel, masterPanel; - public AddViewDialog (AspNetAppProject project) + public AddViewDialog (DotNetProject project) { this.project = project; + aspFlavor = project.GetService (); Build (); @@ -73,14 +76,14 @@ namespace MonoDevelop.AspNet.Commands loadedTemplateList = new Dictionary> (); foreach (var engine in viewEngines) { viewEngineCombo.AppendText (engine); - loadedTemplateList[engine] = project.GetCodeTemplates ("AddView", engine); + loadedTemplateList[engine] = aspFlavor.GetCodeTemplates ("AddView", engine); } viewEngineCombo.Active = 0; InitializeTemplateStore (loadedTemplateList); ContentPlaceHolders = new List (); - string siteMaster = project.VirtualToLocalPath ("~/Views/Shared/Site.master", null); + string siteMaster = aspFlavor.VirtualToLocalPath ("~/Views/Shared/Site.master", null); if (project.Files.GetFile (siteMaster) != null) masterEntry.Text = "~/Views/Shared/Site.master"; @@ -221,7 +224,7 @@ namespace MonoDevelop.AspNet.Commands IEnumerable GetProperViewEngines () { yield return "Aspx"; - if (project.SupportsRazorViewEngine) + if (aspFlavor.SupportsRazorViewEngine) yield return "Razor"; } @@ -307,7 +310,7 @@ namespace MonoDevelop.AspNet.Commands return false; if (!IsPartialView && HasMaster && ActiveViewEngine != "Razor") { - if (String.IsNullOrEmpty (MasterFile) || !File.Exists (project.VirtualToLocalPath (oldMaster, null))) + if (String.IsNullOrEmpty (MasterFile) || !File.Exists (aspFlavor.VirtualToLocalPath (oldMaster, null))) return false; //PrimaryPlaceHolder can be empty //Layout Page can be empty in Razor Views - it's usually set in _ViewStart.cshtml file @@ -341,7 +344,7 @@ namespace MonoDevelop.AspNet.Commands }; try { if (MessageService.RunCustomDialog (dialog) == (int) ResponseType.Ok) - masterEntry.Text = project.LocalToVirtualPath (dialog.SelectedFile.FilePath); + masterEntry.Text = aspFlavor.LocalToVirtualPath (dialog.SelectedFile.FilePath); } finally { dialog.Destroy (); } @@ -359,7 +362,7 @@ namespace MonoDevelop.AspNet.Commands primaryPlaceholderStore.Clear (); ContentPlaceHolders.Clear (); - string realPath = project.VirtualToLocalPath (oldMaster, null); + string realPath = aspFlavor.VirtualToLocalPath (oldMaster, null); if (!File.Exists (realPath)) return; diff --git a/main/src/addins/AspNet/Commands/AddViewFromControllerCommandHandler.cs b/main/src/addins/AspNet/Commands/AddViewFromControllerCommandHandler.cs index 0bf46856ec..0d732c6f54 100644 --- a/main/src/addins/AspNet/Commands/AddViewFromControllerCommandHandler.cs +++ b/main/src/addins/AspNet/Commands/AddViewFromControllerCommandHandler.cs @@ -28,6 +28,7 @@ using System; using MonoDevelop.Components.Commands; using MonoDevelop.Ide; using MonoDevelop.AspNet.Projects; +using MonoDevelop.Projects; namespace MonoDevelop.AspNet.Commands { @@ -41,7 +42,7 @@ namespace MonoDevelop.AspNet.Commands protected override void Run () { var doc = IdeApp.Workbench.ActiveDocument; - var project = (AspNetAppProject)doc.Project; + var project = (DotNetProject)doc.Project; var currentLocation = doc.Editor.Caret.Location; string controllerName = doc.ParsedDocument.GetTopLevelTypeDefinition (currentLocation).Name; @@ -54,7 +55,7 @@ namespace MonoDevelop.AspNet.Commands AddView (project, path, actionName); } - public static void AddView (AspNetAppProject project, string path, string name) + public static void AddView (DotNetProject project, string path, string name) { var provider = project.LanguageBinding.GetCodeDomProvider (); if (provider == null) @@ -125,7 +126,7 @@ namespace MonoDevelop.AspNet.Commands if (System.IO.File.Exists (outputFile)) { project.AddFile (outputFile); - IdeApp.ProjectOperations.Save (project); + IdeApp.ProjectOperations.SaveAsync (project); } } } diff --git a/main/src/addins/AspNet/Commands/GoToControllerCommandHandler.cs b/main/src/addins/AspNet/Commands/GoToControllerCommandHandler.cs index ed2251cb31..3e62a685bb 100644 --- a/main/src/addins/AspNet/Commands/GoToControllerCommandHandler.cs +++ b/main/src/addins/AspNet/Commands/GoToControllerCommandHandler.cs @@ -40,8 +40,12 @@ namespace MonoDevelop.AspNet.Commands protected override void Update (CommandInfo info) { var doc = IdeApp.Workbench.ActiveDocument; - AspNetAppProject project; - if (doc == null || (project = doc.Project as AspNetAppProject) == null || !project.IsAspMvcProject) { + if (doc == null || doc.Project == null) { + info.Enabled = info.Visible = false; + return; + } + var aspFlavor = doc.Project.GetService (); + if (aspFlavor == null || !aspFlavor.IsAspMvcProject) { info.Enabled = info.Visible = false; return; } diff --git a/main/src/addins/AspNet/Commands/MvcCommandsCommonHandler.cs b/main/src/addins/AspNet/Commands/MvcCommandsCommonHandler.cs index 03fa16fb63..fcc9aa7acd 100644 --- a/main/src/addins/AspNet/Commands/MvcCommandsCommonHandler.cs +++ b/main/src/addins/AspNet/Commands/MvcCommandsCommonHandler.cs @@ -38,8 +38,12 @@ namespace MonoDevelop.AspNet.Commands public static void Update (CommandInfo info) { var doc = IdeApp.Workbench.ActiveDocument; - AspNetAppProject project; - if (doc == null || (project = doc.Project as AspNetAppProject) == null || !project.IsAspMvcProject || doc.ParsedDocument == null) { + if (doc == null || doc.Project == null || doc.ParsedDocument == null) { + info.Enabled = info.Visible = false; + return; + } + var aspFlavor = doc.Project.GetService (); + if (aspFlavor == null || !aspFlavor.IsAspMvcProject) { info.Enabled = info.Visible = false; return; } diff --git a/main/src/addins/AspNet/Execution/AspNetExecutionHandler.cs b/main/src/addins/AspNet/Execution/AspNetExecutionHandler.cs index 2e0dcca894..19566f4656 100644 --- a/main/src/addins/AspNet/Execution/AspNetExecutionHandler.cs +++ b/main/src/addins/AspNet/Execution/AspNetExecutionHandler.cs @@ -89,7 +89,7 @@ namespace MonoDevelop.AspNet.Execution return cmd != null && !string.IsNullOrEmpty (GetXspName (cmd)); } - public IProcessAsyncOperation Execute (ExecutionCommand command, IConsole console) + public ProcessAsyncOperation Execute (ExecutionCommand command, IConsole console) { var cmd = (AspNetExecutionCommand) command; var xspPath = GetXspPath (cmd); diff --git a/main/src/addins/AspNet/Execution/BrowserLauncher.cs b/main/src/addins/AspNet/Execution/BrowserLauncher.cs index 6a03216721..628b4cdd00 100644 --- a/main/src/addins/AspNet/Execution/BrowserLauncher.cs +++ b/main/src/addins/AspNet/Execution/BrowserLauncher.cs @@ -35,7 +35,7 @@ namespace MonoDevelop.AspNet.Execution { static class BrowserLauncher { - public static IProcessAsyncOperation LaunchDefaultBrowser (string url) + public static ProcessAsyncOperation LaunchDefaultBrowser (string url) { try { DesktopService.ShowUrl (url); diff --git a/main/src/addins/AspNet/Execution/XspOptionsPanel.cs b/main/src/addins/AspNet/Execution/XspOptionsPanel.cs index 6bd97b965d..1565afca86 100644 --- a/main/src/addins/AspNet/Execution/XspOptionsPanel.cs +++ b/main/src/addins/AspNet/Execution/XspOptionsPanel.cs @@ -41,12 +41,12 @@ namespace MonoDevelop.AspNet.Execution public override Widget CreatePanelWidget () { - return panel = new XspOptionsPanelWidget ((AspNetAppProject) ConfiguredProject); + return panel = new XspOptionsPanelWidget (ConfiguredProject.GetService ()); } public override void ApplyChanges () { - panel.Store ((AspNetAppProject) ConfiguredProject); + panel.Store (ConfiguredProject.GetService ()); } } } diff --git a/main/src/addins/AspNet/Execution/XspOptionsPanelWidget.cs b/main/src/addins/AspNet/Execution/XspOptionsPanelWidget.cs index 18126f4836..da3a559f14 100644 --- a/main/src/addins/AspNet/Execution/XspOptionsPanelWidget.cs +++ b/main/src/addins/AspNet/Execution/XspOptionsPanelWidget.cs @@ -46,7 +46,7 @@ namespace MonoDevelop.AspNet.Execution readonly FileEntry certLocation = new FileEntry (); readonly Entry passwordEntry = new Entry { InvisibleChar = '●' }; - public XspOptionsPanelWidget (AspNetAppProject project) + public XspOptionsPanelWidget (AspNetFlavor project) { Build (); @@ -165,7 +165,7 @@ namespace MonoDevelop.AspNet.Execution ShowAll (); } - public void Store (AspNetAppProject project) + public void Store (AspNetFlavor project) { XspParameters xPar = project.XspParameters; diff --git a/main/src/addins/AspNet/Makefile.am b/main/src/addins/AspNet/Makefile.am index b8a06787c8..2dc30cad76 100644 --- a/main/src/addins/AspNet/Makefile.am +++ b/main/src/addins/AspNet/Makefile.am @@ -1,4 +1,4 @@ include $(top_srcdir)/xbuild.include EXTRA_DIST += \ $(wildcard lib/*) \ - $(wildcard Templates/Common/*.cshtml) + $(wildcard Templates/MvcCommon/*.cshtml) diff --git a/main/src/addins/AspNet/MonoDevelop.AspNet.csproj b/main/src/addins/AspNet/MonoDevelop.AspNet.csproj index 26e3e80662..f0b66a4ae4 100644 --- a/main/src/addins/AspNet/MonoDevelop.AspNet.csproj +++ b/main/src/addins/AspNet/MonoDevelop.AspNet.csproj @@ -9,6 +9,7 @@ Library MonoDevelop.AspNet MonoDevelop.AspNet + v4.5 True @@ -125,6 +126,7 @@ ..\..\..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Razor.dll + ..\..\..\packages\Microsoft.AspNet.Mvc.4.0.30506.0\lib\net40\System.Web.Mvc.dll @@ -187,8 +189,6 @@ - - @@ -290,6 +290,7 @@ + @@ -490,10 +491,9 @@ - ..\..\..\external\nuget-binary\NuGet.exe + $(SolutionDir)\external\nuget-binary\NuGet.exe mono $(NuGet) - ..\..\.. - + diff --git a/main/src/addins/AspNet/ProjectPad/AspNetFolderNodeCommandHandler.cs b/main/src/addins/AspNet/ProjectPad/AspNetFolderNodeCommandHandler.cs index 30e870fccc..b6f5169fc6 100644 --- a/main/src/addins/AspNet/ProjectPad/AspNetFolderNodeCommandHandler.cs +++ b/main/src/addins/AspNet/ProjectPad/AspNetFolderNodeCommandHandler.cs @@ -31,7 +31,8 @@ using MonoDevelop.Ide.Gui.Components; using MonoDevelop.Ide.Gui.Pads.ProjectPad; using MonoDevelop.Ide; using MonoDevelop.AspNet.Projects; -using MonoDevelop.AspNet.Commands; +using MonoDevelop.AspNet.Commands; +using MonoDevelop.Projects; namespace MonoDevelop.AspNet.ProjectPad { @@ -40,8 +41,9 @@ namespace MonoDevelop.AspNet.ProjectPad [CommandUpdateHandler (AspNetCommands.AddController)] public void AddControllerUpdate (CommandInfo info) { - var project = CurrentNode.GetParentDataItem (typeof (AspNetAppProject), true) as AspNetAppProject; - if (project == null || !project.IsAspMvcProject) { + var project = CurrentNode.GetParentDataItem (typeof (DotNetProject), true) as DotNetProject; + var aspFlavor = project != null ? project.GetService () : null; + if (aspFlavor == null || !aspFlavor.IsAspMvcProject) { info.Enabled = info.Visible = false; return; } @@ -54,7 +56,7 @@ namespace MonoDevelop.AspNet.ProjectPad [CommandHandler (AspNetCommands.AddController)] public void AddController () { - var project = (AspNetAppProject) CurrentNode.GetParentDataItem (typeof (AspNetAppProject), true); + var project = (DotNetProject) CurrentNode.GetParentDataItem (typeof (DotNetProject), true); object currentItem = CurrentNode.DataItem; @@ -68,7 +70,7 @@ namespace MonoDevelop.AspNet.ProjectPad nav.Expanded = true; } - public static void AddController (AspNetAppProject project, string path, string name) + public static void AddController (DotNetProject project, string path, string name) { var provider = project.LanguageBinding.GetCodeDomProvider (); if (provider == null) @@ -119,15 +121,15 @@ namespace MonoDevelop.AspNet.ProjectPad if (System.IO.File.Exists (outputFile)) { project.AddFile (outputFile); - IdeApp.ProjectOperations.Save (project); + IdeApp.ProjectOperations.SaveAsync (project); } } [CommandUpdateHandler (AspNetCommands.AddView)] public void AddViewUpdate (CommandInfo info) { - var project = CurrentNode.GetParentDataItem (typeof (AspNetAppProject), true) as AspNetAppProject; - if (project == null || !project.IsAspMvcProject) { + var project = CurrentNode.GetParentDataItem (true); + if (project == null || !project.HasFlavor() || !project.GetFlavor().IsAspMvcProject) { info.Enabled = info.Visible = false; return; } @@ -140,7 +142,7 @@ namespace MonoDevelop.AspNet.ProjectPad [CommandHandler (AspNetCommands.AddView)] public void AddView () { - var project = (AspNetAppProject) CurrentNode.GetParentDataItem (typeof (AspNetAppProject), true); + var project = CurrentNode.GetParentDataItem (true); object currentItem = CurrentNode.DataItem; diff --git a/main/src/addins/AspNet/ProjectPad/AspNetProjectNodeBuilderExtension.cs b/main/src/addins/AspNet/ProjectPad/AspNetProjectNodeBuilderExtension.cs index da125b8376..572f5e864b 100644 --- a/main/src/addins/AspNet/ProjectPad/AspNetProjectNodeBuilderExtension.cs +++ b/main/src/addins/AspNet/ProjectPad/AspNetProjectNodeBuilderExtension.cs @@ -29,6 +29,7 @@ using System; using MonoDevelop.Ide.Gui.Components; using MonoDevelop.AspNet.Projects; +using MonoDevelop.Projects; namespace MonoDevelop.AspNet.ProjectPad { @@ -36,7 +37,7 @@ namespace MonoDevelop.AspNet.ProjectPad { public override bool CanBuildNode (Type dataType) { - return typeof(AspNetAppProject).IsAssignableFrom (dataType); + return typeof(DotNetProject).IsAssignableFrom (dataType); } public override Type CommandHandlerType { diff --git a/main/src/addins/AspNet/ProjectPad/AspNetProjectNodeCommandHandler.cs b/main/src/addins/AspNet/ProjectPad/AspNetProjectNodeCommandHandler.cs index 3bf027f7c8..3373c62b1b 100644 --- a/main/src/addins/AspNet/ProjectPad/AspNetProjectNodeCommandHandler.cs +++ b/main/src/addins/AspNet/ProjectPad/AspNetProjectNodeCommandHandler.cs @@ -42,21 +42,25 @@ namespace MonoDevelop.AspNet.ProjectPad [CommandHandler (AspNetCommands.AddAspNetDirectory)] public void OnAddSpecialDirectory (object ob) { - AspNetAppProject proj = CurrentNode.DataItem as AspNetAppProject; + var proj = CurrentNode.DataItem as DotNetProject; if (proj == null) return; proj.AddDirectory ((string) ob); - IdeApp.ProjectOperations.Save (proj); + IdeApp.ProjectOperations.SaveAsync (proj); } [CommandUpdateHandler (AspNetCommands.AddAspNetDirectory)] public void OnAddSpecialDirectoryUpdate (CommandArrayInfo info) { - AspNetAppProject proj = CurrentNode.DataItem as AspNetAppProject; - if (proj == null) - return; - - List dirs = new List (proj.GetSpecialDirectories ()); + var proj = CurrentNode.DataItem as DotNetProject; + if (proj == null) + return; + + var asp = proj.GetFlavor (); + if (asp == null) + return; + + List dirs = new List (asp.GetSpecialDirectories ()); dirs.Sort (); List fullPaths = new List (dirs.Count); foreach (string s in dirs) diff --git a/main/src/addins/AspNet/Projects/AspMvcProject.cs b/main/src/addins/AspNet/Projects/AspMvcProject.cs index 8161c25ee2..9faf060a04 100644 --- a/main/src/addins/AspNet/Projects/AspMvcProject.cs +++ b/main/src/addins/AspNet/Projects/AspMvcProject.cs @@ -31,37 +31,21 @@ using MonoDevelop.Projects; namespace MonoDevelop.AspNet.Projects { - abstract class AspMvcProject : AspNetAppProject + abstract class AspMvcProject : AspNetFlavor { - protected AspMvcProject () - { - } - - protected AspMvcProject (string languageName) - : base (languageName) - { - } - - protected AspMvcProject (string languageName, ProjectCreateInformation info, XmlElement projectOptions) - : base (languageName, info, projectOptions) - { - } - - public override SolutionItemConfiguration CreateConfiguration (string name) + protected override SolutionItemConfiguration OnCreateConfiguration (string name) { var conf = new AspMvcProjectConfiguration (name); - conf.CopyFrom (base.CreateConfiguration (name)); + conf.CopyFrom (base.OnCreateConfiguration (name)); return conf; } - public override IEnumerable GetProjectTypes () + protected override void OnGetProjectTypes (HashSet types) { - yield return "AspNetMvc"; - foreach (var t in base.GetProjectTypes ()) - yield return t; + types.Add ("AspNetMvc"); } - public override bool SupportsFramework (MonoDevelop.Core.Assemblies.TargetFramework framework) + protected override bool OnGetSupportsFramework (MonoDevelop.Core.Assemblies.TargetFramework framework) { return framework.CanReferenceAssembliesTargetingFramework (MonoDevelop.Core.Assemblies.TargetFrameworkMoniker.NET_3_5); } @@ -75,20 +59,6 @@ namespace MonoDevelop.AspNet.Projects class AspMvc1Project : AspMvcProject { - public AspMvc1Project () - { - } - - public AspMvc1Project (string languageName) - : base (languageName) - { - } - - public AspMvc1Project (string languageName, ProjectCreateInformation info, XmlElement projectOptions) - : base (languageName, info, projectOptions) - { - } - protected override string GetDefaultAspNetMvcVersion () { return "1.0.0.0"; @@ -97,20 +67,6 @@ namespace MonoDevelop.AspNet.Projects class AspMvc2Project : AspMvcProject { - public AspMvc2Project () - { - } - - public AspMvc2Project (string languageName) - : base (languageName) - { - } - - public AspMvc2Project (string languageName, ProjectCreateInformation info, XmlElement projectOptions) - : base (languageName, info, projectOptions) - { - } - protected override string GetDefaultAspNetMvcVersion () { return "2.0.0.0"; @@ -119,21 +75,7 @@ namespace MonoDevelop.AspNet.Projects class AspMvc3Project : AspMvcProject { - public AspMvc3Project () - { - } - - public AspMvc3Project (string languageName) - : base (languageName) - { - } - - public AspMvc3Project (string languageName, ProjectCreateInformation info, XmlElement projectOptions) - : base (languageName, info, projectOptions) - { - } - - public override bool SupportsFramework (MonoDevelop.Core.Assemblies.TargetFramework framework) + protected override bool OnGetSupportsFramework (MonoDevelop.Core.Assemblies.TargetFramework framework) { return framework.CanReferenceAssembliesTargetingFramework (MonoDevelop.Core.Assemblies.TargetFrameworkMoniker.NET_4_0); } @@ -146,21 +88,7 @@ namespace MonoDevelop.AspNet.Projects class AspMvc4Project : AspMvcProject { - public AspMvc4Project () - { - } - - public AspMvc4Project (string languageName) - : base (languageName) - { - } - - public AspMvc4Project (string languageName, ProjectCreateInformation info, XmlElement projectOptions) - : base (languageName, info, projectOptions) - { - } - - public override bool SupportsFramework (MonoDevelop.Core.Assemblies.TargetFramework framework) + protected override bool OnGetSupportsFramework (MonoDevelop.Core.Assemblies.TargetFramework framework) { return framework.CanReferenceAssembliesTargetingFramework (MonoDevelop.Core.Assemblies.TargetFrameworkMoniker.NET_4_0); } diff --git a/main/src/addins/AspNet/Projects/AspNetAppProject.cs b/main/src/addins/AspNet/Projects/AspNetAppProject.cs deleted file mode 100644 index ef44893202..0000000000 --- a/main/src/addins/AspNet/Projects/AspNetAppProject.cs +++ /dev/null @@ -1,742 +0,0 @@ -// -// AspNetAppProject.cs: ASP.NET "Web Application" project type -// -// Authors: -// Michael Hutchinson -// -// Copyright (C) 2006 Michael Hutchinson -// -// -// This source code is licenced under The MIT License: -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Xml; - -using ICSharpCode.NRefactory.TypeSystem; - -using MonoDevelop.Core; -using MonoDevelop.Core.Assemblies; -using MonoDevelop.Core.Execution; -using MonoDevelop.Core.ProgressMonitoring; -using MonoDevelop.Core.Serialization; -using MonoDevelop.Ide.Desktop; -using MonoDevelop.Ide; -using MonoDevelop.Ide.TypeSystem; -using MonoDevelop.Projects; -using MonoDevelop.AspNet.Execution; -using MonoDevelop.AspNet.WebForms; - -namespace MonoDevelop.AspNet.Projects -{ - [DataInclude (typeof(AspNetAppProjectConfiguration))] - public class AspNetAppProject : DotNetAssemblyProject - { - [ItemProperty("XspParameters", IsExternal=true)] - XspParameters xspParameters = new XspParameters (); - - WebFormsRegistrationCache registrationCache; - WebFormsCodeBehindTypeNameCache codebehindTypeNameCache; - - #region properties - - public override IEnumerable GetProjectTypes () - { - yield return "AspNetApp"; - foreach (var t in base.GetProjectTypes ()) - yield return t; - } - - public override bool IsLibraryBasedProjectType { - get { return true; } - } - - public XspParameters XspParameters { - get { return xspParameters; } - } - - internal WebFormsRegistrationCache RegistrationCache { - get { - if (registrationCache == null) - registrationCache = new WebFormsRegistrationCache (this); - return registrationCache; - } - } - - #endregion - - #region constructors - - public AspNetAppProject () - { - Init (); - } - - public AspNetAppProject (string languageName) - : base (languageName) - { - Init (); - } - - public AspNetAppProject (string languageName, ProjectCreateInformation info, XmlElement projectOptions) - : base (languageName, info, projectOptions) - { - Init (); - - var binPath = info == null? (FilePath)"bin" : info.BinPath; - foreach (var cfg in Configurations.Cast ()) - cfg.OutputDirectory = binPath; - } - - public override SolutionItemConfiguration CreateConfiguration (string name) - { - var conf = new AspNetAppProjectConfiguration (name); - conf.CopyFrom (base.CreateConfiguration (name)); - conf.OutputDirectory = BaseDirectory.IsNullOrEmpty? "bin" : (string)BaseDirectory.Combine ("bin"); - return conf; - } - - void Init () - { - codebehindTypeNameCache = new WebFormsCodeBehindTypeNameCache (this); - } - - public new AspNetAppProjectConfiguration GetConfiguration (ConfigurationSelector configuration) - { - return (AspNetAppProjectConfiguration) base.GetConfiguration (configuration); - } - - #endregion - - public override void Dispose () - { - codebehindTypeNameCache.Dispose (); - RegistrationCache.Dispose (); - base.Dispose (); - } - - #region build/prebuild/execute - - - protected override BuildResult DoBuild (IProgressMonitor monitor, ConfigurationSelector configuration) - { - //if no files are set to compile, then some compilers will error out - //though this is valid with ASP.NET apps, so we just avoid calling the compiler in this case - bool needsCompile = false; - foreach (ProjectFile pf in Files) { - if (pf.BuildAction == BuildAction.Compile) { - needsCompile = true; - break; - } - } - - if (needsCompile) - return base.DoBuild (monitor, configuration); - return new BuildResult (); - } - - ExecutionCommand CreateExecutionCommand (ConfigurationSelector config, AspNetAppProjectConfiguration configuration) - { - return new AspNetExecutionCommand { - ClrVersion = configuration.ClrVersion, - DebugMode = configuration.DebugMode, - XspParameters = XspParameters, - BaseDirectory = BaseDirectory, - TargetRuntime = TargetRuntime, - TargetFramework = TargetFramework, - UserAssemblyPaths = GetUserAssemblyPaths (config), - EnvironmentVariables = configuration.EnvironmentVariables, - }; - } - - protected override bool OnGetCanExecute (ExecutionContext context, ConfigurationSelector configuration) - { - var cmd = CreateExecutionCommand (configuration, GetConfiguration (configuration)); - return context.ExecutionHandler.CanExecute (cmd); - } - - protected override void DoExecute (IProgressMonitor monitor, ExecutionContext context, ConfigurationSelector configuration) - { - //check XSP is available - - var cfg = GetConfiguration (configuration); - var cmd = CreateExecutionCommand (configuration, cfg); - var browserExcTarget = (BrowserExecutionTarget) context.ExecutionTarget; - - IConsole console = null; - var operationMonitor = new AggregatedOperationMonitor (monitor); - - bool isXsp = true; //FIXME: fix this when it might not be true - should delegate to the ExecutionHandler - - try { - //HACK: check XSP exists first, because error UX is cleaner w/o displaying a blank console pad. - if (isXsp) { - try { - AspNetExecutionHandler.GetXspPath ((AspNetExecutionCommand)cmd); - } catch (UserException ex) { - MessageService.ShowError ( - GettextCatalog.GetString ("Could not launch ASP.NET web server"), - ex.Message); - throw; - } - } - - if (cfg.ExternalConsole) - console = context.ExternalConsoleFactory.CreateConsole (!cfg.PauseConsoleOutput); - else - console = context.ConsoleFactory.CreateConsole (!cfg.PauseConsoleOutput); - - // The running Port value is now captured in the XspBrowserLauncherConsole object - string url = String.Format ("http://{0}", XspParameters.Address); - - - if (isXsp) { - console = new XspBrowserLauncherConsole (console, delegate (string port) { - if (browserExcTarget != null) - browserExcTarget.DesktopApp.Launch (String.Format("{0}:{1}", url, port)); - else - BrowserLauncher.LaunchDefaultBrowser (String.Format("{0}:{1}", url, port)); - }); - } - - monitor.Log.WriteLine ("Running web server..."); - - var op = context.ExecutionHandler.Execute (cmd, console); - operationMonitor.AddOperation (op); //handles cancellation - - if (!isXsp) { - if (browserExcTarget != null) - browserExcTarget.DesktopApp.Launch (url); - else - BrowserLauncher.LaunchDefaultBrowser (url); - } - - op.WaitForCompleted (); - - monitor.Log.WriteLine ("The web server exited with code: {0}", op.ExitCode); - - } catch (Exception ex) { - if (!(ex is UserException)) { - LoggingService.LogError ("Could not launch ASP.NET web server.", ex); - } - monitor.ReportError ("Could not launch web server.", ex); - } finally { - operationMonitor.Dispose (); - if (console != null) - console.Dispose (); - } - } - - #endregion - - #region File utility methods - - public WebSubtype DetermineWebSubtype (ProjectFile file) - { - if (LanguageBinding != null && LanguageBinding.IsSourceCodeFile (file.FilePath)) - return WebSubtype.Code; - return DetermineWebSubtype (file.Name); - } - - public static WebSubtype DetermineWebSubtype (string fileName) - { - string extension = Path.GetExtension (fileName); - if (extension == null) - return WebSubtype.None; - extension = extension.ToUpperInvariant ().TrimStart ('.'); - - //NOTE: No way to identify WebSubtype.Code from here - //use the instance method for that - switch (extension) { - case "ASPX": - return WebSubtype.WebForm; - case "MASTER": - return WebSubtype.MasterPage; - case "ASHX": - return WebSubtype.WebHandler; - case "ASCX": - return WebSubtype.WebControl; - case "ASMX": - return WebSubtype.WebService; - case "ASAX": - return WebSubtype.Global; - case "GIF": - case "PNG": - case "JPG": - return WebSubtype.WebImage; - case "SKIN": - return WebSubtype.WebSkin; - case "CONFIG": - return WebSubtype.Config; - case "BROWSER": - return WebSubtype.BrowserDefinition; - case "AXD": - return WebSubtype.Axd; - case "SITEMAP": - return WebSubtype.Sitemap; - case "CSS": - return WebSubtype.Css; - case "XHTML": - case "HTML": - case "HTM": - return WebSubtype.Html; - case "JS": - return WebSubtype.JavaScript; - case "LESS": - return WebSubtype.Less; - case "SASS": - case "SCSS": - return WebSubtype.Sass; - case "EOT": - case "TTF": - case "OTF": - case "WOFF": - return WebSubtype.Font; - case "SVG": - return WebSubtype.Svg; - case "STYL": - return WebSubtype.Stylus; - case "CSHTML": - return WebSubtype.Razor; - default: - return WebSubtype.None; - } - } - - #endregion - - #region special files - - #endregion - - public ProjectFile ResolveVirtualPath (string virtualPath, string relativeToFile) - { - string name = VirtualToLocalPath (virtualPath, relativeToFile); - if (name == null) - return null; - return Files.GetFile (name); - } - - public string VirtualToLocalPath (string virtualPath, string relativeToFile) - { - if (string.IsNullOrEmpty (virtualPath) || virtualPath [0] == '/' || virtualPath.IndexOf (':') > -1) - return null; - - FilePath relativeToDir; - if (virtualPath.Length > 1 && virtualPath[0] == '~') { - if (virtualPath[1] == '/') - virtualPath = virtualPath.Substring (2); - else - virtualPath = virtualPath.Substring (1); - relativeToDir = BaseDirectory; - } else { - relativeToDir = String.IsNullOrEmpty (relativeToFile) - ? BaseDirectory - : (FilePath) Path.GetDirectoryName (relativeToFile); - } - - virtualPath = virtualPath.Replace ('/', Path.DirectorySeparatorChar); - return relativeToDir.Combine (virtualPath).FullPath; - } - - public string LocalToVirtualPath (string filename) - { - string rel = FileService.AbsoluteToRelativePath (BaseDirectory, filename); - return "~/" + rel.Replace (Path.DirectorySeparatorChar, '/'); - } - - public string LocalToVirtualPath (ProjectFile file) - { - return LocalToVirtualPath (file.FilePath); - } - - #region Reference handling - - protected override void OnReferenceAddedToProject (ProjectReferenceEventArgs e) - { - //short-circuit if the project is being deserialised - if (Loading) { - base.OnReferenceAddedToProject (e); - return; - } - - UpdateWebConfigRefs (); - - base.OnReferenceAddedToProject (e); - } - - protected override void OnReferenceRemovedFromProject (ProjectReferenceEventArgs e) - { - //short-circuit if the project is being deserialised - if (Loading) { - base.OnReferenceAddedToProject (e); - return; - } - - UpdateWebConfigRefs (); - - base.OnReferenceRemovedFromProject (e); - } - - void UpdateWebConfigRefs () - { - var refs = new List (); - foreach (var reference in References) { - //local copied assemblies are copied to the bin directory so ASP.NET references them automatically - if (reference.LocalCopy && (reference.ReferenceType == ReferenceType.Project || reference.ReferenceType == ReferenceType.Assembly)) - continue; - if (string.IsNullOrEmpty (reference.Reference)) - continue; - //these assemblies are referenced automatically by ASP.NET - if (WebFormsRegistrationCache.IsDefaultReference (reference.Reference)) - continue; - //bypass non dotnet projects - if ((reference.ReferenceType == ReferenceType.Project) && - (!(reference.OwnerProject.ParentSolution.FindProjectByName (reference.Reference) is DotNetProject))) - continue; - refs.Add (reference.Reference); - } - - var webConfig = GetWebConfig (); - if (webConfig == null || !File.Exists (webConfig.FilePath)) - return; - - var textFile = TextFileProvider.Instance.GetEditableTextFile (webConfig.FilePath); - //use textfile API because it's write safe (writes out to another file then moves) - if (textFile == null) - textFile = MonoDevelop.Projects.Text.TextFile.ReadFile (webConfig.FilePath); - - //can't use System.Web.Configuration.WebConfigurationManager, as it can only access virtual paths within an app - //so need full manual handling - try { - var doc = new XmlDocument (); - - //FIXME: PreserveWhitespace doesn't handle whitespace in attribute lists - //doc.PreserveWhitespace = true; - doc.LoadXml (textFile.Text); - - //hunt our way to the assemblies element, creating elements if necessary - XmlElement configElement = doc.DocumentElement; - if (configElement == null || string.Compare (configElement.Name, "configuration", StringComparison.OrdinalIgnoreCase) != 0) { - configElement = (XmlElement) doc.AppendChild (doc.CreateNode (XmlNodeType.Document, "configuration", null)); - } - XmlElement webElement = GetNamedXmlElement (doc, configElement, "system.web"); - XmlElement compilationNode = GetNamedXmlElement (doc, webElement, "compilation"); - XmlElement assembliesNode = GetNamedXmlElement (doc, compilationNode, "assemblies"); - - List existingAdds = new List (); - foreach (XmlNode node in assembliesNode) - if (string.Compare (node.Name, "add", StringComparison.OrdinalIgnoreCase) == 0) - existingAdds.Add (node); - - //add refs to the doc if they're not in it - foreach (string reference in refs) { - int index = 0; - bool found = false; - while (index < existingAdds.Count) { - XmlNode node = existingAdds [index]; - XmlAttribute att = (XmlAttribute)node.Attributes.GetNamedItem ("assembly"); - if (att == null) - continue; - string refAtt = att.Value; - if (refAtt != null && refAtt == reference) { - existingAdds.RemoveAt (index); - found = true; - break; - } - index++; - } - if (!found) { - XmlElement newAdd = doc.CreateElement ("add"); - XmlAttribute newAtt = doc.CreateAttribute ("assembly"); - newAtt.Value = reference; - newAdd.Attributes.Append (newAtt); - assembliesNode.AppendChild (newAdd); - } - } - - //any nodes that weren't removed from the existingAdds list are old/redundant, so remove from doc - foreach (XmlNode node in existingAdds) - assembliesNode.RemoveChild (node); - - StringWriter sw = new StringWriter (); - XmlTextWriter tw = new XmlTextWriter (sw); - tw.Formatting = Formatting.Indented; - doc.WriteTo (tw); - tw.Flush (); - textFile.Text = sw.ToString (); - - MonoDevelop.Projects.Text.TextFile tf = textFile as MonoDevelop.Projects.Text.TextFile; - if (tf != null) - tf.Save (); - } catch (Exception e) { - LoggingService.LogWarning ("Could not modify application web.config in project " + Name, e); - } - } - - - XmlElement GetNamedXmlElement (XmlDocument doc, XmlElement parent, string name) - { - XmlElement result = null; - foreach (XmlNode node in parent.ChildNodes) { - XmlElement elem = node as XmlElement; - if (elem != null && string.Compare (elem.Name, name, StringComparison.OrdinalIgnoreCase) == 0) { - result = elem; - break; - } - } - if (result == null) { - result = (XmlElement) parent.AppendChild (doc.CreateElement (name)); - } - return result; - } - - ProjectFile GetWebConfig () - { - var webConf = BaseDirectory.Combine ("web.config"); - foreach (var file in Files) - if (string.Compare (file.FilePath.ToString (), webConf, StringComparison.OrdinalIgnoreCase) == 0) - return file; - return null; - } - - bool IsWebConfig (FilePath file) - { - var webConf = BaseDirectory.Combine ("web.config"); - return (string.Compare (file, webConf, StringComparison.OrdinalIgnoreCase) == 0); - } - - #endregion - - #region File event handlers - - protected override void OnFileAddedToProject (ProjectFileEventArgs e) - { - //short-circuit if the project is being deserialised - if (Loading) { - base.OnFileAddedToProject (e); - return; - } - - bool webConfigChange = false; - List filesToAdd = new List (); - - foreach (ProjectFileEventInfo fargs in e) { - IEnumerable files = MonoDevelop.DesignerSupport.CodeBehind.GuessDependencies - (this, fargs.ProjectFile, groupedExtensions); - if (files != null) - filesToAdd.AddRange (files); - if (IsWebConfig (fargs.ProjectFile.FilePath)) - webConfigChange = true; - } - - if (webConfigChange) - UpdateWebConfigRefs (); - - //let the base fire the event before we add files - //don't want to fire events out of order of files being added - base.OnFileAddedToProject (e); - - //make sure that the parent and child files are in the project - foreach (string file in filesToAdd) { - //NOTE: this only adds files if they are not already in the project - AddFile (file); - } - } - - public override string GetDefaultBuildAction (string fileName) - { - - WebSubtype type = DetermineWebSubtype (fileName); - switch (type) { - case WebSubtype.Code: - return BuildAction.Compile; - case WebSubtype.None: - return base.GetDefaultBuildAction (fileName); - default: - return BuildAction.Content; - } - } - - static string[] groupedExtensions = { ".aspx", ".master", ".ashx", ".ascx", ".asmx", ".asax" }; - - #endregion - - public virtual IEnumerable GetSpecialDirectories () - { - yield return "App_Browsers"; - yield return "App_Data"; - yield return "App_GlobalResources"; - yield return "App_LocalResources"; - yield return "Theme"; - - if (IsAspMvcProject) { - yield return "Views"; - yield return "Models"; - yield return "Controllers"; - } - - // For "web site" projects - // "App_WebReferences", "App_Resources","App_Themes", "App_Code", - } - - protected override IList GetCommonBuildActions () - { - return new [] { - BuildAction.None, - BuildAction.Compile, - BuildAction.Content, - BuildAction.EmbeddedResource, - }; - } - - public string GetCodebehindTypeName (string fileName) - { - lock (codebehindTypeNameCache) - return codebehindTypeNameCache.GetCodeBehindTypeName (fileName); - } - - public IList GetCodeTemplates (string type, string subtype = null) - { - var files = new List (); - var names = new HashSet (); - - string asmDir = Path.GetDirectoryName (typeof (AspNetAppProject).Assembly.Location); - string lang = LanguageName; - if (lang == "C#") { - lang = "CSharp"; - } - - if (subtype != null) { - type = Path.Combine (type, subtype); - } - - var dirs = new [] { - Path.Combine (BaseDirectory, "CodeTemplates", type), - Path.Combine (BaseDirectory, "CodeTemplates", lang, type), - Path.Combine (asmDir, "CodeTemplates", type), - Path.Combine (asmDir, "CodeTemplates", lang, type), - }; - - foreach (string directory in dirs) - if (Directory.Exists (directory)) - foreach (string file in Directory.GetFiles (directory, "*.tt", SearchOption.TopDirectoryOnly)) - if (names.Add (Path.GetFileName (file))) - files.Add (file); - - return files; - } - - protected override void PopulateSupportFileList (FileCopySet list, ConfigurationSelector configuration) - { - base.PopulateSupportFileList (list, configuration); - - //HACK: workaround for MD not local-copying package references - foreach (MonoDevelop.Projects.ProjectReference projectReference in References) { - if (projectReference.Package != null && projectReference.Package.Name == "system.web.mvc") { - if (projectReference.ReferenceType == ReferenceType.Package) - foreach (SystemAssembly assem in projectReference.Package.Assemblies) - list.Add (assem.Location); - break; - } - } - } - - public string GetAspNetMvcVersion () - { - foreach (var pref in References) { - if (pref.Reference.IndexOf ("System.Web.Mvc", StringComparison.OrdinalIgnoreCase) < 0) - continue; - switch (pref.ReferenceType) { - case ReferenceType.Assembly: - case ReferenceType.Package: - foreach (var f in pref.GetReferencedFileNames (null)) { - if (Path.GetFileNameWithoutExtension (f) != "System.Web.Mvc" || !File.Exists (f)) - continue; - return AssemblyName.GetAssemblyName (f).Version.ToString (); - } - break; - default: - continue; - } - } - - if (IsAspMvcProject) - return GetDefaultAspNetMvcVersion (); - - return null; - } - - public bool SupportsRazorViewEngine { - get { - return References.Any (r => r.Reference.StartsWith ("System.Web.WebPages.Razor", StringComparison.Ordinal)); - } - } - - protected virtual string GetDefaultAspNetMvcVersion () - { - return "5.2"; - } - - public virtual bool IsAspMvcProject { - get { - return References.Any (r => r.Reference.StartsWith ("System.Web.Mvc", StringComparison.Ordinal)); - } - } - - class BrowserExecutionTarget : ExecutionTarget - { - string name, id; - public BrowserExecutionTarget (string id, string displayName, DesktopApplication app){ - this.name = displayName; - this.id = id; - this.DesktopApp = app; - } - - public override string Name { - get { return name; } - } - - public override string Id { - get { return id; } - } - - public DesktopApplication DesktopApp { get; private set; } - } - - protected override IEnumerable OnGetExecutionTargets (ConfigurationSelector configuration) - { - var apps = new List (); - foreach (var browser in MonoDevelop.Ide.DesktopService.GetApplications ("test.html")) { - if (browser.IsDefault) - apps.Insert (0, new BrowserExecutionTarget (browser.Id,browser.DisplayName,browser)); - else - apps.Add (new BrowserExecutionTarget (browser.Id,browser.DisplayName,browser)); - } - return apps; - } - } -} diff --git a/main/src/addins/AspNet/Projects/AspNetAppProjectBinding.cs b/main/src/addins/AspNet/Projects/AspNetAppProjectBinding.cs deleted file mode 100644 index 3a89feac81..0000000000 --- a/main/src/addins/AspNet/Projects/AspNetAppProjectBinding.cs +++ /dev/null @@ -1,84 +0,0 @@ -// -// AspNetAppProjectBinding.cs: Project binding for AspNetAppProject -// -// Authors: -// Michael Hutchinson -// -// Copyright (C) 2006 Michael Hutchinson -// -// -// This source code is licenced under The MIT License: -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - -using System; -using System.IO; -using MonoDevelop.Core; -using MonoDevelop.Projects; -using MonoDevelop.Core.Serialization; -using System.Xml; - -namespace MonoDevelop.AspNet.Projects -{ - //based heavily on DotNetProjectBinding - public class AspNetAppProjectBinding : IProjectBinding - { - - public string Name { - get { return "AspNetApp"; } - } - - public Project CreateProject (ProjectCreateInformation info, XmlElement projectOptions) - { - string lang = projectOptions.GetAttribute ("language"); - return CreateProject (lang, info, projectOptions); - } - - public Project CreateProject (string language, ProjectCreateInformation info, XmlElement projectOptions) - { - return new AspNetAppProject (language, info, projectOptions); - } - - public Project CreateSingleFileProject (string file) - { - //TODO: get page language - string language = "C#"; - - var info = new ProjectCreateInformation () { - ProjectName = Path.GetFileNameWithoutExtension (file), - SolutionPath = Path.GetDirectoryName (file), - ProjectBasePath = Path.GetDirectoryName (file), - }; - var project = CreateProject (language, info, null); - project.Files.Add (new ProjectFile (file)); - return project; - } - - public bool CanCreateSingleFileProject (string sourceFile) - { - WebSubtype type = AspNetAppProject.DetermineWebSubtype (sourceFile); - - return ((type == WebSubtype.WebForm) - || (type == WebSubtype.WebHandler) - || (type == WebSubtype.WebService)); - } - } -} diff --git a/main/src/addins/AspNet/Projects/AspNetFlavor.cs b/main/src/addins/AspNet/Projects/AspNetFlavor.cs new file mode 100644 index 0000000000..96902a8fdb --- /dev/null +++ b/main/src/addins/AspNet/Projects/AspNetFlavor.cs @@ -0,0 +1,723 @@ +// +// AspNetAppProject.cs: ASP.NET "Web Application" project type +// +// Authors: +// Michael Hutchinson +// +// Copyright (C) 2006 Michael Hutchinson +// +// +// This source code is licenced under The MIT License: +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Xml; + +using ICSharpCode.NRefactory.TypeSystem; + +using MonoDevelop.Core; +using MonoDevelop.Core.Assemblies; +using MonoDevelop.Core.Execution; +using MonoDevelop.Core.ProgressMonitoring; +using MonoDevelop.Core.Serialization; +using MonoDevelop.Ide.Desktop; +using MonoDevelop.Ide; +using MonoDevelop.Ide.TypeSystem; +using MonoDevelop.Projects; +using MonoDevelop.AspNet.Execution; +using MonoDevelop.AspNet.WebForms; +using System.Threading.Tasks; + +namespace MonoDevelop.AspNet.Projects +{ + [DataInclude (typeof(AspNetAppProjectConfiguration))] + public class AspNetFlavor : DotNetProjectExtension + { + [ItemProperty("XspParameters", IsExternal=true)] + XspParameters xspParameters = new XspParameters (); + + WebFormsRegistrationCache registrationCache; + WebFormsCodeBehindTypeNameCache codebehindTypeNameCache; + + #region properties + + protected override void OnGetProjectTypes (HashSet types) + { + types.Add ("AspNetApp"); + } + + protected override bool IsLibraryBasedProjectType { + get { return true; } + } + + public XspParameters XspParameters { + get { return xspParameters; } + } + + internal WebFormsRegistrationCache RegistrationCache { + get { + if (registrationCache == null) + registrationCache = new WebFormsRegistrationCache (Project); + return registrationCache; + } + } + + #endregion + + #region constructors + + protected override void OnInitializeNew (string languageName, ProjectCreateInformation info, XmlElement projectOptions) + { + base.OnInitializeNew (languageName, info, projectOptions); + codebehindTypeNameCache = new WebFormsCodeBehindTypeNameCache (Project); + + var binPath = info == null? (FilePath)"bin" : info.BinPath; + foreach (var cfg in Project.Configurations.Cast ()) + cfg.OutputDirectory = binPath; + } + + protected override SolutionItemConfiguration OnCreateConfiguration (string name) + { + var conf = new AspNetAppProjectConfiguration (name); + conf.CopyFrom (base.OnCreateConfiguration (name)); + conf.OutputDirectory = Project.BaseDirectory.IsNullOrEmpty? "bin" : (string)Project.BaseDirectory.Combine ("bin"); + return conf; + } + + public AspNetAppProjectConfiguration GetConfiguration (ConfigurationSelector configuration) + { + return (AspNetAppProjectConfiguration) Project.GetConfiguration (configuration); + } + + #endregion + + public override void Dispose () + { + codebehindTypeNameCache.Dispose (); + RegistrationCache.Dispose (); + base.Dispose (); + } + + #region build/prebuild/execute + + + protected override Task OnBuild (ProgressMonitor monitor, ConfigurationSelector configuration) + { + //if no files are set to compile, then some compilers will error out + //though this is valid with ASP.NET apps, so we just avoid calling the compiler in this case + bool needsCompile = false; + foreach (ProjectFile pf in Project.Files) { + if (pf.BuildAction == BuildAction.Compile) { + needsCompile = true; + break; + } + } + + if (needsCompile) + return base.OnBuild (monitor, configuration); + return Task.FromResult (BuildResult.Success); + } + + ExecutionCommand CreateExecutionCommand (ConfigurationSelector config, AspNetAppProjectConfiguration configuration) + { + return new AspNetExecutionCommand { + ClrVersion = configuration.ClrVersion, + DebugMode = configuration.DebugMode, + XspParameters = XspParameters, + BaseDirectory = Project.BaseDirectory, + TargetRuntime = Project.TargetRuntime, + TargetFramework = Project.TargetFramework, + UserAssemblyPaths = Project.GetUserAssemblyPaths (config), + EnvironmentVariables = configuration.EnvironmentVariables, + }; + } + + protected override bool OnGetCanExecute (ExecutionContext context, ConfigurationSelector configuration) + { + var cmd = CreateExecutionCommand (configuration, GetConfiguration (configuration)); + return context.ExecutionHandler.CanExecute (cmd); + } + + protected async override Task OnExecute (ProgressMonitor monitor, ExecutionContext context, ConfigurationSelector configuration) + { + //check XSP is available + + var cfg = GetConfiguration (configuration); + var cmd = CreateExecutionCommand (configuration, cfg); + var browserExcTarget = (BrowserExecutionTarget) context.ExecutionTarget; + + IConsole console = null; + + bool isXsp = true; //FIXME: fix this when it might not be true - should delegate to the ExecutionHandler + + try { + //HACK: check XSP exists first, because error UX is cleaner w/o displaying a blank console pad. + if (isXsp) { + try { + AspNetExecutionHandler.GetXspPath ((AspNetExecutionCommand)cmd); + } catch (UserException ex) { + MessageService.ShowError ( + GettextCatalog.GetString ("Could not launch ASP.NET web server"), + ex.Message); + throw; + } + } + + if (cfg.ExternalConsole) + console = context.ExternalConsoleFactory.CreateConsole (!cfg.PauseConsoleOutput); + else + console = context.ConsoleFactory.CreateConsole (!cfg.PauseConsoleOutput); + + // The running Port value is now captured in the XspBrowserLauncherConsole object + string url = String.Format ("http://{0}", XspParameters.Address); + + + if (isXsp) { + console = new XspBrowserLauncherConsole (console, delegate (string port) { + if (browserExcTarget != null) + browserExcTarget.DesktopApp.Launch (String.Format("{0}:{1}", url, port)); + else + BrowserLauncher.LaunchDefaultBrowser (String.Format("{0}:{1}", url, port)); + }); + } + + monitor.Log.WriteLine ("Running web server..."); + + var op = context.ExecutionHandler.Execute (cmd, console); + + if (!isXsp) { + if (browserExcTarget != null) + browserExcTarget.DesktopApp.Launch (url); + else + BrowserLauncher.LaunchDefaultBrowser (url); + } + + using (monitor.CancellationToken.Register (op.Cancel)) + await op.Task; + + monitor.Log.WriteLine ("The web server exited with code: {0}", op.ExitCode); + + } catch (Exception ex) { + if (!(ex is UserException)) { + LoggingService.LogError ("Could not launch ASP.NET web server.", ex); + } + monitor.ReportError ("Could not launch web server.", ex); + } finally { + if (console != null) + console.Dispose (); + } + } + + #endregion + + #region File utility methods + + public WebSubtype DetermineWebSubtype (ProjectFile file) + { + if (Project.LanguageBinding != null && Project.LanguageBinding.IsSourceCodeFile (file.FilePath)) + return WebSubtype.Code; + return DetermineWebSubtype (file.Name); + } + + public static WebSubtype DetermineWebSubtype (string fileName) + { + string extension = Path.GetExtension (fileName); + if (extension == null) + return WebSubtype.None; + extension = extension.ToUpperInvariant ().TrimStart ('.'); + + //NOTE: No way to identify WebSubtype.Code from here + //use the instance method for that + switch (extension) { + case "ASPX": + return WebSubtype.WebForm; + case "MASTER": + return WebSubtype.MasterPage; + case "ASHX": + return WebSubtype.WebHandler; + case "ASCX": + return WebSubtype.WebControl; + case "ASMX": + return WebSubtype.WebService; + case "ASAX": + return WebSubtype.Global; + case "GIF": + case "PNG": + case "JPG": + return WebSubtype.WebImage; + case "SKIN": + return WebSubtype.WebSkin; + case "CONFIG": + return WebSubtype.Config; + case "BROWSER": + return WebSubtype.BrowserDefinition; + case "AXD": + return WebSubtype.Axd; + case "SITEMAP": + return WebSubtype.Sitemap; + case "CSS": + return WebSubtype.Css; + case "XHTML": + case "HTML": + case "HTM": + return WebSubtype.Html; + case "JS": + return WebSubtype.JavaScript; + case "LESS": + return WebSubtype.Less; + case "SASS": + case "SCSS": + return WebSubtype.Sass; + case "EOT": + case "TTF": + case "OTF": + case "WOFF": + return WebSubtype.Font; + case "SVG": + return WebSubtype.Svg; + case "STYL": + return WebSubtype.Stylus; + case "CSHTML": + return WebSubtype.Razor; + default: + return WebSubtype.None; + } + } + + #endregion + + #region special files + + #endregion + + public ProjectFile ResolveVirtualPath (string virtualPath, string relativeToFile) + { + string name = VirtualToLocalPath (virtualPath, relativeToFile); + if (name == null) + return null; + return Project.Files.GetFile (name); + } + + public string VirtualToLocalPath (string virtualPath, string relativeToFile) + { + if (string.IsNullOrEmpty (virtualPath) || virtualPath [0] == '/' || virtualPath.IndexOf (':') > -1) + return null; + + FilePath relativeToDir; + if (virtualPath.Length > 1 && virtualPath[0] == '~') { + if (virtualPath[1] == '/') + virtualPath = virtualPath.Substring (2); + else + virtualPath = virtualPath.Substring (1); + relativeToDir = Project.BaseDirectory; + } else { + relativeToDir = String.IsNullOrEmpty (relativeToFile) + ? Project.BaseDirectory + : (FilePath) Path.GetDirectoryName (relativeToFile); + } + + virtualPath = virtualPath.Replace ('/', Path.DirectorySeparatorChar); + return relativeToDir.Combine (virtualPath).FullPath; + } + + public string LocalToVirtualPath (string filename) + { + string rel = FileService.AbsoluteToRelativePath (Project.BaseDirectory, filename); + return "~/" + rel.Replace (Path.DirectorySeparatorChar, '/'); + } + + public string LocalToVirtualPath (ProjectFile file) + { + return LocalToVirtualPath (file.FilePath); + } + + #region Reference handling + + protected override void OnReferenceAddedToProject (ProjectReferenceEventArgs e) + { + //short-circuit if the project is being deserialised + if (Project.Loading) { + base.OnReferenceAddedToProject (e); + return; + } + + UpdateWebConfigRefs (); + + base.OnReferenceAddedToProject (e); + } + + protected override void OnReferenceRemovedFromProject (ProjectReferenceEventArgs e) + { + //short-circuit if the project is being deserialised + if (Project.Loading) { + base.OnReferenceAddedToProject (e); + return; + } + + UpdateWebConfigRefs (); + + base.OnReferenceRemovedFromProject (e); + } + + void UpdateWebConfigRefs () + { + var refs = new List (); + foreach (var reference in Project.References) { + //local copied assemblies are copied to the bin directory so ASP.NET references them automatically + if (reference.LocalCopy && (reference.ReferenceType == ReferenceType.Project || reference.ReferenceType == ReferenceType.Assembly)) + continue; + if (string.IsNullOrEmpty (reference.Reference)) + continue; + //these assemblies are referenced automatically by ASP.NET + if (WebFormsRegistrationCache.IsDefaultReference (reference.Reference)) + continue; + //bypass non dotnet projects + if ((reference.ReferenceType == ReferenceType.Project) && + (!(reference.OwnerProject.ParentSolution.FindProjectByName (reference.Reference) is DotNetProject))) + continue; + refs.Add (reference.Reference); + } + + var webConfig = GetWebConfig (); + if (webConfig == null || !File.Exists (webConfig.FilePath)) + return; + + var textFile = TextFileProvider.Instance.GetEditableTextFile (webConfig.FilePath); + //use textfile API because it's write safe (writes out to another file then moves) + if (textFile == null) + textFile = MonoDevelop.Projects.Text.TextFile.ReadFile (webConfig.FilePath); + + //can't use System.Web.Configuration.WebConfigurationManager, as it can only access virtual paths within an app + //so need full manual handling + try { + var doc = new XmlDocument (); + + //FIXME: PreserveWhitespace doesn't handle whitespace in attribute lists + //doc.PreserveWhitespace = true; + doc.LoadXml (textFile.Text); + + //hunt our way to the assemblies element, creating elements if necessary + XmlElement configElement = doc.DocumentElement; + if (configElement == null || string.Compare (configElement.Name, "configuration", StringComparison.OrdinalIgnoreCase) != 0) { + configElement = (XmlElement) doc.AppendChild (doc.CreateNode (XmlNodeType.Document, "configuration", null)); + } + XmlElement webElement = GetNamedXmlElement (doc, configElement, "system.web"); + XmlElement compilationNode = GetNamedXmlElement (doc, webElement, "compilation"); + XmlElement assembliesNode = GetNamedXmlElement (doc, compilationNode, "assemblies"); + + List existingAdds = new List (); + foreach (XmlNode node in assembliesNode) + if (string.Compare (node.Name, "add", StringComparison.OrdinalIgnoreCase) == 0) + existingAdds.Add (node); + + //add refs to the doc if they're not in it + foreach (string reference in refs) { + int index = 0; + bool found = false; + while (index < existingAdds.Count) { + XmlNode node = existingAdds [index]; + XmlAttribute att = (XmlAttribute)node.Attributes.GetNamedItem ("assembly"); + if (att == null) + continue; + string refAtt = att.Value; + if (refAtt != null && refAtt == reference) { + existingAdds.RemoveAt (index); + found = true; + break; + } + index++; + } + if (!found) { + XmlElement newAdd = doc.CreateElement ("add"); + XmlAttribute newAtt = doc.CreateAttribute ("assembly"); + newAtt.Value = reference; + newAdd.Attributes.Append (newAtt); + assembliesNode.AppendChild (newAdd); + } + } + + //any nodes that weren't removed from the existingAdds list are old/redundant, so remove from doc + foreach (XmlNode node in existingAdds) + assembliesNode.RemoveChild (node); + + StringWriter sw = new StringWriter (); + XmlTextWriter tw = new XmlTextWriter (sw); + tw.Formatting = Formatting.Indented; + doc.WriteTo (tw); + tw.Flush (); + textFile.Text = sw.ToString (); + + MonoDevelop.Projects.Text.TextFile tf = textFile as MonoDevelop.Projects.Text.TextFile; + if (tf != null) + tf.Save (); + } catch (Exception e) { + LoggingService.LogWarning ("Could not modify application web.config in project " + Project.Name, e); + } + } + + + XmlElement GetNamedXmlElement (XmlDocument doc, XmlElement parent, string name) + { + XmlElement result = null; + foreach (XmlNode node in parent.ChildNodes) { + XmlElement elem = node as XmlElement; + if (elem != null && string.Compare (elem.Name, name, StringComparison.OrdinalIgnoreCase) == 0) { + result = elem; + break; + } + } + if (result == null) { + result = (XmlElement) parent.AppendChild (doc.CreateElement (name)); + } + return result; + } + + ProjectFile GetWebConfig () + { + var webConf = Project.BaseDirectory.Combine ("web.config"); + foreach (var file in Project.Files) + if (string.Compare (file.FilePath.ToString (), webConf, StringComparison.OrdinalIgnoreCase) == 0) + return file; + return null; + } + + bool IsWebConfig (FilePath file) + { + var webConf = Project.BaseDirectory.Combine ("web.config"); + return (string.Compare (file, webConf, StringComparison.OrdinalIgnoreCase) == 0); + } + + #endregion + + #region File event handlers + + protected override void OnFileAddedToProject (ProjectFileEventArgs e) + { + //short-circuit if the project is being deserialised + if (Project.Loading) { + base.OnFileAddedToProject (e); + return; + } + + bool webConfigChange = false; + List filesToAdd = new List (); + + foreach (ProjectFileEventInfo fargs in e) { + IEnumerable files = MonoDevelop.DesignerSupport.CodeBehind.GuessDependencies + (Project, fargs.ProjectFile, groupedExtensions); + if (files != null) + filesToAdd.AddRange (files); + if (IsWebConfig (fargs.ProjectFile.FilePath)) + webConfigChange = true; + } + + if (webConfigChange) + UpdateWebConfigRefs (); + + //let the base fire the event before we add files + //don't want to fire events out of order of files being added + base.OnFileAddedToProject (e); + + //make sure that the parent and child files are in the project + foreach (string file in filesToAdd) { + //NOTE: this only adds files if they are not already in the project + Project.AddFile (file); + } + } + + protected override string OnGetDefaultBuildAction (string fileName) + { + + WebSubtype type = DetermineWebSubtype (fileName); + switch (type) { + case WebSubtype.Code: + return BuildAction.Compile; + case WebSubtype.None: + return base.OnGetDefaultBuildAction (fileName); + default: + return BuildAction.Content; + } + } + + static string[] groupedExtensions = { ".aspx", ".master", ".ashx", ".ascx", ".asmx", ".asax" }; + + #endregion + + public virtual IEnumerable GetSpecialDirectories () + { + yield return "App_Browsers"; + yield return "App_Data"; + yield return "App_GlobalResources"; + yield return "App_LocalResources"; + yield return "Theme"; + + if (IsAspMvcProject) { + yield return "Views"; + yield return "Models"; + yield return "Controllers"; + } + + // For "web site" projects + // "App_WebReferences", "App_Resources","App_Themes", "App_Code", + } + + protected override IList OnGetCommonBuildActions () + { + return new [] { + BuildAction.None, + BuildAction.Compile, + BuildAction.Content, + BuildAction.EmbeddedResource, + }; + } + + public string GetCodebehindTypeName (string fileName) + { + lock (codebehindTypeNameCache) + return codebehindTypeNameCache.GetCodeBehindTypeName (fileName); + } + + public IList GetCodeTemplates (string type, string subtype = null) + { + var files = new List (); + var names = new HashSet (); + + string asmDir = Path.GetDirectoryName (GetType().Assembly.Location); + string lang = Project.LanguageName; + if (lang == "C#") { + lang = "CSharp"; + } + + if (subtype != null) { + type = Path.Combine (type, subtype); + } + + var dirs = new [] { + Path.Combine (Project.BaseDirectory, "CodeTemplates", type), + Path.Combine (Project.BaseDirectory, "CodeTemplates", lang, type), + Path.Combine (asmDir, "CodeTemplates", type), + Path.Combine (asmDir, "CodeTemplates", lang, type), + }; + + foreach (string directory in dirs) + if (Directory.Exists (directory)) + foreach (string file in Directory.GetFiles (directory, "*.tt", SearchOption.TopDirectoryOnly)) + if (names.Add (Path.GetFileName (file))) + files.Add (file); + + return files; + } + + protected override void OnPopulateSupportFileList (FileCopySet list, ConfigurationSelector configuration) + { + base.OnPopulateSupportFileList (list, configuration); + + //HACK: workaround for MD not local-copying package references + foreach (MonoDevelop.Projects.ProjectReference projectReference in Project.References) { + if (projectReference.Package != null && projectReference.Package.Name == "system.web.mvc") { + if (projectReference.ReferenceType == ReferenceType.Package) + foreach (SystemAssembly assem in projectReference.Package.Assemblies) + list.Add (assem.Location); + break; + } + } + } + + public string GetAspNetMvcVersion () + { + foreach (var pref in Project.References) { + if (pref.Reference.IndexOf ("System.Web.Mvc", StringComparison.OrdinalIgnoreCase) < 0) + continue; + switch (pref.ReferenceType) { + case ReferenceType.Assembly: + case ReferenceType.Package: + foreach (var f in pref.GetReferencedFileNames (null)) { + if (Path.GetFileNameWithoutExtension (f) != "System.Web.Mvc" || !File.Exists (f)) + continue; + return AssemblyName.GetAssemblyName (f).Version.ToString (); + } + break; + default: + continue; + } + } + + if (IsAspMvcProject) + return GetDefaultAspNetMvcVersion (); + + return null; + } + + public bool SupportsRazorViewEngine { + get { + return Project.References.Any (r => r.Reference.StartsWith ("System.Web.WebPages.Razor", StringComparison.Ordinal)); + } + } + + protected virtual string GetDefaultAspNetMvcVersion () + { + return "5.2"; + } + + public virtual bool IsAspMvcProject { + get { + return Project.References.Any (r => r.Reference.StartsWith ("System.Web.Mvc", StringComparison.Ordinal)); + } + } + + class BrowserExecutionTarget : ExecutionTarget + { + string name, id; + public BrowserExecutionTarget (string id, string displayName, DesktopApplication app){ + this.name = displayName; + this.id = id; + this.DesktopApp = app; + } + + public override string Name { + get { return name; } + } + + public override string Id { + get { return id; } + } + + public DesktopApplication DesktopApp { get; private set; } + } + + protected override IEnumerable OnGetExecutionTargets (ConfigurationSelector configuration) + { + var apps = new List (); + foreach (var browser in MonoDevelop.Ide.DesktopService.GetApplications ("test.html")) { + if (browser.IsDefault) + apps.Insert (0, new BrowserExecutionTarget (browser.Id,browser.DisplayName,browser)); + else + apps.Add (new BrowserExecutionTarget (browser.Id,browser.DisplayName,browser)); + } + return apps; + } + } +} diff --git a/main/src/addins/AspNet/Projects/AspNetMvcFileTemplateCondition.cs b/main/src/addins/AspNet/Projects/AspNetMvcFileTemplateCondition.cs index 0a4f581ad1..58a71c5371 100644 --- a/main/src/addins/AspNet/Projects/AspNetMvcFileTemplateCondition.cs +++ b/main/src/addins/AspNet/Projects/AspNetMvcFileTemplateCondition.cs @@ -50,7 +50,7 @@ namespace MonoDevelop.AspNet.Projects if (proj == null) return true; - var aspProj = proj as AspNetAppProject; + var aspProj = proj.GetFlavor (); if (aspProj == null) return false; diff --git a/main/src/addins/AspNet/Properties/MonoDevelop.AspNet.addin.xml b/main/src/addins/AspNet/Properties/MonoDevelop.AspNet.addin.xml index 17406e444f..a6f13d0f3d 100644 --- a/main/src/addins/AspNet/Properties/MonoDevelop.AspNet.addin.xml +++ b/main/src/addins/AspNet/Properties/MonoDevelop.AspNet.addin.xml @@ -178,32 +178,23 @@ extensions = "*.htm,*.html"/> - - - - - - + - + - + - + - + + type="MonoDevelop.AspNet.Projects.AspNetAppProjectExtension" /> @@ -217,7 +208,7 @@ - +
@@ -262,11 +253,9 @@ - - - - - + + + diff --git a/main/src/addins/AspNet/Razor/Generator/RazorTemplatePreprocessor.cs b/main/src/addins/AspNet/Razor/Generator/RazorTemplatePreprocessor.cs index 32a8a31ff2..41d105e862 100644 --- a/main/src/addins/AspNet/Razor/Generator/RazorTemplatePreprocessor.cs +++ b/main/src/addins/AspNet/Razor/Generator/RazorTemplatePreprocessor.cs @@ -30,6 +30,7 @@ using System.CodeDom.Compiler; using MonoDevelop.Projects; using MonoDevelop.Core; using MonoDevelop.TextTemplating; +using System.Threading.Tasks; namespace MonoDevelop.AspNet.Razor.Generator { @@ -46,18 +47,18 @@ namespace MonoDevelop.AspNet.Razor.Generator return ns; } - public IAsyncOperation Generate (IProgressMonitor monitor, ProjectFile file, SingleFileCustomToolResult result) + public Task Generate (ProgressMonitor monitor, ProjectFile file, SingleFileCustomToolResult result) { - return new ThreadAsyncOperation (delegate { + return Task.Factory.StartNew (delegate { try { GenerateInternal (monitor, file, result); } catch (Exception ex) { result.UnhandledException = ex; } - }, result); + }); } - void GenerateInternal (IProgressMonitor monitor, ProjectFile file, SingleFileCustomToolResult result) + void GenerateInternal (ProgressMonitor monitor, ProjectFile file, SingleFileCustomToolResult result) { var dnp = file.Project as DotNetProject; if (dnp == null || dnp.LanguageName != "C#") { diff --git a/main/src/addins/AspNet/Razor/RazorCSharpParser.cs b/main/src/addins/AspNet/Razor/RazorCSharpParser.cs index ac77e93f69..390e00e819 100644 --- a/main/src/addins/AspNet/Razor/RazorCSharpParser.cs +++ b/main/src/addins/AspNet/Razor/RazorCSharpParser.cs @@ -64,7 +64,7 @@ namespace MonoDevelop.AspNet.Razor ChangeInfo lastChange; string lastParsedFile; TextDocument currentDocument; - AspNetAppProject aspProject; + AspNetFlavor aspProject; DotNetProject project; IList openDocuments; @@ -90,7 +90,7 @@ namespace MonoDevelop.AspNet.Razor if (currentDocument == null && !TryAddDocument (fileName)) return new RazorCSharpParsedDocument (fileName, new RazorCSharpPageInfo ()); - this.aspProject = project as AspNetAppProject; + this.aspProject = project.GetService (); EnsureParserInitializedFor (fileName); @@ -211,7 +211,7 @@ namespace MonoDevelop.AspNet.Razor // Try to create host using web.config file var webConfigMap = new WebConfigurationFileMap (); if (aspProject != null) { - var vdm = new VirtualDirectoryMapping (aspProject.BaseDirectory.Combine ("Views"), true, "web.config"); + var vdm = new VirtualDirectoryMapping (project.BaseDirectory.Combine ("Views"), true, "web.config"); webConfigMap.VirtualDirectories.Add ("/", vdm); } Configuration configuration; diff --git a/main/src/addins/AspNet/Tests/Razor/RazorCompletionTesting.cs b/main/src/addins/AspNet/Tests/Razor/RazorCompletionTesting.cs index 7da98546eb..d35f5f9ca5 100644 --- a/main/src/addins/AspNet/Tests/Razor/RazorCompletionTesting.cs +++ b/main/src/addins/AspNet/Tests/Razor/RazorCompletionTesting.cs @@ -92,7 +92,7 @@ namespace MonoDevelop.AspNet.Tests.Razor cursorPosition = endPos - 1; } - var project = new AspNetAppProject ("C#"); + var project = Services.ProjectService.CreateDotNetProject ("C#"); project.FileName = UnitTests.TestBase.GetTempFile (".csproj"); string file = UnitTests.TestBase.GetTempFile (extension); diff --git a/main/src/addins/AspNet/Tests/WebForms/WebFormsTesting.cs b/main/src/addins/AspNet/Tests/WebForms/WebFormsTesting.cs index 4f8e2444d9..74f486803c 100644 --- a/main/src/addins/AspNet/Tests/WebForms/WebFormsTesting.cs +++ b/main/src/addins/AspNet/Tests/WebForms/WebFormsTesting.cs @@ -69,7 +69,7 @@ namespace MonoDevelop.AspNet.Tests.WebForms cursorPosition = endPos - 1; } - var project = new AspNetAppProject ("C#"); + var project = Services.ProjectService.CreateDotNetProject ("C#"); project.References.Add (new ProjectReference (ReferenceType.Package, "System")); project.References.Add (new ProjectReference (ReferenceType.Package, "System.Web")); project.FileName = UnitTests.TestBase.GetTempFile (".csproj"); diff --git a/main/src/addins/AspNet/WebForms/MasterContentFileDescriptionTemplate.cs b/main/src/addins/AspNet/WebForms/MasterContentFileDescriptionTemplate.cs index bced906b6d..8ca2ded55d 100644 --- a/main/src/addins/AspNet/WebForms/MasterContentFileDescriptionTemplate.cs +++ b/main/src/addins/AspNet/WebForms/MasterContentFileDescriptionTemplate.cs @@ -38,7 +38,7 @@ namespace MonoDevelop.AspNet.WebForms { public class MasterContentFileDescriptionTemplate : SingleFileDescriptionTemplate { - public override void ModifyTags (SolutionItem policyParent, Project project, string language, string identifier, string fileName, ref Dictionary tags) + public override void ModifyTags (SolutionFolderItem policyParent, Project project, string language, string identifier, string fileName, ref Dictionary tags) { base.ModifyTags (policyParent, project, language, identifier, fileName, ref tags); if (fileName == null) @@ -47,13 +47,13 @@ namespace MonoDevelop.AspNet.WebForms tags ["AspNetMaster"] = ""; tags ["AspNetMasterContent"] = ""; - AspNetAppProject aspProj = project as AspNetAppProject; + var aspProj = project.GetService (); if (aspProj == null) throw new InvalidOperationException ("MasterContentFileDescriptionTemplate is only valid for ASP.NET projects"); ProjectFile masterPage = null; - var dialog = new MonoDevelop.Ide.Projects.ProjectFileSelectorDialog (aspProj, null, "*.master"); + var dialog = new MonoDevelop.Ide.Projects.ProjectFileSelectorDialog (project, null, "*.master"); try { dialog.Title = GettextCatalog.GetString ("Select a Master Page..."); int response = MonoDevelop.Ide.MessageService.RunCustomDialog (dialog); diff --git a/main/src/addins/AspNet/WebForms/WebFormsCodeBehind.cs b/main/src/addins/AspNet/WebForms/WebFormsCodeBehind.cs index bfdce9399f..ed1977dc84 100644 --- a/main/src/addins/AspNet/WebForms/WebFormsCodeBehind.cs +++ b/main/src/addins/AspNet/WebForms/WebFormsCodeBehind.cs @@ -47,7 +47,7 @@ namespace MonoDevelop.AspNet.WebForms { public static string GetCodeBehindClassName (ProjectFile file) { - AspNetAppProject proj = file.Project as AspNetAppProject; + var proj = file.Project.GetService (); if (proj == null) return null; return proj.GetCodebehindTypeName (file.Name); @@ -55,19 +55,19 @@ namespace MonoDevelop.AspNet.WebForms public static ProjectFile GetDesignerFile (ProjectFile file) { - var project = file.Project as AspNetAppProject; + var ext = file.Project.GetService (); - var type = AspNetAppProject.DetermineWebSubtype (file.FilePath); + var type = AspNetFlavor.DetermineWebSubtype (file.FilePath); if (type != WebSubtype.WebForm && type != WebSubtype.WebControl && type != WebSubtype.MasterPage) return null; - var dfName = project.LanguageBinding.GetFileName (file.FilePath + ".designer"); - return project.Files.GetFile (dfName); + var dfName = ext.Project.LanguageBinding.GetFileName (file.FilePath + ".designer"); + return ext.Project.Files.GetFile (dfName); } public static BuildResult UpdateDesignerFile ( CodeBehindWriter writer, - AspNetAppProject project, + DotNetProject project, ProjectFile file, ProjectFile designerFile ) { @@ -102,7 +102,7 @@ namespace MonoDevelop.AspNet.WebForms } public static BuildResult GenerateCodeBehind ( - AspNetAppProject project, + DotNetProject project, string filename, WebFormsParsedDocument document, out CodeCompileUnit ccu) @@ -149,7 +149,8 @@ namespace MonoDevelop.AspNet.WebForms masterTypeName = document.Info.MasterPageTypeName; } else if (!String.IsNullOrEmpty (document.Info.MasterPageTypeVPath)) { try { - ProjectFile resolvedMaster = project.ResolveVirtualPath (document.Info.MasterPageTypeVPath, document.FileName); + var ext = project.GetService (); + ProjectFile resolvedMaster = ext.ResolveVirtualPath (document.Info.MasterPageTypeVPath, document.FileName); WebFormsParsedDocument masterParsedDocument = null; if (resolvedMaster != null) masterParsedDocument = TypeSystemService.ParseFile (project, resolvedMaster.FilePath) as WebFormsParsedDocument; diff --git a/main/src/addins/AspNet/WebForms/WebFormsCodeBehindTypeNameCache.cs b/main/src/addins/AspNet/WebForms/WebFormsCodeBehindTypeNameCache.cs index 526911a74f..c5088a67b6 100644 --- a/main/src/addins/AspNet/WebForms/WebFormsCodeBehindTypeNameCache.cs +++ b/main/src/addins/AspNet/WebForms/WebFormsCodeBehindTypeNameCache.cs @@ -31,13 +31,14 @@ using MonoDevelop.Core; using MonoDevelop.Ide.TypeSystem; using MonoDevelop.Ide; using MonoDevelop.AspNet.WebForms; -using MonoDevelop.AspNet.Projects; +using MonoDevelop.AspNet.Projects; +using MonoDevelop.Projects; namespace MonoDevelop.AspNet.WebForms { - class WebFormsCodeBehindTypeNameCache : ProjectFileCache + class WebFormsCodeBehindTypeNameCache : ProjectFileCache { - public WebFormsCodeBehindTypeNameCache (AspNetAppProject proj) : base (proj) + public WebFormsCodeBehindTypeNameCache (Project proj) : base (proj) { } diff --git a/main/src/addins/AspNet/WebForms/WebFormsDirectiveCompletion.cs b/main/src/addins/AspNet/WebForms/WebFormsDirectiveCompletion.cs index 54839d53ae..a7ded63cf7 100644 --- a/main/src/addins/AspNet/WebForms/WebFormsDirectiveCompletion.cs +++ b/main/src/addins/AspNet/WebForms/WebFormsDirectiveCompletion.cs @@ -36,6 +36,7 @@ using System.Web.UI; using MonoDevelop.Core; using MonoDevelop.Ide.CodeCompletion; using MonoDevelop.AspNet.Projects; +using MonoDevelop.Projects; namespace MonoDevelop.AspNet.WebForms { @@ -94,7 +95,7 @@ namespace MonoDevelop.AspNet.WebForms } - public static CompletionDataList GetAttributeValues (AspNetAppProject project, FilePath fromFile, string directiveName, string attribute) + public static CompletionDataList GetAttributeValues (DotNetProject project, FilePath fromFile, string directiveName, string attribute) { switch (directiveName.ToLowerInvariant ()) { case "page": @@ -105,7 +106,7 @@ namespace MonoDevelop.AspNet.WebForms return null; } - public static CompletionDataList GetAttributes (AspNetAppProject project, string directiveName, + public static CompletionDataList GetAttributes (DotNetProject project, string directiveName, Dictionary existingAtts) { var list = new CompletionDataList (); @@ -199,7 +200,7 @@ namespace MonoDevelop.AspNet.WebForms list.Add (s); } - static CompletionDataList GetPageAttributeValues (AspNetAppProject project, FilePath fromFile, string attribute) + static CompletionDataList GetPageAttributeValues (Project project, FilePath fromFile, string attribute) { var list = new CompletionDataList (); switch (attribute.ToLowerInvariant ()) { @@ -346,7 +347,7 @@ namespace MonoDevelop.AspNet.WebForms return list.Count > 0? list : null; } - static CompletionDataList GetRegisterAttributeValues (AspNetAppProject project, FilePath fromFile, string attribute) + static CompletionDataList GetRegisterAttributeValues (Project project, FilePath fromFile, string attribute) { switch (attribute.ToLowerInvariant ()) { case "src": diff --git a/main/src/addins/AspNet/WebForms/WebFormsEditorExtension.cs b/main/src/addins/AspNet/WebForms/WebFormsEditorExtension.cs index 96a0239b78..bc2cc3ef64 100644 --- a/main/src/addins/AspNet/WebForms/WebFormsEditorExtension.cs +++ b/main/src/addins/AspNet/WebForms/WebFormsEditorExtension.cs @@ -48,6 +48,7 @@ using S = MonoDevelop.Xml.Parser; using MonoDevelop.AspNet.WebForms.Dom; using MonoDevelop.Xml.Parser; using MonoDevelop.Xml.Dom; +using MonoDevelop.Projects; namespace MonoDevelop.AspNet.WebForms { @@ -56,7 +57,7 @@ namespace MonoDevelop.AspNet.WebForms static readonly Regex DocTypeRegex = new Regex (@"(?:PUBLIC|public)\s+""(?[^""]*)""\s+""(?[^""]*)"""); WebFormsParsedDocument aspDoc; - AspNetAppProject project; + DotNetProject project; WebFormsTypeContext refman = new WebFormsTypeContext (); ILanguageCompletionBuilder documentBuilder; @@ -90,7 +91,7 @@ namespace MonoDevelop.AspNet.WebForms if (HasDoc) refman.Doc = aspDoc; - var newProj = Document.Project as AspNetAppProject; + var newProj = Document.Project as DotNetProject; if (newProj != null) { project = newProj; refman.Project = newProj; diff --git a/main/src/addins/AspNet/WebForms/WebFormsParser.cs b/main/src/addins/AspNet/WebForms/WebFormsParser.cs index 03f19b91be..f29967ff7d 100644 --- a/main/src/addins/AspNet/WebForms/WebFormsParser.cs +++ b/main/src/addins/AspNet/WebForms/WebFormsParser.cs @@ -67,7 +67,7 @@ namespace MonoDevelop.AspNet.WebForms XDocument xDoc = parser.Nodes.GetRoot (); info.Populate (xDoc, errors); - var type = AspNetAppProject.DetermineWebSubtype (fileName); + var type = AspNetFlavor.DetermineWebSubtype (fileName); if (type != info.Subtype) { if (info.Subtype == WebSubtype.None) { errors.Add (new Error (ErrorType.Error, "File directive is missing", 1, 1)); diff --git a/main/src/addins/AspNet/WebForms/WebFormsRegistrationCache.cs b/main/src/addins/AspNet/WebForms/WebFormsRegistrationCache.cs index ac1a6ccb6c..494eae7723 100644 --- a/main/src/addins/AspNet/WebForms/WebFormsRegistrationCache.cs +++ b/main/src/addins/AspNet/WebForms/WebFormsRegistrationCache.cs @@ -38,9 +38,9 @@ using MonoDevelop.AspNet.Projects; namespace MonoDevelop.AspNet.WebForms { - class WebFormsRegistrationCache : ProjectFileCache + class WebFormsRegistrationCache : ProjectFileCache { - public WebFormsRegistrationCache (AspNetAppProject project) : base (project) + public WebFormsRegistrationCache (DotNetProject project) : base (project) { } @@ -135,6 +135,16 @@ namespace MonoDevelop.AspNet.WebForms info.Namespaces.AddRange (defaultNamespaces.Select (ns => new NamespaceRegistration (true, ns))); info.Assemblies.AddRange (defaultAssemblies.Select (asm => new AssemblyRegistration (true, asm))); + + // from Mono's 4.5 machine web.config + info.Controls.AddRange (new [] { + MachineControlReg ("asp", "System.Web.UI.WebControls.WebParts", "System.Web"), + MachineControlReg ("asp", "System.Web.UI", "System.Web.Extensions"), + MachineControlReg ("asp", "System.Web.UI.WebControls", "System.Web.Extensions"), + MachineControlReg ("asp", "System.Web.UI.WebControls.Expressions", "System.Web.Extensions"), + MachineControlReg ("asp", "System.Web.DynamicData", "System.Web.DynamicData"), + MachineControlReg ("asp", "System.Web.UI.WebControls", "System.Web.Entity"), + }); return info; } @@ -171,6 +181,11 @@ namespace MonoDevelop.AspNet.WebForms "System.Web.UI.WebControls.WebParts", }; + static ControlRegistration MachineControlReg(string prefix, string ns, string asm) + { + return new ControlRegistration (null, true, prefix, ns, asm, null, null); + } + public static bool IsDefaultReference (string reference) { return defaultAssemblies.Any (r => diff --git a/main/src/addins/AspNet/WebForms/WebFormsToolboxNode.cs b/main/src/addins/AspNet/WebForms/WebFormsToolboxNode.cs index 6ccccbddc5..f0804abf65 100644 --- a/main/src/addins/AspNet/WebForms/WebFormsToolboxNode.cs +++ b/main/src/addins/AspNet/WebForms/WebFormsToolboxNode.cs @@ -157,7 +157,7 @@ namespace MonoDevelop.AspNet.WebForms public bool IsCompatibleWith (MonoDevelop.Ide.Gui.Document document) { - switch (AspNetAppProject.DetermineWebSubtype (document.FileName)) { + switch (AspNetFlavor.DetermineWebSubtype (document.FileName)) { case WebSubtype.WebForm: case WebSubtype.MasterPage: case WebSubtype.WebControl: @@ -167,7 +167,7 @@ namespace MonoDevelop.AspNet.WebForms } var clrVersion = ClrVersion.Net_2_0; - var aspProj = document.Project as AspNetAppProject; + var aspProj = document.Project as DotNetProject; if (aspProj != null && aspProj.TargetFramework.ClrVersion != ClrVersion.Default) clrVersion = aspProj.TargetFramework.ClrVersion; diff --git a/main/src/addins/AspNet/WebForms/WebFormsTypeContext.cs b/main/src/addins/AspNet/WebForms/WebFormsTypeContext.cs index 7778cf5844..5af1c706a6 100644 --- a/main/src/addins/AspNet/WebForms/WebFormsTypeContext.cs +++ b/main/src/addins/AspNet/WebForms/WebFormsTypeContext.cs @@ -51,8 +51,9 @@ namespace MonoDevelop.AspNet.WebForms public class WebFormsTypeContext { ICompilation compilation; - AspNetAppProject project; + DotNetProject project; WebFormsParsedDocument doc; + AspNetFlavor aspFlavor; public WebFormsParsedDocument Doc { get { @@ -66,7 +67,7 @@ namespace MonoDevelop.AspNet.WebForms } } - public AspNetAppProject Project { + public DotNetProject Project { get { return project; } @@ -75,6 +76,7 @@ namespace MonoDevelop.AspNet.WebForms return; project = value; compilation = null; + aspFlavor = project.GetFlavor (); } } @@ -336,7 +338,7 @@ namespace MonoDevelop.AspNet.WebForms IList GetRegistrationInfos () { if (project != null && doc != null) - return project.RegistrationCache.GetInfosForPath (Path.GetDirectoryName (doc.FileName)); + return aspFlavor.RegistrationCache.GetInfosForPath (Path.GetDirectoryName (doc.FileName)); return new[] { WebFormsRegistrationCache.MachineRegistrationInfo }; } @@ -570,7 +572,10 @@ namespace MonoDevelop.AspNet.WebForms IType AssemblyTypeLookup (string namespac, string tagName) { var fullName = namespac + "." + tagName; - return ReflectionHelper.ParseReflectionName (fullName).Resolve (Compilation); + var type = ReflectionHelper.ParseReflectionName (fullName).Resolve (Compilation); + if (type.Kind == TypeKind.Unknown) + return null; + return type; } public string GetControlPrefix (IType control) @@ -595,8 +600,8 @@ namespace MonoDevelop.AspNet.WebForms { string typeName = null; if (project != null && doc != null) { - string absolute = project.VirtualToLocalPath (virtualPath, doc.FileName); - typeName = project.GetCodebehindTypeName (absolute); + string absolute = aspFlavor.VirtualToLocalPath (virtualPath, doc.FileName); + typeName = aspFlavor.GetCodebehindTypeName (absolute); } return typeName ?? "System.Web.UI.UserControl"; } @@ -604,7 +609,10 @@ namespace MonoDevelop.AspNet.WebForms IType GetUserControlType (string virtualPath) { var name = GetUserControlTypeName (virtualPath); - return ReflectionHelper.ParseReflectionName (name).Resolve (Compilation); + var type = ReflectionHelper.ParseReflectionName (name).Resolve (Compilation); + if (type.Kind == TypeKind.Unknown) + return null; + return type; } } diff --git a/main/src/addins/CBinding/CBinding.addin.xml b/main/src/addins/CBinding/CBinding.addin.xml index 35cb77e26d..1fef8d00e9 100644 --- a/main/src/addins/CBinding/CBinding.addin.xml +++ b/main/src/addins/CBinding/CBinding.addin.xml @@ -190,12 +190,6 @@ - - - - - - @@ -207,11 +201,7 @@ - - - - - + - - - - - - - - - - @@ -146,6 +136,8 @@ + + @@ -190,8 +182,8 @@ - - + + diff --git a/main/src/addins/NUnit/NUnitRunner/NUnitRunner.csproj b/main/src/addins/NUnit/NUnitRunner/NUnitRunner.csproj index 68153a46ba..2248340e29 100644 --- a/main/src/addins/NUnit/NUnitRunner/NUnitRunner.csproj +++ b/main/src/addins/NUnit/NUnitRunner/NUnitRunner.csproj @@ -37,18 +37,28 @@ - - ..\lib\nunit.core.dll - - ..\lib\nunit.framework.dll + ..\..\..\..\packages\NUnit.2.6.3\lib\nunit.framework.dll + + + ..\..\..\..\packages\NUnit.Runners.2.6.3\tools\lib\nunit.core.dll - ..\lib\nunit.core.interfaces.dll + ..\..\..\..\packages\NUnit.Runners.2.6.3\tools\lib\nunit.core.interfaces.dll - \ No newline at end of file + + + + + + $(SolutionDir)\external\nuget-binary\NuGet.exe + mono $(NuGet) + + + + diff --git a/main/src/addins/NUnit/NUnitRunner/packages.config b/main/src/addins/NUnit/NUnitRunner/packages.config new file mode 100644 index 0000000000..3ca92b52ea --- /dev/null +++ b/main/src/addins/NUnit/NUnitRunner/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/main/src/addins/NUnit/Project/NUnitAssemblyGroupProject.cs b/main/src/addins/NUnit/Project/NUnitAssemblyGroupProject.cs index 0a67aac29d..561ede1a8a 100644 --- a/main/src/addins/NUnit/Project/NUnitAssemblyGroupProject.cs +++ b/main/src/addins/NUnit/Project/NUnitAssemblyGroupProject.cs @@ -38,7 +38,7 @@ using MonoDevelop.Ide.TypeSystem; namespace MonoDevelop.NUnit { [DataInclude (typeof(NUnitAssemblyGroupProjectConfiguration))] - public class NUnitAssemblyGroupProject: SolutionEntityItem + public class NUnitAssemblyGroupProject: SolutionItem { RootTest rootTest; @@ -53,7 +53,7 @@ namespace MonoDevelop.NUnit Configurations.Add (CreateConfiguration ("Default")); } - public override void InitializeFromTemplate (XmlElement element) + protected override void OnInitializeFromTemplate (XmlElement element) { Configurations.Add (CreateConfiguration ("Default")); } @@ -73,28 +73,6 @@ namespace MonoDevelop.NUnit conf.Name = name; return conf; } - - protected override void OnClean (IProgressMonitor monitor, ConfigurationSelector configuration) - { - } - - protected override BuildResult OnBuild (IProgressMonitor monitor, ConfigurationSelector configuration) - { - return null; - } - - protected override void OnExecute (IProgressMonitor monitor, ExecutionContext context, ConfigurationSelector configuration) - { - } - - protected override bool OnGetNeedsBuilding (ConfigurationSelector configuration) - { - return false; - } - - protected override void OnSetNeedsBuilding (bool value, ConfigurationSelector configuration) - { - } } public class NUnitAssemblyGroupProjectConfiguration: SolutionItemConfiguration diff --git a/main/src/addins/NUnit/Services/ITestProvider.cs b/main/src/addins/NUnit/Services/ITestProvider.cs index b9cd72530d..c2bea5f998 100644 --- a/main/src/addins/NUnit/Services/ITestProvider.cs +++ b/main/src/addins/NUnit/Services/ITestProvider.cs @@ -35,7 +35,7 @@ namespace MonoDevelop.NUnit { public interface ITestProvider { - UnitTest CreateUnitTest (IWorkspaceObject entry); + UnitTest CreateUnitTest (WorkspaceObject entry); Type[] GetOptionTypes (); } } diff --git a/main/src/addins/NUnit/Services/NUnitAssemblyTestSuite.cs b/main/src/addins/NUnit/Services/NUnitAssemblyTestSuite.cs index 3e55a824be..895b07674d 100644 --- a/main/src/addins/NUnit/Services/NUnitAssemblyTestSuite.cs +++ b/main/src/addins/NUnit/Services/NUnitAssemblyTestSuite.cs @@ -45,6 +45,7 @@ using MonoDevelop.Ide; using System.Xml.Linq; using System.Linq; using System.Globalization; +using System.Threading.Tasks; namespace MonoDevelop.NUnit { @@ -69,7 +70,7 @@ namespace MonoDevelop.NUnit { } - public NUnitAssemblyTestSuite (string name, SolutionItem ownerSolutionItem): base (name, ownerSolutionItem) + public NUnitAssemblyTestSuite (string name, WorkspaceObject ownerSolutionItem): base (name, ownerSolutionItem) { } @@ -145,10 +146,9 @@ namespace MonoDevelop.NUnit } } - public override IAsyncOperation Refresh () + public override Task Refresh (CancellationToken ct) { - AsyncOperation oper = new AsyncOperation (); - System.Threading.ThreadPool.QueueUserWorkItem (delegate { + return Task.Factory.StartNew (delegate { lock (locker) { try { while (Status == TestStatus.Loading) { @@ -162,13 +162,10 @@ namespace MonoDevelop.NUnit Monitor.Wait (locker); } } - oper.SetCompleted (true); } catch { - oper.SetCompleted (false); } } }); - return oper; } DateTime GetAssemblyTime () diff --git a/main/src/addins/NUnit/Services/NUnitProjectServiceExtension.cs b/main/src/addins/NUnit/Services/NUnitProjectServiceExtension.cs index 0ecd719fd8..ff59f13226 100644 --- a/main/src/addins/NUnit/Services/NUnitProjectServiceExtension.cs +++ b/main/src/addins/NUnit/Services/NUnitProjectServiceExtension.cs @@ -28,44 +28,32 @@ using MonoDevelop.Core; using MonoDevelop.Projects; using MonoDevelop.Ide; +using System.Threading.Tasks; namespace MonoDevelop.NUnit { - public class NUnitProjectServiceExtension: ProjectServiceExtension + public class NUnitProjectServiceExtension: ProjectExtension { - public override void Execute (MonoDevelop.Core.IProgressMonitor monitor, IBuildTarget item, ExecutionContext context, ConfigurationSelector configuration) + protected override Task OnExecute (MonoDevelop.Core.ProgressMonitor monitor, ExecutionContext context, ConfigurationSelector configuration) { - if (base.CanExecute (item, context, configuration)) { + if (base.OnGetCanExecute (context, configuration)) { // It is executable by default - base.Execute(monitor, item, context, configuration); - return; - } else if (item is IWorkspaceObject) { - UnitTest test = NUnitService.Instance.FindRootTest ((IWorkspaceObject)item); - if (test != null) { - IAsyncOperation oper = null; - DispatchService.GuiSyncDispatch (delegate { - oper = NUnitService.Instance.RunTest (test, context.ExecutionHandler, false); - }); -// if (oper != null) { -// monitor.CancelRequested += delegate { -// oper.Cancel (); -// }; -// oper.WaitForCompleted (); -// } - } + return base.OnExecute (monitor, context, configuration); } + UnitTest test = NUnitService.Instance.FindRootTest (Project); + if (test != null) + return NUnitService.Instance.RunTest (test, context.ExecutionHandler, false).Task; + else + return Task.FromResult (0); } - public override bool CanExecute (IBuildTarget item, ExecutionContext context, ConfigurationSelector configuration) + protected override bool OnGetCanExecute (ExecutionContext context, ConfigurationSelector configuration) { // We check for DefaultExecutionHandlerFactory because the tests can't run using any other execution mode - bool res = base.CanExecute (item, context, configuration); - if (!res && (item is IWorkspaceObject)) { - UnitTest test = NUnitService.Instance.FindRootTest ((IWorkspaceObject)item); - return (test != null) && test.CanRun (context.ExecutionHandler); - } else - return res; + bool res = base.OnGetCanExecute (context, configuration); + UnitTest test = NUnitService.Instance.FindRootTest (Project); + return (test != null) && test.CanRun (context.ExecutionHandler); } } } diff --git a/main/src/addins/NUnit/Services/NUnitService.cs b/main/src/addins/NUnit/Services/NUnitService.cs index c5a2407532..79877e0fc4 100644 --- a/main/src/addins/NUnit/Services/NUnitService.cs +++ b/main/src/addins/NUnit/Services/NUnitService.cs @@ -38,6 +38,8 @@ using MonoDevelop.Projects; using NUnit.Core; using MonoDevelop.Ide.Gui; using MonoDevelop.Ide; +using System.Threading.Tasks; +using System.Linq; namespace MonoDevelop.NUnit { @@ -99,14 +101,20 @@ namespace MonoDevelop.NUnit } } - public IAsyncOperation RunTest (UnitTest test, IExecutionHandler context) + public AsyncOperation RunTest (UnitTest test, IExecutionHandler context) { var result = RunTest (test, context, IdeApp.Preferences.BuildBeforeRunningTests); - result.Completed += (OperationHandler) DispatchService.GuiDispatch (new OperationHandler (OnTestSessionCompleted)); + result.Task.ContinueWith (t => OnTestSessionCompleted ()); return result; } - public IAsyncOperation RunTest (UnitTest test, IExecutionHandler context, bool buildOwnerObject) + public AsyncOperation RunTest (UnitTest test, IExecutionHandler context, bool buildOwnerObject) + { + var cs = new CancellationTokenSource (); + return new AsyncOperation (RunTestAsync (test, context, buildOwnerObject, cs), cs); + } + + async Task RunTestAsync (UnitTest test, IExecutionHandler context, bool buildOwnerObject, CancellationTokenSource cs) { string testName = test.FullName; @@ -115,39 +123,23 @@ namespace MonoDevelop.NUnit if (bt != null && bt.NeedsBuilding (IdeApp.Workspace.ActiveConfiguration)) { if (!IdeApp.ProjectOperations.CurrentRunOperation.IsCompleted) { MonoDevelop.Ide.Commands.StopHandler.StopBuildOperations (); - IdeApp.ProjectOperations.CurrentRunOperation.WaitForCompleted (); + await IdeApp.ProjectOperations.CurrentRunOperation.Task; } - AsyncOperation retOper = new AsyncOperation (); - - IAsyncOperation op = IdeApp.ProjectOperations.Build (bt); - retOper.TrackOperation (op, false); - - op.Completed += delegate { - // The completed event of the build operation is run in the gui thread, - // so we need a new thread, because refreshing must be async - System.Threading.ThreadPool.QueueUserWorkItem (delegate { - if (op.Success) { - RefreshTests (); - test = SearchTest (testName); - if (test != null) { - Gtk.Application.Invoke (delegate { - // RunTest must run in the gui thread - retOper.TrackOperation (RunTest (test, context, false), true); - }); - } - else - retOper.SetCompleted (false); - } - }); - }; - - return retOper; + var res = await IdeApp.ProjectOperations.Build (bt, cs.Token).Task; + if (res.HasErrors) + return; + + await RefreshTests (cs.Token); + test = SearchTest (testName); + if (test != null) + await RunTestAsync (test, context, false, cs); + return; } } if (!IdeApp.ProjectOperations.ConfirmExecutionOperation ()) - return NullProcessAsyncOperation.Failure; + return; Pad resultsPad = IdeApp.Workbench.GetPad (); if (resultsPad == null) { @@ -160,25 +152,17 @@ namespace MonoDevelop.NUnit resultsPad.Sticky = true; resultsPad.BringToFront (); - TestSession session = new TestSession (test, context, (TestResultsPad) resultsPad.Content); - - session.Completed += delegate { - Gtk.Application.Invoke (delegate { - resultsPad.Sticky = false; - }); - }; - - session.Start (); - + TestSession session = new TestSession (test, context, (TestResultsPad) resultsPad.Content, cs); IdeApp.ProjectOperations.CurrentRunOperation = session; - - return session; + + await session.Start (); + + resultsPad.Sticky = false; } - public void RefreshTests () + public Task RefreshTests (CancellationToken ct) { - foreach (UnitTest t in RootTests) - t.Refresh ().WaitForCompleted (); + return Task.WhenAll (RootTests.Select (t => t.Refresh (ct))); } public UnitTest SearchTest (string fullName) @@ -238,12 +222,12 @@ namespace MonoDevelop.NUnit return null; } - public UnitTest FindRootTest (IWorkspaceObject item) + public UnitTest FindRootTest (WorkspaceObject item) { return FindRootTest (RootTests, item); } - public UnitTest FindRootTest (IEnumerable tests, IWorkspaceObject item) + public UnitTest FindRootTest (IEnumerable tests, WorkspaceObject item) { foreach (UnitTest t in tests) { if (t.OwnerObject == item) @@ -281,7 +265,7 @@ namespace MonoDevelop.NUnit NotifyTestSuiteChanged (); } - public UnitTest BuildTest (IWorkspaceObject entry) + public UnitTest BuildTest (WorkspaceObject entry) { foreach (ITestProvider p in providers) { try { @@ -325,7 +309,7 @@ namespace MonoDevelop.NUnit public event EventHandler TestSuiteChanged; - void OnTestSessionCompleted (IAsyncOperation op) + void OnTestSessionCompleted () { var handler = TestSessionCompleted; if (handler != null) @@ -337,31 +321,28 @@ namespace MonoDevelop.NUnit - class TestSession: IAsyncOperation, ITestProgressMonitor + class TestSession: AsyncOperation, ITestProgressMonitor { UnitTest test; TestMonitor monitor; Thread runThread; bool success; - ManualResetEvent waitEvent; IExecutionHandler context; TestResultsPad resultsPad; - public TestSession (UnitTest test, IExecutionHandler context, TestResultsPad resultsPad) + public TestSession (UnitTest test, IExecutionHandler context, TestResultsPad resultsPad, CancellationTokenSource cs) { this.test = test; this.context = context; - this.monitor = new TestMonitor (resultsPad); + CancellationTokenSource = cs; + this.monitor = new TestMonitor (resultsPad, CancellationTokenSource); this.resultsPad = resultsPad; resultsPad.InitializeTestRun (test); } - public void Start () + public Task Start () { - runThread = new Thread (new ThreadStart (RunTests)); - runThread.Name = "NUnit test runner"; - runThread.IsBackground = true; - runThread.Start (); + return Task = Task.Factory.StartNew (RunTests); } void RunTests () @@ -381,12 +362,6 @@ namespace MonoDevelop.NUnit monitor.FinishTestRun (); runThread = null; } - lock (this) { - if (waitEvent != null) - waitEvent.Set (); - } - if (Completed != null) - Completed (this); } void ITestProgressMonitor.BeginTest (UnitTest test) @@ -412,45 +387,7 @@ namespace MonoDevelop.NUnit bool ITestProgressMonitor.IsCancelRequested { get { return monitor.IsCancelRequested; } } - - void IAsyncOperation.Cancel () - { - monitor.Cancel (); - } - - public void WaitForCompleted () - { - if (IsCompleted) return; - - if (DispatchService.IsGuiThread) { - while (!IsCompleted) { - while (Gtk.Application.EventsPending ()) - Gtk.Application.RunIteration (); - Thread.Sleep (100); - } - } else { - lock (this) { - if (waitEvent == null) - waitEvent = new ManualResetEvent (false); - } - waitEvent.WaitOne (); - } - } - - public bool IsCompleted { - get { return runThread == null; } - } - - public bool Success { - get { return success; } - } - public bool SuccessWithWarnings { - get { return false; } - } - - public event OperationHandler Completed; - public event TestHandler CancelRequested { add { monitor.CancelRequested += value; } remove { monitor.CancelRequested -= value; } diff --git a/main/src/addins/NUnit/Services/SolutionFolderTestGroup.cs b/main/src/addins/NUnit/Services/SolutionFolderTestGroup.cs index c961b9c7e8..384598bc45 100644 --- a/main/src/addins/NUnit/Services/SolutionFolderTestGroup.cs +++ b/main/src/addins/NUnit/Services/SolutionFolderTestGroup.cs @@ -81,7 +81,7 @@ namespace MonoDevelop.NUnit protected override void OnCreateTests () { NUnitService testService = NUnitService.Instance; - foreach (SolutionItem e in combine.Items) { + foreach (SolutionFolderItem e in combine.Items) { UnitTest t = testService.BuildTest (e); if (t != null) Tests.Add (t); diff --git a/main/src/addins/NUnit/Services/SystemTestProvider.cs b/main/src/addins/NUnit/Services/SystemTestProvider.cs index 9e60f7767a..4090e3fff2 100644 --- a/main/src/addins/NUnit/Services/SystemTestProvider.cs +++ b/main/src/addins/NUnit/Services/SystemTestProvider.cs @@ -34,7 +34,7 @@ namespace MonoDevelop.NUnit { public class SystemTestProvider: ITestProvider { - public UnitTest CreateUnitTest (IWorkspaceObject entry) + public UnitTest CreateUnitTest (WorkspaceObject entry) { UnitTest test = null; diff --git a/main/src/addins/NUnit/Services/UnitTest.cs b/main/src/addins/NUnit/Services/UnitTest.cs index f8e9816015..a0044ac0c7 100644 --- a/main/src/addins/NUnit/Services/UnitTest.cs +++ b/main/src/addins/NUnit/Services/UnitTest.cs @@ -34,6 +34,9 @@ using MonoDevelop.Core.ProgressMonitoring; using MonoDevelop.Projects; using MonoDevelop.Core.Serialization; using MonoDevelop.Core.Execution; +using MonoDevelop.Ide; +using System.Threading.Tasks; +using System.Threading; namespace MonoDevelop.NUnit { @@ -45,8 +48,8 @@ namespace MonoDevelop.NUnit UnitTest parent; TestStatus status; Hashtable options; - IWorkspaceObject ownerSolutionItem; - SolutionEntityItem ownerSolutionEntityItem; + WorkspaceObject ownerSolutionItem; + SolutionItem ownerSolutionEntityItem; UnitTestResultsStore results; bool historicResult; bool resultLoaded; @@ -71,11 +74,11 @@ namespace MonoDevelop.NUnit this.name = name; } - protected UnitTest (string name, IWorkspaceObject ownerSolutionItem) + protected UnitTest (string name, WorkspaceObject ownerSolutionItem) { this.name = name; this.ownerSolutionItem = ownerSolutionItem; - ownerSolutionEntityItem = ownerSolutionItem as SolutionEntityItem; + ownerSolutionEntityItem = ownerSolutionItem as SolutionItem; if (ownerSolutionEntityItem != null) ownerSolutionEntityItem.DefaultConfigurationChanged += OnConfugurationChanged; } @@ -363,11 +366,11 @@ namespace MonoDevelop.NUnit } } - protected IWorkspaceObject OwnerSolutionItem { + protected WorkspaceObject OwnerSolutionItem { get { return ownerSolutionItem; } } - public IWorkspaceObject OwnerObject { + public WorkspaceObject OwnerObject { get { if (ownerSolutionItem != null) return ownerSolutionItem; @@ -390,11 +393,9 @@ namespace MonoDevelop.NUnit } // Forces the reloading of tests, if they have changed - public virtual IAsyncOperation Refresh () + public virtual Task Refresh (CancellationToken ct) { - AsyncOperation op = new AsyncOperation (); - op.SetCompleted (true); - return op; + return Task.FromResult (0); } public UnitTestResult Run (TestContext testContext) @@ -521,8 +522,8 @@ namespace MonoDevelop.NUnit oset.Tests.Remove (te); } } - - ce.Save (new NullProgressMonitor ()); + + IdeApp.ProjectOperations.SaveAsync ((WorkspaceObject)ce); } protected virtual ICollection OnLoadOptions (string configuration) @@ -552,8 +553,8 @@ namespace MonoDevelop.NUnit void GetOwnerSolutionItem (UnitTest t, out IConfigurationTarget c, out string path) { - if (OwnerSolutionItem is SolutionEntityItem) { - c = OwnerSolutionItem as SolutionEntityItem; + if (OwnerSolutionItem is SolutionItem) { + c = OwnerSolutionItem as SolutionItem; path = ""; } else if (parent != null) { parent.GetOwnerSolutionItem (t, out c, out path); diff --git a/main/src/addins/NUnit/Services/UnitTestGroup.cs b/main/src/addins/NUnit/Services/UnitTestGroup.cs index f478e1f00b..eaa541f83a 100644 --- a/main/src/addins/NUnit/Services/UnitTestGroup.cs +++ b/main/src/addins/NUnit/Services/UnitTestGroup.cs @@ -31,6 +31,8 @@ using MonoDevelop.Core; using MonoDevelop.Core.ProgressMonitoring; using System.Collections; using MonoDevelop.Projects; +using System.Threading.Tasks; +using System.Threading; namespace MonoDevelop.NUnit { @@ -42,7 +44,7 @@ namespace MonoDevelop.NUnit { } - protected UnitTestGroup (string name, IWorkspaceObject ownerSolutionItem): base (name, ownerSolutionItem) + protected UnitTestGroup (string name, WorkspaceObject ownerSolutionItem): base (name, ownerSolutionItem) { } @@ -121,13 +123,10 @@ namespace MonoDevelop.NUnit { } - public override IAsyncOperation Refresh () + public async override Task Refresh (CancellationToken ct) { - AggregatedAsyncOperation oper = new AggregatedAsyncOperation (); foreach (UnitTest t in Tests) - oper.Add (t.Refresh ()); - oper.StartMonitoring (); - return oper; + await t.Refresh (ct); } protected override UnitTestResult OnRun (TestContext testContext) diff --git a/main/src/addins/NUnit/lib/nunit.core.dll b/main/src/addins/NUnit/lib/nunit.core.dll deleted file mode 100644 index 5f748becd1..0000000000 Binary files a/main/src/addins/NUnit/lib/nunit.core.dll and /dev/null differ diff --git a/main/src/addins/NUnit/lib/nunit.core.interfaces.dll b/main/src/addins/NUnit/lib/nunit.core.interfaces.dll deleted file mode 100644 index 72b9486d74..0000000000 Binary files a/main/src/addins/NUnit/lib/nunit.core.interfaces.dll and /dev/null differ diff --git a/main/src/addins/NUnit/lib/nunit.framework.dll b/main/src/addins/NUnit/lib/nunit.framework.dll deleted file mode 100644 index eaea9eedf7..0000000000 Binary files a/main/src/addins/NUnit/lib/nunit.framework.dll and /dev/null differ diff --git a/main/src/addins/NUnit/lib/nunit.util.dll b/main/src/addins/NUnit/lib/nunit.util.dll deleted file mode 100644 index 28d603c662..0000000000 Binary files a/main/src/addins/NUnit/lib/nunit.util.dll and /dev/null differ diff --git a/main/src/addins/NUnit/packages.config b/main/src/addins/NUnit/packages.config new file mode 100644 index 0000000000..3ca92b52ea --- /dev/null +++ b/main/src/addins/NUnit/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/main/src/addins/NUnit/templates/NUnitProject.xpt.xml b/main/src/addins/NUnit/templates/NUnitProject.xpt.xml index 9a83ac6b23..4a42bb84fb 100644 --- a/main/src/addins/NUnit/templates/NUnitProject.xpt.xml +++ b/main/src/addins/NUnit/templates/NUnitProject.xpt.xml @@ -27,9 +27,12 @@ - - + + + + + diff --git a/main/src/addins/TextTemplating/Mono.TextTemplating.Tests/TemplateEnginePreprocessTemplateTests.cs b/main/src/addins/TextTemplating/Mono.TextTemplating.Tests/TemplateEnginePreprocessTemplateTests.cs index 824a06ed1a..c904caacf7 100644 --- a/main/src/addins/TextTemplating/Mono.TextTemplating.Tests/TemplateEnginePreprocessTemplateTests.cs +++ b/main/src/addins/TextTemplating/Mono.TextTemplating.Tests/TemplateEnginePreprocessTemplateTests.cs @@ -60,6 +60,16 @@ namespace Mono.TextTemplating.Tests Assert.AreEqual (expectedOutput, output, output); } + + [Test] + public void CaptureEncodingAndExtension () + { + string input = InputTemplate_CaptureEncodingAndExtension; + string output = Preprocess (input); + string expectedOutput = TemplatingEngineHelper.CleanCodeDom (Output_CaptureEncodingAndExtension, "\n"); + + Assert.AreEqual (expectedOutput, output, output); + } #region Helpers @@ -143,6 +153,12 @@ Included Method Body Text Block <#+ } #> +"; + + public static string InputTemplate_CaptureEncodingAndExtension = + @" +<#@ template debug=""false"" language=""C#"" inherits=""Foo"" hostspecific=""trueFromBase"" #> +<#@ output extension="".cs"" encoding=""utf-8"" #> "; #endregion @@ -589,6 +605,34 @@ namespace Templating { } } "; + + public static string Output_CaptureEncodingAndExtension = + + @"namespace Templating { + + + public partial class PreprocessedTemplate : Foo { + + public override string TransformText() { + this.GenerationEnvironment = null; + + #line 1 """" + this.Write(""\n""); + + #line default + #line hidden + return this.GenerationEnvironment.ToString(); + } + + protected override void Initialize() { + if ((this.Host != null)) { + this.Host.SetFileExtension("".cs""); + this.Host.SetOutputEncoding(System.Text.Encoding.GetEncoding(65001, true)); + } + base.Initialize(); + } + } +}"; #endregion } } diff --git a/main/src/addins/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/TextTransformation.cs b/main/src/addins/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/TextTransformation.cs index 409a36a9a6..f6a597752d 100644 --- a/main/src/addins/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/TextTransformation.cs +++ b/main/src/addins/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/TextTransformation.cs @@ -43,7 +43,7 @@ namespace Microsoft.VisualStudio.TextTemplating { } - protected internal virtual void Initialize () + public virtual void Initialize () { } @@ -55,15 +55,12 @@ namespace Microsoft.VisualStudio.TextTemplating public void Error (string message) { - Errors.Add (new CompilerError (null, -1, -1, null, message)); + Errors.Add (new CompilerError ("", 0, 0, "", message)); } public void Warning (string message) { - var err = new CompilerError (null, -1, -1, null, message) { - IsWarning = true, - }; - Errors.Add (err); + Errors.Add (new CompilerError ("", 0, 0, "", message) { IsWarning = true }); } protected internal CompilerErrorCollection Errors { diff --git a/main/src/addins/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/RecyclableAppDomain.cs b/main/src/addins/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/RecyclableAppDomain.cs index 51934e42e3..8ef80cddc1 100644 --- a/main/src/addins/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/RecyclableAppDomain.cs +++ b/main/src/addins/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/RecyclableAppDomain.cs @@ -201,6 +201,12 @@ namespace Mono.TextTemplating { map[name] = location; } + + //keep this alive as long as the app domain is alive + public override object InitializeLifetimeService () + { + return null; + } } } } \ No newline at end of file diff --git a/main/src/addins/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplatingEngine.cs b/main/src/addins/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplatingEngine.cs index 24394ff826..bdecf05e34 100644 --- a/main/src/addins/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplatingEngine.cs +++ b/main/src/addins/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplatingEngine.cs @@ -500,7 +500,7 @@ namespace Mono.TextTemplating case SegmentType.Block: if (helperMode) //TODO: are blocks permitted after helpers? - throw new ParserException ("Blocks are not permitted after helpers", seg.StartLocation); + pt.LogError ("Blocks are not permitted after helpers", seg.TagStartLocation); st = new CodeSnippetStatement (seg.Text); break; case SegmentType.Expression: @@ -512,7 +512,8 @@ namespace Mono.TextTemplating st = new CodeExpressionStatement (new CodeMethodInvokeExpression (writeMeth, new CodePrimitiveExpression (seg.Text))); break; case SegmentType.Helper: - type.Members.Add (CreateSnippetMember (seg.Text, location)); + if (!string.IsNullOrEmpty (seg.Text)) + type.Members.Add (CreateSnippetMember (seg.Text, location)); helperMode = true; break; default: @@ -524,7 +525,9 @@ namespace Mono.TextTemplating //TODO: is there a way to do this for languages that use indentation for blocks, e.g. python? using (var writer = new StringWriter ()) { settings.Provider.GenerateCodeFromStatement (st, writer, null); - type.Members.Add (CreateSnippetMember (writer.ToString (), location )); + var text = writer.ToString (); + if (!string.IsNullOrEmpty (text)) + type.Members.Add (CreateSnippetMember (text, location)); } } else { st.LinePragma = location; @@ -546,7 +549,7 @@ namespace Mono.TextTemplating //class code and attributes from processors foreach (var processor in settings.DirectiveProcessors.Values) { string classCode = processor.GetClassCodeForProcessingRun (); - if (classCode != null) + if (!string.IsNullOrEmpty (classCode)) type.Members.Add (CreateSnippetMember (classCode)); var atts = processor.GetTemplateClassCustomAttributes (); if (atts != null) { @@ -605,6 +608,44 @@ namespace Mono.TextTemplating }; if (!settings.IncludePreprocessingHelpers) initializeMeth.Attributes |= MemberAttributes.Override; + + //if preprocessed, pass the extension and encoding to the host + if (settings.IsPreprocessed && settings.HostSpecific) { + var hostProp = new CodePropertyReferenceExpression (new CodeThisReferenceExpression (), "Host"); + var statements = new List (); + + if (!string.IsNullOrEmpty (settings.Extension)) { + statements.Add (new CodeExpressionStatement (new CodeMethodInvokeExpression ( + hostProp, + "SetFileExtension", + new CodePrimitiveExpression (settings.Extension) + ))); + } + + if (settings.Encoding != null) { + statements.Add (new CodeExpressionStatement (new CodeMethodInvokeExpression ( + hostProp, + "SetOutputEncoding", + new CodeMethodInvokeExpression( + new CodeTypeReferenceExpression (typeof(Encoding)), + "GetEncoding", + new CodePrimitiveExpression (settings.Encoding.CodePage), + new CodePrimitiveExpression(true) + ) + ))); + } + + if (statements.Count > 0) { + initializeMeth.Statements.Add (new CodeConditionStatement ( + new CodeBinaryOperatorExpression ( + hostProp, + CodeBinaryOperatorType.IdentityInequality, + new CodePrimitiveExpression (null) + ), + statements.ToArray() + )); + } + } //pre-init code from processors foreach (var processor in settings.DirectiveProcessors.Values) { diff --git a/main/src/addins/TextTemplating/MonoDevelop.TextTemplating/TextTemplatingFileGenerator.cs b/main/src/addins/TextTemplating/MonoDevelop.TextTemplating/TextTemplatingFileGenerator.cs index ce0582208c..5b37d5c0b2 100644 --- a/main/src/addins/TextTemplating/MonoDevelop.TextTemplating/TextTemplatingFileGenerator.cs +++ b/main/src/addins/TextTemplating/MonoDevelop.TextTemplating/TextTemplatingFileGenerator.cs @@ -28,14 +28,15 @@ using System; using MonoDevelop.Ide.CustomTools; using MonoDevelop.Projects; using MonoDevelop.Core; +using System.Threading.Tasks; namespace MonoDevelop.TextTemplating { public class TextTemplatingFileGenerator : ISingleFileCustomTool { - public IAsyncOperation Generate (IProgressMonitor monitor, ProjectFile file, SingleFileCustomToolResult result) + public Task Generate (ProgressMonitor monitor, ProjectFile file, SingleFileCustomToolResult result) { - return new ThreadAsyncOperation (delegate { + return Task.Factory.StartNew (delegate { using (var host = new ProjectFileTemplatingHost (file)) { host.AddMonoDevelopHostImport (); var defaultOutputName = file.FilePath.ChangeExtension (".cs"); //cs extension for VS compat @@ -50,7 +51,7 @@ namespace MonoDevelop.TextTemplating foreach (var err in host.Errors) monitor.Log.WriteLine (err); } - }, result); + }); } } } diff --git a/main/src/addins/TextTemplating/MonoDevelop.TextTemplating/TextTemplatingFilePreprocessor.cs b/main/src/addins/TextTemplating/MonoDevelop.TextTemplating/TextTemplatingFilePreprocessor.cs index bf08fb5dff..e1887f35b2 100644 --- a/main/src/addins/TextTemplating/MonoDevelop.TextTemplating/TextTemplatingFilePreprocessor.cs +++ b/main/src/addins/TextTemplating/MonoDevelop.TextTemplating/TextTemplatingFilePreprocessor.cs @@ -33,14 +33,15 @@ using MonoDevelop.Ide; using MonoDevelop.Ide.CustomTools; using MonoDevelop.Projects; using MonoDevelop.Projects.Policies; +using System.Threading.Tasks; namespace MonoDevelop.TextTemplating { public class TextTemplatingFilePreprocessor : ISingleFileCustomTool { - public IAsyncOperation Generate (IProgressMonitor monitor, ProjectFile file, SingleFileCustomToolResult result) + public Task Generate (ProgressMonitor monitor, ProjectFile file, SingleFileCustomToolResult result) { - return new ThreadAsyncOperation (delegate { + return Task.Factory.StartNew (delegate { var host = new ProjectFileTemplatingHost (file); var dnp = file.Project as DotNetProject; @@ -74,7 +75,7 @@ namespace MonoDevelop.TextTemplating result.Errors.AddRange (host.Errors); foreach (var err in host.Errors) monitor.Log.WriteLine (err); - }, result); + }); } static bool warningLogged; diff --git a/main/src/addins/TextTemplating/MonoDevelop.TextTemplating/TextTemplatingService.cs b/main/src/addins/TextTemplating/MonoDevelop.TextTemplating/TextTemplatingService.cs index e434450482..34892038ad 100644 --- a/main/src/addins/TextTemplating/MonoDevelop.TextTemplating/TextTemplatingService.cs +++ b/main/src/addins/TextTemplating/MonoDevelop.TextTemplating/TextTemplatingService.cs @@ -39,7 +39,7 @@ namespace MonoDevelop.TextTemplating TaskService.Errors.Clear (); foreach (CompilerError err in errors) { - TaskService.Errors.Add (new Task (err.FileName, err.ErrorText, err.Column, err.Line, + TaskService.Errors.Add (new UserTask (err.FileName, err.ErrorText, err.Column, err.Line, err.IsWarning? TaskSeverity.Warning : TaskSeverity.Error)); } TaskService.ShowErrors (); diff --git a/main/src/addins/VBNetBinding/Gui/ProjectOptionsPanelWidget.cs b/main/src/addins/VBNetBinding/Gui/ProjectOptionsPanelWidget.cs index 211b6a8f7a..b72279305b 100644 --- a/main/src/addins/VBNetBinding/Gui/ProjectOptionsPanelWidget.cs +++ b/main/src/addins/VBNetBinding/Gui/ProjectOptionsPanelWidget.cs @@ -39,7 +39,7 @@ namespace MonoDevelop.VBNetBinding public partial class ProjectOptionsPanelWidget : Gtk.Bin { DotNetProject project; - VBProjectParameters parameters; + VBProjectExtension parameters; public ProjectOptionsPanelWidget (MonoDevelop.Projects.Project project) { @@ -49,7 +49,7 @@ namespace MonoDevelop.VBNetBinding this.Build(); this.project = (DotNetProject) project; - parameters = (VBProjectParameters) this.project.LanguageParameters; + parameters = this.project.GetService (); cr = new Gtk.CellRendererText (); store = new Gtk.ListStore (typeof (string)); diff --git a/main/src/addins/VBNetBinding/Project/Import.cs b/main/src/addins/VBNetBinding/Project/Import.cs index f8685402fa..227b7a27a1 100644 --- a/main/src/addins/VBNetBinding/Project/Import.cs +++ b/main/src/addins/VBNetBinding/Project/Import.cs @@ -30,14 +30,14 @@ using MonoDevelop.Projects; namespace MonoDevelop.VBNetBinding { - [DataItem ("Import")] - public class Import: SimpleProjectItem + public class Import: ProjectItem { public Import () { + ItemName = "Import"; } - public Import (string include) + public Import (string include): this () { Include = include; } diff --git a/main/src/addins/VBNetBinding/Project/VBCompilerParameters.cs b/main/src/addins/VBNetBinding/Project/VBCompilerParameters.cs index 386f8cab79..1dc141c777 100644 --- a/main/src/addins/VBNetBinding/Project/VBCompilerParameters.cs +++ b/main/src/addins/VBNetBinding/Project/VBCompilerParameters.cs @@ -36,7 +36,7 @@ using MonoDevelop.Core.Serialization; namespace MonoDevelop.VBNetBinding { - public class VBCompilerParameters: ConfigurationParameters + public class VBCompilerParameters: DotNetCompilerParameters { // // Project level properties: diff --git a/main/src/addins/VBNetBinding/Project/VBProjectExtension.cs b/main/src/addins/VBNetBinding/Project/VBProjectExtension.cs new file mode 100644 index 0000000000..b10b0d0300 --- /dev/null +++ b/main/src/addins/VBNetBinding/Project/VBProjectExtension.cs @@ -0,0 +1,118 @@ +// +// VBProjectExtension.cs +// +// Author: +// Lluis Sanchez Gual +// +// Copyright (c) 2014 Xamarin, Inc (http://www.xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +using System; +using MonoDevelop.Projects; +using MonoDevelop.Projects.Formats.MSBuild; +using MonoDevelop.Core.Serialization; + +namespace MonoDevelop.VBNetBinding +{ + public class VBProjectExtension: DotNetProjectExtension + { + [ItemProperty ("OptionInfer", DefaultValue="Off")] + string optionInfer = "Off"; + + [ItemProperty ("OptionExplicit", DefaultValue="On")] + string optionExplicit = "On"; + + [ItemProperty ("OptionCompare", DefaultValue="Binary")] + string optionCompare = "Binary"; + + [ItemProperty ("OptionStrict", DefaultValue="Off")] + string optionStrict = "Off"; + + [ItemProperty ("MyType", DefaultValue="")] + string myType = string.Empty; + + [ItemProperty ("StartupObject", DefaultValue="")] + string startupObject = string.Empty; + + [ProjectPathItemProperty ("ApplicationIcon", DefaultValue="")] + string applicationIcon = string.Empty; + + [ItemProperty ("CodePage", DefaultValue="")] + string codePage = string.Empty; + + public bool OptionInfer { + get { return optionInfer == "On"; } + set { optionInfer = value ? "On" : "Off"; } + } + + public bool OptionExplicit { + get { return optionExplicit == "On"; } + set { optionExplicit = value ? "On" : "Off"; } + } + + public bool BinaryOptionCompare { + get { return optionCompare == "Binary"; } + set { optionCompare = value ? "Binary" : "Text"; } + } + + public bool OptionStrict { + get { return optionStrict == "On"; } + set { optionStrict = value ? "On" : "Off"; } + } + + public string MyType { + get { return myType; } + set { myType = value ?? string.Empty; } + } + + public string StartupObject { + get { return startupObject; } + set { startupObject = value ?? string.Empty; } + } + + public string ApplicationIcon { + get { return applicationIcon; } + set { applicationIcon = value ?? string.Empty; } + } + + public string CodePage { + get { return codePage; } + set { codePage = value ?? string.Empty; } + } + + protected override void Initialize () + { + base.Initialize (); + Project.DefaultNamespaceIsImplicit = true; + } + + protected override void OnReadProject (MonoDevelop.Core.ProgressMonitor monitor, MSBuildProject msproject) + { + base.OnReadProject (monitor, msproject); + msproject.GetGlobalPropertyGroup ().ReadObjectProperties (this, typeof(VBProjectExtension)); + } + + protected override void OnWriteProject (MonoDevelop.Core.ProgressMonitor monitor, MSBuildProject msproject) + { + base.OnWriteProject (monitor, msproject); + msproject.GetGlobalPropertyGroup ().WriteObjectProperties (this, typeof(VBProjectExtension)); + } + } +} + diff --git a/main/src/addins/VBNetBinding/Project/VBProjectParameters.cs b/main/src/addins/VBNetBinding/Project/VBProjectParameters.cs deleted file mode 100644 index f3e8dd95ff..0000000000 --- a/main/src/addins/VBNetBinding/Project/VBProjectParameters.cs +++ /dev/null @@ -1,109 +0,0 @@ -// -// VBProjectParameters.cs -// -// Author: -// Lluis Sanchez Gual -// -// Copyright (c) 2009 Novell, Inc (http://www.novell.com) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -using System; -using MonoDevelop.Core.Serialization; -using MonoDevelop.Projects; - -namespace MonoDevelop.VBNetBinding -{ - public class VBProjectParameters: DotNetProjectParameters - { - public override bool DefaultNamespaceIsImplicit { - get { - return true; - } - } - - [ItemProperty ("OptionInfer", DefaultValue="Off")] - string optionInfer = "Off"; - - [ItemProperty ("OptionExplicit", DefaultValue="On")] - string optionExplicit = "On"; - - [ItemProperty ("OptionCompare", DefaultValue="Binary")] - string optionCompare = "Binary"; - - [ItemProperty ("OptionStrict", DefaultValue="Off")] - string optionStrict = "Off"; - - [ItemProperty ("MyType", DefaultValue="")] - string myType = string.Empty; - - [ItemProperty ("StartupObject", DefaultValue="")] - string startupObject = string.Empty; - - [ProjectPathItemProperty ("ApplicationIcon", DefaultValue="")] - string applicationIcon = string.Empty; - - [ItemProperty ("CodePage", DefaultValue="")] - string codePage = string.Empty; - - public VBProjectParameters() - { - } - - public bool OptionInfer { - get { return optionInfer == "On"; } - set { optionInfer = value ? "On" : "Off"; } - } - - public bool OptionExplicit { - get { return optionExplicit == "On"; } - set { optionExplicit = value ? "On" : "Off"; } - } - - public bool BinaryOptionCompare { - get { return optionCompare == "Binary"; } - set { optionCompare = value ? "Binary" : "Text"; } - } - - public bool OptionStrict { - get { return optionStrict == "On"; } - set { optionStrict = value ? "On" : "Off"; } - } - - public string MyType { - get { return myType; } - set { myType = value ?? string.Empty; } - } - - public string StartupObject { - get { return startupObject; } - set { startupObject = value ?? string.Empty; } - } - - public string ApplicationIcon { - get { return applicationIcon; } - set { applicationIcon = value ?? string.Empty; } - } - - public string CodePage { - get { return codePage; } - set { codePage = value ?? string.Empty; } - } - } -} diff --git a/main/src/addins/VBNetBinding/VBBindingCompilerServices.cs b/main/src/addins/VBNetBinding/VBBindingCompilerServices.cs index a5eb348271..8ef14e9669 100644 --- a/main/src/addins/VBNetBinding/VBBindingCompilerServices.cs +++ b/main/src/addins/VBNetBinding/VBBindingCompilerServices.cs @@ -55,7 +55,7 @@ namespace MonoDevelop.VBNetBinding { static Regex regexError = new Regex (@"^\s*((?.*)\s?\((?\d*)(,(?\d*))?\) : )?(?\w+) :? ?(?[^:]*): (?.*)$", RegexOptions.Compiled | RegexOptions.ExplicitCapture); - string GenerateOptions (DotNetProjectConfiguration configuration, VBCompilerParameters compilerparameters, VBProjectParameters projectparameters, string outputFileName) + string GenerateOptions (DotNetProjectConfiguration configuration, VBCompilerParameters compilerparameters, VBProjectExtension projectparameters, string outputFileName) { DotNetProject project = (DotNetProject) configuration.ParentItem; StringBuilder sb = new StringBuilder (); @@ -189,16 +189,14 @@ namespace MonoDevelop.VBNetBinding { return sb.ToString(); } - public BuildResult Compile (ProjectItemCollection items, DotNetProjectConfiguration configuration, ConfigurationSelector configSelector, IProgressMonitor monitor) + public BuildResult Compile (ProjectItemCollection items, DotNetProjectConfiguration configuration, ConfigurationSelector configSelector, ProgressMonitor monitor) { VBCompilerParameters compilerparameters = (VBCompilerParameters) configuration.CompilationParameters; if (compilerparameters == null) compilerparameters = new VBCompilerParameters (); - VBProjectParameters projectparameters = (VBProjectParameters) configuration.ProjectParameters; - if (projectparameters == null) - projectparameters = new VBProjectParameters (); - + var projectparameters = configuration.ParentItem.GetService (); + string exe = configuration.CompiledOutputName; string responseFileName = Path.GetTempFileName(); StreamWriter writer = new StreamWriter (responseFileName); diff --git a/main/src/addins/VBNetBinding/VBLanguageBinding.cs b/main/src/addins/VBNetBinding/VBLanguageBinding.cs index 0fbca6123c..8ddde46aaa 100644 --- a/main/src/addins/VBNetBinding/VBLanguageBinding.cs +++ b/main/src/addins/VBNetBinding/VBLanguageBinding.cs @@ -62,13 +62,13 @@ namespace MonoDevelop.VBNetBinding return Path.GetExtension(fileName) == ".vb"; } - public BuildResult Compile (ProjectItemCollection items, DotNetProjectConfiguration configuration, ConfigurationSelector configSelector, IProgressMonitor monitor) + public BuildResult Compile (ProjectItemCollection items, DotNetProjectConfiguration configuration, ConfigurationSelector configSelector, ProgressMonitor monitor) { Debug.Assert(compilerServices != null); return compilerServices.Compile (items, configuration, configSelector, monitor); } - public ConfigurationParameters CreateCompilationParameters (XmlElement projectOptions) + public DotNetCompilerParameters CreateCompilationParameters (XmlElement projectOptions) { return new VBCompilerParameters (); } @@ -94,11 +94,6 @@ namespace MonoDevelop.VBNetBinding return new ClrVersion[] { ClrVersion.Net_2_0, ClrVersion.Net_4_0 }; } - public ProjectParameters CreateProjectParameters (XmlElement projectOptions) - { - return new VBProjectParameters (); - } - class ImprovedCodeDomProvider : Microsoft.VisualBasic.VBCodeProvider { [Obsolete ("Use CodeDomProvider class")] diff --git a/main/src/addins/VBNetBinding/VBNetBinding.csproj b/main/src/addins/VBNetBinding/VBNetBinding.csproj index d730d2a3f5..7591c7b96c 100644 --- a/main/src/addins/VBNetBinding/VBNetBinding.csproj +++ b/main/src/addins/VBNetBinding/VBNetBinding.csproj @@ -95,8 +95,8 @@ - + diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git.Tests/BaseGitRepositoryTests.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git.Tests/BaseGitRepositoryTests.cs index 8841f269d3..a87f73024f 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git.Tests/BaseGitRepositoryTests.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git.Tests/BaseGitRepositoryTests.cs @@ -155,7 +155,7 @@ namespace MonoDevelop.VersionControl.Git.Tests protected override void PostCommit (Repository repo) { var repo2 = (GitRepository)repo; - repo2.Push (new MonoDevelop.Core.ProgressMonitoring.NullProgressMonitor (), repo2.GetCurrentRemote (), repo2.GetCurrentBranch ()); + repo2.Push (new MonoDevelop.Core.ProgressMonitor (), repo2.GetCurrentRemote (), repo2.GetCurrentBranch ()); } protected override void BlameExtraInternals (Annotation [] annotations) @@ -193,19 +193,19 @@ namespace MonoDevelop.VersionControl.Git.Tests AddFile ("file1", "text", true, true); repo2.CreateBranch ("branch1", null); - repo2.SwitchToBranch (new MonoDevelop.Core.ProgressMonitoring.NullProgressMonitor (), "branch1"); + repo2.SwitchToBranch (new MonoDevelop.Core.ProgressMonitor (), "branch1"); Assert.AreEqual ("branch1", repo2.GetCurrentBranch ()); Assert.IsTrue (File.Exists (LocalPath + "file1"), "Branch not inheriting from current."); AddFile ("file2", "text", true, false); repo2.CreateBranch ("branch2", null); - repo2.SwitchToBranch (new MonoDevelop.Core.ProgressMonitoring.NullProgressMonitor (), "branch2"); + repo2.SwitchToBranch (new MonoDevelop.Core.ProgressMonitor (), "branch2"); Assert.IsTrue (!File.Exists (LocalPath + "file2"), "Uncommitted changes were not stashed"); repo2.GetStashes ().Pop (new NullProgressMonitor ()); Assert.IsTrue (File.Exists (LocalPath + "file2"), "Uncommitted changes were not stashed correctly"); - repo2.SwitchToBranch (new MonoDevelop.Core.ProgressMonitoring.NullProgressMonitor (), "master"); + repo2.SwitchToBranch (new MonoDevelop.Core.ProgressMonitor (), "master"); repo2.RemoveBranch ("branch1"); Assert.IsFalse (repo2.GetBranches ().Any (b => b.Name == "branch1"), "Failed to delete branch"); @@ -224,14 +224,14 @@ namespace MonoDevelop.VersionControl.Git.Tests PostCommit (repo2); repo2.CreateBranch ("branch3", null); - repo2.SwitchToBranch (new MonoDevelop.Core.ProgressMonitoring.NullProgressMonitor (), "branch3"); + repo2.SwitchToBranch (new MonoDevelop.Core.ProgressMonitor (), "branch3"); AddFile ("file2", "asdf", true, true); - repo2.Push (new MonoDevelop.Core.ProgressMonitoring.NullProgressMonitor (), "origin", "branch3"); + repo2.Push (new MonoDevelop.Core.ProgressMonitor (), "origin", "branch3"); - repo2.SwitchToBranch (new MonoDevelop.Core.ProgressMonitoring.NullProgressMonitor (), "master"); + repo2.SwitchToBranch (new MonoDevelop.Core.ProgressMonitor (), "master"); repo2.CreateBranch ("branch4", "origin/branch3"); - repo2.SwitchToBranch (new MonoDevelop.Core.ProgressMonitoring.NullProgressMonitor (), "branch4"); + repo2.SwitchToBranch (new MonoDevelop.Core.ProgressMonitor (), "branch4"); Assert.IsTrue (File.Exists (LocalPath + "file2"), "Tracking remote is not grabbing correct commits"); } @@ -306,7 +306,7 @@ namespace MonoDevelop.VersionControl.Git.Tests AddFile ("file1", "text", true, true); PostCommit (repo2); repo2.CreateBranch ("branch1", null); - repo2.SwitchToBranch (new MonoDevelop.Core.ProgressMonitoring.NullProgressMonitor (), "branch1"); + repo2.SwitchToBranch (new MonoDevelop.Core.ProgressMonitor (), "branch1"); AddFile ("file2", "text", true, true); PostCommit (repo2); Assert.AreEqual (2, repo2.GetBranches ().Count ()); @@ -329,12 +329,12 @@ namespace MonoDevelop.VersionControl.Git.Tests Assert.IsTrue (repo2.IsBranchMerged ("master")); repo2.CreateBranch ("branch1", null); - repo2.SwitchToBranch (new MonoDevelop.Core.ProgressMonitoring.NullProgressMonitor (), "branch1"); + repo2.SwitchToBranch (new MonoDevelop.Core.ProgressMonitor (), "branch1"); AddFile ("file2", "text", true, true); - repo2.SwitchToBranch (new MonoDevelop.Core.ProgressMonitoring.NullProgressMonitor (), "master"); + repo2.SwitchToBranch (new MonoDevelop.Core.ProgressMonitor (), "master"); Assert.IsFalse (repo2.IsBranchMerged ("branch1")); - repo2.Merge ("branch1", GitUpdateOptions.NormalUpdate, new MonoDevelop.Core.ProgressMonitoring.NullProgressMonitor ()); + repo2.Merge ("branch1", GitUpdateOptions.NormalUpdate, new MonoDevelop.Core.ProgressMonitor ()); Assert.IsTrue (repo2.IsBranchMerged ("branch1")); } diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git.Tests/BaseRepositoryTests.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git.Tests/BaseRepositoryTests.cs index ba74fd3e0e..648cc45fdb 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git.Tests/BaseRepositoryTests.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git.Tests/BaseRepositoryTests.cs @@ -242,15 +242,15 @@ namespace MonoDevelop.VersionControl.Tests Repo2 = GetRepo (second, RemoteUrl); string added = second + "testfile2"; File.Create (added).Close (); - Repo2.Add (added, false, new NullProgressMonitor ()); + Repo2.Add (added, false, new ProgressMonitor ()); ChangeSet changes = Repo.CreateChangeSet (Repo.RootPath); changes.AddFile (Repo.GetVersionInfo (added, VersionInfoQueryFlags.IgnoreCache)); changes.GlobalComment = "test2"; - Repo2.Commit (changes, new NullProgressMonitor ()); + Repo2.Commit (changes, new ProgressMonitor ()); PostCommit (Repo2); - Repo.Update (Repo.RootPath, true, new NullProgressMonitor ()); + Repo.Update (Repo.RootPath, true, new ProgressMonitor ()); Assert.True (File.Exists (LocalPath + "testfile2")); DeleteDirectory (second); @@ -290,7 +290,7 @@ namespace MonoDevelop.VersionControl.Tests // Revert to head. File.WriteAllText (added, content); - Repo.Revert (added, false, new NullProgressMonitor ()); + Repo.Revert (added, false, new ProgressMonitor ()); Assert.AreEqual (Repo.GetBaseText (added), File.ReadAllText (added)); } @@ -317,7 +317,7 @@ namespace MonoDevelop.VersionControl.Tests string added = LocalPath + "testfile2"; AddFile ("testfile", "text", true, true); AddFile ("testfile2", "text2", true, true); - Repo.RevertRevision (added, GetHeadRevision (), new NullProgressMonitor ()); + Repo.RevertRevision (added, GetHeadRevision (), new ProgressMonitor ()); Assert.IsFalse (File.Exists (added)); } @@ -334,7 +334,7 @@ namespace MonoDevelop.VersionControl.Tests AddFile ("testfile", null, true, true); src = LocalPath + "testfile"; dst = src + "2"; - Repo.MoveFile (src, dst, false, new NullProgressMonitor ()); + Repo.MoveFile (src, dst, false, new ProgressMonitor ()); srcVi = Repo.GetVersionInfo (src, VersionInfoQueryFlags.IgnoreCache); dstVi = Repo.GetVersionInfo (dst, VersionInfoQueryFlags.IgnoreCache); const VersionStatus versionedStatus = VersionStatus.ScheduledDelete | VersionStatus.ScheduledReplace; @@ -345,7 +345,7 @@ namespace MonoDevelop.VersionControl.Tests AddFile ("addedfile", null, true, false); src = LocalPath + "addedfile"; dst = src + "2"; - Repo.MoveFile (src, dst, false, new NullProgressMonitor ()); + Repo.MoveFile (src, dst, false, new ProgressMonitor ()); srcVi = Repo.GetVersionInfo (src, VersionInfoQueryFlags.IgnoreCache); dstVi = Repo.GetVersionInfo (dst, VersionInfoQueryFlags.IgnoreCache); Assert.AreEqual (VersionStatus.Unversioned, srcVi.Status); @@ -355,7 +355,7 @@ namespace MonoDevelop.VersionControl.Tests AddFile ("unversionedfile", null, false, false); src = LocalPath + "unversionedfile"; dst = src + "2"; - Repo.MoveFile (src, dst, false, new NullProgressMonitor ()); + Repo.MoveFile (src, dst, false, new ProgressMonitor ()); srcVi = Repo.GetVersionInfo (src, VersionInfoQueryFlags.IgnoreCache); dstVi = Repo.GetVersionInfo (dst, VersionInfoQueryFlags.IgnoreCache); Assert.AreEqual (VersionStatus.Unversioned, srcVi.Status); @@ -374,7 +374,7 @@ namespace MonoDevelop.VersionControl.Tests AddDirectory ("test", true, false); AddFile ("test" + Path.DirectorySeparatorChar + "testfile", null, true, true); - Repo.MoveDirectory (srcDir, dstDir, false, new NullProgressMonitor ()); + Repo.MoveDirectory (srcDir, dstDir, false, new ProgressMonitor ()); VersionInfo srcVi = Repo.GetVersionInfo (src, VersionInfoQueryFlags.IgnoreCache); VersionInfo dstVi = Repo.GetVersionInfo (dst, VersionInfoQueryFlags.IgnoreCache); const VersionStatus expectedStatus = VersionStatus.ScheduledDelete | VersionStatus.ScheduledReplace; @@ -390,7 +390,7 @@ namespace MonoDevelop.VersionControl.Tests // Versioned file. added = LocalPath + "testfile1" + postFix; AddFile ("testfile1" + postFix, null, true, true); - Repo.DeleteFile (added, true, new NullProgressMonitor (), keepLocal); + Repo.DeleteFile (added, true, new ProgressMonitor (), keepLocal); vi = Repo.GetVersionInfo (added, VersionInfoQueryFlags.IgnoreCache); Assert.AreEqual (VersionStatus.ScheduledDelete, vi.Status & VersionStatus.ScheduledDelete); Assert.AreEqual (keepLocal, File.Exists (added)); @@ -398,7 +398,7 @@ namespace MonoDevelop.VersionControl.Tests // Just added file. added = LocalPath + "testfile2" + postFix; AddFile ("testfile2" + postFix, null, true, false); - Repo.DeleteFile (added, true, new NullProgressMonitor (), keepLocal); + Repo.DeleteFile (added, true, new ProgressMonitor (), keepLocal); vi = Repo.GetVersionInfo (added, VersionInfoQueryFlags.IgnoreCache); Assert.AreEqual (VersionStatus.Unversioned, vi.Status); Assert.AreEqual (keepLocal, File.Exists (added)); @@ -406,7 +406,7 @@ namespace MonoDevelop.VersionControl.Tests // Non versioned file. added = LocalPath + "testfile3" + postFix; AddFile ("testfile3" + postFix, null, false, false); - Repo.DeleteFile (added, true, new NullProgressMonitor (), keepLocal); + Repo.DeleteFile (added, true, new ProgressMonitor (), keepLocal); vi = Repo.GetVersionInfo (added, VersionInfoQueryFlags.IgnoreCache); Assert.AreEqual (VersionStatus.Unversioned, vi.Status); Assert.AreEqual (keepLocal, File.Exists (added)); @@ -433,7 +433,7 @@ namespace MonoDevelop.VersionControl.Tests AddDirectory ("test1" + postFix, true, false); AddFile ("test1" + postFix + Path.DirectorySeparatorChar + "testfile", null, true, true); - Repo.DeleteDirectory (addedDir, true, new NullProgressMonitor (), keepLocal); + Repo.DeleteDirectory (addedDir, true, new ProgressMonitor (), keepLocal); vi = Repo.GetVersionInfo (added, VersionInfoQueryFlags.IgnoreCache); Assert.AreEqual (VersionStatus.ScheduledDelete, vi.Status & VersionStatus.ScheduledDelete); Assert.AreEqual (keepLocal, File.Exists (added)); @@ -444,7 +444,7 @@ namespace MonoDevelop.VersionControl.Tests AddDirectory ("test2" + postFix, true, false); AddFile ("test2" + postFix + Path.DirectorySeparatorChar + "testfile", null, true, false); - Repo.DeleteDirectory (addedDir, true, new NullProgressMonitor (), keepLocal); + Repo.DeleteDirectory (addedDir, true, new ProgressMonitor (), keepLocal); vi = Repo.GetVersionInfo (added, VersionInfoQueryFlags.IgnoreCache); Assert.AreEqual (VersionStatus.Unversioned, vi.Status); Assert.AreEqual (keepLocal, File.Exists (added)); @@ -455,7 +455,7 @@ namespace MonoDevelop.VersionControl.Tests AddDirectory ("test3" + postFix, true, false); AddFile ("test3" + postFix + Path.DirectorySeparatorChar + "testfile", null, false, false); - Repo.DeleteDirectory (addedDir, true, new NullProgressMonitor (), keepLocal); + Repo.DeleteDirectory (addedDir, true, new ProgressMonitor (), keepLocal); vi = Repo.GetVersionInfo (added, VersionInfoQueryFlags.IgnoreCache); Assert.AreEqual (VersionStatus.Unversioned, vi.Status); Assert.AreEqual (keepLocal, File.Exists (added)); @@ -475,7 +475,7 @@ namespace MonoDevelop.VersionControl.Tests { string added = LocalPath + "testfile"; AddFile ("testfile", null, true, true); - Repo.Lock (new NullProgressMonitor (), added); + Repo.Lock (new ProgressMonitor (), added); PostLock (); } @@ -490,8 +490,8 @@ namespace MonoDevelop.VersionControl.Tests { string added = LocalPath + "testfile"; AddFile ("testfile", null, true, true); - Repo.Lock (new NullProgressMonitor (), "testfile"); - Repo.Unlock (new NullProgressMonitor (), added); + Repo.Lock (new ProgressMonitor (), "testfile"); + Repo.Unlock (new ProgressMonitor (), added); PostLock (); } @@ -575,7 +575,7 @@ namespace MonoDevelop.VersionControl.Tests protected void Checkout (string path, string url) { Repository _repo = GetRepo (path, url); - _repo.Checkout (path, true, new NullProgressMonitor ()); + _repo.Checkout (path, true, new ProgressMonitor ()); if (Repo == null) Repo = _repo; else @@ -589,7 +589,7 @@ namespace MonoDevelop.VersionControl.Tests changes.AddFile (Repo.GetVersionInfo (item, VersionInfoQueryFlags.IgnoreCache)); } changes.GlobalComment = String.Format ("Commit #{0}", CommitNumber); - Repo.Commit (changes, new NullProgressMonitor ()); + Repo.Commit (changes, new ProgressMonitor ()); CommitNumber++; } @@ -603,7 +603,7 @@ namespace MonoDevelop.VersionControl.Tests changes.AddFile (Repo.GetVersionInfo (path, VersionInfoQueryFlags.IgnoreCache)); changes.GlobalComment = String.Format ("Commit #{0}", CommitNumber); - Repo.Commit (changes, new NullProgressMonitor ()); + Repo.Commit (changes, new ProgressMonitor ()); CommitNumber++; } @@ -626,7 +626,7 @@ namespace MonoDevelop.VersionControl.Tests File.WriteAllText (added, contents); if (toVcs) - Repo.Add (added, false, new NullProgressMonitor ()); + Repo.Add (added, false, new ProgressMonitor ()); if (commit) CommitFile (added); diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/Commands.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/Commands.cs index b624b70f0e..72d67d950a 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/Commands.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/Commands.cs @@ -50,7 +50,7 @@ namespace MonoDevelop.VersionControl.Git { public GitRepository Repository { get { - IWorkspaceObject wob = IdeApp.ProjectOperations.CurrentSelectedSolutionItem; + WorkspaceObject wob = IdeApp.ProjectOperations.CurrentSelectedSolutionItem; if (wob == null) wob = IdeApp.ProjectOperations.CurrentSelectedWorkspaceItem; if (wob != null) @@ -86,7 +86,7 @@ namespace MonoDevelop.VersionControl.Git if (repo == null) return; - IWorkspaceObject wob = IdeApp.ProjectOperations.CurrentSelectedItem as IWorkspaceObject; + WorkspaceObject wob = IdeApp.ProjectOperations.CurrentSelectedItem as WorkspaceObject; if (wob == null) return; if (((wob is WorkspaceItem) && ((WorkspaceItem)wob).ParentWorkspace == null) || diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitNodeBuilderExtension.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitNodeBuilderExtension.cs index 6f008faa03..03561045fe 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitNodeBuilderExtension.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitNodeBuilderExtension.cs @@ -35,7 +35,7 @@ namespace MonoDevelop.VersionControl.Git { sealed class GitNodeBuilderExtension: NodeBuilderExtension { - readonly Dictionary repos = new Dictionary (); + readonly Dictionary repos = new Dictionary (); protected override void Initialize () { @@ -53,15 +53,15 @@ namespace MonoDevelop.VersionControl.Git public override bool CanBuildNode (Type dataType) { - return typeof(IWorkspaceObject).IsAssignableFrom (dataType); + return typeof(WorkspaceObject).IsAssignableFrom (dataType); } public override void BuildNode (ITreeBuilder treeBuilder, object dataObject, NodeInfo nodeInfo) { - IWorkspaceObject ob = (IWorkspaceObject) dataObject; + WorkspaceObject ob = (WorkspaceObject) dataObject; GitRepository rep = VersionControlService.GetRepository (ob) as GitRepository; if (rep != null) { - IWorkspaceObject rob; + WorkspaceObject rob; if (repos.TryGetValue (rep.RootPath.CanonicalPath, out rob)) { if (ob == rob) nodeInfo.Label += " (" + rep.GetCurrentBranch () + ")"; @@ -71,7 +71,7 @@ namespace MonoDevelop.VersionControl.Git public override void OnNodeAdded (object dataObject) { - IWorkspaceObject ob = (IWorkspaceObject) dataObject; + WorkspaceObject ob = (WorkspaceObject) dataObject; GitRepository rep = VersionControlService.GetRepository (ob) as GitRepository; if (rep != null && !repos.ContainsKey (rep.RootPath.CanonicalPath)) { repos [rep.RootPath] = ob; @@ -80,9 +80,9 @@ namespace MonoDevelop.VersionControl.Git public override void OnNodeRemoved (object dataObject) { - IWorkspaceObject ob = (IWorkspaceObject) dataObject; + WorkspaceObject ob = (WorkspaceObject) dataObject; GitRepository rep = VersionControlService.GetRepository (ob) as GitRepository; - IWorkspaceObject rob; + WorkspaceObject rob; if (rep != null && repos.TryGetValue (rep.RootPath.CanonicalPath, out rob)) { if (ob == rob) repos.Remove (rep.RootPath.CanonicalPath); diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs index 144e81b7ce..83725fb1d1 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs @@ -44,6 +44,7 @@ using NGit.Transport; using NGit.Diff; using NGit.Merge; using NGit.Submodule; +using ProgressMonitor = MonoDevelop.Core.ProgressMonitor; namespace MonoDevelop.VersionControl.Git { @@ -409,7 +410,7 @@ namespace MonoDevelop.VersionControl.Git .Select (f => new FilePath (f).CanonicalPath)); } - protected override Repository OnPublish (string serverPath, FilePath localPath, FilePath[] files, string message, IProgressMonitor monitor) + protected override Repository OnPublish (string serverPath, FilePath localPath, FilePath[] files, string message, ProgressMonitor monitor) { // Initialize the repository RootRepository = GitUtil.Init (localPath, Url); @@ -451,7 +452,7 @@ namespace MonoDevelop.VersionControl.Git return this; } - protected override void OnUpdate (FilePath[] localPaths, bool recurse, IProgressMonitor monitor) + protected override void OnUpdate (FilePath[] localPaths, bool recurse, ProgressMonitor monitor) { IEnumerable statusList = null; @@ -478,7 +479,7 @@ namespace MonoDevelop.VersionControl.Git monitor.EndTask (); } - public void Fetch (IProgressMonitor monitor) + public void Fetch (ProgressMonitor monitor) { string remote = GetCurrentRemote (); if (remote == null) @@ -536,7 +537,7 @@ namespace MonoDevelop.VersionControl.Git return true; } - public void Rebase (string upstreamRef, GitUpdateOptions options, IProgressMonitor monitor) + public void Rebase (string upstreamRef, GitUpdateOptions options, ProgressMonitor monitor) { StashCollection stashes = GitUtil.GetStashes (RootRepository); Stash stash = null; @@ -660,7 +661,7 @@ namespace MonoDevelop.VersionControl.Git } } - public void Merge (string branch, GitUpdateOptions options, IProgressMonitor monitor) + public void Merge (string branch, GitUpdateOptions options, ProgressMonitor monitor) { IEnumerable statusList = null; Stash stash = null; @@ -798,7 +799,7 @@ namespace MonoDevelop.VersionControl.Git return res; } - protected override void OnCommit (ChangeSet changeSet, IProgressMonitor monitor) + protected override void OnCommit (ChangeSet changeSet, ProgressMonitor monitor) { string message = changeSet.GlobalComment; if (string.IsNullOrEmpty (message)) @@ -864,7 +865,7 @@ namespace MonoDevelop.VersionControl.Git config.Save (); } - protected override void OnCheckout (FilePath targetLocalPath, Revision rev, bool recurse, IProgressMonitor monitor) + protected override void OnCheckout (FilePath targetLocalPath, Revision rev, bool recurse, ProgressMonitor monitor) { CloneCommand cmd = NGit.Api.Git.CloneRepository (); cmd.SetURI (Url); @@ -889,108 +890,109 @@ namespace MonoDevelop.VersionControl.Git } } - protected override void OnRevert (FilePath[] localPaths, bool recurse, IProgressMonitor monitor) + protected override void OnRevert (FilePath[] localPaths, bool recurse, ProgressMonitor monitor) { // Replace with NGit.Api.Git.Reset () + // FIXME: we lack info about what happened to files - foreach (var group in GroupByRepository (localPaths)) { + + var groups = GroupByRepository (localPaths).ToArray (); + monitor.BeginTask (GettextCatalog.GetString ("Reverting files"), groups.Length); + + foreach (var group in groups) { + monitor.BeginStep (1); var repository = group.Key; var files = group.ToArray (); - var c = GetHeadCommit (repository); - RevTree tree = c != null ? c.Tree : null; - - List changedFiles = new List (); - List removedFiles = new List (); - - monitor.BeginTask (GettextCatalog.GetString ("Reverting files"), 3); - monitor.BeginStepTask (GettextCatalog.GetString ("Reverting files"), files.Length, 2); - - DirCache dc = repository.LockDirCache (); - DirCacheBuilder builder = dc.Builder (); - - try { - HashSet entriesToRemove = new HashSet (); - HashSet foldersToRemove = new HashSet (); + var c = GetHeadCommit (repository); + RevTree tree = c != null ? c.Tree : null; - // Add the new entries - foreach (FilePath fp in files) { - string p = repository.ToGitPath (fp); - - // Register entries to be removed from the index - if (Directory.Exists (fp)) - foldersToRemove.Add (p); - else - entriesToRemove.Add (p); + List changedFiles = new List (); + List removedFiles = new List (); + + monitor.BeginTask (files.Length); + + DirCache dc = repository.LockDirCache (); + DirCacheBuilder builder = dc.Builder (); + + try { + HashSet entriesToRemove = new HashSet (); + HashSet foldersToRemove = new HashSet (); - TreeWalk tw = tree != null ? TreeWalk.ForPath (repository, p, tree) : null; - if (tw == null) { - // Removed from the index - } - else { - // Add new entries + // Add the new entries + foreach (FilePath fp in files) { + string p = repository.ToGitPath (fp); - TreeWalk r; - if (tw.IsSubtree) { - // It's a directory. Make sure we remove existing index entries of this directory + // Register entries to be removed from the index + if (Directory.Exists (fp)) foldersToRemove.Add (p); + else + entriesToRemove.Add (p); + + TreeWalk tw = tree != null ? TreeWalk.ForPath (repository, p, tree) : null; + if (tw == null) { + // Removed from the index + } + else { + // Add new entries - // We have to iterate through all folder files. We need a new iterator since the - // existing rw is not recursive - r = new TreeWalk(repository); - r.Reset (tree); - r.Filter = PathFilterGroup.CreateFromStrings(new string[]{p}); - r.Recursive = true; - r.Next (); - } else { - r = tw; + TreeWalk r; + if (tw.IsSubtree) { + // It's a directory. Make sure we remove existing index entries of this directory + foldersToRemove.Add (p); + + // We have to iterate through all folder files. We need a new iterator since the + // existing rw is not recursive + r = new TreeWalk(repository); + r.Reset (tree); + r.Filter = PathFilterGroup.CreateFromStrings(new string[]{p}); + r.Recursive = true; + r.Next (); + } else { + r = tw; + } + + do { + // There can be more than one entry if reverting a whole directory + string rpath = repository.FromGitPath (r.PathString); + DirCacheEntry e = new DirCacheEntry (r.PathString); + e.SetObjectId (r.GetObjectId (0)); + e.FileMode = r.GetFileMode (0); + if (!Directory.Exists (Path.GetDirectoryName (rpath))) + Directory.CreateDirectory (rpath); + DirCacheCheckout.CheckoutEntry (repository, rpath, e); + builder.Add (e); + changedFiles.Add (rpath); + } while (r.Next ()); } - - do { - // There can be more than one entry if reverting a whole directory - string rpath = repository.FromGitPath (r.PathString); - DirCacheEntry e = new DirCacheEntry (r.PathString); - e.SetObjectId (r.GetObjectId (0)); - e.FileMode = r.GetFileMode (0); - if (!Directory.Exists (Path.GetDirectoryName (rpath))) - Directory.CreateDirectory (rpath); - DirCacheCheckout.CheckoutEntry (repository, rpath, e); + } + + // Add entries we want to keep + int count = dc.GetEntryCount (); + for (int n=0; n IsSubpath (f,path))) builder.Add (e); - changedFiles.Add (rpath); - } while (r.Next ()); } + + builder.Commit (); monitor.Step (1); } - - // Add entries we want to keep - int count = dc.GetEntryCount (); - for (int n=0; n IsSubpath (f,path))) - builder.Add (e); + catch { + dc.Unlock (); + throw; } - builder.Commit (); - } - catch { - dc.Unlock (); - throw; - } - - monitor.EndTask (); - monitor.BeginTask (null, files.Length); + foreach (FilePath p in changedFiles) + FileService.NotifyFileChanged (p, true); - foreach (FilePath p in changedFiles) { - FileService.NotifyFileChanged (p, true); - monitor.Step (1); - } - foreach (FilePath p in removedFiles) { - FileService.NotifyFileRemoved (p); - monitor.Step (1); + foreach (FilePath p in removedFiles) + FileService.NotifyFileRemoved (p); + + monitor.EndTask (); } monitor.EndTask (); - } } static bool IsSubpath (string basePath, string childPath) @@ -1001,12 +1003,12 @@ namespace MonoDevelop.VersionControl.Git return childPath.StartsWith (basePath + "/", StringComparison.InvariantCulture); } - protected override void OnRevertRevision (FilePath localPath, Revision revision, IProgressMonitor monitor) + protected override void OnRevertRevision (FilePath localPath, Revision revision, ProgressMonitor monitor) { throw new NotSupportedException (); } - protected override void OnRevertToRevision (FilePath localPath, Revision revision, IProgressMonitor monitor) + protected override void OnRevertToRevision (FilePath localPath, Revision revision, ProgressMonitor monitor) { NGit.Repository repo = GetRepository (localPath); NGit.Api.Git git = new NGit.Api.Git (repo); @@ -1020,7 +1022,7 @@ namespace MonoDevelop.VersionControl.Git } - protected override void OnAdd (FilePath[] localPaths, bool recurse, IProgressMonitor monitor) + protected override void OnAdd (FilePath[] localPaths, bool recurse, ProgressMonitor monitor) { foreach (var group in GroupByRepository (localPaths)) { var repository = group.Key; @@ -1034,7 +1036,7 @@ namespace MonoDevelop.VersionControl.Git } } - protected override void OnDeleteFiles (FilePath[] localPaths, bool force, IProgressMonitor monitor, bool keepLocal) + protected override void OnDeleteFiles (FilePath[] localPaths, bool force, ProgressMonitor monitor, bool keepLocal) { DeleteCore (localPaths, force, monitor, keepLocal); @@ -1054,7 +1056,7 @@ namespace MonoDevelop.VersionControl.Git } } - protected override void OnDeleteDirectories (FilePath[] localPaths, bool force, IProgressMonitor monitor, bool keepLocal) + protected override void OnDeleteDirectories (FilePath[] localPaths, bool force, ProgressMonitor monitor, bool keepLocal) { DeleteCore (localPaths, force, monitor, keepLocal); @@ -1076,7 +1078,7 @@ namespace MonoDevelop.VersionControl.Git } } - void DeleteCore (FilePath[] localPaths, bool force, IProgressMonitor monitor, bool keepLocal) + void DeleteCore (FilePath[] localPaths, bool force, ProgressMonitor monitor, bool keepLocal) { foreach (var group in GroupByRepository (localPaths)) { List backupFiles = new List (); @@ -1220,7 +1222,7 @@ namespace MonoDevelop.VersionControl.Git return remotes[0]; } - public void Push (IProgressMonitor monitor, string remote, string remoteBranch) + public void Push (ProgressMonitor monitor, string remote, string remoteBranch) { string remoteRef = "refs/heads/" + remoteBranch; IEnumerable res; @@ -1422,7 +1424,7 @@ namespace MonoDevelop.VersionControl.Git return RootRepository.GetBranch (); } - public void SwitchToBranch (IProgressMonitor monitor, string branch) + public void SwitchToBranch (ProgressMonitor monitor, string branch) { monitor.BeginTask (GettextCatalog.GetString ("Switching to branch {0}", branch), GitService.StashUnstashWhenSwitchingBranches ? 4 : 2); @@ -1477,7 +1479,7 @@ namespace MonoDevelop.VersionControl.Git monitor.EndTask (); } - void NotifyFileChanges (IProgressMonitor monitor, IEnumerable statusList) + void NotifyFileChanges (ProgressMonitor monitor, IEnumerable statusList) { List changes = new List (statusList); @@ -1575,7 +1577,7 @@ namespace MonoDevelop.VersionControl.Git return diffs.ToArray (); } - protected override void OnMoveFile (FilePath localSrcPath, FilePath localDestPath, bool force, IProgressMonitor monitor) + protected override void OnMoveFile (FilePath localSrcPath, FilePath localDestPath, bool force, ProgressMonitor monitor) { VersionInfo vi = GetVersionInfo (localSrcPath, VersionInfoQueryFlags.IgnoreCache); if (vi == null || !vi.IsVersioned) { @@ -1589,7 +1591,7 @@ namespace MonoDevelop.VersionControl.Git Revert (localSrcPath, false, monitor); } - protected override void OnMoveDirectory (FilePath localSrcPath, FilePath localDestPath, bool force, IProgressMonitor monitor) + protected override void OnMoveDirectory (FilePath localSrcPath, FilePath localDestPath, bool force, ProgressMonitor monitor) { VersionInfo[] versionedFiles = GetDirectoryVersionInfo (localSrcPath, false, true); base.OnMoveDirectory (localSrcPath, localDestPath, force, monitor); @@ -1767,21 +1769,21 @@ namespace MonoDevelop.VersionControl.Git public string PushUrl { get; internal set; } } - class GitMonitor: ProgressMonitor, IDisposable + class GitMonitor: NGit.ProgressMonitor, IDisposable { - readonly IProgressMonitor monitor; + readonly MonoDevelop.Core.ProgressMonitor monitor; int currentWork; int currentStep; bool taskStarted; int totalTasksOverride = -1; bool monitorStarted; - public GitMonitor (IProgressMonitor monitor) + public GitMonitor (MonoDevelop.Core.ProgressMonitor monitor) { this.monitor = monitor; } - public GitMonitor (IProgressMonitor monitor, int totalTasksOverride) + public GitMonitor (MonoDevelop.Core.ProgressMonitor monitor, int totalTasksOverride) { this.monitor = monitor; this.totalTasksOverride = totalTasksOverride; @@ -1829,7 +1831,7 @@ namespace MonoDevelop.VersionControl.Git public override bool IsCancelled () { - return monitor.IsCancelRequested; + return monitor.CancellationToken.IsCancellationRequested; } public void Dispose () diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitService.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitService.cs index 41ffac25fd..6b7d86cf14 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitService.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitService.cs @@ -30,6 +30,7 @@ using MonoDevelop.Ide; using MonoDevelop.Ide.ProgressMonitoring; using NGit.Api; using System.Threading; +using System.Threading.Tasks; namespace MonoDevelop.VersionControl.Git { @@ -63,7 +64,7 @@ namespace MonoDevelop.VersionControl.Git string remote = dlg.SelectedRemote; string branch = dlg.SelectedRemoteBranch ?? repo.GetCurrentBranch (); - IProgressMonitor monitor = VersionControlService.GetProgressMonitor (GettextCatalog.GetString ("Pushing changes..."), VersionControlOperationType.Push); + ProgressMonitor monitor = VersionControlService.GetProgressMonitor (GettextCatalog.GetString ("Pushing changes..."), VersionControlOperationType.Push); ThreadPool.QueueUserWorkItem (delegate { try { repo.Push (monitor, remote, branch); @@ -91,13 +92,13 @@ namespace MonoDevelop.VersionControl.Git if (MessageService.RunCustomDialog (dlg) == (int) Gtk.ResponseType.Ok) { dlg.Hide (); if (rebasing) { - using (IProgressMonitor monitor = VersionControlService.GetProgressMonitor (GettextCatalog.GetString ("Rebasing branch '{0}'...", dlg.SelectedBranch))) { + using (ProgressMonitor monitor = VersionControlService.GetProgressMonitor (GettextCatalog.GetString ("Rebasing branch '{0}'...", dlg.SelectedBranch))) { if (dlg.IsRemote) repo.Fetch (monitor); repo.Rebase (dlg.SelectedBranch, dlg.StageChanges ? GitUpdateOptions.SaveLocalChanges : GitUpdateOptions.None, monitor); } } else { - using (IProgressMonitor monitor = VersionControlService.GetProgressMonitor (GettextCatalog.GetString ("Merging branch '{0}'...", dlg.SelectedBranch))) { + using (ProgressMonitor monitor = VersionControlService.GetProgressMonitor (GettextCatalog.GetString ("Merging branch '{0}'...", dlg.SelectedBranch))) { if (dlg.IsRemote) repo.Fetch (monitor); repo.Merge (dlg.SelectedBranch, dlg.StageChanges ? GitUpdateOptions.SaveLocalChanges : GitUpdateOptions.None, monitor); @@ -115,13 +116,13 @@ namespace MonoDevelop.VersionControl.Git MessageService.ShowCustomDialog (dlg); } - public static void SwitchToBranch (GitRepository repo, string branch) + public async static void SwitchToBranch (GitRepository repo, string branch) { MessageDialogProgressMonitor monitor = new MessageDialogProgressMonitor (true, false, false, true); try { IdeApp.Workbench.AutoReloadDocuments = true; IdeApp.Workbench.LockGui (); - ThreadPool.QueueUserWorkItem (delegate { + await Task.Factory.StartNew (delegate { try { repo.SwitchToBranch (monitor, branch); } catch (Exception ex) { @@ -130,18 +131,17 @@ namespace MonoDevelop.VersionControl.Git monitor.Dispose (); } }); - monitor.AsyncOperation.WaitForCompleted (); } finally { IdeApp.Workbench.AutoReloadDocuments = false; IdeApp.Workbench.UnlockGui (); } } - public static IAsyncOperation ApplyStash (Stash s) + public static Task ApplyStash (Stash s) { MessageDialogProgressMonitor monitor = new MessageDialogProgressMonitor (true, false, false, true); var statusTracker = IdeApp.Workspace.GetFileStatusTracker (); - ThreadPool.QueueUserWorkItem (delegate { + var t = Task.Factory.StartNew (delegate { try { MergeCommandResult result; using (var gm = new GitMonitor (monitor)) @@ -156,10 +156,10 @@ namespace MonoDevelop.VersionControl.Git statusTracker.NotifyChanges (); } }); - return monitor.AsyncOperation; + return t; } - public static void ReportStashResult (IProgressMonitor monitor, MergeCommandResult result) + public static void ReportStashResult (ProgressMonitor monitor, MergeCommandResult result) { if (result.GetMergeStatus () == MergeStatus.FAILED) { string msg = GettextCatalog.GetString ("Stash operation failed."); diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitSupportFeature.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitSupportFeature.cs index 437c28627f..9ee17b62cb 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitSupportFeature.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitSupportFeature.cs @@ -27,31 +27,32 @@ using System; using MonoDevelop.Ide.Templates; using MonoDevelop.Core; using MonoDevelop.Projects; +using System.Linq; namespace MonoDevelop.VersionControl.Git { sealed class GitSupportFeature: ISolutionItemFeature { - public FeatureSupportLevel GetSupportLevel (SolutionFolder parentFolder, SolutionItem entry) + public FeatureSupportLevel GetSupportLevel (SolutionFolder parentFolder, SolutionFolderItem entry) { if (parentFolder != null && !parentFolder.ParentSolution.FileName.IsNullOrEmpty && System.IO.File.Exists (parentFolder.ParentSolution.FileName)) return FeatureSupportLevel.NotSupported; return FeatureSupportLevel.SupportedByDefault; } - public Gtk.Widget CreateFeatureEditor (SolutionFolder parentCombine, SolutionItem entry) + public Gtk.Widget CreateFeatureEditor (SolutionFolder parentCombine, SolutionFolderItem entry) { Gtk.Label label = new Gtk.Label (GettextCatalog.GetString ("A new local Git Repository for the solution will be created")); label.Show (); return label; } - public string Validate (SolutionFolder parentCombine, SolutionItem entry, Gtk.Widget editor) + public string Validate (SolutionFolder parentCombine, SolutionFolderItem entry, Gtk.Widget editor) { return null; } - public void ApplyFeature (SolutionFolder parentFolder, SolutionItem entry, Gtk.Widget editor) + public void ApplyFeature (SolutionFolder parentFolder, SolutionFolderItem entry, Gtk.Widget editor) { // The solution may not be saved yet if (parentFolder.ParentSolution.FileName.IsNullOrEmpty || !System.IO.File.Exists (parentFolder.ParentSolution.FileName)) @@ -67,7 +68,7 @@ namespace MonoDevelop.VersionControl.Git GitUtil.Init (sol.BaseDirectory, null); GitRepository gitRepo = new GitRepository (sol.BaseDirectory, null); - gitRepo.Add (sol.GetItemFiles (true).ToArray (), false, new MonoDevelop.Core.ProgressMonitoring.NullProgressMonitor ()); + gitRepo.Add (sol.GetItemFiles (true).ToArray (), false, new MonoDevelop.Core.ProgressMonitor ()); } public string Title { diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitUtil.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitUtil.cs index 2b56ef3e51..5ec0df4cbf 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitUtil.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitUtil.cs @@ -38,6 +38,7 @@ using NGit.Transport; using NGit.Diff; using NGit.Internal; using System; +using ProgressMonitor = MonoDevelop.Core.ProgressMonitor; namespace MonoDevelop.VersionControl.Git { @@ -287,7 +288,7 @@ namespace MonoDevelop.VersionControl.Git return repo; } - public static MergeCommandResult MergeTrees (ProgressMonitor monitor, NGit.Repository repo, RevCommit srcBase, RevCommit srcCommit, string sourceDisplayName, bool commitResult) + public static MergeCommandResult MergeTrees (NGit.ProgressMonitor monitor, NGit.Repository repo, RevCommit srcBase, RevCommit srcCommit, string sourceDisplayName, bool commitResult) { RevCommit newHead; RevWalk revWalk = new RevWalk(repo); diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/Stash.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/Stash.cs index ccf2f2e338..be5d4fd6d1 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/Stash.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/Stash.cs @@ -300,7 +300,7 @@ namespace MonoDevelop.VersionControl.Git } } - internal MergeCommandResult Apply (ProgressMonitor monitor, Stash stash) + internal MergeCommandResult Apply (NGit.ProgressMonitor monitor, Stash stash) { monitor.Start (1); monitor.BeginTask ("Applying stash", 100); diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/StashManagerDialog.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/StashManagerDialog.cs index b546e803fc..284522c521 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/StashManagerDialog.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/StashManagerDialog.cs @@ -93,13 +93,11 @@ namespace MonoDevelop.VersionControl.Git return (Stash) store.GetValue (it, 0); } - void ApplyStashAndRemove(Stash s) + async void ApplyStashAndRemove (Stash s) { using (IdeApp.Workspace.GetFileStatusTracker ()) { - GitService.ApplyStash (s).Completed += delegate(IAsyncOperation op) { - if (op.Success) - stashes.Remove (s); - }; + await GitService.ApplyStash (s); + stashes.Remove (s); } } diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/LibSvnClient.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/LibSvnClient.cs index fe6ecd5e69..c331c3b3da 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/LibSvnClient.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/LibSvnClient.cs @@ -146,7 +146,6 @@ namespace MonoDevelop.VersionControl.Subversion.Unix { public abstract IntPtr client_get_wc_root (out IntPtr wcroot_abspath, string local_abspath, IntPtr ctx, IntPtr result_pool, IntPtr scratch_pool); - // TODO: Check if intptr public abstract IntPtr strerror (int statcode, byte[] buf, int bufsize); public abstract IntPtr path_internal_style (string path, IntPtr pool); @@ -617,8 +616,56 @@ namespace MonoDevelop.VersionControl.Subversion.Unix { Locked, Unlocked, FailedLock, - FailedUnlock - // TODO: Add more enum data + FailedUnlock, + Exists, + ChangelistSet, + ChangelistClear, + ChangelistMoved, + MergeBegin, + ForeignMergeBegin, + UpdateReplace, + PropertyAdded, + PropertyDeleted, + PropertyDeletedNonexistent, + RevpropSet, + RevpropDeleted, + MergeCompleted, + TreeConflict, + FailedExternal, + UpdateStarted, + UpdateSkipObstruction, + UpdateSkipWorkingOnly, + UpdateSkipAccessDenied, + UpdateExternalRemoved, + UpdateShadowedAdd, + UpdateShadowedDelete, + MergeRecordInfo, + UpgradedPath, + MergeRecordInfoBegin, + MergeElideInfo, + Patch, + PatchAppliedHunk, + PatchRejectedHunk, + PatchHunkAlreadyApplied, + CommitCopied, + CommitCopiedReplaced, + UrlRedirect, + PathNonexistent, + Exclude, + FailedConflict, + FailedMissing, + FailedOutOfDate, + FailedNoParent, + FailedLocked, + FailedForbiddenByServer, + SkipConflicted, + UpdateBrokenLock, + FailedObstruction, + ConflictResolverStarting, + ConflictResolverDone, + LeftLocalModifications, + ForeignCopyBegin, + MoveBroken, } public enum NotifyState { diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/SvnClient.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/SvnClient.cs index b94c055d25..a27a322a82 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/SvnClient.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/SvnClient.cs @@ -11,6 +11,8 @@ using svn_revnum_t = System.IntPtr; using size_t = System.Int32; using off_t = System.Int64; using MonoDevelop.Projects.Text; +using System.Threading; +using System.Linq; namespace MonoDevelop.VersionControl.Subversion.Unix { @@ -77,6 +79,7 @@ namespace MonoDevelop.VersionControl.Subversion.Unix return error.message; else { byte[] buf = new byte [300]; + // Caller will handle the lock. Svn.strerror (error.apr_err, buf, buf.Length); return Encoding.UTF8.GetString (buf); } @@ -86,16 +89,25 @@ namespace MonoDevelop.VersionControl.Subversion.Unix { IntPtr p; + // Caller will handle the lock. Apr.pool_create_ex (out p, parent, IntPtr.Zero, IntPtr.Zero); if (p == IntPtr.Zero) throw new InvalidOperationException ("Could not create an APR pool."); return p; } + + internal static void destroypool (IntPtr pool) + { + // Caller will handle lock. + if (pool != IntPtr.Zero) + Apr.pool_destroy (pool); + } public static string NormalizePath (string pathOrUrl, IntPtr localpool) { if (pathOrUrl == null) return null; + // Caller will handle the lock. IntPtr res = Svn.path_internal_style (pathOrUrl, localpool); return Marshal.PtrToStringAnsi (res); } @@ -129,7 +141,9 @@ namespace MonoDevelop.VersionControl.Subversion.Unix public static string GetVersion () { - IntPtr ptr = Svn.client_version (); + IntPtr ptr; + lock (Svn) + ptr = Svn.client_version (); LibSvnClient.svn_version_t ver = (LibSvnClient.svn_version_t)Marshal.PtrToStructure (ptr, typeof(LibSvnClient.svn_version_t)); return ver.major + "." + ver.minor + "." + ver.patch; } @@ -173,26 +187,6 @@ namespace MonoDevelop.VersionControl.Subversion.Unix return new UnixSvnBackend (); } - public override string GetPathUrl (FilePath path) - { - if (path == FilePath.Null) - throw new ArgumentNullException(); - - IntPtr ret = IntPtr.Zero; - IntPtr localpool = newpool (IntPtr.Zero); - try { - string npath = NormalizePath (path, localpool); - CheckError (Svn.client_url_from_path (ref ret, npath, localpool)); - } finally { - Apr.pool_destroy (localpool); - } - - if (ret == IntPtr.Zero) - return null; - - return Marshal.PtrToStringAnsi (ret); - } - public override string GetDirectoryDotSvn (FilePath path) { if (Pre_1_7) @@ -240,15 +234,17 @@ namespace MonoDevelop.VersionControl.Subversion.Unix return SvnClient.newpool (parent); } + static void destroypool (IntPtr pool) + { + SvnClient.destroypool (pool); + } + bool disposed; readonly IntPtr auth_baton; readonly IntPtr pool; readonly IntPtr ctx; - readonly object sync = new object(); - bool inProgress; - - IProgressMonitor updatemonitor; + ProgressMonitor updatemonitor; ArrayList updateFileList; string commitmessage; @@ -274,109 +270,113 @@ namespace MonoDevelop.VersionControl.Subversion.Unix public UnixSvnBackend () { - // Allocate the APR pool and the SVN client context. - pool = newpool (IntPtr.Zero); + lock (svn) { + // Allocate the APR pool and the SVN client context. + pool = newpool (IntPtr.Zero); - // Make sure the config directory is properly created. - // If the config directory and specifically the subdirectories - // for the authentication providers don't exist, authentication - // data won't be saved and no error is given. - svn.config_ensure (null, pool); + // Make sure the config directory is properly created. + // If the config directory and specifically the subdirectories + // for the authentication providers don't exist, authentication + // data won't be saved and no error is given. + svn.config_ensure (null, pool); - // Load user and system configuration - svn.config_get_config (ref config_hash, null, pool); + // Load user and system configuration + svn.config_get_config (ref config_hash, null, pool); - if (svn.client_create_context (out ctx, pool) != IntPtr.Zero) - throw new InvalidOperationException ("Could not create a Subversion client context."); + if (svn.client_create_context (out ctx, pool) != IntPtr.Zero) + throw new InvalidOperationException ("Could not create a Subversion client context."); - // Set the callbacks on the client context structure. - notify_func = new LibSvnClient.svn_wc_notify_func2_t (svn_wc_notify_func_t_impl); - Marshal.WriteIntPtr (ctx, - (int) Marshal.OffsetOf (typeof (LibSvnClient.svn_client_ctx_t), "NotifyFunc2"), - Marshal.GetFunctionPointerForDelegate (notify_func)); - log_func = new LibSvnClient.svn_client_get_commit_log_t (svn_client_get_commit_log_impl); - Marshal.WriteIntPtr (ctx, - (int) Marshal.OffsetOf (typeof (LibSvnClient.svn_client_ctx_t), "LogMsgFunc"), - Marshal.GetFunctionPointerForDelegate (log_func)); - progress_func = new LibSvnClient.svn_ra_progress_notify_func_t (svn_ra_progress_notify_func_t_impl); - Marshal.WriteIntPtr (ctx, - (int) Marshal.OffsetOf (typeof (LibSvnClient.svn_client_ctx_t), "progress_func"), - Marshal.GetFunctionPointerForDelegate (progress_func)); - cancel_func = new LibSvnClient.svn_cancel_func_t (svn_cancel_func_t_impl); - Marshal.WriteIntPtr (ctx, - (int) Marshal.OffsetOf (typeof (LibSvnClient.svn_client_ctx_t), "cancel_func"), - Marshal.GetFunctionPointerForDelegate (cancel_func)); - - Marshal.WriteIntPtr (ctx, - (int) Marshal.OffsetOf (typeof (LibSvnClient.svn_client_ctx_t), "config"), - config_hash); - - if (!SvnClient.Pre_1_7) { - IntPtr scratch = newpool (IntPtr.Zero); - svn.wc_context_create (out wc_ctx, IntPtr.Zero, pool, scratch); + // Set the callbacks on the client context structure. + notify_func = new LibSvnClient.svn_wc_notify_func2_t (svn_wc_notify_func_t_impl); Marshal.WriteIntPtr (ctx, - (int) Marshal.OffsetOf (typeof (LibSvnClient.svn_client_ctx_t), "wc_ctx"), - wc_ctx); - apr.pool_destroy (scratch); - } + (int)Marshal.OffsetOf (typeof(LibSvnClient.svn_client_ctx_t), "NotifyFunc2"), + Marshal.GetFunctionPointerForDelegate (notify_func)); + log_func = new LibSvnClient.svn_client_get_commit_log_t (svn_client_get_commit_log_impl); + Marshal.WriteIntPtr (ctx, + (int)Marshal.OffsetOf (typeof(LibSvnClient.svn_client_ctx_t), "LogMsgFunc"), + Marshal.GetFunctionPointerForDelegate (log_func)); + progress_func = new LibSvnClient.svn_ra_progress_notify_func_t (svn_ra_progress_notify_func_t_impl); + Marshal.WriteIntPtr (ctx, + (int)Marshal.OffsetOf (typeof(LibSvnClient.svn_client_ctx_t), "progress_func"), + Marshal.GetFunctionPointerForDelegate (progress_func)); + cancel_func = new LibSvnClient.svn_cancel_func_t (svn_cancel_func_t_impl); + Marshal.WriteIntPtr (ctx, + (int)Marshal.OffsetOf (typeof(LibSvnClient.svn_client_ctx_t), "cancel_func"), + Marshal.GetFunctionPointerForDelegate (cancel_func)); - IntPtr providers = apr.array_make (pool, 16, IntPtr.Size); - IntPtr item; + Marshal.WriteIntPtr (ctx, + (int)Marshal.OffsetOf (typeof(LibSvnClient.svn_client_ctx_t), "config"), + config_hash); + + if (!SvnClient.Pre_1_7) { + IntPtr scratch = newpool (IntPtr.Zero); + svn.wc_context_create (out wc_ctx, IntPtr.Zero, pool, scratch); + Marshal.WriteIntPtr (ctx, + (int)Marshal.OffsetOf (typeof(LibSvnClient.svn_client_ctx_t), "wc_ctx"), + wc_ctx); + apr.pool_destroy (scratch); + } + + IntPtr providers = apr.array_make (pool, 16, IntPtr.Size); + IntPtr item; - // The main disk-caching auth providers, for both - // 'username/password' creds and 'username' creds. + // The main disk-caching auth providers, for both + // 'username/password' creds and 'username' creds. - item = apr.array_push (providers); - svn.client_get_simple_provider (item, pool); + item = apr.array_push (providers); + svn.client_get_simple_provider (item, pool); - item = apr.array_push (providers); - svn.client_get_username_provider (item, pool); + item = apr.array_push (providers); + svn.client_get_username_provider (item, pool); - // The server-cert, client-cert, and client-cert-password providers + // The server-cert, client-cert, and client-cert-password providers - item = apr.array_push (providers); - svn.client_get_ssl_server_trust_file_provider (item, pool); + item = apr.array_push (providers); + svn.client_get_ssl_server_trust_file_provider (item, pool); - item = apr.array_push (providers); - svn.client_get_ssl_client_cert_file_provider (item, pool); + item = apr.array_push (providers); + svn.client_get_ssl_client_cert_file_provider (item, pool); - item = apr.array_push (providers); - svn.client_get_ssl_client_cert_pw_file_provider (item, pool); + item = apr.array_push (providers); + svn.client_get_ssl_client_cert_pw_file_provider (item, pool); - // Two basic prompt providers: username/password, and just username. + // Two basic prompt providers: username/password, and just username. - item = apr.array_push (providers); - svn.client_get_simple_prompt_provider (item, OnAuthSimplePromptCallback, IntPtr.Zero, 2, pool); + item = apr.array_push (providers); + svn.client_get_simple_prompt_provider (item, OnAuthSimplePromptCallback, IntPtr.Zero, 2, pool); - item = apr.array_push (providers); - svn.client_get_username_prompt_provider (item, OnAuthUsernamePromptCallback, IntPtr.Zero, 2, pool); + item = apr.array_push (providers); + svn.client_get_username_prompt_provider (item, OnAuthUsernamePromptCallback, IntPtr.Zero, 2, pool); - // Three ssl prompt providers, for server-certs, client-certs, - // and client-cert-passphrases. + // Three ssl prompt providers, for server-certs, client-certs, + // and client-cert-passphrases. - item = apr.array_push (providers); - svn.client_get_ssl_server_trust_prompt_provider (item, OnAuthSslServerTrustPromptCallback, IntPtr.Zero, pool); + item = apr.array_push (providers); + svn.client_get_ssl_server_trust_prompt_provider (item, OnAuthSslServerTrustPromptCallback, IntPtr.Zero, pool); - item = apr.array_push (providers); - svn.client_get_ssl_client_cert_prompt_provider (item, OnAuthSslClientCertPromptCallback, IntPtr.Zero, 2, pool); + item = apr.array_push (providers); + svn.client_get_ssl_client_cert_prompt_provider (item, OnAuthSslClientCertPromptCallback, IntPtr.Zero, 2, pool); - item = apr.array_push (providers); - svn.client_get_ssl_client_cert_pw_prompt_provider (item, OnAuthSslClientCertPwPromptCallback, IntPtr.Zero, 2, pool); + item = apr.array_push (providers); + svn.client_get_ssl_client_cert_pw_prompt_provider (item, OnAuthSslClientCertPwPromptCallback, IntPtr.Zero, 2, pool); - // Create the authentication baton - svn.auth_open (out auth_baton, providers, pool); + // Create the authentication baton + svn.auth_open (out auth_baton, providers, pool); - Marshal.WriteIntPtr (ctx, - (int) Marshal.OffsetOf (typeof(LibSvnClient.svn_client_ctx_t), "auth_baton"), - auth_baton); + Marshal.WriteIntPtr (ctx, + (int)Marshal.OffsetOf (typeof(LibSvnClient.svn_client_ctx_t), "auth_baton"), + auth_baton); + } } public void Dispose () { - if (!disposed) { - if (apr != null) - apr.pool_destroy(pool); - disposed = true; + lock (svn) { + if (!disposed) { + if (apr != null) + apr.pool_destroy (pool); + disposed = true; + } } } @@ -387,14 +387,15 @@ namespace MonoDevelop.VersionControl.Subversion.Unix static IntPtr GetCancelError () { - LibSvnClient.svn_error_t error = new LibSvnClient.svn_error_t (); - error.apr_err = LibApr.APR_OS_START_USEERR; - error.message = "Operation cancelled."; - // Subversion destroys the error pool to dispose the error object, // so we need to use a non-shared pool. IntPtr localpool = newpool (IntPtr.Zero); - error.pool = localpool; + var error = new LibSvnClient.svn_error_t { + apr_err = LibApr.APR_OS_START_USEERR, + message = "Operation cancelled.", + pool = localpool, + }; + return apr.pcalloc (localpool, error); } @@ -420,8 +421,9 @@ namespace MonoDevelop.VersionControl.Subversion.Unix static readonly LibSvnClient.svn_auth_username_prompt_func_t OnAuthUsernamePromptCallback = OnAuthUsernamePrompt; static IntPtr OnAuthUsernamePrompt (ref IntPtr cred, IntPtr baton, string realm, bool may_save, IntPtr pool) { - LibSvnClient.svn_auth_cred_username_t data = new LibSvnClient.svn_auth_cred_username_t (); - data.username = ""; + LibSvnClient.svn_auth_cred_username_t data = new LibSvnClient.svn_auth_cred_username_t { + username = "", + }; bool ms; if (UserNameAuthenticationPrompt (realm, may_save, ref data.username, out ms)) { data.may_save = ms; @@ -438,15 +440,16 @@ namespace MonoDevelop.VersionControl.Subversion.Unix static readonly LibSvnClient.svn_auth_ssl_server_trust_prompt_func_t OnAuthSslServerTrustPromptCallback = OnAuthSslServerTrustPrompt; static IntPtr OnAuthSslServerTrustPrompt (ref IntPtr cred, IntPtr baton, string realm, UInt32 failures, ref LibSvnClient.svn_auth_ssl_server_cert_info_t cert_info, bool may_save, IntPtr pool) { - LibSvnClient.svn_auth_cred_ssl_server_trust_t data = new LibSvnClient.svn_auth_cred_ssl_server_trust_t (); - - CertficateInfo ci = new CertficateInfo (); - ci.AsciiCert = cert_info.ascii_cert; - ci.Fingerprint = cert_info.fingerprint; - ci.HostName = cert_info.hostname; - ci.IssuerName = cert_info.issuer_dname; - ci.ValidFrom = cert_info.valid_from; - ci.ValidUntil = cert_info.valid_until; + var data = new LibSvnClient.svn_auth_cred_ssl_server_trust_t (); + + var ci = new CertficateInfo { + AsciiCert = cert_info.ascii_cert, + Fingerprint = cert_info.fingerprint, + HostName = cert_info.hostname, + IssuerName = cert_info.issuer_dname, + ValidFrom = cert_info.valid_from, + ValidUntil = cert_info.valid_until, + }; SslFailure accepted_failures; bool ms; @@ -466,7 +469,7 @@ namespace MonoDevelop.VersionControl.Subversion.Unix static readonly LibSvnClient.svn_auth_ssl_client_cert_prompt_func_t OnAuthSslClientCertPromptCallback = OnAuthSslClientCertPrompt; static IntPtr OnAuthSslClientCertPrompt (ref IntPtr cred, IntPtr baton, string realm, bool may_save, IntPtr pool) { - LibSvnClient.svn_auth_cred_ssl_client_cert_t data = new LibSvnClient.svn_auth_cred_ssl_client_cert_t (); + var data = new LibSvnClient.svn_auth_cred_ssl_client_cert_t (); bool ms; if (SslClientCertAuthenticationPrompt (realm, may_save, out data.cert_file, out ms)) { data.may_save = ms; @@ -483,7 +486,7 @@ namespace MonoDevelop.VersionControl.Subversion.Unix static readonly LibSvnClient.svn_auth_ssl_client_cert_pw_prompt_func_t OnAuthSslClientCertPwPromptCallback = OnAuthSslClientCertPwPrompt; static IntPtr OnAuthSslClientCertPwPrompt (ref IntPtr cred, IntPtr baton, string realm, bool may_save, IntPtr pool) { - LibSvnClient.svn_auth_cred_ssl_client_cert_pw_t data; + var data = new LibSvnClient.svn_auth_cred_ssl_client_cert_pw_t (); bool ms; if (SslClientCertPwAuthenticationPrompt (realm, may_save, out data.password, out ms)) { data.may_save = ms; @@ -513,6 +516,17 @@ namespace MonoDevelop.VersionControl.Subversion.Unix { return SvnClient.NormalizePath (pathOrUrl, localpool); } + + static IntPtr NormalizePaths (IntPtr pool, params FilePath[] paths) + { + IntPtr array = apr.array_make (pool, 0, IntPtr.Size); + foreach (string path in paths) { + string pathorurl = NormalizePath (path, pool); + IntPtr item = apr.array_push (array); + Marshal.WriteIntPtr (item, apr.pstrdup (pool, pathorurl)); + } + return array; + } public override IEnumerable ListUrl (string url, bool recurse, SvnRevision rev) { @@ -520,12 +534,13 @@ namespace MonoDevelop.VersionControl.Subversion.Unix throw new ArgumentNullException (); LibSvnClient.Rev revision = (LibSvnClient.Rev) rev; - IntPtr localpool = TryStartOperation (null); + IntPtr localpool = IntPtr.Zero; List items = new List (); try { IntPtr hash; - + + localpool = TryStartOperation (null); url = NormalizePath (url, localpool); CheckError (svn.client_ls (out hash, url, ref revision, @@ -538,22 +553,22 @@ namespace MonoDevelop.VersionControl.Subversion.Unix apr.hash_this (item, out nameptr, out namelen, out val); string name = Marshal.PtrToStringAnsi (nameptr); - LibSvnClient.svn_dirent_t ent = (LibSvnClient.svn_dirent_t) Marshal.PtrToStructure (val, typeof (LibSvnClient.svn_dirent_t)); + var ent = (LibSvnClient.svn_dirent_t) Marshal.PtrToStructure (val, typeof (LibSvnClient.svn_dirent_t)); item = apr.hash_next (item); - DirectoryEntry dent = new DirectoryEntry (); - dent.Name = name; - dent.IsDirectory = ent.kind == LibSvnClient.svn_node_kind_t.Dir; - dent.Size = ent.size; - dent.HasProps = ent.has_props; - dent.CreatedRevision = (int) ent.created_rev; - dent.Time = new DateTime (1970, 1, 1).AddTicks(ent.time * 10); - dent.LastAuthor = ent.last_author; + var dent = new DirectoryEntry { + Name = name, + IsDirectory = ent.kind == LibSvnClient.svn_node_kind_t.Dir, + Size = ent.size, + HasProps = ent.has_props, + CreatedRevision = (int) ent.created_rev, + Time = new DateTime (1970, 1, 1).AddTicks(ent.time * 10), + LastAuthor = ent.last_author, + }; items.Add (dent); } } finally { - apr.pool_destroy (localpool); - TryEndOperation (); + TryEndOperation (localpool); } return items; @@ -568,8 +583,9 @@ namespace MonoDevelop.VersionControl.Subversion.Unix ArrayList ret = new ArrayList (); StatusCollector collector = new StatusCollector (ret); - var localpool = TryStartOperation (null); + IntPtr localpool = IntPtr.Zero; try { + localpool = TryStartOperation (null); string pathorurl = NormalizePath (path, localpool); CheckError (svn.client_status (IntPtr.Zero, pathorurl, ref revision, collector.Func, @@ -584,8 +600,7 @@ namespace MonoDevelop.VersionControl.Subversion.Unix if (e.ErrorCode != 155007 && e.ErrorCode != 155008) throw; } finally { - apr.pool_destroy (localpool); - TryEndOperation (); + TryEndOperation (localpool); } List nodes = new List(); @@ -605,8 +620,9 @@ namespace MonoDevelop.VersionControl.Subversion.Unix List ret = new List (); IntPtr strptr = IntPtr.Zero; - var localpool = TryStartOperation (null); + IntPtr localpool = IntPtr.Zero; try { + localpool = TryStartOperation (null); IntPtr array = apr.array_make (localpool, 0, IntPtr.Size); IntPtr first = apr.array_push (array); string pathorurl = NormalizePath (path, localpool); @@ -621,8 +637,7 @@ namespace MonoDevelop.VersionControl.Subversion.Unix } finally { if (strptr != IntPtr.Zero) Marshal.FreeHGlobal (strptr); - apr.pool_destroy (localpool); - TryEndOperation (); + TryEndOperation (localpool); } return ret; @@ -649,13 +664,13 @@ namespace MonoDevelop.VersionControl.Subversion.Unix Annotation[] annotations = new Annotation [numAnnotations]; AnnotationCollector collector = new AnnotationCollector (annotations); - var localpool = TryStartOperation (null); + IntPtr localpool = IntPtr.Zero; try { + localpool = TryStartOperation (null); string path = NormalizePath (file.FullPath, localpool); CheckError (svn.client_blame (path, ref revisionStart, ref revisionEnd, collector.Func, IntPtr.Zero, ctx, localpool)); } finally { - apr.pool_destroy (localpool); - TryEndOperation (); + TryEndOperation (localpool); } return annotations; @@ -695,8 +710,9 @@ namespace MonoDevelop.VersionControl.Subversion.Unix LibSvnClient.Rev revision = (LibSvnClient.Rev) rev; - var localpool = TryStartOperation (null); + IntPtr localpool = IntPtr.Zero; try { + localpool = TryStartOperation (null); pathorurl = NormalizePath (pathorurl, localpool); StreamCollector collector = new StreamCollector (stream); IntPtr svnstream = svn.stream_create (IntPtr.Zero, localpool); @@ -705,12 +721,11 @@ namespace MonoDevelop.VersionControl.Subversion.Unix // Otherwise, it will use Head as peg and it will throw exceptions. CheckError (svn.client_cat2 (svnstream, pathorurl, ref revision, ref revision, ctx, localpool), 195007); } finally { - apr.pool_destroy (localpool); - TryEndOperation (); + TryEndOperation (localpool); } } - public override void Update (FilePath path, bool recurse, IProgressMonitor monitor) + public override void Update (FilePath path, bool recurse, ProgressMonitor monitor) { if (path == FilePath.Null || monitor == null) throw new ArgumentNullException(); @@ -718,15 +733,15 @@ namespace MonoDevelop.VersionControl.Subversion.Unix updateFileList = new ArrayList (); LibSvnClient.Rev rev = LibSvnClient.Rev.Head; - var localpool = TryStartOperation (monitor); + IntPtr localpool = IntPtr.Zero; try { + localpool = TryStartOperation (monitor); string pathorurl = NormalizePath (path, localpool); IntPtr result = Marshal.AllocHGlobal (IntPtr.Size); CheckError (svn.client_update (result, pathorurl, ref rev, recurse, ctx, localpool)); Marshal.FreeHGlobal (result); } finally { - apr.pool_destroy (localpool); - TryEndOperation (); + TryEndOperation (localpool); foreach (string file in updateFileList) FileService.NotifyFileChanged (file, true); @@ -735,56 +750,50 @@ namespace MonoDevelop.VersionControl.Subversion.Unix } } - public override void Revert (FilePath[] paths, bool recurse, IProgressMonitor monitor) + public override void Revert (FilePath[] paths, bool recurse, ProgressMonitor monitor) { if (paths == null || monitor == null) throw new ArgumentNullException(); - var localpool = TryStartOperation (monitor); + IntPtr localpool = IntPtr.Zero; try { - // Put each item into an APR array. - IntPtr array = apr.array_make (localpool, 0, IntPtr.Size); - foreach (string path in paths) { - string pathorurl = NormalizePath (path, localpool); - IntPtr item = apr.array_push (array); - Marshal.WriteIntPtr (item, apr.pstrdup (localpool, pathorurl)); - } - + localpool = TryStartOperation (monitor); + IntPtr array = NormalizePaths (localpool, paths); CheckError (svn.client_revert (array, recurse, ctx, localpool)); } finally { - apr.pool_destroy (localpool); - TryEndOperation (); + TryEndOperation (localpool); } } - public override void Add (FilePath path, bool recurse, IProgressMonitor monitor) + public override void Add (FilePath path, bool recurse, ProgressMonitor monitor) { if (path == FilePath.Null || monitor == null) throw new ArgumentNullException (); nb = new notify_baton (); - var localpool = TryStartOperation (monitor); + IntPtr localpool = IntPtr.Zero; try { + localpool = TryStartOperation (monitor); string pathorurl = NormalizePath (path, localpool); CheckError (svn.client_add3 (pathorurl, recurse, true, false, ctx, localpool)); } finally { - apr.pool_destroy (localpool); - TryEndOperation (); + TryEndOperation (localpool); } } - public override void Checkout (string url, FilePath path, Revision revision, bool recurse, IProgressMonitor monitor) + public override void Checkout (string url, FilePath path, Revision revision, bool recurse, ProgressMonitor monitor) { if (url == null || monitor == null) throw new ArgumentNullException (); if (revision == null) revision = SvnRevision.Head; - LibSvnClient.Rev rev = (LibSvnClient.Rev) revision; + var rev = (LibSvnClient.Rev) revision; nb = new notify_baton (); - var localpool = TryStartOperation (monitor); + IntPtr localpool = IntPtr.Zero; try { + localpool = TryStartOperation (monitor); // Using Uri here because the normalization method doesn't remove the redundant port number when using https url = NormalizePath (new Uri(url).ToString(), localpool); string npath = NormalizePath (path, localpool); @@ -796,27 +805,20 @@ namespace MonoDevelop.VersionControl.Subversion.Unix if (Directory.Exists (path.ParentDirectory)) FileService.DeleteDirectory (path.ParentDirectory); } finally { - apr.pool_destroy (localpool); - TryEndOperation (); + TryEndOperation (localpool); } } - public override void Commit (FilePath[] paths, string message, IProgressMonitor monitor) + public override void Commit (FilePath[] paths, string message, ProgressMonitor monitor) { if (paths == null || message == null || monitor == null) throw new ArgumentNullException(); nb = new notify_baton (); - var localpool = TryStartOperation (monitor); + IntPtr localpool = IntPtr.Zero; try { - // Put each item into an APR array. - IntPtr array = apr.array_make (localpool, 0, IntPtr.Size); - foreach (string path in paths) { - string npath = NormalizePath (path, localpool); - IntPtr item = apr.array_push (array); - Marshal.WriteIntPtr (item, apr.pstrdup (localpool, npath)); - } - + localpool = TryStartOperation (monitor); + IntPtr array = NormalizePaths (localpool, paths); IntPtr commit_info = IntPtr.Zero; commitmessage = message; @@ -829,26 +831,20 @@ namespace MonoDevelop.VersionControl.Subversion.Unix } } finally { commitmessage = null; - apr.pool_destroy (localpool); - TryEndOperation (); + TryEndOperation (localpool); } } - public override void Mkdir (string[] paths, string message, IProgressMonitor monitor) + public override void Mkdir (string[] paths, string message, ProgressMonitor monitor) { if (paths == null || monitor == null) throw new ArgumentNullException (); nb = new notify_baton (); - var localpool = TryStartOperation (monitor); + IntPtr localpool = IntPtr.Zero; try { - // Put each item into an APR array. - IntPtr array = apr.array_make (localpool, paths.Length, IntPtr.Size); - foreach (string path in paths) { - string npath = NormalizePath (path, localpool); - IntPtr item = apr.array_push (array); - Marshal.WriteIntPtr (item, apr.pstrdup (localpool, npath)); - } + localpool = TryStartOperation (monitor); + IntPtr array = NormalizePaths (localpool, paths.Select (p => (FilePath)p).ToArray ()); commitmessage = message; @@ -856,36 +852,29 @@ namespace MonoDevelop.VersionControl.Subversion.Unix CheckError (svn.client_mkdir2 (ref commit_info, array, ctx, localpool)); } finally { commitmessage = null; - apr.pool_destroy (localpool); - TryEndOperation (); + TryEndOperation (localpool); } } - public override void Delete (FilePath path, bool force, IProgressMonitor monitor) + public override void Delete (FilePath path, bool force, ProgressMonitor monitor) { if (path == FilePath.Null || monitor == null) throw new ArgumentNullException (); nb = new notify_baton (); - var localpool = TryStartOperation (monitor); + IntPtr localpool = IntPtr.Zero; try { - // Put each item into an APR array. - IntPtr array = apr.array_make (localpool, 0, IntPtr.Size); - //foreach (string path in paths) { - string npath = NormalizePath (path, localpool); - IntPtr item = apr.array_push (array); - Marshal.WriteIntPtr (item, apr.pstrdup (localpool, npath)); - //} + localpool = TryStartOperation (monitor); + IntPtr array = NormalizePaths (localpool, path); IntPtr commit_info = IntPtr.Zero; CheckError (svn.client_delete (ref commit_info, array, force, ctx, localpool)); } finally { commitmessage = null; - apr.pool_destroy (localpool); - TryEndOperation (); + TryEndOperation (localpool); } } - public override void Move (FilePath srcPath, FilePath destPath, SvnRevision rev, bool force, IProgressMonitor monitor) + public override void Move (FilePath srcPath, FilePath destPath, SvnRevision rev, bool force, ProgressMonitor monitor) { if (srcPath == FilePath.Null || destPath == FilePath.Null || monitor == null) throw new ArgumentNullException (); @@ -894,29 +883,25 @@ namespace MonoDevelop.VersionControl.Subversion.Unix nb = new notify_baton (); IntPtr commit_info = IntPtr.Zero; - var localpool = TryStartOperation (monitor); + IntPtr localpool = IntPtr.Zero; try { + localpool = TryStartOperation (monitor); string nsrcPath = NormalizePath (srcPath, localpool); string ndestPath = NormalizePath (destPath, localpool); CheckError (svn.client_move (ref commit_info, nsrcPath, ref revision, ndestPath, force, ctx, localpool)); } finally { - apr.pool_destroy (localpool); - TryEndOperation (); + TryEndOperation (localpool); } } - public override void Lock (IProgressMonitor monitor, string comment, bool stealLock, params FilePath[] paths) + public override void Lock (ProgressMonitor monitor, string comment, bool stealLock, params FilePath[] paths) { nb = new notify_baton (); - var localpool = TryStartOperation (monitor); + IntPtr localpool = IntPtr.Zero; try { - IntPtr array = apr.array_make (localpool, 0, IntPtr.Size); - foreach (string path in paths) { - string npath = NormalizePath (path, localpool); - IntPtr item = apr.array_push (array); - Marshal.WriteIntPtr (item, apr.pstrdup (localpool, npath)); - } + localpool = TryStartOperation (monitor); + IntPtr array = NormalizePaths (localpool, paths); lockFileList = new ArrayList (); requiredLockState = LibSvnClient.NotifyLockState.Locked; @@ -924,23 +909,18 @@ namespace MonoDevelop.VersionControl.Subversion.Unix if (paths.Length != lockFileList.Count) throw new SubversionException ("Lock operation failed."); } finally { - apr.pool_destroy (localpool); lockFileList = null; - TryEndOperation (); + TryEndOperation (localpool); } } - public override void Unlock (IProgressMonitor monitor, bool breakLock, params FilePath[] paths) + public override void Unlock (ProgressMonitor monitor, bool breakLock, params FilePath[] paths) { nb = new notify_baton (); - var localpool = TryStartOperation (monitor); + IntPtr localpool = IntPtr.Zero; try { - IntPtr array = apr.array_make (localpool, 0, IntPtr.Size); - foreach (string path in paths) { - string npath = NormalizePath (path, localpool); - IntPtr item = apr.array_push (array); - Marshal.WriteIntPtr (item, apr.pstrdup (localpool, npath)); - } + localpool = TryStartOperation (monitor); + IntPtr array = NormalizePaths (localpool, paths); lockFileList = new ArrayList (); requiredLockState = LibSvnClient.NotifyLockState.Unlocked; @@ -948,9 +928,8 @@ namespace MonoDevelop.VersionControl.Subversion.Unix if (paths.Length != lockFileList.Count) throw new SubversionException ("Lock operation failed."); } finally { - apr.pool_destroy (localpool); lockFileList = null; - TryEndOperation (); + TryEndOperation (localpool); } } @@ -964,8 +943,9 @@ namespace MonoDevelop.VersionControl.Subversion.Unix LibSvnClient.Rev revision1 = (LibSvnClient.Rev) rev1; LibSvnClient.Rev revision2 = (LibSvnClient.Rev) rev2; - var localpool = TryStartOperation (null); + IntPtr localpool = IntPtr.Zero; try { + localpool = TryStartOperation (null); IntPtr options = apr.array_make (localpool, 0, IntPtr.Size); fout = Path.GetTempFileName (); @@ -1001,18 +981,17 @@ namespace MonoDevelop.VersionControl.Subversion.Unix FileService.DeleteFile (fout); } catch { } finally { - apr.pool_destroy (localpool); - TryEndOperation (); + TryEndOperation (localpool); } } } - public override void RevertToRevision (FilePath path, Revision revision, IProgressMonitor monitor) + public override void RevertToRevision (FilePath path, Revision revision, ProgressMonitor monitor) { Merge (path, LibSvnClient.Rev.Head, (LibSvnClient.Rev) revision); } - public override void RevertRevision (FilePath path, Revision revision, IProgressMonitor monitor) + public override void RevertRevision (FilePath path, Revision revision, ProgressMonitor monitor) { SvnRevision srev = (SvnRevision) revision; Merge (path, (LibSvnClient.Rev) srev, LibSvnClient.Rev.Number (srev.Rev - 1)); @@ -1020,8 +999,9 @@ namespace MonoDevelop.VersionControl.Subversion.Unix private void Merge (string path, LibSvnClient.Rev revision1, LibSvnClient.Rev revision2) { - var localpool = TryStartOperation (null); + IntPtr localpool = IntPtr.Zero; try { + localpool = TryStartOperation (null); path = NormalizePath (path, localpool); LibSvnClient.Rev working = LibSvnClient.Rev.Working; CheckError (svn.client_merge_peg2 (path, @@ -1034,117 +1014,110 @@ namespace MonoDevelop.VersionControl.Subversion.Unix ctx, localpool)); } finally { - apr.pool_destroy (localpool); - TryEndOperation (); + TryEndOperation (localpool); } } - public override void Ignore (FilePath[] paths) + static void GetProps (StringBuilder props, IntPtr pool, IntPtr result) { - IntPtr hash_item, hash_name, hash_val; + LibSvnClient.svn_string_t new_props; + IntPtr hash_name, hash_val; + IntPtr hash_item = apr.hash_first (pool, result); int length; + + while (hash_item != IntPtr.Zero) { + apr.hash_this (hash_item, out hash_name, out length, out hash_val); + new_props = (LibSvnClient.svn_string_t) Marshal.PtrToStructure (hash_val, typeof (LibSvnClient.svn_string_t)); + props.Append (Marshal.PtrToStringAnsi (new_props.data)); + hash_item = apr.hash_next (hash_item); + } + } + + public override void Ignore (FilePath[] paths) + { IntPtr result; - IntPtr props_ptr = IntPtr.Zero; - StringBuilder props = new StringBuilder (); + IntPtr props_ptr; + var props = new StringBuilder (); string new_path; LibSvnClient.svn_string_t new_props; LibSvnClient.Rev rev = LibSvnClient.Rev.Working; - var localpool = TryStartOperation (null); + IntPtr localpool = IntPtr.Zero; try { + localpool = TryStartOperation (null); foreach (var path in paths) { new_path = NormalizePath (path, localpool); CheckError (svn.client_propget (out result, "svn:ignore", Path.GetDirectoryName (new_path), ref rev, false, ctx, localpool)); - hash_item = apr.hash_first (localpool, result); - while (hash_item != IntPtr.Zero) { - apr.hash_this (hash_item, out hash_name, out length, out hash_val); - new_props = (LibSvnClient.svn_string_t) Marshal.PtrToStructure (hash_val, typeof (LibSvnClient.svn_string_t)); - props.Append (Marshal.PtrToStringAnsi (new_props.data)); - hash_item = apr.hash_next (hash_item); - } + GetProps (props, localpool, result); + props.AppendLine (Path.GetFileName (new_path)); - new_props = new LibSvnClient.svn_string_t (); - new_props.data = Marshal.StringToHGlobalAnsi (props.ToString ()); - new_props.len = props.Length; + new_props = new LibSvnClient.svn_string_t { + data = Marshal.StringToHGlobalAnsi (props.ToString ()), + len = props.Length, + }; props_ptr = apr.pcalloc (localpool, new_props); CheckError (svn.client_propset ("svn:ignore", props_ptr, Path.GetDirectoryName (new_path), false, localpool)); } } finally { - apr.pool_destroy (localpool); - TryEndOperation (); + TryEndOperation (localpool); } } public override void Unignore (FilePath[] paths) { - IntPtr hash_item, hash_name, hash_val; - int length; IntPtr result; - IntPtr props_ptr = IntPtr.Zero; - StringBuilder props = new StringBuilder (); + IntPtr props_ptr; + var props = new StringBuilder (); string new_path; LibSvnClient.svn_string_t new_props; LibSvnClient.Rev rev = LibSvnClient.Rev.Working; int index; string props_str; - var localpool = TryStartOperation (null); + IntPtr localpool = IntPtr.Zero; try { + localpool = TryStartOperation (null); foreach (var path in paths) { new_path = NormalizePath (path, localpool); CheckError (svn.client_propget (out result, "svn:ignore", Path.GetDirectoryName (new_path), ref rev, false, ctx, localpool)); - hash_item = apr.hash_first (localpool, result); - while (hash_item != IntPtr.Zero) { - apr.hash_this (hash_item, out hash_name, out length, out hash_val); - new_props = (LibSvnClient.svn_string_t) Marshal.PtrToStructure (hash_val, typeof (LibSvnClient.svn_string_t)); - props.Append (Marshal.PtrToStringAnsi (new_props.data)); - hash_item = apr.hash_next (hash_item); - } + GetProps (props, localpool, result); + props_str = props.ToString (); index = props_str.IndexOf (Path.GetFileName (new_path) + Environment.NewLine, StringComparison.Ordinal); props_str = (index < 0) ? props_str : props_str.Remove (index, Path.GetFileName(new_path).Length+1); - new_props = new LibSvnClient.svn_string_t (); - new_props.data = Marshal.StringToHGlobalAnsi (props_str); - new_props.len = props_str.Length; + new_props = new LibSvnClient.svn_string_t { + data = Marshal.StringToHGlobalAnsi (props_str), + len = props_str.Length, + }; props_ptr = apr.pcalloc (localpool, new_props); CheckError (svn.client_propset ("svn:ignore", props_ptr, Path.GetDirectoryName (new_path), false, localpool)); } } finally { - apr.pool_destroy (localpool); - TryEndOperation (); + TryEndOperation (localpool); } } public override bool HasNeedLock (FilePath file) { - IntPtr hash_item, hash_name, hash_val; - int length; IntPtr result; - IntPtr props_ptr = IntPtr.Zero; - StringBuilder props = new StringBuilder (); + var props = new StringBuilder (); string new_path; - LibSvnClient.svn_string_t new_props; LibSvnClient.Rev rev = LibSvnClient.Rev.Working; - var localpool = TryStartOperation (null); + IntPtr localpool = IntPtr.Zero; try { + localpool = TryStartOperation (null); new_path = NormalizePath (file, localpool); CheckError (svn.client_propget (out result, "svn:needs-lock", new_path, ref rev, false, ctx, localpool)); - hash_item = apr.hash_first (localpool, result); - while (hash_item != IntPtr.Zero) { - apr.hash_this (hash_item, out hash_name, out length, out hash_val); - new_props = (LibSvnClient.svn_string_t) Marshal.PtrToStructure (hash_val, typeof (LibSvnClient.svn_string_t)); - props.Append (Marshal.PtrToStringAnsi (new_props.data)); - hash_item = apr.hash_next (hash_item); - } + GetProps (props, localpool, result); + return props.Length != 0; } finally { - apr.pool_destroy (localpool); - TryEndOperation (); + TryEndOperation (localpool); } } @@ -1172,32 +1145,19 @@ namespace MonoDevelop.VersionControl.Subversion.Unix return IntPtr.Zero; } - string oldStacktrace = String.Empty; - IntPtr TryStartOperation (IProgressMonitor monitor) + IntPtr TryStartOperation (ProgressMonitor monitor) { - lock (sync) { - if (inProgress) { - var se = new SubversionException ("Another Subversion operation is already in progress."); - se.Data.Add ("OldStacktrace", oldStacktrace); - se.Data.Add ("CurrentStackTrace", Environment.StackTrace); - throw se; - } - oldStacktrace = Environment.StackTrace; - inProgress = true; - updatemonitor = monitor; - progressData = new ProgressData (); - return newpool (pool); - } + Monitor.Enter (svn); + updatemonitor = monitor; + progressData = new ProgressData (); + return newpool (pool); } - void TryEndOperation () + void TryEndOperation (IntPtr pool) { - lock (sync) { - if (!inProgress) - throw new SubversionException ("No Subversion operation is in progress."); - inProgress = false; - updatemonitor = null; - } + destroypool (pool); + updatemonitor = null; + Monitor.Exit (svn); } static VersionInfo CreateNode (LibSvnClient.StatusEnt ent, Repository repo) @@ -1266,15 +1226,16 @@ namespace MonoDevelop.VersionControl.Subversion.Unix IntPtr svn_cancel_func_t_impl (IntPtr baton) { - if (updatemonitor == null || !updatemonitor.IsCancelRequested) + if (updatemonitor == null || !updatemonitor.CancellationToken.IsCancellationRequested) return IntPtr.Zero; - LibSvnClient.svn_error_t err = new LibSvnClient.svn_error_t (); - err.apr_err = 200015; - err.message = "The operation was interrupted"; - IntPtr localpool = newpool (IntPtr.Zero); - err.pool = localpool; + var err = new LibSvnClient.svn_error_t { + apr_err = 200015, + message = "The operation was interrupted", + pool = localpool + }; + return apr.pcalloc (localpool, err); } @@ -1525,9 +1486,11 @@ namespace MonoDevelop.VersionControl.Subversion.Unix return String.Empty; IntPtr result; - IntPtr scratch = newpool (pool); - var localpool = TryStartOperation (null); + IntPtr scratch = IntPtr.Zero; + IntPtr localpool = IntPtr.Zero; try { + localpool = TryStartOperation (null); + scratch = newpool (pool); string new_path = NormalizePath (path.FullPath, localpool); SubversionException e = CheckErrorNoThrow (svn.client_get_wc_root (out result, new_path, ctx, localpool, scratch), null); if (e != null) { @@ -1553,9 +1516,8 @@ namespace MonoDevelop.VersionControl.Subversion.Unix } return Marshal.PtrToStringAnsi (result); } finally { - apr.pool_destroy (localpool); - apr.pool_destroy (scratch); - TryEndOperation (); + destroypool (scratch); + TryEndOperation (localpool); if (TooOld) WorkingCopyFormatPrompt (false, null); @@ -1572,15 +1534,15 @@ namespace MonoDevelop.VersionControl.Subversion.Unix if (!Upgrading || path.IsNullOrEmpty) return; - var localpool = TryStartOperation (null); + IntPtr localpool = IntPtr.Zero; bool tryParent = false; try { + localpool = TryStartOperation (null); CheckError (svn.client_upgrade (path, ctx, localpool)); } catch (Exception e) { tryParent = true; } finally { - apr.pool_destroy (localpool); - TryEndOperation (); + TryEndOperation (localpool); } if (tryParent) @@ -1653,7 +1615,7 @@ namespace MonoDevelop.VersionControl.Subversion.Unix apr.hash_this (item, out nameptr, out namelen, out val); string name = Marshal.PtrToStringAnsi (nameptr); - LibSvnClient.svn_log_changed_path_t ch = (LibSvnClient.svn_log_changed_path_t) Marshal.PtrToStructure (val, typeof (LibSvnClient.svn_log_changed_path_t)); + LibSvnClient.svn_log_changed_path_t ch = (LibSvnClient.svn_log_changed_path_t) Marshal.PtrToStructure (val, typeof(LibSvnClient.svn_log_changed_path_t)); item = apr.hash_next (item); RevisionAction ac; diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion/MonoDevelop.VersionControl.Subversion/SubversionRepository.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion/MonoDevelop.VersionControl.Subversion/SubversionRepository.cs index 1172cb4bdf..c373e0564a 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion/MonoDevelop.VersionControl.Subversion/SubversionRepository.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion/MonoDevelop.VersionControl.Subversion/SubversionRepository.cs @@ -144,17 +144,17 @@ namespace MonoDevelop.VersionControl.Subversion return true; } - protected override void OnLock (IProgressMonitor monitor, params FilePath[] localPaths) + protected override void OnLock (ProgressMonitor monitor, params FilePath[] localPaths) { Svn.Lock (monitor, "", false, localPaths); } - protected override void OnUnlock (IProgressMonitor monitor, params FilePath[] localPaths) + protected override void OnUnlock (ProgressMonitor monitor, params FilePath[] localPaths) { Svn.Unlock (monitor, false, localPaths); } - protected override Repository OnPublish (string serverPath, FilePath localPath, FilePath[] files, string message, IProgressMonitor monitor) + protected override Repository OnPublish (string serverPath, FilePath localPath, FilePath[] files, string message, ProgressMonitor monitor) { string url = Url; if (!serverPath.StartsWith ("/", StringComparison.Ordinal) && !url.EndsWith ("/", StringComparison.Ordinal)) @@ -180,7 +180,7 @@ namespace MonoDevelop.VersionControl.Subversion return new SubversionRepository (VersionControlSystem, paths[0], localPath); } - void PublishDir (Set dirs, FilePath dir, bool rec, IProgressMonitor monitor) + void PublishDir (Set dirs, FilePath dir, bool rec, ProgressMonitor monitor) { if (dirs.Add (dir.CanonicalPath)) { if (rec) { @@ -190,31 +190,28 @@ namespace MonoDevelop.VersionControl.Subversion } } - protected override void OnUpdate (FilePath[] localPaths, bool recurse, IProgressMonitor monitor) + protected override void OnUpdate (FilePath[] localPaths, bool recurse, ProgressMonitor monitor) { foreach (string path in localPaths) Svn.Update (path, recurse, monitor); } - protected override void OnCommit (ChangeSet changeSet, IProgressMonitor monitor) + protected override void OnCommit (ChangeSet changeSet, ProgressMonitor monitor) { - List list = new List (); - foreach (ChangeSetItem it in changeSet.Items) - list.Add (it.LocalPath); - Svn.Commit (list.ToArray (), changeSet.GlobalComment, monitor); + Svn.Commit (changeSet.Items.Select (it => it.LocalPath).ToArray (), changeSet.GlobalComment, monitor); } - void CreateDirectory (string[] paths, string message, IProgressMonitor monitor) + void CreateDirectory (string[] paths, string message, ProgressMonitor monitor) { Svn.Mkdir (paths, message, monitor); } - protected override void OnCheckout (FilePath targetLocalPath, Revision rev, bool recurse, IProgressMonitor monitor) + protected override void OnCheckout (FilePath targetLocalPath, Revision rev, bool recurse, ProgressMonitor monitor) { Svn.Checkout (this.Url, targetLocalPath, rev, recurse, monitor); } - protected override void OnRevert (FilePath[] localPaths, bool recurse, IProgressMonitor monitor) + protected override void OnRevert (FilePath[] localPaths, bool recurse, ProgressMonitor monitor) { // If we have an array of paths such as: new [] { "/Foo/Directory", "/Foo/Directory/File1", "/Foo/Directory/File2" } // svn will successfully revert the first entry (the directory) and then throw an error when trying to revert the @@ -225,17 +222,17 @@ namespace MonoDevelop.VersionControl.Subversion Svn.Revert (localPaths, recurse, monitor); } - protected override void OnRevertRevision (FilePath localPath, Revision revision, IProgressMonitor monitor) + protected override void OnRevertRevision (FilePath localPath, Revision revision, ProgressMonitor monitor) { Svn.RevertRevision (localPath, revision, monitor); } - protected override void OnRevertToRevision (FilePath localPath, Revision revision, IProgressMonitor monitor) + protected override void OnRevertToRevision (FilePath localPath, Revision revision, ProgressMonitor monitor) { Svn.RevertToRevision (localPath, revision, monitor); } - protected override void OnAdd (FilePath[] localPaths, bool recurse, IProgressMonitor monitor) + protected override void OnAdd (FilePath[] localPaths, bool recurse, ProgressMonitor monitor) { foreach (FilePath path in localPaths) { if (IsVersioned (path) && File.Exists (path) && !Directory.Exists (path)) { @@ -293,10 +290,10 @@ namespace MonoDevelop.VersionControl.Subversion public string Root { get { try { - UriBuilder ub = new UriBuilder (Url); - ub.Path = string.Empty; - ub.Query = string.Empty; - return ub.ToString (); + return new UriBuilder (Url) { + Path = string.Empty, + Query = string.Empty + }.ToString (); } catch { return string.Empty; } @@ -308,7 +305,7 @@ namespace MonoDevelop.VersionControl.Subversion return (srcRepository is SubversionRepository) && ((SubversionRepository)srcRepository).Root == Root; } - protected override void OnMoveFile (FilePath localSrcPath, FilePath localDestPath, bool force, IProgressMonitor monitor) + protected override void OnMoveFile (FilePath localSrcPath, FilePath localDestPath, bool force, ProgressMonitor monitor) { bool destIsVersioned = false; @@ -343,7 +340,7 @@ namespace MonoDevelop.VersionControl.Subversion } } - protected override void OnMoveDirectory (FilePath localSrcPath, FilePath localDestPath, bool force, IProgressMonitor monitor) + protected override void OnMoveDirectory (FilePath localSrcPath, FilePath localDestPath, bool force, ProgressMonitor monitor) { if (IsVersioned (localDestPath)) { @@ -434,7 +431,7 @@ namespace MonoDevelop.VersionControl.Subversion } } - void MakeDirVersioned (string dir, IProgressMonitor monitor) + void MakeDirVersioned (string dir, ProgressMonitor monitor) { if (Directory.Exists (SubversionBackend.GetDirectoryDotSvn (VersionControlSystem, dir))) return; @@ -461,7 +458,7 @@ namespace MonoDevelop.VersionControl.Subversion collection.Add(f); } - protected override void OnDeleteFiles (FilePath[] localPaths, bool force, IProgressMonitor monitor, bool keepLocal) + protected override void OnDeleteFiles (FilePath[] localPaths, bool force, ProgressMonitor monitor, bool keepLocal) { foreach (string path in localPaths) { if (IsVersioned (path)) { @@ -489,7 +486,7 @@ namespace MonoDevelop.VersionControl.Subversion } } - protected override void OnDeleteDirectories (FilePath[] localPaths, bool force, IProgressMonitor monitor, bool keepLocal) + protected override void OnDeleteDirectories (FilePath[] localPaths, bool force, ProgressMonitor monitor, bool keepLocal) { foreach (string path in localPaths) { if (IsVersioned (path)) { diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion/MonoDevelop.VersionControl.Subversion/SubversionVersionControl.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion/MonoDevelop.VersionControl.Subversion/SubversionVersionControl.cs index 0ee35899fe..3ffd857b6f 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion/MonoDevelop.VersionControl.Subversion/SubversionVersionControl.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion/MonoDevelop.VersionControl.Subversion/SubversionVersionControl.cs @@ -4,6 +4,7 @@ using System.IO; using MonoDevelop.Core; using MonoDevelop.VersionControl.Subversion.Gui; +using System.Linq; namespace MonoDevelop.VersionControl.Subversion { @@ -23,8 +24,6 @@ namespace MonoDevelop.VersionControl.Subversion } public abstract SubversionBackend CreateBackend (); - - public abstract string GetPathUrl (FilePath path); public override Repository GetRepositoryReference (FilePath path, string id) { @@ -57,17 +56,12 @@ namespace MonoDevelop.VersionControl.Subversion public Revision[] GetHistory (Repository repo, FilePath sourcefile, Revision since) { - List revs = new List(); - SvnRevision startrev = SvnRevision.Working; SvnRevision sincerev = SvnRevision.First; if (since != null) sincerev = (SvnRevision) since; - - foreach (SvnRevision rev in Log (repo, sourcefile, startrev, sincerev)) - revs.Add (rev); - - return revs.ToArray (); + + return Log (repo, sourcefile, startrev, sincerev).ToArray (); } public abstract IEnumerable Log (Repository repo, FilePath path, SvnRevision revisionStart, SvnRevision revisionEnd); @@ -110,9 +104,8 @@ namespace MonoDevelop.VersionControl.Subversion return VersionInfo.CreateUnversioned (sourcefile, false); if (!sourcefile.IsChildPathOf (srepo.RootPath)) return VersionInfo.CreateUnversioned (sourcefile, false); - - List statuses = new List (); - statuses.AddRange (Status (repo, sourcefile, SvnRevision.Head, false, false, getRemoteStatus)); + + var statuses = new List (Status (repo, sourcefile, SvnRevision.Head, false, false, getRemoteStatus)); if (statuses.Count == 0) return VersionInfo.CreateUnversioned (sourcefile, false); @@ -120,7 +113,7 @@ namespace MonoDevelop.VersionControl.Subversion if (statuses.Count != 1) return VersionInfo.CreateUnversioned (sourcefile, false); - VersionInfo ent = (VersionInfo) statuses[0]; + VersionInfo ent = statuses [0]; if (ent.IsDirectory) return VersionInfo.CreateUnversioned (sourcefile, false); @@ -143,30 +136,28 @@ namespace MonoDevelop.VersionControl.Subversion public VersionInfo[] GetDirectoryVersionInfo (Repository repo, FilePath sourcepath, bool getRemoteStatus, bool recursive) { - List list = new List (); - list.AddRange (Status (repo, sourcepath, SvnRevision.Head, recursive, true, getRemoteStatus)); - return list.ToArray (); + return Status (repo, sourcepath, SvnRevision.Head, recursive, true, getRemoteStatus).ToArray (); } public abstract IEnumerable Status (Repository repo, FilePath path, SvnRevision revision, bool descendDirs, bool changedItemsOnly, bool remoteStatus); - public abstract void Update (FilePath path, bool recurse, IProgressMonitor monitor); + public abstract void Update (FilePath path, bool recurse, ProgressMonitor monitor); - public abstract void Commit (FilePath[] paths, string message, IProgressMonitor monitor); + public abstract void Commit (FilePath[] paths, string message, ProgressMonitor monitor); - public abstract void Mkdir (string[] paths, string message, IProgressMonitor monitor); + public abstract void Mkdir (string[] paths, string message, ProgressMonitor monitor); - public abstract void Checkout (string url, FilePath path, Revision rev, bool recurse, IProgressMonitor monitor); + public abstract void Checkout (string url, FilePath path, Revision rev, bool recurse, ProgressMonitor monitor); - public abstract void Revert (FilePath[] paths, bool recurse, IProgressMonitor monitor); + public abstract void Revert (FilePath[] paths, bool recurse, ProgressMonitor monitor); - public abstract void RevertRevision (FilePath path, Revision revision, IProgressMonitor monitor); + public abstract void RevertRevision (FilePath path, Revision revision, ProgressMonitor monitor); - public abstract void RevertToRevision (FilePath path, Revision revision, IProgressMonitor monitor); + public abstract void RevertToRevision (FilePath path, Revision revision, ProgressMonitor monitor); - public abstract void Add (FilePath path, bool recurse, IProgressMonitor monitor); + public abstract void Add (FilePath path, bool recurse, ProgressMonitor monitor); - public abstract void Delete (FilePath path, bool force, IProgressMonitor monitor); + public abstract void Delete (FilePath path, bool force, ProgressMonitor monitor); public abstract void Ignore (FilePath[] paths); @@ -186,16 +177,16 @@ namespace MonoDevelop.VersionControl.Subversion public abstract IEnumerable ListUrl (string url, bool recurse, SvnRevision rev); - public void Move (FilePath srcPath, FilePath destPath, bool force, IProgressMonitor monitor) + public void Move (FilePath srcPath, FilePath destPath, bool force, ProgressMonitor monitor) { Move (srcPath, destPath, SvnRevision.Head, force, monitor); } - public abstract void Move (FilePath srcPath, FilePath destPath, SvnRevision rev, bool force, IProgressMonitor monitor); + public abstract void Move (FilePath srcPath, FilePath destPath, SvnRevision rev, bool force, ProgressMonitor monitor); - public abstract void Lock (IProgressMonitor monitor, string comment, bool stealLock, params FilePath[] paths); + public abstract void Lock (ProgressMonitor monitor, string comment, bool stealLock, params FilePath[] paths); - public abstract void Unlock (IProgressMonitor monitor, bool breakLock, params FilePath[] paths); + public abstract void Unlock (ProgressMonitor monitor, bool breakLock, params FilePath[] paths); public string GetUnifiedDiff (FilePath path, bool recursive, bool remoteDiff) { diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/StatusView.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/StatusView.cs index b9496598a4..95f58746ed 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/StatusView.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/StatusView.cs @@ -162,9 +162,10 @@ namespace MonoDevelop.VersionControl.Views scroller.VscrollbarPolicy = PolicyType.Automatic; filelist.RowActivated += OnRowActivated; filelist.DiffLineActivated += OnDiffLineActivated; + filelist.CommitSelectionToggled += OnCommitSelectionToggled; cellToggle = new CellRendererToggle(); - cellToggle.Toggled += new ToggledHandler(OnCommitToggledHandler); + cellToggle.Toggled += new ToggledHandler(OnCommitCellToggled); var crc = new CellRendererImage (); crc.StockId = "vc-comment"; colCommit = new TreeViewColumn (); @@ -409,13 +410,14 @@ namespace MonoDevelop.VersionControl.Views filelist.DoPopupMenu = null; filelist.RowActivated -= OnRowActivated; filelist.DiffLineActivated -= OnDiffLineActivated; + filelist.CommitSelectionToggled -= OnCommitSelectionToggled; filelist.TestExpandRow -= OnTestExpandRow; filelist.Selection.Changed -= OnCursorChanged; filelist.Destroy (); filelist = null; } if (cellToggle != null) { - cellToggle.Toggled -= OnCommitToggledHandler; + cellToggle.Toggled -= OnCommitCellToggled; cellToggle.Destroy (); cellToggle = null; } @@ -455,7 +457,7 @@ namespace MonoDevelop.VersionControl.Views ThreadPool.QueueUserWorkItem (delegate { if (fileList != null) { - var group = fileList.GroupBy (v => v.IsDirectory || v.WorkspaceObject is SolutionItem); + var group = fileList.GroupBy (v => v.IsDirectory || v.WorkspaceObject is SolutionFolderItem); foreach (var item in group) { // Is directory. if (item.Key) { @@ -710,11 +712,8 @@ namespace MonoDevelop.VersionControl.Views OnOpen (null, null); } - void OnCommitToggledHandler(object o, ToggledArgs args) { - TreeIter pos; - if (!filestore.GetIterFromString (out pos, args.Path)) - return; - + void ToggleCommitStatus(TreeIter pos) + { string localpath = (string) filestore.GetValue (pos, ColFullPath); if (changeSet.ContainsFile (localpath)) { @@ -728,6 +727,20 @@ namespace MonoDevelop.VersionControl.Views UpdateSelectionStatus (); } + void OnCommitSelectionToggled (object sender, EventArgs e) + { + filelist.Selection.SelectedForeach((model, path, iter) => ToggleCommitStatus(iter)); + } + + void OnCommitCellToggled(object o, ToggledArgs args) + { + TreeIter pos; + if (!filestore.GetIterFromString (out pos, args.Path)) + return; + + ToggleCommitStatus (pos); + } + VersionInfo GetVersionInfo (string file) { foreach (VersionInfo vi in statuses) @@ -1134,6 +1147,32 @@ namespace MonoDevelop.VersionControl.Views { const Gdk.ModifierType selectionModifiers = Gdk.ModifierType.ShiftMask | Gdk.ModifierType.ControlMask; + protected override bool OnKeyPressEvent (Gdk.EventKey evnt) + { + if (evnt.Key == Gdk.Key.Right || evnt.Key == Gdk.Key.KP_Right) { + Selection.SelectedForeach ((model, path, iter) => ExpandRow (path, true)); + return true; + } + + if (evnt.Key == Gdk.Key.Left || evnt.Key == Gdk.Key.KP_Left) { + Selection.SelectedForeach ((model, path, iter) => CollapseRow (path)); + return true; + } + + if (evnt.Key == Gdk.Key.space && CommitSelectionToggled != null) { + CommitSelectionToggled (this, EventArgs.Empty); + return true; + } + + if (evnt.Key == Gdk.Key.Return || evnt.Key == Gdk.Key.KP_Enter) { + if (DiffLineActivated != null) + DiffLineActivated (this, EventArgs.Empty); + return true; + } + + return base.OnKeyPressEvent (evnt); + } + protected override bool OnButtonPressEvent (Gdk.EventButton evnt) { bool keepPos = false; @@ -1228,5 +1267,6 @@ namespace MonoDevelop.VersionControl.Views public Action DoPopupMenu; public event EventHandler DiffLineActivated; + public event EventHandler CommitSelectionToggled; } } diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/SubviewAttachmentHandler.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/SubviewAttachmentHandler.cs index 9808922e3d..b95b373dea 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/SubviewAttachmentHandler.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/SubviewAttachmentHandler.cs @@ -48,10 +48,10 @@ namespace MonoDevelop.VersionControl.Views if (document == null || !document.IsFile || document.Window.FindView () >= 0) return; - IWorkspaceObject project = document.Project; + WorkspaceObject project = document.Project; if (project == null) { // Fix for broken .csproj and .sln files not being seen as having a project. - foreach (var projItem in Ide.IdeApp.Workspace.GetAllSolutionItems ()) { + foreach (var projItem in Ide.IdeApp.Workspace.GetAllItems ()) { if (projItem.FileName == document.FileName) { project = projItem; } diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.csproj b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.csproj index 937b7abc9f..f4bf6413df 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.csproj +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.csproj @@ -330,7 +330,6 @@ - @@ -396,6 +395,7 @@ + diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/AddRemoveMoveCommand.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/AddRemoveMoveCommand.cs index 70766591ea..60850e1c15 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/AddRemoveMoveCommand.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/AddRemoveMoveCommand.cs @@ -17,7 +17,7 @@ namespace MonoDevelop.VersionControl return true; } - private class AddWorker : Task { + private class AddWorker : VersionControlTask { VersionControlItemList items; public AddWorker (VersionControlItemList items) @@ -32,7 +32,7 @@ namespace MonoDevelop.VersionControl protected override void Run () { - IProgressMonitor monitor = Monitor; + ProgressMonitor monitor = Monitor; foreach (VersionControlItemList list in items.SplitByRepository ()) list[0].Repository.Add (list.Paths, true, monitor); @@ -108,7 +108,7 @@ namespace MonoDevelop.VersionControl return true; } - private class RemoveWorker : Task { + private class RemoveWorker : VersionControlTask { VersionControlItemList items; public RemoveWorker (VersionControlItemList items) { diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/CheckoutCommand.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/CheckoutCommand.cs index 7ecd9340ed..7e03982d5a 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/CheckoutCommand.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/CheckoutCommand.cs @@ -28,7 +28,7 @@ namespace MonoDevelop.VersionControl } } - class CheckoutWorker : Task + class CheckoutWorker : VersionControlTask { Repository vc; string path; @@ -45,7 +45,7 @@ namespace MonoDevelop.VersionControl return GettextCatalog.GetString ("Checking out {0}...", path); } - protected override IProgressMonitor CreateProgressMonitor () + protected override ProgressMonitor CreateProgressMonitor () { return new MonoDevelop.Core.ProgressMonitoring.AggregatedProgressMonitor ( base.CreateProgressMonitor (), @@ -73,7 +73,7 @@ namespace MonoDevelop.VersionControl return; } - if (Monitor.IsCancelRequested) { + if (Monitor.CancellationToken.IsCancellationRequested) { Monitor.ReportSuccess (GettextCatalog.GetString ("Checkout operation cancelled")); return; } diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/Commands.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/Commands.cs index 6c8d5abea3..5462cd8978 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/Commands.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/Commands.cs @@ -37,7 +37,7 @@ namespace MonoDevelop.VersionControl VersionControlItemList list = new VersionControlItemList (); WorkspaceItem wob; - SolutionItem sol; + SolutionFolderItem sol; Repository repo = null; wob = IdeApp.ProjectOperations.CurrentSelectedWorkspaceItem; if (wob != null) diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/CommitCommand.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/CommitCommand.cs index f5257c5979..c3e6e4979c 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/CommitCommand.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/CommitCommand.cs @@ -32,7 +32,7 @@ namespace MonoDevelop.VersionControl } } - private class CommitWorker : Task + private class CommitWorker : VersionControlTask { Repository vc; ChangeSet changeSet; diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/IgnoreCommand.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/IgnoreCommand.cs index d9f74988ca..48297e4b43 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/IgnoreCommand.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/IgnoreCommand.cs @@ -62,7 +62,7 @@ namespace MonoDevelop.VersionControl } } - private class IgnoreWorker : Task + private class IgnoreWorker : VersionControlTask { VersionControlItemList items; @@ -125,7 +125,7 @@ namespace MonoDevelop.VersionControl } } - private class UnignoreWorker : Task + private class UnignoreWorker : VersionControlTask { VersionControlItemList items; diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/LockCommand.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/LockCommand.cs index 66507132e4..46cb65a80c 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/LockCommand.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/LockCommand.cs @@ -43,7 +43,7 @@ namespace MonoDevelop.VersionControl return true; } - private class LockWorker : Task + private class LockWorker : VersionControlTask { VersionControlItemList items; diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/PublishCommand.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/PublishCommand.cs index b636e7e3db..5dee5c58c9 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/PublishCommand.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/PublishCommand.cs @@ -10,7 +10,7 @@ namespace MonoDevelop.VersionControl { internal class PublishCommand { - public static bool Publish (IWorkspaceObject entry, FilePath localPath, bool test) + public static bool Publish (WorkspaceObject entry, FilePath localPath, bool test) { if (test) return VersionControlService.CheckVersionControlInstalled () && VersionControlService.GetRepository (entry) == null; @@ -52,7 +52,7 @@ namespace MonoDevelop.VersionControl return true; } - static void GetFiles (List files, IWorkspaceObject entry) + static void GetFiles (List files, WorkspaceObject entry) { // Ensure that we strip out all linked files from outside of the solution/projects path. if (entry is IWorkspaceFileObject) @@ -69,7 +69,7 @@ namespace MonoDevelop.VersionControl } } - internal class PublishWorker : Task { + internal class PublishWorker : VersionControlTask { Repository vc; FilePath path; string moduleName; diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/Repository.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/Repository.cs index aef5e0dd2d..aca8706d1d 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/Repository.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/Repository.cs @@ -372,6 +372,25 @@ namespace MonoDevelop.VersionControl } catch (Exception ex) { LoggingService.LogError ("Version control status query failed", ex); + //Release all items in current batch + foreach (var item in recursiveDirectoryQueryQueueClone) + item.ResetEvent.Set (); + + lock (queryLock) { + queryRunning = false; + + fileQueryQueue.Clear (); + filesInQueryQueue.Clear (); + + directoriesInQueryQueue.Clear (); + directoryQueryQueue.Clear (); + + recursiveDirectoryQueryQueueClone = recursiveDirectoryQueryQueue.ToArray (); + recursiveDirectoriesInQueryQueue.Clear (); + recursiveDirectoryQueryQueue.Clear (); + } + + //Release newly pending foreach (var item in recursiveDirectoryQueryQueueClone) item.ResetEvent.Set (); } @@ -421,29 +440,29 @@ namespace MonoDevelop.VersionControl // Imports a directory into the repository. 'serverPath' is the relative path in the repository. // 'localPath' is the local directory to publish. 'files' is the list of files to add to the new // repository directory (must use absolute local paths). - public Repository Publish (string serverPath, FilePath localPath, FilePath[] files, string message, IProgressMonitor monitor) + public Repository Publish (string serverPath, FilePath localPath, FilePath[] files, string message, ProgressMonitor monitor) { var res = OnPublish (serverPath, localPath, files, message, monitor); ClearCachedVersionInfo (localPath); return res; } - protected abstract Repository OnPublish (string serverPath, FilePath localPath, FilePath[] files, string message, IProgressMonitor monitor); + protected abstract Repository OnPublish (string serverPath, FilePath localPath, FilePath[] files, string message, ProgressMonitor monitor); // Updates a local file or directory from the repository // Returns a list of updated files - public void Update (FilePath localPath, bool recurse, IProgressMonitor monitor) + public void Update (FilePath localPath, bool recurse, ProgressMonitor monitor) { Update (new FilePath[] { localPath }, recurse, monitor); } - public void Update (FilePath[] localPaths, bool recurse, IProgressMonitor monitor) + public void Update (FilePath[] localPaths, bool recurse, ProgressMonitor monitor) { OnUpdate (localPaths, recurse, monitor); ClearCachedVersionInfo (localPaths); } - protected abstract void OnUpdate (FilePath[] localPaths, bool recurse, IProgressMonitor monitor); + protected abstract void OnUpdate (FilePath[] localPaths, bool recurse, ProgressMonitor monitor); // Called to create a ChangeSet to be used for a commit operation public virtual ChangeSet CreateChangeSet (FilePath basePath) @@ -468,70 +487,70 @@ namespace MonoDevelop.VersionControl } // Commits changes in a set of files or directories into the repository - public void Commit (ChangeSet changeSet, IProgressMonitor monitor) + public void Commit (ChangeSet changeSet, ProgressMonitor monitor) { ClearCachedVersionInfo (changeSet.BaseLocalPath); OnCommit (changeSet, monitor); } - protected abstract void OnCommit (ChangeSet changeSet, IProgressMonitor monitor); + protected abstract void OnCommit (ChangeSet changeSet, ProgressMonitor monitor); // Gets the contents of this repositories into the specified local path - public void Checkout (FilePath targetLocalPath, bool recurse, IProgressMonitor monitor) + public void Checkout (FilePath targetLocalPath, bool recurse, ProgressMonitor monitor) { Checkout (targetLocalPath, null, recurse, monitor); } - public void Checkout (FilePath targetLocalPath, Revision rev, bool recurse, IProgressMonitor monitor) + public void Checkout (FilePath targetLocalPath, Revision rev, bool recurse, ProgressMonitor monitor) { ClearCachedVersionInfo (targetLocalPath); OnCheckout (targetLocalPath, rev, recurse, monitor); } - protected abstract void OnCheckout (FilePath targetLocalPath, Revision rev, bool recurse, IProgressMonitor monitor); + protected abstract void OnCheckout (FilePath targetLocalPath, Revision rev, bool recurse, ProgressMonitor monitor); - public void Revert (FilePath[] localPaths, bool recurse, IProgressMonitor monitor) + public void Revert (FilePath[] localPaths, bool recurse, ProgressMonitor monitor) { ClearCachedVersionInfo (localPaths); OnRevert (localPaths, recurse, monitor); } - public void Revert (FilePath localPath, bool recurse, IProgressMonitor monitor) + public void Revert (FilePath localPath, bool recurse, ProgressMonitor monitor) { Revert (new FilePath[] { localPath }, recurse, monitor); } - protected abstract void OnRevert (FilePath[] localPaths, bool recurse, IProgressMonitor monitor); + protected abstract void OnRevert (FilePath[] localPaths, bool recurse, ProgressMonitor monitor); - public void RevertRevision (FilePath localPath, Revision revision, IProgressMonitor monitor) + public void RevertRevision (FilePath localPath, Revision revision, ProgressMonitor monitor) { ClearCachedVersionInfo (localPath); OnRevertRevision (localPath, revision, monitor); } - protected abstract void OnRevertRevision (FilePath localPath, Revision revision, IProgressMonitor monitor); + protected abstract void OnRevertRevision (FilePath localPath, Revision revision, ProgressMonitor monitor); - public void RevertToRevision (FilePath localPath, Revision revision, IProgressMonitor monitor) + public void RevertToRevision (FilePath localPath, Revision revision, ProgressMonitor monitor) { ClearCachedVersionInfo (localPath); OnRevertToRevision (localPath, revision, monitor); } - protected abstract void OnRevertToRevision (FilePath localPath, Revision revision, IProgressMonitor monitor); + protected abstract void OnRevertToRevision (FilePath localPath, Revision revision, ProgressMonitor monitor); // Adds a file or directory to the repository - public void Add (FilePath localPath, bool recurse, IProgressMonitor monitor) + public void Add (FilePath localPath, bool recurse, ProgressMonitor monitor) { Add (new FilePath[] { localPath }, recurse, monitor); } - public void Add (FilePath[] localPaths, bool recurse, IProgressMonitor monitor) + public void Add (FilePath[] localPaths, bool recurse, ProgressMonitor monitor) { OnAdd (localPaths, recurse, monitor); ClearCachedVersionInfo (localPaths); } - protected abstract void OnAdd (FilePath[] localPaths, bool recurse, IProgressMonitor monitor); + protected abstract void OnAdd (FilePath[] localPaths, bool recurse, ProgressMonitor monitor); // Returns true if the file can be moved from source location (and repository) to this repository public virtual bool CanMoveFilesFrom (Repository srcRepository, FilePath localSrcPath, FilePath localDestPath) @@ -545,57 +564,57 @@ namespace MonoDevelop.VersionControl // For example, when moving a file to an unversioned directory, the implementation // might just throw an exception, or it could version the directory, or it could // ask the user what to do. - public void MoveFile (FilePath localSrcPath, FilePath localDestPath, bool force, IProgressMonitor monitor) + public void MoveFile (FilePath localSrcPath, FilePath localDestPath, bool force, ProgressMonitor monitor) { ClearCachedVersionInfo (localSrcPath, localDestPath); OnMoveFile (localSrcPath, localDestPath, force, monitor); } - protected virtual void OnMoveFile (FilePath localSrcPath, FilePath localDestPath, bool force, IProgressMonitor monitor) + protected virtual void OnMoveFile (FilePath localSrcPath, FilePath localDestPath, bool force, ProgressMonitor monitor) { File.Move (localSrcPath, localDestPath); } // Moves a directory. This method may be called for versioned and unversioned // files. The default implementetions performs a system file move. - public void MoveDirectory (FilePath localSrcPath, FilePath localDestPath, bool force, IProgressMonitor monitor) + public void MoveDirectory (FilePath localSrcPath, FilePath localDestPath, bool force, ProgressMonitor monitor) { ClearCachedVersionInfo (localSrcPath, localDestPath); OnMoveDirectory (localSrcPath, localDestPath, force, monitor); } - protected virtual void OnMoveDirectory (FilePath localSrcPath, FilePath localDestPath, bool force, IProgressMonitor monitor) + protected virtual void OnMoveDirectory (FilePath localSrcPath, FilePath localDestPath, bool force, ProgressMonitor monitor) { - Directory.Move (localSrcPath, localDestPath); + FileService.SystemDirectoryRename (localSrcPath, localDestPath); } // Deletes a file or directory. This method may be called for versioned and unversioned // files. The default implementetions performs a system file delete. - public void DeleteFile (FilePath localPath, bool force, IProgressMonitor monitor, bool keepLocal = true) + public void DeleteFile (FilePath localPath, bool force, ProgressMonitor monitor, bool keepLocal = true) { DeleteFiles (new FilePath[] { localPath }, force, monitor, keepLocal); } - public void DeleteFiles (FilePath[] localPaths, bool force, IProgressMonitor monitor, bool keepLocal = true) + public void DeleteFiles (FilePath[] localPaths, bool force, ProgressMonitor monitor, bool keepLocal = true) { OnDeleteFiles (localPaths, force, monitor, keepLocal); ClearCachedVersionInfo (localPaths); } - protected abstract void OnDeleteFiles (FilePath[] localPaths, bool force, IProgressMonitor monitor, bool keepLocal); + protected abstract void OnDeleteFiles (FilePath[] localPaths, bool force, ProgressMonitor monitor, bool keepLocal); - public void DeleteDirectory (FilePath localPath, bool force, IProgressMonitor monitor, bool keepLocal = true) + public void DeleteDirectory (FilePath localPath, bool force, ProgressMonitor monitor, bool keepLocal = true) { DeleteDirectories (new FilePath[] { localPath }, force, monitor, keepLocal); } - public void DeleteDirectories (FilePath[] localPaths, bool force, IProgressMonitor monitor, bool keepLocal = true) + public void DeleteDirectories (FilePath[] localPaths, bool force, ProgressMonitor monitor, bool keepLocal = true) { OnDeleteDirectories (localPaths, force, monitor, keepLocal); ClearCachedVersionInfo (localPaths); } - protected abstract void OnDeleteDirectories (FilePath[] localPaths, bool force, IProgressMonitor monitor, bool keepLocal); + protected abstract void OnDeleteDirectories (FilePath[] localPaths, bool force, ProgressMonitor monitor, bool keepLocal); // Called to request write permission for a file. The file may not yet exist. // After the file is modified or created, NotifyFileChanged is called. @@ -620,26 +639,26 @@ namespace MonoDevelop.VersionControl } // Locks a file in the repository so no other users can change it - public void Lock (IProgressMonitor monitor, params FilePath[] localPaths) + public void Lock (ProgressMonitor monitor, params FilePath[] localPaths) { ClearCachedVersionInfo (localPaths); OnLock (monitor, localPaths); } // Locks a file in the repository so no other users can change it - protected virtual void OnLock (IProgressMonitor monitor, params FilePath[] localPaths) + protected virtual void OnLock (ProgressMonitor monitor, params FilePath[] localPaths) { throw new System.NotSupportedException (); } // Unlocks a file in the repository so other users can change it - public void Unlock (IProgressMonitor monitor, params FilePath[] localPaths) + public void Unlock (ProgressMonitor monitor, params FilePath[] localPaths) { ClearCachedVersionInfo (localPaths); OnUnlock (monitor, localPaths); } - protected virtual void OnUnlock (IProgressMonitor monitor, params FilePath[] localPaths) + protected virtual void OnUnlock (ProgressMonitor monitor, params FilePath[] localPaths) { throw new System.NotSupportedException (); } diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/RevertCommand.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/RevertCommand.cs index b69500f639..f49c902b47 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/RevertCommand.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/RevertCommand.cs @@ -43,7 +43,7 @@ namespace MonoDevelop.VersionControl } } - private class RevertWorker : Task { + private class RevertWorker : VersionControlTask { VersionControlItemList items; public RevertWorker (VersionControlItemList items) { diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/RevertRevisionsCommands.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/RevertRevisionsCommands.cs index e0be0ad697..bf4fa3cf85 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/RevertRevisionsCommands.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/RevertRevisionsCommands.cs @@ -75,7 +75,7 @@ namespace MonoDevelop.VersionControl } } - private class RevertWorker : Task { + private class RevertWorker : VersionControlTask { Repository vc; string path; Revision revision; diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/Task.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/Task.cs deleted file mode 100644 index 92aaac31c3..0000000000 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/Task.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using System.Threading; -using Gtk; - -using MonoDevelop.Core; - -namespace MonoDevelop.VersionControl -{ - internal abstract class Task - { - IProgressMonitor tracker; - ThreadNotify threadnotify; - - protected VersionControlOperationType OperationType { get; set; } - - protected abstract string GetDescription(); - - // This occurs in the background. - protected abstract void Run(); - - // This occurs on the main thread when the background - // task is complete. - protected virtual void Finished() - { - } - - protected Task() - { - OperationType = VersionControlOperationType.Other; - threadnotify = new ThreadNotify(new ReadyEvent(Wakeup)); - } - - protected IProgressMonitor Monitor { - get { return tracker; } - } - - protected virtual IProgressMonitor CreateProgressMonitor () - { - return VersionControlService.GetProgressMonitor (GetDescription (), OperationType); - } - - public void Start() { - tracker = CreateProgressMonitor (); - tracker.BeginTask(GetDescription(), 1); - ThreadPool.QueueUserWorkItem (BackgroundWorker); - } - - void BackgroundWorker (object state) - { - try { - Run(); - } catch (DllNotFoundException e) { - tracker.ReportError("The operation could not be completed because a shared library is missing: " + e.Message, null); - } catch (Exception e) { - string msg = GettextCatalog.GetString ("Version control operation failed: "); - tracker.ReportError (msg, e); - } finally { - threadnotify.WakeupMain(); - } - } - - public void Wakeup() { - try { - tracker.EndTask(); - tracker.Dispose(); - } finally { - Finished(); - } - } - - protected void Log(string logtext) { - tracker.Log.WriteLine(logtext); - } - - protected void Warn(string logtext) { - tracker.ReportWarning(logtext); - } - } -} diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/UnknownRepository.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/UnknownRepository.cs index 030583d3ce..7735cab3f2 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/UnknownRepository.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/UnknownRepository.cs @@ -45,52 +45,52 @@ namespace MonoDevelop.VersionControl } - protected override Repository OnPublish (string serverPath, FilePath localPath, FilePath[] FilePath, string message, IProgressMonitor monitor) + protected override Repository OnPublish (string serverPath, FilePath localPath, FilePath[] FilePath, string message, ProgressMonitor monitor) { return null; } - protected override void OnUpdate (FilePath[] paths, bool recurse, IProgressMonitor monitor) + protected override void OnUpdate (FilePath[] paths, bool recurse, ProgressMonitor monitor) { } - protected override void OnCommit (ChangeSet changeSet, IProgressMonitor monitor) + protected override void OnCommit (ChangeSet changeSet, ProgressMonitor monitor) { } - protected override void OnCheckout (FilePath path, Revision rev, bool recurse, IProgressMonitor monitor) + protected override void OnCheckout (FilePath path, Revision rev, bool recurse, ProgressMonitor monitor) { } - protected override void OnRevert (FilePath[] localPaths, bool recurse, IProgressMonitor monitor) + protected override void OnRevert (FilePath[] localPaths, bool recurse, ProgressMonitor monitor) { } - protected override void OnRevertRevision (FilePath localPath, Revision revision, IProgressMonitor monitor) + protected override void OnRevertRevision (FilePath localPath, Revision revision, ProgressMonitor monitor) { } - protected override void OnRevertToRevision (FilePath localPath, Revision revision, IProgressMonitor monitor) + protected override void OnRevertToRevision (FilePath localPath, Revision revision, ProgressMonitor monitor) { } - protected override void OnAdd (FilePath[] paths, bool recurse, IProgressMonitor monitor) + protected override void OnAdd (FilePath[] paths, bool recurse, ProgressMonitor monitor) { } - protected override void OnMoveFile (FilePath srcPath, FilePath destPath, bool force, IProgressMonitor monitor) + protected override void OnMoveFile (FilePath srcPath, FilePath destPath, bool force, ProgressMonitor monitor) { } - protected override void OnMoveDirectory (FilePath srcPath, FilePath destPath, bool force, IProgressMonitor monitor) + protected override void OnMoveDirectory (FilePath srcPath, FilePath destPath, bool force, ProgressMonitor monitor) { } - protected override void OnDeleteFiles (FilePath[] path, bool force, IProgressMonitor monitor, bool keepLocal) + protected override void OnDeleteFiles (FilePath[] path, bool force, ProgressMonitor monitor, bool keepLocal) { } - protected override void OnDeleteDirectories (FilePath[] path, bool force, IProgressMonitor monitor, bool keepLocal) + protected override void OnDeleteDirectories (FilePath[] path, bool force, ProgressMonitor monitor, bool keepLocal) { } diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/UnlockCommand.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/UnlockCommand.cs index 599e3d56f0..90b5cf4f79 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/UnlockCommand.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/UnlockCommand.cs @@ -45,7 +45,7 @@ namespace MonoDevelop.VersionControl return true; } - private class UnlockWorker : Task + private class UnlockWorker : VersionControlTask { VersionControlItemList items; diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/UpdateCommand.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/UpdateCommand.cs index 6677562bb1..838884e603 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/UpdateCommand.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/UpdateCommand.cs @@ -16,7 +16,7 @@ namespace MonoDevelop.VersionControl return true; } - private class UpdateWorker : Task { + private class UpdateWorker : VersionControlTask { VersionControlItemList items; public UpdateWorker (VersionControlItemList items) { diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlCommandHandler.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlCommandHandler.cs index ba12420ea5..009cfe0c50 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlCommandHandler.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlCommandHandler.cs @@ -70,7 +70,7 @@ namespace MonoDevelop.VersionControl { string path; bool isDir; - IWorkspaceObject pentry; + WorkspaceObject pentry; Repository repo; VersionInfo versionInfo = null; @@ -105,8 +105,8 @@ namespace MonoDevelop.VersionControl path = item.FileName; isDir = false; pentry = item; - } else if (obj is IWorkspaceObject) { - pentry = ((IWorkspaceObject)obj); + } else if (obj is WorkspaceObject) { + pentry = ((WorkspaceObject)obj); path = pentry.BaseDirectory; isDir = true; } else diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlFileSystemExtension.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlFileSystemExtension.cs index 4f50281ce9..c77a27fdfc 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlFileSystemExtension.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlFileSystemExtension.cs @@ -52,7 +52,7 @@ namespace MonoDevelop.VersionControl public override void MoveFile (FilePath source, FilePath dest) { - IProgressMonitor monitor = new NullProgressMonitor (); + ProgressMonitor monitor = new ProgressMonitor (); Repository srcRepo = GetRepository (source); Repository dstRepo = GetRepository (dest); @@ -78,7 +78,7 @@ namespace MonoDevelop.VersionControl public override void DeleteFile (FilePath file) { Repository repo = GetRepository (file); - repo.DeleteFile (file, true, new NullProgressMonitor (), false); + repo.DeleteFile (file, true, new ProgressMonitor (), false); } public override void CreateDirectory (FilePath path) @@ -86,12 +86,12 @@ namespace MonoDevelop.VersionControl Repository repo = GetRepository (path); repo.ClearCachedVersionInfo (path); System.IO.Directory.CreateDirectory (path); - repo.Add (path, false, new NullProgressMonitor ()); + repo.Add (path, false, new ProgressMonitor ()); } public override void MoveDirectory (FilePath sourcePath, FilePath destPath) { - IProgressMonitor monitor = new NullProgressMonitor (); + ProgressMonitor monitor = new ProgressMonitor (); Repository srcRepo = GetRepository (sourcePath); Repository dstRepo = GetRepository (destPath); @@ -107,7 +107,7 @@ namespace MonoDevelop.VersionControl public override void DeleteDirectory (FilePath path) { Repository repo = GetRepository (path); - repo.DeleteDirectory (path, true, new NullProgressMonitor (), false); + repo.DeleteDirectory (path, true, new ProgressMonitor (), false); } public override void RequestFileEdit (IEnumerable files) diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlItem.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlItem.cs index c8f3011f0d..7aa84c36ea 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlItem.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlItem.cs @@ -35,11 +35,11 @@ namespace MonoDevelop.VersionControl { FilePath path; bool isDirectory; - IWorkspaceObject workspaceObject; + WorkspaceObject workspaceObject; Repository repository; VersionInfo versionInfo; - public VersionControlItem (Repository repository, IWorkspaceObject workspaceObject, FilePath path, bool isDirectory, VersionInfo versionInfo) + public VersionControlItem (Repository repository, WorkspaceObject workspaceObject, FilePath path, bool isDirectory, VersionInfo versionInfo) { this.path = path; this.repository = repository; @@ -48,7 +48,7 @@ namespace MonoDevelop.VersionControl this.versionInfo = versionInfo; } - public IWorkspaceObject WorkspaceObject { + public WorkspaceObject WorkspaceObject { get { return workspaceObject; } diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlNodeExtension.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlNodeExtension.cs index 848be5eba1..a2f9544638 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlNodeExtension.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlNodeExtension.cs @@ -24,7 +24,7 @@ namespace MonoDevelop.VersionControl return typeof(ProjectFile).IsAssignableFrom (dataType) || typeof(SystemFile).IsAssignableFrom (dataType) || typeof(ProjectFolder).IsAssignableFrom (dataType) - || typeof(IWorkspaceObject).IsAssignableFrom (dataType); + || typeof(WorkspaceObject).IsAssignableFrom (dataType); } protected override void Initialize () @@ -46,8 +46,8 @@ namespace MonoDevelop.VersionControl // Add status overlays - if (dataObject is IWorkspaceObject) { - IWorkspaceObject ce = (IWorkspaceObject) dataObject; + if (dataObject is WorkspaceObject) { + WorkspaceObject ce = (WorkspaceObject) dataObject; Repository rep = VersionControlService.GetRepository (ce); if (rep != null) { rep.GetDirectoryVersionInfo (ce.BaseDirectory, false, false); @@ -66,7 +66,7 @@ namespace MonoDevelop.VersionControl return; } - IWorkspaceObject prj; + WorkspaceObject prj; FilePath file; if (dataObject is ProjectFile) { @@ -202,8 +202,8 @@ namespace MonoDevelop.VersionControl return ((ProjectFile) dataObject).FilePath; } else if (dataObject is SystemFile) { return ((SystemFile) dataObject).Path; - } else if (dataObject is IWorkspaceObject) { - return ((IWorkspaceObject)dataObject).BaseDirectory; + } else if (dataObject is WorkspaceObject) { + return ((WorkspaceObject)dataObject).BaseDirectory; } else if (dataObject is ProjectFolder) { return ((ProjectFolder)dataObject).Path; } diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlService.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlService.cs index 9d204b4309..f994eb7cfd 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlService.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlService.cs @@ -185,7 +185,7 @@ namespace MonoDevelop.VersionControl } internal static Dictionary referenceCache = new Dictionary (); - public static Repository GetRepository (IWorkspaceObject entry) + public static Repository GetRepository (WorkspaceObject entry) { if (IsGloballyDisabled) return null; @@ -437,6 +437,12 @@ namespace MonoDevelop.VersionControl FileStatusChanged (null, args); } } + + static bool ShouldAddFile (ProjectFileEventInfo info) + { + const ProjectItemFlags ignoreFlags = ProjectItemFlags.DontPersist | ProjectItemFlags.Hidden; + return (info.ProjectFile.Flags & ignoreFlags) != ignoreFlags; + } //static void OnFileChanged (object s, ProjectFileEventArgs args) //{ @@ -448,13 +454,14 @@ namespace MonoDevelop.VersionControl static void OnFileAdded (object s, ProjectFileEventArgs e) { FileUpdateEventArgs vargs = new FileUpdateEventArgs (); - IProgressMonitor monitor = null; + ProgressMonitor monitor = null; try { foreach (var repoFiles in e.GroupBy (i => i.Project)) { Repository repo = GetRepository (repoFiles.Key); if (repo == null) continue; - var versionInfos = repo.GetVersionInfo (repoFiles.Select (f => f.ProjectFile.FilePath), VersionInfoQueryFlags.IgnoreCache); + var filePaths = repoFiles.Where (ShouldAddFile).Select (f => f.ProjectFile.FilePath); + var versionInfos = repo.GetVersionInfo (filePaths, VersionInfoQueryFlags.IgnoreCache); FilePath[] paths = versionInfos.Where (i => i.CanAdd).Select (i => i.LocalPath).ToArray (); if (paths.Length > 0) { if (monitor == null) @@ -494,10 +501,10 @@ namespace MonoDevelop.VersionControl } } */ - static void SolutionItemAddFiles (string rootPath, SolutionItem entry, HashSet files) + static void SolutionItemAddFiles (string rootPath, SolutionFolderItem entry, HashSet files) { - if (entry is SolutionEntityItem) { - foreach (var file in ((SolutionEntityItem)entry).GetItemFiles (false)) + if (entry is SolutionItem) { + foreach (var file in ((SolutionItem)entry).GetItemFiles (false)) SolutionItemAddFile (rootPath, files, file); } @@ -507,7 +514,7 @@ namespace MonoDevelop.VersionControl SolutionItemAddFile (rootPath, files, file.FilePath); } } else if (entry is SolutionFolder) { - foreach (SolutionItem ent in ((SolutionFolder) entry).Items) + foreach (SolutionFolderItem ent in ((SolutionFolder) entry).Items) SolutionItemAddFiles (rootPath, ent, files); } } @@ -531,7 +538,7 @@ namespace MonoDevelop.VersionControl return; // handles addition of solutions and projects - SolutionItem parent = (SolutionItem) args.SolutionItem.ParentFolder; + SolutionFolderItem parent = (SolutionFolderItem) args.SolutionItem.ParentFolder; if (parent == null) return; @@ -541,7 +548,7 @@ namespace MonoDevelop.VersionControl if (repo == null) return; - SolutionItem entry = args.SolutionItem; + SolutionFolderItem entry = args.SolutionItem; Repository currentRepo = GetRepository (entry); if (currentRepo != null && currentRepo.VersionControlSystem != repo.VersionControlSystem) { // If the item is already under version control using a different version control system @@ -558,7 +565,7 @@ namespace MonoDevelop.VersionControl var files = new HashSet { path }; SolutionItemAddFiles (path, entry, files); - using (IProgressMonitor monitor = GetStatusMonitor ()) { + using (ProgressMonitor monitor = GetStatusMonitor ()) { var status = repo.GetDirectoryVersionInfo (path, false, true); foreach (var v in status) { if (!v.IsVersioned && files.Contains (v.LocalPath)) @@ -572,12 +579,12 @@ namespace MonoDevelop.VersionControl NotifyFileStatusChanged (new FileUpdateEventArgs (repo, parent.BaseDirectory, true)); } - public static IProgressMonitor GetProgressMonitor (string operation) + public static ProgressMonitor GetProgressMonitor (string operation) { return GetProgressMonitor (operation, VersionControlOperationType.Other); } - public static IProgressMonitor GetProgressMonitor (string operation, VersionControlOperationType op) + public static ProgressMonitor GetProgressMonitor (string operation, VersionControlOperationType op) { IconId icon; switch (op) { @@ -586,7 +593,7 @@ namespace MonoDevelop.VersionControl default: icon = "md-version-control"; break; } - IProgressMonitor monitor = IdeApp.Workbench.ProgressMonitors.GetOutputProgressMonitor ("MonoDevelop.VersionControlOutput", "Version Control", "md-version-control", false, true); + ProgressMonitor monitor = IdeApp.Workbench.ProgressMonitors.GetOutputProgressMonitor ("MonoDevelop.VersionControlOutput", "Version Control", "md-version-control", false, true); Pad outPad = IdeApp.Workbench.ProgressMonitors.GetPadForMonitor (monitor); AggregatedProgressMonitor mon = new AggregatedProgressMonitor (monitor); @@ -594,7 +601,7 @@ namespace MonoDevelop.VersionControl return mon; } - static IProgressMonitor GetStatusMonitor () + static ProgressMonitor GetStatusMonitor () { return IdeApp.Workbench.ProgressMonitors.GetStatusProgressMonitor (GettextCatalog.GetString ("Updating version control repository"), "vc-remote-status", true); } @@ -736,7 +743,7 @@ namespace MonoDevelop.VersionControl } } - public static CommitMessageFormat GetCommitMessageFormat (SolutionItem item) + public static CommitMessageFormat GetCommitMessageFormat (SolutionFolderItem item) { CommitMessageFormat format = new CommitMessageFormat (); format.Style = item.Policies.Get ().CommitMessageStyle; diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlTask.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlTask.cs new file mode 100644 index 0000000000..3ca1b9e2a5 --- /dev/null +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl/VersionControlTask.cs @@ -0,0 +1,79 @@ +using System; +using System.Threading; +using Gtk; + +using MonoDevelop.Core; + +namespace MonoDevelop.VersionControl +{ + internal abstract class VersionControlTask + { + ProgressMonitor tracker; + ThreadNotify threadnotify; + + protected VersionControlOperationType OperationType { get; set; } + + protected abstract string GetDescription(); + + // This occurs in the background. + protected abstract void Run(); + + // This occurs on the main thread when the background + // task is complete. + protected virtual void Finished() + { + } + + protected VersionControlTask() + { + OperationType = VersionControlOperationType.Other; + threadnotify = new ThreadNotify(new ReadyEvent(Wakeup)); + } + + protected ProgressMonitor Monitor { + get { return tracker; } + } + + protected virtual ProgressMonitor CreateProgressMonitor () + { + return VersionControlService.GetProgressMonitor (GetDescription (), OperationType); + } + + public void Start() { + tracker = CreateProgressMonitor (); + tracker.BeginTask(GetDescription(), 1); + ThreadPool.QueueUserWorkItem (BackgroundWorker); + } + + void BackgroundWorker (object state) + { + try { + Run(); + } catch (DllNotFoundException e) { + tracker.ReportError("The operation could not be completed because a shared library is missing: " + e.Message, null); + } catch (Exception e) { + string msg = GettextCatalog.GetString ("Version control operation failed: "); + tracker.ReportError (msg, e); + } finally { + threadnotify.WakeupMain(); + } + } + + public void Wakeup() { + try { + tracker.EndTask(); + tracker.Dispose(); + } finally { + Finished(); + } + } + + protected void Log(string logtext) { + tracker.Log.WriteLine(logtext); + } + + protected void Warn(string logtext) { + tracker.ReportWarning(logtext); + } + } +} diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/VersionControl.addin.xml b/main/src/addins/VersionControl/MonoDevelop.VersionControl/VersionControl.addin.xml index 848fcc2200..18e0f0809b 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/VersionControl.addin.xml +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/VersionControl.addin.xml @@ -164,7 +164,7 @@ defaultHandler = "MonoDevelop.VersionControl.UnlockCommandHandler" description = "Unlock files in the repository, so that other user can change them."/> ListUrl (string url, bool recurse, SvnRevision rev) @@ -292,41 +294,42 @@ namespace SubversionAddinWindows return List (new SvnPathTarget (path, GetRevision (rev)), recurse); } - IEnumerable List (SvnTarget target, bool recurse) + static IEnumerable List (SvnTarget target, bool recurse) { var list = new List (); - var args = new SvnListArgs (); - args.Depth = recurse ? SvnDepth.Infinity : SvnDepth.Children; + var args = new SvnListArgs { + Depth = recurse ? SvnDepth.Infinity : SvnDepth.Children, + }; lock (client) client.List (target, args, delegate (object o, SvnListEventArgs a) { - if (string.IsNullOrEmpty (a.Path)) - return; - var de = new DirectoryEntry (); - de.CreatedRevision = ToBaseRevision (a.Entry.Revision).Rev; - de.HasProps = a.Entry.HasProperties; - de.IsDirectory = a.Entry.NodeKind == SvnNodeKind.Directory; - de.LastAuthor = a.Entry.Author; - de.Name = a.Path; - de.Size = a.Entry.FileSize; - de.Time = a.Entry.Time; - list.Add (de); - }); + if (string.IsNullOrEmpty (a.Path)) + return; + list.Add (new DirectoryEntry { + CreatedRevision = ToBaseRevision (a.Entry.Revision).Rev, + HasProps = a.Entry.HasProperties, + IsDirectory = a.Entry.NodeKind == SvnNodeKind.Directory, + LastAuthor = a.Entry.Author, + Name = a.Path, + Size = a.Entry.FileSize, + Time = a.Entry.Time, + }); + }); return list; } public override IEnumerable Log (Repository repo, FilePath path, SvnRevision revisionStart, SvnRevision revisionEnd) { var list = new List (); - var args = new SvnLogArgs (); - args.Range = new SvnRevisionRange (GetRevision (revisionStart), GetRevision (revisionEnd)); + var args = new SvnLogArgs { + Range = new SvnRevisionRange (GetRevision (revisionStart), GetRevision (revisionEnd)), + }; lock (client) client.Log (path, args, delegate (object o, SvnLogEventArgs a) { var paths = new List (); foreach (SvnChangeItem item in a.ChangedPaths) { paths.Add (new RevisionPath (item.Path, ConvertRevisionAction (item.Action), "")); } - var r = new SvnRevision (repo, (int) a.Revision, a.Time, a.Author, a.LogMessage, paths.ToArray ()); - list.Add (r); + list.Add (new SvnRevision (repo, (int) a.Revision, a.Time, a.Author, a.LogMessage, paths.ToArray ())); }); return list; } @@ -342,24 +345,26 @@ namespace SubversionAddinWindows return RevisionAction.Other; } - public override void Mkdir (string[] paths, string message, IProgressMonitor monitor) + public override void Mkdir (string[] paths, string message, ProgressMonitor monitor) { - var args = new SvnCreateDirectoryArgs (); - args.CreateParents = true; + var args = new SvnCreateDirectoryArgs { + CreateParents = true, + LogMessage = message, + }; BindMonitor (monitor); var uris = new List (); foreach (string path in paths) uris.Add (new Uri (path)); - args.LogMessage = message; lock (client) client.RemoteCreateDirectories (uris, args); } - public override void Move (FilePath srcPath, FilePath destPath, SvnRevision rev, bool force, IProgressMonitor monitor) + public override void Move (FilePath srcPath, FilePath destPath, SvnRevision rev, bool force, ProgressMonitor monitor) { - var args = new SvnMoveArgs (); + var args = new SvnMoveArgs { + Force = force, + }; BindMonitor (monitor); - args.Force = force; lock (client) client.Move (srcPath, destPath, args); } @@ -368,27 +373,30 @@ namespace SubversionAddinWindows { var t1 = new SvnPathTarget (path1, GetRevision (revision1)); var t2 = new SvnPathTarget (path2, GetRevision (revision2)); - var args = new SvnDiffArgs (); - args.Depth = recursive ? SvnDepth.Infinity : SvnDepth.Children; - var ms = new MemoryStream (); - lock (client) - client.Diff (t1, t2, args, ms); - ms.Position = 0; - using (var sr = new StreamReader (ms)) { - return sr.ReadToEnd (); + var args = new SvnDiffArgs { + Depth = recursive ? SvnDepth.Infinity : SvnDepth.Children, + }; + using (var ms = new MemoryStream ()) { + lock (client) + client.Diff (t1, t2, args, ms); + ms.Position = 0; + using (var sr = new StreamReader (ms)) { + return sr.ReadToEnd (); + } } } - public override void Revert (FilePath[] paths, bool recurse, IProgressMonitor monitor) + public override void Revert (FilePath[] paths, bool recurse, ProgressMonitor monitor) { - var args = new SvnRevertArgs (); + var args = new SvnRevertArgs { + Depth = recurse ? SvnDepth.Infinity : SvnDepth.Children, + }; BindMonitor (monitor); - args.Depth = recurse ? SvnDepth.Infinity : SvnDepth.Children; lock (client) client.Revert (paths.ToStringArray (), args); } - public override void RevertRevision (FilePath path, Revision revision, IProgressMonitor monitor) + public override void RevertRevision (FilePath path, Revision revision, ProgressMonitor monitor) { var args = new SvnMergeArgs (); BindMonitor (monitor); @@ -398,7 +406,7 @@ namespace SubversionAddinWindows client.Merge (path, new SvnPathTarget (path), range, args); } - public override void RevertToRevision (FilePath path, Revision revision, IProgressMonitor monitor) + public override void RevertToRevision (FilePath path, Revision revision, ProgressMonitor monitor) { var args = new SvnMergeArgs (); BindMonitor (monitor); @@ -410,11 +418,12 @@ namespace SubversionAddinWindows public override IEnumerable Status (Repository repo, FilePath path, SvnRevision revision, bool descendDirs, bool changedItemsOnly, bool remoteStatus) { var list = new List (); - var args = new SvnStatusArgs (); - args.Revision = GetRevision (revision); - args.Depth = descendDirs ? SvnDepth.Infinity : SvnDepth.Children; - args.RetrieveAllEntries = !changedItemsOnly; - args.RetrieveRemoteStatus = remoteStatus; + var args = new SvnStatusArgs { + Revision = GetRevision (revision), + Depth = descendDirs ? SvnDepth.Infinity : SvnDepth.Children, + RetrieveAllEntries = !changedItemsOnly, + RetrieveRemoteStatus = remoteStatus, + }; lock (client) { try { client.Status (path, args, (o, a) => list.Add (CreateVersionInfo (repo, a))); @@ -497,31 +506,35 @@ namespace SubversionAddinWindows return VersionStatus.Unversioned; } - public override void Lock (IProgressMonitor monitor, string comment, bool stealLock, params FilePath[] paths) + public override void Lock (ProgressMonitor monitor, string comment, bool stealLock, params FilePath[] paths) { - var args = new SvnLockArgs (); + var args = new SvnLockArgs { + Comment = comment, + StealLock = stealLock, + }; BindMonitor (monitor); - args.Comment = comment; - args.StealLock = stealLock; lock (client) client.Lock (paths.ToStringArray (), args); } - public override void Unlock (IProgressMonitor monitor, bool breakLock, params FilePath[] paths) + public override void Unlock (ProgressMonitor monitor, bool breakLock, params FilePath[] paths) { - var args = new SvnUnlockArgs (); + var args = new SvnUnlockArgs { + BreakLock = breakLock, + }; BindMonitor (monitor); - args.BreakLock = breakLock; lock (client) client.Unlock (paths.ToStringArray (), args); } - public override void Update (FilePath path, bool recurse, IProgressMonitor monitor) + public override void Update (FilePath path, bool recurse, ProgressMonitor monitor) { - var args = new SvnUpdateArgs (); + var args = new SvnUpdateArgs { + Depth = recurse ? SvnDepth.Infinity : SvnDepth.Children, + }; BindMonitor (monitor); - args.Depth = recurse ? SvnDepth.Infinity : SvnDepth.Children; - client.Update (path, args); + lock (client) + client.Update (path, args); } public override void Ignore (FilePath[] paths) @@ -556,22 +569,29 @@ namespace SubversionAddinWindows throw new ArgumentNullException (); var target = new SvnPathTarget (file, SharpSvn.SvnRevision.Base); - var data = new MemoryStream (); int numAnnotations = 0; - client.Write (target, data); - - using (var reader = new StreamReader (data)) { - reader.BaseStream.Seek (0, SeekOrigin.Begin); - while (reader.ReadLine () != null) - numAnnotations++; + using (var data = new MemoryStream ()) { + lock (client) + client.Write (target, data); + + using (var reader = new StreamReader (data)) { + reader.BaseStream.Seek (0, SeekOrigin.Begin); + while (reader.ReadLine () != null) + numAnnotations++; + } } System.Collections.ObjectModel.Collection list; - var args = new SvnBlameArgs (); - args.Start = GetRevision (revStart); - args.End = GetRevision (revEnd); + var args = new SvnBlameArgs { + Start = GetRevision (revStart), + End = GetRevision (revEnd), + }; - if (client.GetBlame (target, args, out list)) { + bool success; + lock (client) { + success = client.GetBlame (target, args, out list); + } + if (success) { var annotations = new Annotation [numAnnotations]; foreach (var annotation in list) { if (annotation.LineNumber < annotations.Length) @@ -633,7 +653,7 @@ namespace SubversionAddinWindows public int Seconds; } - void BindMonitor (IProgressMonitor monitor) + void BindMonitor (ProgressMonitor monitor) { notifyData = new NotifData (); progressData = new ProgressData (); @@ -648,7 +668,7 @@ namespace SubversionAddinWindows return String.Format ("{0:0.00} MBytes", kbytes / 1024.0); } - static void ProgressWork (SvnProgressEventArgs e, ProgressData data, IProgressMonitor monitor) + static void ProgressWork (SvnProgressEventArgs e, ProgressData data, ProgressMonitor monitor) { if (monitor == null) return; @@ -685,7 +705,7 @@ namespace SubversionAddinWindows data.LogTimer.Start (); } - static void Notify (SvnNotifyEventArgs e, NotifData notifData, IProgressMonitor monitor) + static void Notify (SvnNotifyEventArgs e, NotifData notifData, ProgressMonitor monitor) { string actiondesc; string file = e.Path; diff --git a/main/src/addins/VersionControl/Subversion.Win32/VersionControl.Subversion.Win32.csproj b/main/src/addins/VersionControl/Subversion.Win32/VersionControl.Subversion.Win32.csproj index d635660a89..5a78c6eb76 100644 --- a/main/src/addins/VersionControl/Subversion.Win32/VersionControl.Subversion.Win32.csproj +++ b/main/src/addins/VersionControl/Subversion.Win32/VersionControl.Subversion.Win32.csproj @@ -59,8 +59,11 @@ - - ..\..\..\..\external\sharpsvn-binary\SharpSvn.dll + + ..\..\..\..\packages\SharpSvn.1.8-x86.1.8010.3345.53\lib\net40\SharpSvn.dll + + + ..\..\..\..\packages\SharpSvn.1.8-x86.1.8010.3345.53\lib\net40\SharpSvn.UI.dll @@ -89,13 +92,13 @@ - {7525BB88-6142-4A26-93B9-A30C6983390A} @@ -124,13 +127,14 @@ - + SharpPlink-Win32.svnExe PreserveNewest - + SharpSvn-DB44-20-win32.svnDll PreserveNewest + \ No newline at end of file diff --git a/main/src/addins/VersionControl/Subversion.Win32/packages.config b/main/src/addins/VersionControl/Subversion.Win32/packages.config new file mode 100644 index 0000000000..eead751a62 --- /dev/null +++ b/main/src/addins/VersionControl/Subversion.Win32/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/main/src/addins/WindowsPlatform/WindowsPlatform/Dialogs/OpenFileDialogHandler.cs b/main/src/addins/WindowsPlatform/WindowsPlatform/Dialogs/OpenFileDialogHandler.cs index 068c0f69e6..5c548b0128 100644 --- a/main/src/addins/WindowsPlatform/WindowsPlatform/Dialogs/OpenFileDialogHandler.cs +++ b/main/src/addins/WindowsPlatform/WindowsPlatform/Dialogs/OpenFileDialogHandler.cs @@ -47,8 +47,6 @@ namespace MonoDevelop.Platform { public class OpenFileDialogHandler : IOpenFileDialogHandler { - static int[] encodings; - public bool Run (OpenFileDialogData data) { var parent = data.TransientFor ?? MessageService.RootWindow; @@ -96,6 +94,7 @@ namespace MonoDevelop.Platform dialog.Controls.Add (group); if (IdeApp.Workspace.IsOpen) { + viewerCombo.SelectedIndexChanged += (o, e) => closeSolution.Visible = ((ViewerComboItem)viewerCombo.Items[viewerCombo.SelectedIndex]).Viewer == null; var group2 = new CommonFileDialogGroupBox (); // "Close current workspace" is too long and splits the text on 2 lines. @@ -130,7 +129,9 @@ namespace MonoDevelop.Platform if (viewerCombo != null) { if (closeSolution != null) data.CloseCurrentWorkspace = closeSolution.Visible && closeSolution.IsChecked; - data.SelectedViewer = ((ViewerComboItem)viewerCombo.Items [viewerCombo.SelectedIndex]).Viewer; + int index = viewerCombo.SelectedIndex; + if (index != -1) + data.SelectedViewer = ((ViewerComboItem)viewerCombo.Items [index]).Viewer; } return true; @@ -173,39 +174,35 @@ namespace MonoDevelop.Platform int i = 0; if (showAutoDetected) { - combo.Items.Add (new EncodingComboItem (-1, GettextCatalog.GetString ("Auto Detected"))); + combo.Items.Add (new EncodingComboItem (null, GettextCatalog.GetString ("Auto Detected"))); combo.SelectedIndex = 0; i = 1; } - encodings = SelectedEncodings.ConversionEncodings; - if (encodings == null || encodings.Length == 0) - encodings = SelectedEncodings.DefaultEncodings; - int j = 1; foreach (var e in TextEncoding.ConversionEncodings) { - combo.Items.Add (new EncodingComboItem (j++, string.Format ("{0} ({1})", e.Name, e.Id))); + combo.Items.Add (new EncodingComboItem (Encoding.GetEncoding (e.CodePage), string.Format ("{0} ({1})", e.Name, e.Id))); if (selectedEncoding != null && e.CodePage == selectedEncoding.WindowsCodePage) combo.SelectedIndex = i; i++; } if (combo.SelectedIndex == -1) combo.SelectedIndex = 0; - combo.Items.Add (new EncodingComboItem (-1, GettextCatalog.GetString ("Add or Remove..."))); + combo.Items.Add (new EncodingComboItem (null, GettextCatalog.GetString ("Add or Remove..."))); } class EncodingComboItem : CommonFileDialogComboBoxItem { - int tag; + Encoding encoding; - public EncodingComboItem (int tag, string label) : base (label) + public EncodingComboItem (Encoding encoding, string label) : base (label) { - this.tag = tag; + this.encoding = encoding; } public Encoding Encoding { get { - return tag <= 0 ? null : Encoding.GetEncoding (encodings [tag - 1]); + return encoding; } } } diff --git a/main/src/addins/WindowsPlatform/WindowsPlatform/Enums.cs b/main/src/addins/WindowsPlatform/WindowsPlatform/Enums.cs deleted file mode 100644 index 489c9def44..0000000000 --- a/main/src/addins/WindowsPlatform/WindowsPlatform/Enums.cs +++ /dev/null @@ -1,573 +0,0 @@ -// Copyright (c) 2006, Gustavo Franco -// Email: gustavo_franco@hotmail.com -// All rights reserved. - -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: - -// Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. - -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY -// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR -// PURPOSE. IT CAN BE DISTRIBUTED FREE OF CHARGE AS LONG AS THIS HEADER -// REMAINS UNCHANGED. - -using System; -using System.Collections.Generic; -using System.Text; -using System.Runtime.InteropServices; - -namespace CustomControls.OS -{ - #region SWP_Flags - [Flags] - public enum SWP_Flags - { - SWP_NOSIZE = 0x0001, - SWP_NOMOVE = 0x0002, - SWP_NOZORDER = 0x0004, - SWP_NOACTIVATE = 0x0010, - SWP_FRAMECHANGED = 0x0020, /* The frame changed: send WM_NCCALCSIZE */ - SWP_SHOWWINDOW = 0x0040, - SWP_HIDEWINDOW = 0x0080, - SWP_NOOWNERZORDER = 0x0200, /* Don't do owner Z ordering */ - - SWP_DRAWFRAME = SWP_FRAMECHANGED, - SWP_NOREPOSITION = SWP_NOOWNERZORDER - } - #endregion - - #region DialogChangeStatus - public enum DialogChangeStatus : long - { - CDN_FIRST = 0xFFFFFDA7, - CDN_INITDONE = (CDN_FIRST - 0x0000), - CDN_SELCHANGE = (CDN_FIRST - 0x0001), - CDN_FOLDERCHANGE = (CDN_FIRST - 0x0002), - CDN_SHAREVIOLATION = (CDN_FIRST - 0x0003), - CDN_HELP = (CDN_FIRST - 0x0004), - CDN_FILEOK = (CDN_FIRST - 0x0005), - CDN_TYPECHANGE = (CDN_FIRST - 0x0006), - } - #endregion - - #region DialogChangeProperties - public enum DialogChangeProperties - { - CDM_FIRST = (0x400 + 100), - CDM_GETSPEC = (CDM_FIRST + 0x0000), - CDM_GETFILEPATH = (CDM_FIRST + 0x0001), - CDM_GETFOLDERPATH = (CDM_FIRST + 0x0002), - CDM_GETFOLDERIDLIST = (CDM_FIRST + 0x0003), - CDM_SETCONTROLTEXT = (CDM_FIRST + 0x0004), - CDM_HIDECONTROL = (CDM_FIRST + 0x0005), - CDM_SETDEFEXT = (CDM_FIRST + 0x0006) - } - #endregion - - #region ImeNotify - [Author("Franco, Gustavo")] - public enum ImeNotify - { - IMN_CLOSESTATUSWINDOW = 0x0001, - IMN_OPENSTATUSWINDOW = 0x0002, - IMN_CHANGECANDIDATE = 0x0003, - IMN_CLOSECANDIDATE = 0x0004, - IMN_OPENCANDIDATE = 0x0005, - IMN_SETCONVERSIONMODE = 0x0006, - IMN_SETSENTENCEMODE = 0x0007, - IMN_SETOPENSTATUS = 0x0008, - IMN_SETCANDIDATEPOS = 0x0009, - IMN_SETCOMPOSITIONFONT = 0x000A, - IMN_SETCOMPOSITIONWINDOW = 0x000B, - IMN_SETSTATUSWINDOWPOS = 0x000C, - IMN_GUIDELINE = 0x000D, - IMN_PRIVATE = 0x000E - } - #endregion - - #region FolderViewMode - [Author("Franco, Gustavo")] - public enum FolderViewMode - { - Default = 0x7028, - Icon = Default + 1, - SmallIcon = Default + 2, - List = Default + 3, - Details = Default + 4, - Thumbnails = Default + 5, - Title = Default + 6, - Thumbstrip = Default + 7, - } - #endregion - - #region Enum DialogViewProperty - [Author("Franco, Gustavo")] - public enum DefaultViewType - { - Icons = 0x7029, - List = 0x702b, - Details = 0x702c, - Thumbnails = 0x702d, - Tiles = 0x702e, - } - #endregion - - #region ButtonStyle - [Author("Franco, Gustavo")] - public enum ButtonStyle : long - { - BS_PUSHBUTTON = 0x00000000, - BS_DEFPUSHBUTTON = 0x00000001, - BS_CHECKBOX = 0x00000002, - BS_AUTOCHECKBOX = 0x00000003, - BS_RADIOBUTTON = 0x00000004, - BS_3STATE = 0x00000005, - BS_AUTO3STATE = 0x00000006, - BS_GROUPBOX = 0x00000007, - BS_USERBUTTON = 0x00000008, - BS_AUTORADIOBUTTON= 0x00000009, - BS_PUSHBOX = 0x0000000A, - BS_OWNERDRAW = 0x0000000B, - BS_TYPEMASK = 0x0000000F, - BS_LEFTTEXT = 0x00000020, - BS_TEXT = 0x00000000, - BS_ICON = 0x00000040, - BS_BITMAP = 0x00000080, - BS_LEFT = 0x00000100, - BS_RIGHT = 0x00000200, - BS_CENTER = 0x00000300, - BS_TOP = 0x00000400, - BS_BOTTOM = 0x00000800, - BS_VCENTER = 0x00000C00, - BS_PUSHLIKE = 0x00001000, - BS_MULTILINE = 0x00002000, - BS_NOTIFY = 0x00004000, - BS_FLAT = 0x00008000, - BS_RIGHTBUTTON = BS_LEFTTEXT - } - #endregion - - #region ZOrderPos - [Author("Franco, Gustavo")] - public enum ZOrderPos - { - HWND_TOP = 0, - HWND_BOTTOM = 1, - HWND_TOPMOST = -1, - HWND_NOTOPMOST = -2 - } - #endregion - - #region Static Control Styles - [Author("Franco, Gustavo")] - public enum StaticControlStyles : long - { - SS_LEFT = 0x00000000, - SS_CENTER = 0x00000001, - SS_RIGHT = 0x00000002, - SS_ICON = 0x00000003, - SS_BLACKRECT = 0x00000004, - SS_GRAYRECT = 0x00000005, - SS_WHITERECT = 0x00000006, - SS_BLACKFRAME = 0x00000007, - SS_GRAYFRAME = 0x00000008, - SS_WHITEFRAME = 0x00000009, - SS_USERITEM = 0x0000000A, - SS_SIMPLE = 0x0000000B, - SS_LEFTNOWORDWRAP = 0x0000000C, - SS_OWNERDRAW = 0x0000000D, - SS_BITMAP = 0x0000000E, - SS_ENHMETAFILE = 0x0000000F, - SS_ETCHEDHORZ = 0x00000010, - SS_ETCHEDVERT = 0x00000011, - SS_ETCHEDFRAME = 0x00000012, - SS_TYPEMASK = 0x0000001F, - SS_REALSIZECONTROL = 0x00000040, - SS_NOPREFIX = 0x00000080, /* Don't do "&" character translation */ - SS_NOTIFY = 0x00000100, - SS_CENTERIMAGE = 0x00000200, - SS_RIGHTJUST = 0x00000400, - SS_REALSIZEIMAGE = 0x00000800, - SS_SUNKEN = 0x00001000, - SS_EDITCONTROL = 0x00002000, - SS_ENDELLIPSIS = 0x00004000, - SS_PATHELLIPSIS = 0x00008000, - SS_WORDELLIPSIS = 0x0000C000, - SS_ELLIPSISMASK = 0x0000C000 - } - #endregion - - #region Combo Box styles - [Author("Franco, Gustavo")] - public enum ComboBoxStyles : long - { - CBS_SIMPLE = 0x0001, - CBS_DROPDOWN = 0x0002, - CBS_DROPDOWNLIST = 0x0003, - CBS_OWNERDRAWFIXED = 0x0010, - CBS_OWNERDRAWVARIABLE = 0x0020, - CBS_AUTOHSCROLL = 0x0040, - CBS_OEMCONVERT = 0x0080, - CBS_SORT = 0x0100, - CBS_HASSTRINGS = 0x0200, - CBS_NOINTEGRALHEIGHT = 0x0400, - CBS_DISABLENOSCROLL = 0x0800, - CBS_UPPERCASE = 0x2000, - CBS_LOWERCASE = 0x4000 - } - #endregion - - #region Window Styles - [Author("Franco, Gustavo")] - public enum WindowStyles : long - { - WS_OVERLAPPED = 0x00000000, - WS_POPUP = 0x80000000, - WS_CHILD = 0x40000000, - WS_MINIMIZE = 0x20000000, - WS_VISIBLE = 0x10000000, - WS_DISABLED = 0x08000000, - WS_CLIPSIBLINGS = 0x04000000, - WS_CLIPCHILDREN = 0x02000000, - WS_MAXIMIZE = 0x01000000, - WS_CAPTION = 0x00C00000, - WS_BORDER = 0x00800000, - WS_DLGFRAME = 0x00400000, - WS_VSCROLL = 0x00200000, - WS_HSCROLL = 0x00100000, - WS_SYSMENU = 0x00080000, - WS_THICKFRAME = 0x00040000, - WS_GROUP = 0x00020000, - WS_TABSTOP = 0x00010000, - WS_MINIMIZEBOX = 0x00020000, - WS_MAXIMIZEBOX = 0x00010000, - WS_TILED = 0x00000000, - WS_ICONIC = 0x20000000, - WS_SIZEBOX = 0x00040000, - WS_POPUPWINDOW = 0x80880000, - WS_OVERLAPPEDWINDOW = 0x00CF0000, - WS_TILEDWINDOW = 0x00CF0000, - WS_CHILDWINDOW = 0x40000000 - } - #endregion - - #region Window Extended Styles - [Author("Franco, Gustavo")] - [Flags] - public enum WindowExStyles - { - WS_EX_DLGMODALFRAME = 0x00000001, - WS_EX_NOPARENTNOTIFY = 0x00000004, - WS_EX_TOPMOST = 0x00000008, - WS_EX_ACCEPTFILES = 0x00000010, - WS_EX_TRANSPARENT = 0x00000020, - WS_EX_MDICHILD = 0x00000040, - WS_EX_TOOLWINDOW = 0x00000080, - WS_EX_WINDOWEDGE = 0x00000100, - WS_EX_CLIENTEDGE = 0x00000200, - WS_EX_CONTEXTHELP = 0x00000400, - WS_EX_RIGHT = 0x00001000, - WS_EX_LEFT = 0x00000000, - WS_EX_RTLREADING = 0x00002000, - WS_EX_LTRREADING = 0x00000000, - WS_EX_LEFTSCROLLBAR = 0x00004000, - WS_EX_RIGHTSCROLLBAR = 0x00000000, - WS_EX_CONTROLPARENT = 0x00010000, - WS_EX_STATICEDGE = 0x00020000, - WS_EX_APPWINDOW = 0x00040000, - WS_EX_OVERLAPPEDWINDOW = 0x00000300, - WS_EX_PALETTEWINDOW = 0x00000188, - WS_EX_LAYERED = 0x00080000 - } - #endregion - - #region ChildFromPointFlags - [Author("Franco, Gustavo")] - public enum ChildFromPointFlags - { - CWP_ALL = 0x0000, - CWP_SKIPINVISIBLE = 0x0001, - CWP_SKIPDISABLED = 0x0002, - CWP_SKIPTRANSPARENT = 0x0004 - } - #endregion - - #region HitTest - [Author("Franco, Gustavo")] - public enum HitTest - { - HTERROR = (-2), - HTTRANSPARENT = (-1), - HTNOWHERE = 0, - HTCLIENT = 1, - HTCAPTION = 2, - HTSYSMENU = 3, - HTGROWBOX = 4, - HTSIZE = HTGROWBOX, - HTMENU = 5, - HTHSCROLL = 6, - HTVSCROLL = 7, - HTMINBUTTON = 8, - HTMAXBUTTON = 9, - HTLEFT = 10, - HTRIGHT = 11, - HTTOP = 12, - HTTOPLEFT = 13, - HTTOPRIGHT = 14, - HTBOTTOM = 15, - HTBOTTOMLEFT = 16, - HTBOTTOMRIGHT = 17, - HTBORDER = 18, - HTREDUCE = HTMINBUTTON, - HTZOOM = HTMAXBUTTON, - HTSIZEFIRST = HTLEFT, - HTSIZELAST = HTBOTTOMRIGHT, - HTOBJECT = 19, - HTCLOSE = 20, - HTHELP = 21 - } - #endregion - - #region Windows Messages - [Author("Franco, Gustavo")] - public enum Msg - { - WM_NULL = 0x0000, - WM_CREATE = 0x0001, - WM_DESTROY = 0x0002, - WM_MOVE = 0x0003, - WM_SIZE = 0x0005, - WM_ACTIVATE = 0x0006, - WM_SETFOCUS = 0x0007, - WM_KILLFOCUS = 0x0008, - WM_ENABLE = 0x000A, - WM_SETREDRAW = 0x000B, - WM_SETTEXT = 0x000C, - WM_GETTEXT = 0x000D, - WM_GETTEXTLENGTH = 0x000E, - WM_PAINT = 0x000F, - WM_CLOSE = 0x0010, - WM_QUERYENDSESSION = 0x0011, - WM_QUIT = 0x0012, - WM_QUERYOPEN = 0x0013, - WM_ERASEBKGND = 0x0014, - WM_SYSCOLORCHANGE = 0x0015, - WM_ENDSESSION = 0x0016, - WM_SHOWWINDOW = 0x0018, - WM_CTLCOLOR = 0x0019, - WM_WININICHANGE = 0x001A, - WM_SETTINGCHANGE = 0x001A, - WM_DEVMODECHANGE = 0x001B, - WM_ACTIVATEAPP = 0x001C, - WM_FONTCHANGE = 0x001D, - WM_TIMECHANGE = 0x001E, - WM_CANCELMODE = 0x001F, - WM_SETCURSOR = 0x0020, - WM_MOUSEACTIVATE = 0x0021, - WM_CHILDACTIVATE = 0x0022, - WM_QUEUESYNC = 0x0023, - WM_GETMINMAXINFO = 0x0024, - WM_PAINTICON = 0x0026, - WM_ICONERASEBKGND = 0x0027, - WM_NEXTDLGCTL = 0x0028, - WM_SPOOLERSTATUS = 0x002A, - WM_DRAWITEM = 0x002B, - WM_MEASUREITEM = 0x002C, - WM_DELETEITEM = 0x002D, - WM_VKEYTOITEM = 0x002E, - WM_CHARTOITEM = 0x002F, - WM_SETFONT = 0x0030, - WM_GETFONT = 0x0031, - WM_SETHOTKEY = 0x0032, - WM_GETHOTKEY = 0x0033, - WM_QUERYDRAGICON = 0x0037, - WM_COMPAREITEM = 0x0039, - WM_GETOBJECT = 0x003D, - WM_COMPACTING = 0x0041, - WM_COMMNOTIFY = 0x0044 , - WM_WINDOWPOSCHANGING = 0x0046, - WM_WINDOWPOSCHANGED = 0x0047, - WM_POWER = 0x0048, - WM_COPYDATA = 0x004A, - WM_CANCELJOURNAL = 0x004B, - WM_NOTIFY = 0x004E, - WM_INPUTLANGCHANGEREQUEST = 0x0050, - WM_INPUTLANGCHANGE = 0x0051, - WM_TCARD = 0x0052, - WM_HELP = 0x0053, - WM_USERCHANGED = 0x0054, - WM_NOTIFYFORMAT = 0x0055, - WM_CONTEXTMENU = 0x007B, - WM_STYLECHANGING = 0x007C, - WM_STYLECHANGED = 0x007D, - WM_DISPLAYCHANGE = 0x007E, - WM_GETICON = 0x007F, - WM_SETICON = 0x0080, - WM_NCCREATE = 0x0081, - WM_NCDESTROY = 0x0082, - WM_NCCALCSIZE = 0x0083, - WM_NCHITTEST = 0x0084, - WM_NCPAINT = 0x0085, - WM_NCACTIVATE = 0x0086, - WM_GETDLGCODE = 0x0087, - WM_SYNCPAINT = 0x0088, - WM_NCMOUSEMOVE = 0x00A0, - WM_NCLBUTTONDOWN = 0x00A1, - WM_NCLBUTTONUP = 0x00A2, - WM_NCLBUTTONDBLCLK = 0x00A3, - WM_NCRBUTTONDOWN = 0x00A4, - WM_NCRBUTTONUP = 0x00A5, - WM_NCRBUTTONDBLCLK = 0x00A6, - WM_NCMBUTTONDOWN = 0x00A7, - WM_NCMBUTTONUP = 0x00A8, - WM_NCMBUTTONDBLCLK = 0x00A9, - WM_NCXBUTTONDOWN = 0x00AB, - WM_NCXBUTTONUP = 0x00AC, - WM_NCXBUTTONDBLCLK = 0x00AD, - WM_KEYDOWN = 0x0100, - WM_KEYUP = 0x0101, - WM_CHAR = 0x0102, - WM_DEADCHAR = 0x0103, - WM_SYSKEYDOWN = 0x0104, - WM_SYSKEYUP = 0x0105, - WM_SYSCHAR = 0x0106, - WM_SYSDEADCHAR = 0x0107, - WM_KEYLAST = 0x0108, - WM_IME_STARTCOMPOSITION = 0x010D, - WM_IME_ENDCOMPOSITION = 0x010E, - WM_IME_COMPOSITION = 0x010F, - WM_IME_KEYLAST = 0x010F, - WM_INITDIALOG = 0x0110, - WM_COMMAND = 0x0111, - WM_SYSCOMMAND = 0x0112, - WM_TIMER = 0x0113, - WM_HSCROLL = 0x0114, - WM_VSCROLL = 0x0115, - WM_INITMENU = 0x0116, - WM_INITMENUPOPUP = 0x0117, - WM_MENUSELECT = 0x011F, - WM_MENUCHAR = 0x0120, - WM_ENTERIDLE = 0x0121, - WM_MENURBUTTONUP = 0x0122, - WM_MENUDRAG = 0x0123, - WM_MENUGETOBJECT = 0x0124, - WM_UNINITMENUPOPUP = 0x0125, - WM_MENUCOMMAND = 0x0126, - WM_CTLCOLORMSGBOX = 0x0132, - WM_CTLCOLOREDIT = 0x0133, - WM_CTLCOLORLISTBOX = 0x0134, - WM_CTLCOLORBTN = 0x0135, - WM_CTLCOLORDLG = 0x0136, - WM_CTLCOLORSCROLLBAR = 0x0137, - WM_CTLCOLORSTATIC = 0x0138, - WM_MOUSEMOVE = 0x0200, - WM_LBUTTONDOWN = 0x0201, - WM_LBUTTONUP = 0x0202, - WM_LBUTTONDBLCLK = 0x0203, - WM_RBUTTONDOWN = 0x0204, - WM_RBUTTONUP = 0x0205, - WM_RBUTTONDBLCLK = 0x0206, - WM_MBUTTONDOWN = 0x0207, - WM_MBUTTONUP = 0x0208, - WM_MBUTTONDBLCLK = 0x0209, - WM_MOUSEWHEEL = 0x020A, - WM_XBUTTONDOWN = 0x020B, - WM_XBUTTONUP = 0x020C, - WM_XBUTTONDBLCLK = 0x020D, - WM_PARENTNOTIFY = 0x0210, - WM_ENTERMENULOOP = 0x0211, - WM_EXITMENULOOP = 0x0212, - WM_NEXTMENU = 0x0213, - WM_SIZING = 0x0214, - WM_CAPTURECHANGED = 0x0215, - WM_MOVING = 0x0216, - WM_DEVICECHANGE = 0x0219, - WM_MDICREATE = 0x0220, - WM_MDIDESTROY = 0x0221, - WM_MDIACTIVATE = 0x0222, - WM_MDIRESTORE = 0x0223, - WM_MDINEXT = 0x0224, - WM_MDIMAXIMIZE = 0x0225, - WM_MDITILE = 0x0226, - WM_MDICASCADE = 0x0227, - WM_MDIICONARRANGE = 0x0228, - WM_MDIGETACTIVE = 0x0229, - WM_MDISETMENU = 0x0230, - WM_ENTERSIZEMOVE = 0x0231, - WM_EXITSIZEMOVE = 0x0232, - WM_DROPFILES = 0x0233, - WM_MDIREFRESHMENU = 0x0234, - WM_IME_SETCONTEXT = 0x0281, - WM_IME_NOTIFY = 0x0282, - WM_IME_CONTROL = 0x0283, - WM_IME_COMPOSITIONFULL = 0x0284, - WM_IME_SELECT = 0x0285, - WM_IME_CHAR = 0x0286, - WM_IME_REQUEST = 0x0288, - WM_IME_KEYDOWN = 0x0290, - WM_IME_KEYUP = 0x0291, - WM_MOUSEHOVER = 0x02A1, - WM_MOUSELEAVE = 0x02A3, - WM_CUT = 0x0300, - WM_COPY = 0x0301, - WM_PASTE = 0x0302, - WM_CLEAR = 0x0303, - WM_UNDO = 0x0304, - WM_RENDERFORMAT = 0x0305, - WM_RENDERALLFORMATS = 0x0306, - WM_DESTROYCLIPBOARD = 0x0307, - WM_DRAWCLIPBOARD = 0x0308, - WM_PAINTCLIPBOARD = 0x0309, - WM_VSCROLLCLIPBOARD = 0x030A, - WM_SIZECLIPBOARD = 0x030B, - WM_ASKCBFORMATNAME = 0x030C, - WM_CHANGECBCHAIN = 0x030D, - WM_HSCROLLCLIPBOARD = 0x030E, - WM_QUERYNEWPALETTE = 0x030F, - WM_PALETTEISCHANGING = 0x0310, - WM_PALETTECHANGED = 0x0311, - WM_HOTKEY = 0x0312, - WM_PRINT = 0x0317, - WM_PRINTCLIENT = 0x0318, - WM_THEME_CHANGED = 0x031A, - WM_HANDHELDFIRST = 0x0358, - WM_HANDHELDLAST = 0x035F, - WM_AFXFIRST = 0x0360, - WM_AFXLAST = 0x037F, - WM_PENWINFIRST = 0x0380, - WM_PENWINLAST = 0x038F, - WM_APP = 0x8000, - WM_USER = 0x0400, - WM_REFLECT = WM_USER + 0x1c00 - } - #endregion - - #region SetWindowPosFlags - [Author("Franco, Gustavo")] - [Flags] - public enum SetWindowPosFlags - { - SWP_NOSIZE = 0x0001, - SWP_NOMOVE = 0x0002, - SWP_NOZORDER = 0x0004, - SWP_NOREDRAW = 0x0008, - SWP_NOACTIVATE = 0x0010, - SWP_FRAMECHANGED = 0x0020, - SWP_SHOWWINDOW = 0x0040, - SWP_HIDEWINDOW = 0x0080, - SWP_NOCOPYBITS = 0x0100, - SWP_NOOWNERZORDER = 0x0200, - SWP_NOSENDCHANGING = 0x0400, - SWP_DRAWFRAME = 0x0020, - SWP_NOREPOSITION = 0x0200, - SWP_DEFERERASE = 0x2000, - SWP_ASYNCWINDOWPOS = 0x4000 - } - #endregion -} diff --git a/main/src/addins/WindowsPlatform/WindowsPlatform/JumpList.cs b/main/src/addins/WindowsPlatform/WindowsPlatform/JumpList.cs index 3a3a442a92..d2baeebf3e 100644 --- a/main/src/addins/WindowsPlatform/WindowsPlatform/JumpList.cs +++ b/main/src/addins/WindowsPlatform/WindowsPlatform/JumpList.cs @@ -128,7 +128,7 @@ namespace MonoDevelop.Platform continue; } - RegistryKey openWithKey = Registry.ClassesRoot.OpenSubKey (Path.Combine (subkey, "OpenWithProgIds")); + RegistryKey openWithKey = Registry.ClassesRoot.OpenSubKey (Path.Combine (subkey, "OpenWithProgids")); if (openWithKey == null) { continue; } diff --git a/main/src/addins/WindowsPlatform/WindowsPlatform/Win32.cs b/main/src/addins/WindowsPlatform/WindowsPlatform/Win32.cs index d6a21f261e..b6476ea979 100644 --- a/main/src/addins/WindowsPlatform/WindowsPlatform/Win32.cs +++ b/main/src/addins/WindowsPlatform/WindowsPlatform/Win32.cs @@ -24,100 +24,16 @@ using System.Runtime.InteropServices; namespace CustomControls.OS { - [Author("Franco, Gustavo")] public static class Win32 { - public const uint SHGFI_ICON = 0x100; - public const uint SHGFI_LARGEICON = 0x0; // 'Large icon - public const uint SHGFI_SMALLICON = 0x1; // 'Small icon - public const uint SHGFI_ICONLOCATION = 0x1000; - public const uint SHGFI_TYPENAME = 0x400; - public const uint SHGFI_USEFILEATTRIBUTES = 0x10; - public const uint FILE_ATTRIBUTES_NORMAL = 0x80; internal const string USER32 = "user32.dll"; internal const string SHELL32 = "shell32.dll"; - internal const string SHLWAPI = "Shlwapi.dll"; + internal const string SHLWAPI = "Shlwapi.dll"; - #region Delegates - public delegate bool EnumWindowsCallBack(IntPtr hWnd, int lParam); - #endregion - - #region USER32 - [DllImport(Win32.USER32, CharSet = CharSet.Auto)] - public static extern IntPtr GetParent(IntPtr hWnd); - [DllImport(Win32.USER32)] - public static extern int GetDlgCtrlID(IntPtr hWndCtl); - [DllImport(Win32.USER32, CharSet = CharSet.Auto, ExactSpelling = true)] - public static extern int MapWindowPoints(IntPtr hWnd, IntPtr hWndTo, ref POINT pt, int cPoints); - [DllImport(Win32.USER32, SetLastError = true)] - public static extern bool GetWindowInfo(IntPtr hwnd, out WINDOWINFO pwi); - [DllImport(Win32.USER32)] - public static extern void GetWindowText(IntPtr hWnd, StringBuilder param, int length); - [DllImport(Win32.USER32)] - public static extern void GetClassName(IntPtr hWnd, StringBuilder param, int length); - [DllImport(Win32.USER32)] - public static extern bool EnumChildWindows(IntPtr hWndParent, EnumWindowsCallBack lpEnumFunc, int lParam); - [DllImport(Win32.USER32)] - public static extern bool EnumWindows(EnumWindowsCallBack lpEnumFunc, int lParam); - [DllImport(Win32.USER32, CharSet = CharSet.Auto)] - public static extern bool ReleaseCapture(); - [DllImport(Win32.USER32, CharSet = CharSet.Auto)] - public static extern IntPtr SetCapture(IntPtr hWnd); - [DllImport(Win32.USER32, CharSet = CharSet.Auto)] - public static extern IntPtr ChildWindowFromPointEx(IntPtr hParent, POINT pt, ChildFromPointFlags flags); - [DllImport(Win32.USER32, EntryPoint = "FindWindowExA", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] - public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); - [DllImport(Win32.USER32)] - public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); - [DllImport(Win32.USER32, CharSet = CharSet.Auto)] - public static extern int PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam); - [DllImport(Win32.USER32, CharSet = CharSet.Auto)] - public static extern int PostMessage(IntPtr hWnd, int msg, int wParam, int lParam); - [DllImport(Win32.USER32, CharSet = CharSet.Auto)] - public static extern int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam); - [DllImport(Win32.USER32, CharSet = CharSet.Auto)] - public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam); - [DllImport(Win32.USER32, CharSet = CharSet.Auto)] - public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, StringBuilder param); - [DllImport(Win32.USER32, CharSet = CharSet.Auto)] - public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, char[] chars); - [DllImport(Win32.USER32, CharSet = CharSet.Auto)] - public static extern IntPtr BeginDeferWindowPos(int nNumWindows); - [DllImport(Win32.USER32, CharSet = CharSet.Auto)] - public static extern IntPtr DeferWindowPos(IntPtr hWinPosInfo, IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int Width, int Height, SetWindowPosFlags flags); - [DllImport(Win32.USER32, CharSet = CharSet.Auto)] - public static extern bool EndDeferWindowPos(IntPtr hWinPosInfo); - [DllImport(Win32.USER32, CharSet = CharSet.Auto)] - public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int Width, int Height, SetWindowPosFlags flags); - [DllImport(Win32.USER32)] - public static extern bool GetWindowRect(IntPtr hwnd, ref RECT rect); - [DllImport(Win32.USER32)] - public static extern bool GetClientRect(IntPtr hwnd, ref RECT rect); - [DllImport(Win32.USER32)] - public static extern bool DestroyIcon([In] IntPtr hIcon); - [DllImport(Win32.SHELL32, CharSet = CharSet.Unicode)] - public static extern IntPtr SHGetFileInfoW([In] string pszPath, uint dwFileAttributes, [In, Out] ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags); - #endregion - - [DllImport (Win32.SHLWAPI, SetLastError = true, CharSet = CharSet.Unicode)] - public static extern int AssocQueryStringW (AssociationFlags flags, AssociationString str, string assoc, string extra, StringBuilder outBuffer, ref int outBufferSize); + [DllImport (Win32.SHLWAPI, SetLastError = true, CharSet = CharSet.Unicode)] + public static extern int AssocQueryStringW (AssociationFlags flags, AssociationString str, string assoc, string extra, StringBuilder outBuffer, ref int outBufferSize); } - [AttributeUsage(AttributeTargets.Class | - AttributeTargets.Enum | - AttributeTargets.Interface | - AttributeTargets.Struct, - AllowMultiple = true)] - [Author("Franco, Gustavo")] - internal class AuthorAttribute : Attribute - { - #region Constructors - public AuthorAttribute(string authorName) - { - } - #endregion - } - [Flags] public enum AssociationFlags { None = 0x00000000, diff --git a/main/src/addins/WindowsPlatform/WindowsPlatform/WindowsPlatform.cs b/main/src/addins/WindowsPlatform/WindowsPlatform/WindowsPlatform.cs index 4392189f51..9b6258af8a 100644 --- a/main/src/addins/WindowsPlatform/WindowsPlatform/WindowsPlatform.cs +++ b/main/src/addins/WindowsPlatform/WindowsPlatform/WindowsPlatform.cs @@ -87,7 +87,7 @@ namespace MonoDevelop.Platform return type ?? base.OnGetMimeTypeForUri (uri); } finally { - typeKey.Close (); + typeKey.Dispose (); } } @@ -103,10 +103,11 @@ namespace MonoDevelop.Platform public Gdk.Pixbuf CreateFromResource (Bitmap bitmap) { - MemoryStream ms = new MemoryStream (); - bitmap.Save (ms, ImageFormat.Png); - ms.Position = 0; - return new Gdk.Pixbuf (ms); + using (var ms = new MemoryStream ()) { + bitmap.Save (ms, ImageFormat.Png); + ms.Position = 0; + return new Gdk.Pixbuf (ms); + } } // Note: we can't reuse RectangleF because the layout is different... @@ -208,7 +209,7 @@ namespace MonoDevelop.Platform return psi; } - public override IProcessAsyncOperation StartConsoleProcess ( + public override ProcessAsyncOperation StartConsoleProcess ( string command, string arguments, string workingDirectory, IDictionary environmentVariables, string title, bool pauseWhenFinished) diff --git a/main/src/addins/WindowsPlatform/WindowsPlatform/WindowsPlatform.csproj b/main/src/addins/WindowsPlatform/WindowsPlatform/WindowsPlatform.csproj index 7a34098deb..c23f972d7b 100644 --- a/main/src/addins/WindowsPlatform/WindowsPlatform/WindowsPlatform.csproj +++ b/main/src/addins/WindowsPlatform/WindowsPlatform/WindowsPlatform.csproj @@ -87,9 +87,7 @@ - - diff --git a/main/src/addins/WindowsPlatform/WindowsPlatform/structs.cs b/main/src/addins/WindowsPlatform/WindowsPlatform/structs.cs deleted file mode 100644 index b39f00b566..0000000000 --- a/main/src/addins/WindowsPlatform/WindowsPlatform/structs.cs +++ /dev/null @@ -1,178 +0,0 @@ -// Copyright (c) 2006, Gustavo Franco -// Email: gustavo_franco@hotmail.com -// All rights reserved. - -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: - -// Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. - -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY -// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR -// PURPOSE. IT CAN BE DISTRIBUTED FREE OF CHARGE AS LONG AS THIS HEADER -// REMAINS UNCHANGED. - -using System; -using System.Text; -using System.Drawing; -using System.Collections.Generic; -using System.Runtime.InteropServices; - -namespace CustomControls.OS -{ - #region WINDOWINFO - [Author("Franco, Gustavo")] - [StructLayout(LayoutKind.Sequential)] - public struct WINDOWINFO - { - public UInt32 cbSize; - public RECT rcWindow; - public RECT rcClient; - public UInt32 dwStyle; - public UInt32 dwExStyle; - public UInt32 dwWindowStatus; - public UInt32 cxWindowBorders; - public UInt32 cyWindowBorders; - public UInt16 atomWindowType; - public UInt16 wCreatorVersion; - } - #endregion - - #region POINT - [Author("Franco, Gustavo")] - [StructLayout(LayoutKind.Sequential)] - public struct POINT - { - public int x; - public int y; - - #region Constructors - public POINT(int x, int y) - { - this.x = x; - this.y = y; - } - - public POINT(Point point) - { - x = point.X; - y = point.Y; - } - #endregion - } - #endregion - - #region RECT - [Author("Franco, Gustavo")] - [StructLayout(LayoutKind.Sequential)] - public struct RECT - { - public uint left; - public uint top; - public uint right; - public uint bottom; - - #region Properties - public POINT Location - { - get {return new POINT((int) left, (int) top);} - set - { - right -= (left - (uint) value.x); - bottom -= (bottom - (uint) value.y); - left = (uint) value.x; - top = (uint) value.y; - } - } - - public uint Width - { - get {return right - left;} - set {right = left + value;} - } - - public uint Height - { - get {return bottom - top;} - set {bottom = top + value;} - } - #endregion - - #region Overrides - public override string ToString() - { - return left + ":" + top + ":" + right + ":" + bottom; - } - #endregion - } - #endregion - - #region WINDOWPOS - [Author("Franco, Gustavo")] - [StructLayout(LayoutKind.Sequential)] - public struct WINDOWPOS - { - public IntPtr hwnd; - public IntPtr hwndAfter; - public int x; - public int y; - public int cx; - public int cy; - public uint flags; - - #region Overrides - public override string ToString() - { - return x + ":" + y + ":" + cx + ":" + cy + ":" + ((SWP_Flags) flags).ToString(); - } - #endregion - } - #endregion - - #region NCCALCSIZE_PARAMS - public struct NCCALCSIZE_PARAMS - { - public RECT rgrc1; - public RECT rgrc2; - public RECT rgrc3; - public IntPtr lppos; - } - #endregion - - #region - public struct NMHDR - { - public IntPtr hwndFrom; - public IntPtr idFrom; - public uint code; - } - #endregion - - #region OFNOTIFY - [Author("Franco, Gustavo")] - [StructLayout(LayoutKind.Sequential)] - public struct OFNOTIFY - { - public NMHDR hdr; - public IntPtr OPENFILENAME; - public IntPtr fileNameShareViolation; - } - #endregion - - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] - public struct SHFILEINFO - { - public IntPtr hIcon; - public int iIcon; - public uint dwAttributes; - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] - public string szDisplayName; - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] - public string szTypeName; - }; -} diff --git a/main/src/addins/Xml/Editor/BaseXmlEditorExtension.cs b/main/src/addins/Xml/Editor/BaseXmlEditorExtension.cs index 4a1f05cd07..f0395d0aea 100644 --- a/main/src/addins/Xml/Editor/BaseXmlEditorExtension.cs +++ b/main/src/addins/Xml/Editor/BaseXmlEditorExtension.cs @@ -61,7 +61,7 @@ namespace MonoDevelop.Xml.Editor MonoDevelop.Ide.Gui.Components.PadTreeView outlineTreeView; TreeStore outlineTreeStore; - List ownerProjects; + List ownerProjects = new List (); #region Setup and teardown @@ -80,7 +80,12 @@ namespace MonoDevelop.Xml.Editor { base.Initialize (); - UpdateOwnerProjects (); + // Delay the execution of UpdateOwnerProjects since it may end calling Document.AttachToProject, + // which shouldn't be called while the extension chain is being initialized. + // TODO: Move handling of owner projects to Document + Application.Invoke (delegate { + UpdateOwnerProjects (); + }); var parser = new XmlParser (CreateRootState (), false); tracker = new DocumentStateTracker (parser, Editor); @@ -110,7 +115,7 @@ namespace MonoDevelop.Xml.Editor ownerProjects = new List (); return; } - var projects = new HashSet (IdeApp.Workspace.GetAllSolutionItems ().Where (p => p.IsFileInProject (Document.FileName))); + var projects = new HashSet (IdeApp.Workspace.GetAllItems ().Where (p => p.IsFileInProject (Document.FileName))); if (ownerProjects == null || !projects.SetEquals (ownerProjects)) { ownerProjects = projects.OrderBy (p => p.Name).ToList (); var dnp = Document.Project as DotNetProject; @@ -827,8 +832,11 @@ namespace MonoDevelop.Xml.Editor void UpdatePath () { - List l = GetCurrentPath (); + //update timeout could get called after disposed + if (tracker == null) + return; + List l = GetCurrentPath (); //build the list var path = new List (); diff --git a/main/src/addins/Xml/Editor/XmlEditorService.cs b/main/src/addins/Xml/Editor/XmlEditorService.cs index 513b2e7458..c5b0f82730 100644 --- a/main/src/addins/Xml/Editor/XmlEditorService.cs +++ b/main/src/addins/Xml/Editor/XmlEditorService.cs @@ -57,7 +57,7 @@ namespace MonoDevelop.Xml.Editor error.IsWarning = false; //Task task = new Task(fileName, message, column, line); - Task task = new Task (error); + UserTask task = new UserTask (error); TaskService.Errors.Add(task); } #endregion @@ -100,7 +100,7 @@ namespace MonoDevelop.Xml.Editor } }*/ - public static IProgressMonitor GetMonitor () + public static ProgressMonitor GetMonitor () { return IdeApp.Workbench.ProgressMonitors.GetOutputProgressMonitor ("XML", "md-xml-file-icon", true, true); } @@ -198,7 +198,7 @@ namespace MonoDevelop.Xml.Editor /// /// Checks that the xml in this view is well-formed. /// - public static XmlDocument ValidateWellFormedness (IProgressMonitor monitor, string xml, string fileName) + public static XmlDocument ValidateWellFormedness (ProgressMonitor monitor, string xml, string fileName) { monitor.BeginTask (GettextCatalog.GetString ("Validating XML..."), 1); bool error = false; @@ -227,7 +227,7 @@ namespace MonoDevelop.Xml.Editor /// /// Validates the xml against known schemas. /// - public static XmlDocument ValidateXml (IProgressMonitor monitor, string xml, string fileName) + public static XmlDocument ValidateXml (ProgressMonitor monitor, string xml, string fileName) { monitor.BeginTask (GettextCatalog.GetString ("Validating XML..."), 1); bool error = false; @@ -293,7 +293,7 @@ namespace MonoDevelop.Xml.Editor /// /// Validates the schema. /// - public static XmlSchema ValidateSchema (IProgressMonitor monitor, string xml, string fileName) + public static XmlSchema ValidateSchema (ProgressMonitor monitor, string xml, string fileName) { monitor.BeginTask (GettextCatalog.GetString ("Validating schema..."), 1); bool error = false; @@ -341,7 +341,7 @@ namespace MonoDevelop.Xml.Editor return error? null: schema; } - public static XslCompiledTransform ValidateStylesheet (IProgressMonitor monitor, string xml, string fileName) + public static XslCompiledTransform ValidateStylesheet (ProgressMonitor monitor, string xml, string fileName) { monitor.BeginTask (GettextCatalog.GetString ("Validating stylesheet..."), 1); bool error = true; diff --git a/main/src/addins/Xml/Editor/XmlTextEditorExtension.cs b/main/src/addins/Xml/Editor/XmlTextEditorExtension.cs index a9dcf1d6b3..36685f8fa2 100644 --- a/main/src/addins/Xml/Editor/XmlTextEditorExtension.cs +++ b/main/src/addins/Xml/Editor/XmlTextEditorExtension.cs @@ -503,7 +503,7 @@ namespace MonoDevelop.Xml.Editor try { TaskService.Errors.Clear (); string xml = Editor.Text; - using (IProgressMonitor monitor = XmlEditorService.GetMonitor ()) { + using (ProgressMonitor monitor = XmlEditorService.GetMonitor ()) { XmlDocument doc = XmlEditorService.ValidateWellFormedness (monitor, xml, FileName); if (doc == null) return; @@ -570,7 +570,7 @@ namespace MonoDevelop.Xml.Editor public void ValidateCommand () { TaskService.Errors.Clear (); - using (IProgressMonitor monitor = XmlEditorService.GetMonitor()) { + using (ProgressMonitor monitor = XmlEditorService.GetMonitor()) { if (IsSchema) XmlEditorService.ValidateSchema (monitor, Editor.Text, FileName); else @@ -596,7 +596,7 @@ namespace MonoDevelop.Xml.Editor return; } - using (IProgressMonitor monitor = XmlEditorService.GetMonitor()) { + using (ProgressMonitor monitor = XmlEditorService.GetMonitor()) { try { string xsltContent; try { -- cgit v1.2.3