示例#1
0
 public PublishRepository(ISiteBuilder builder, ICompileService compileService, ProjectFinder projectFinder, IProcessRunner processRunner)
 {
     this.builder        = builder;
     this.compileService = compileService;
     this.projectFinder  = projectFinder;
     this.processRunner  = processRunner;
 }
示例#2
0
        /// <summary>
        /// The claims for the user logging in.
        /// </summary>
        /// <returns></returns>
        private IEnumerable <Claim> AllClaims(ProjectFinder projectFinder)
        {
            //Open the project repo and read the global git settings to get the user info, if that is not found
            //use UnconfiguredUser as the user name.
            var projectLocation = projectFinder.MasterRepoPath;
            var user            = "******";

            if (Directory.Exists(projectLocation))
            {
                using (var repo = new Repository(Repository.Discover(projectLocation)))
                {
                    user = repo.Config.GetValueOrDefault <String>("user.name") ?? user;
                    var email = repo.Config.GetValueOrDefault <String>("user.email");
                    if (email != null)
                    {
                        yield return(new Claim("email", email));
                    }
                }
            }

            yield return(new Claim("name", user));

            yield return(new Claim("role", Roles.EditPages));

            yield return(new Claim("role", Roles.Compile));

            yield return(new Claim("role", Roles.UploadAnything));

            yield return(new Claim("role", Roles.CreateDrafts));

            yield return(new Claim("role", Roles.AddBranch));

            yield return(new Claim("role", LocalEdityRoles.Shutdown));
        }
示例#3
0
 public DraftRepository(IFileFinder fileFinder, ITargetFileInfoProvider fileInfoProvider, ProjectFinder projectFinder, IPathBaseInjector pathBaseInjector)
 {
     this.fileFinder       = fileFinder;
     this.fileInfoProvider = fileInfoProvider;
     this.projectFinder    = projectFinder;
     this.pathBase         = pathBaseInjector.PathBase;
 }
示例#4
0
    public async Task UpdateSolutionAsync(string solutionPath, bool includePreviews = false, bool includeReleaseCandidates = false, bool switchToStable = false, bool checkAll = false, string version = null)
    {
        var projectPaths = ProjectFinder.GetProjectFiles(solutionPath);

        if (checkAll && version.IsNullOrWhiteSpace())
        {
            Task.WaitAll(projectPaths.Select(projectPath => UpdateInternalAsync(projectPath, includePreviews, includeReleaseCandidates, switchToStable)).ToArray());
        }
        else
        {
            var latestVersionFromNuget = await _nuGetService.GetLatestVersionOrNullAsync("Volo.Abp.Core", includeReleaseCandidates : includeReleaseCandidates);

            var latestReleaseCandidateVersionFromNuget = await _nuGetService.GetLatestVersionOrNullAsync("Volo.Abp.Core", includeReleaseCandidates : true);

            var latestVersionFromMyGet = await GetLatestVersionFromMyGet("Volo.Abp.Core");

            async Task UpdateAsync(string filePath)
            {
                var fileContent    = File.ReadAllText(filePath);
                var updatedContent = await UpdateVoloPackagesAsync(fileContent,
                                                                   includePreviews,
                                                                   includeReleaseCandidates,
                                                                   switchToStable,
                                                                   latestVersionFromNuget,
                                                                   latestReleaseCandidateVersionFromNuget,
                                                                   latestVersionFromMyGet,
                                                                   version);

                File.WriteAllText(filePath, updatedContent);
            }

            Task.WaitAll(projectPaths.Select(UpdateAsync).ToArray());
        }
    }
示例#5
0
        /// <summary>
        /// Updates the versions of the projects.
        /// </summary>
        /// <param name="context"></param>
        /// <param name="changeVersion"></param>
        /// <returns></returns>
        protected async Task <int> UpdateAsync(CommandContext context, Func <SemVersion, SemVersion> changeVersion)
        {
            context.WriteDebug("Updating versions...");
            var finder       = new ProjectFinder(context.Directory);
            var projectFiles = finder.FindProjects();

            foreach (var projectFile in projectFiles)
            {
                var project = _store.Read(projectFile);
                context.NewVesion = UpdateProject(project, changeVersion);
                _store.Save(project);
            }

            if (!string.IsNullOrEmpty(context.Message))
            {
                if (!await CommitAsync(context))
                {
                    context.WriteWarning("Failed to commit.");
                    return(projectFiles.Count);
                }
                context.WriteInfo($"Commit \"{context.Message}\" is created.");
            }

            if (context.Tag)
            {
                if (!await AddTagAsync(context))
                {
                    context.WriteWarning("Failed to add tag.");
                    return(projectFiles.Count);
                }
                context.WriteInfo($"Tag v{context.NewVesion} is added");
            }
            return(projectFiles.Count);
        }
示例#6
0
 protected static void PerformBuild(ProjectFinder projectFinder, BuildDependencyInfo dependencyInfo, OptionValues optionValues)
 {
     foreach (var solutionFileName in dependencyInfo.TrimmedSolutionDependencyGraph.TopologicalSort())
     {
         Builder.BuildSolution(projectFinder, solutionFileName, optionValues.MatchingAssemblyRegexes, optionValues.FlipIgnore, optionValues.IgnoreMissingAssemblies, optionValues.CleanBeforeBuild, optionValues.RunTests, optionValues.IgnoreFailedTests);
     }
 }
示例#7
0
        public async Task <IActionResult> LogIn([FromServices] ProjectFinder projectFinder, String returnUrl)
        {
            var identity = new ClaimsIdentity(AllClaims(projectFinder), AuthCoreSchemes.Bearer, "name", "role");
            await HttpContext.SignInAsync(AuthCoreSchemes.Bearer, new ClaimsPrincipal(identity));

            return(SafeRedirect(ref returnUrl));
        }
        public void GetAssemblyName_Tests()
        {
            var assemblyName = ProjectFinder.GetAssemblyName(
                GetNormalizedPath(
                    @"c:\temp\project\folder\src\Acme.PhoneBook.Host.csproj"
                    )
                );

            assemblyName.ShouldBe("Acme.PhoneBook.Host");
        }
示例#9
0
        public void FindWithNoProjectOrSolution()
        {
            using (var fs = new DisposableFileSystem())
            {
                fs.CreateFolder("src/project1")
                .CreateFile("src/project1/project1.csproj");
                var finder = new ProjectFinder(fs.RootPath);

                Assert.Throws <FileNotFoundException>(() => finder.FindProjects());
            }
        }
示例#10
0
        public void Execute(CommandContext context)
        {
            var reader       = new ProjectStore();
            var finder       = new ProjectFinder(context.Directory);
            var projectFiles = finder.FindProjects();

            foreach (var projectFile in projectFiles)
            {
                var project = reader.Read(projectFile);
                context.WriteInfo($"\t{project.Name} -> {project.Version}");
            }
        }
        public bool Run(bool preview)
        {
            Log.Information($"Task: {_taskCreator.Description}");
            UpdateProjectOptions options        = _project.Options;
            ProjectFinder        projectFinder  = new ProjectFinder();
            ProjectUpdater       projectUpdater = new ProjectUpdater();
            bool atLeastOneUpdated = false;

            _onUpdate();
            if (options.SolutionFullPath.IsNotEmpty())
            {
                var projects = projectFinder
                               .FindInTheSolution(
                    solutionDirectory: Path.GetDirectoryName(options.SolutionFullPath),
                    fileName: Path.GetFileName(options.SolutionFullPath))
                               .ToArray();

                _onUpdate();
                projectUpdater.Run(
                    projects,
                    project =>
                {
                    var task           = _taskCreator.Create <ProjectInSolution>();
                    atLeastOneUpdated |= task.Run(project, (UpdateProjectOptions)options.WithPreview(preview));
                    _onUpdate();
                });
            }
            else
            {
                var projects = projectFinder
                               .FindWithMask(
                    workingDirectory: options.WorkingDirectory,
                    options.CsProjFileMasks)
                               .ToArray();

                _onUpdate();
                projectUpdater.Run(
                    projects,
                    project =>
                {
                    var task           = _taskCreator.Create <ProjectInFileSystem>();
                    atLeastOneUpdated |= task.Run(project, (UpdateProjectOptions)options.WithPreview(preview));
                    _onUpdate();
                });
            }

            if (!atLeastOneUpdated)
            {
                Log.Information("\tTask completed. No changes.");
            }
            return(atLeastOneUpdated);
        }
示例#12
0
        public void sets_the_CurrentFolder()
        {
            fileSystem.DeleteDirectory("deep1");
            fileSystem.CreateDirectory("deep1");

            CsProjFile.CreateAtSolutionDirectory("Foo", "deep1").Save();

            fileSystem.CreateDirectory("deep1", "Foo", "A");

            var location = ProjectFinder.DetermineLocation("deep1".AppendPath("Foo", "A"));

            location.CurrentFolder.ToFullPath().ShouldEqual(Environment.CurrentDirectory.ToFullPath().AppendPath("deep1", "Foo", "A"));
        }
示例#13
0
        public void find_shallow()
        {
            fileSystem.DeleteDirectory("shallow");
            fileSystem.CreateDirectory("shallow");

            CsProjFile.CreateAtSolutionDirectory("Foo", "shallow").Save();

            var location = ProjectFinder.DetermineLocation("shallow".AppendPath("Foo"));

            location.Project.AssemblyName.ShouldEqual("Foo");
            location.Namespace.ShouldEqual("Foo");
            location.RelativePath.ShouldBeEmpty();
        }
示例#14
0
    private string GetProjectFile(string solutionFile, NugetPackageInfo package)
    {
        var projectFiles     = Directory.GetFiles(Path.GetDirectoryName(solutionFile), "*.csproj", SearchOption.AllDirectories);
        var isSolutionTiered = IsSolutionTiered(projectFiles);

        var projectFile = ProjectFinder.FindNuGetTargetProjectFile(
            projectFiles,
            isSolutionTiered && package.TieredTarget != NuGetPackageTarget.Undefined
                ? package.TieredTarget
                : package.Target);

        return(projectFile);
    }
示例#15
0
    private async Task AddNugetAndNpmReferences(ModuleWithMastersInfo module, string[] projectFiles,
                                                bool useDotnetCliToInstall)
    {
        var webPackagesWillBeAddedToBlazorServerProject = SouldWebPackagesBeAddedToBlazorServerProject(module, projectFiles);

        foreach (var nugetPackage in module.NugetPackages)
        {
            var nugetTarget =
                await IsProjectTiered(projectFiles) && nugetPackage.TieredTarget != NuGetPackageTarget.Undefined
                    ? nugetPackage.TieredTarget
                    : nugetPackage.Target;

            if (webPackagesWillBeAddedToBlazorServerProject && nugetTarget == NuGetPackageTarget.Web)
            {
                nugetTarget = NuGetPackageTarget.BlazorServer;
            }

            var targetProjectFile = ProjectFinder.FindNuGetTargetProjectFile(projectFiles, nugetTarget);
            if (targetProjectFile == null)
            {
                Logger.LogDebug($"Target project is not available for this NuGet package '{nugetPackage.Name}'");
                continue;
            }

            await ProjectNugetPackageAdder.AddAsync(null, targetProjectFile, nugetPackage, null, useDotnetCliToInstall);
        }

        var mvcNpmPackages = module.NpmPackages?.Where(p => p.ApplicationType.HasFlag(NpmApplicationType.Mvc))
                             .ToList();

        if (!mvcNpmPackages.IsNullOrEmpty())
        {
            var targetProjects = ProjectFinder.FindNpmTargetProjectFile(projectFiles);
            if (targetProjects.Any())
            {
                NpmGlobalPackagesChecker.Check();

                foreach (var targetProject in targetProjects)
                {
                    foreach (var npmPackage in mvcNpmPackages)
                    {
                        await ProjectNpmPackageAdder.AddMvcPackageAsync(Path.GetDirectoryName(targetProject), npmPackage);
                    }
                }
            }
            else
            {
                Logger.LogDebug("Target project is not available for NPM packages.");
            }
        }
    }
示例#16
0
        public void FindWithProjectFiles()
        {
            using (var fs = new DisposableFileSystem())
            {
                fs.CreateFile("project1.csproj")
                .CreateFile("project2.csproj");
                var finder = new ProjectFinder(fs.RootPath);

                var projects = finder.FindProjects().OrderBy(p => p.Name).ToArray();

                Assert.Equal("project1.csproj", projects[0].Name);
                Assert.Equal("project2.csproj", projects[1].Name);
            }
        }
示例#17
0
        public void find_deep_2()
        {
            fileSystem.DeleteDirectory("deep2");
            fileSystem.CreateDirectory("deep2");

            CsProjFile.CreateAtSolutionDirectory("Foo", "deep2").Save();

            fileSystem.CreateDirectory("deep2", "Foo", "A", "B");

            var location = ProjectFinder.DetermineLocation("deep2".AppendPath("Foo", "A", "B"));

            location.Project.AssemblyName.ShouldEqual("Foo");
            location.Namespace.ShouldEqual("Foo.A.B");
            location.RelativePath.ShouldEqual("A\\B");
        }
    public async Task UpdateSolutionAsync(string solutionPath, bool includePreviews = false, bool includeReleaseCandidates = false, bool switchToStable = false, bool checkAll = false, string version = null)
    {
        var projectPaths = ProjectFinder.GetProjectFiles(solutionPath);

        if (checkAll && version.IsNullOrWhiteSpace())
        {
            Task.WaitAll(projectPaths.Select(projectPath => UpdateInternalAsync(projectPath, includePreviews, includeReleaseCandidates, switchToStable)).ToArray());
        }
        else
        {
            var latestVersionFromNuget = await _nuGetService.GetLatestVersionOrNullAsync("Volo.Abp.Core", includeReleaseCandidates : includeReleaseCandidates);

            var latestReleaseCandidateVersionFromNuget = await _nuGetService.GetLatestVersionOrNullAsync("Volo.Abp.Core", includeReleaseCandidates : true);

            var latestVersionFromMyGet = await GetLatestVersionFromMyGet("Volo.Abp.Core");

            async Task UpdateAsync(string filePath)
            {
                using (var fs = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
                {
                    using (var sr = new StreamReader(fs, Encoding.Default, true))
                    {
                        var fileContent = await sr.ReadToEndAsync();

                        var updatedContent = await UpdateVoloPackagesAsync(fileContent,
                                                                           includePreviews,
                                                                           includeReleaseCandidates,
                                                                           switchToStable,
                                                                           latestVersionFromNuget,
                                                                           latestReleaseCandidateVersionFromNuget,
                                                                           latestVersionFromMyGet,
                                                                           version);

                        fs.Seek(0, SeekOrigin.Begin);
                        fs.SetLength(0);
                        using (var sw = new StreamWriter(fs, DefaultEncoding))
                        {
                            await sw.WriteAsync(updatedContent);

                            await sw.FlushAsync();
                        }
                    }
                }
            }

            Task.WaitAll(projectPaths.Select(UpdateAsync).ToArray());
        }
    }
示例#19
0
        protected static void PerformUpdateComponents(ProjectFinder projectFinder, BuildDependencyInfo dependencyInfo, OptionValues optionValues)
        {
            var graph           = dependencyInfo.TrimmedSolutionDependencyGraph;
            var sortedSolutions = GetDependencySortedSolutionNames(dependencyInfo);

            if (optionValues.Build)
            {
                foreach (var solutionFileName in sortedSolutions.Where(x => graph.OutEdges(x).Any()))
                {
                    Builder.BuildSolution(projectFinder, solutionFileName, optionValues.MatchingAssemblyRegexes, optionValues.FlipIgnore, optionValues.IgnoreMissingAssemblies, optionValues.CleanBeforeBuild, optionValues.RunTests, optionValues.IgnoreFailedTests);
                }
            }
            foreach (var solutionFileName in sortedSolutions.Where(x => false == graph.OutEdges(x).Any()))
            {
                Builder.UpdateComponentsFromBuiltProjects(projectFinder, solutionFileName, optionValues.MatchingAssemblyRegexes, optionValues.FlipIgnore, optionValues.IgnoreMissingAssemblies);
            }
        }
示例#20
0
    public void FindNpmTargetProjectFile_Tests()
    {
        var npmTargets = ProjectFinder.FindNpmTargetProjectFile(
            new[]
        {
            GetNormalizedPath(@"c:\temp\project\folder\src\Acme.PhoneBook.Host.csproj"),
            GetNormalizedPath(@"c:\temp\project\folder\src\Acme.PhoneBook.Web.Host.csproj"),
            GetNormalizedPath(@"c:\temp\project\folder\src\Acme.PhoneBook.HttpApi.Host.csproj"),
            GetNormalizedPath(@"c:\temp\project\folder\src\Acme.PhoneBook.Application.Contracts.csproj"),
            GetNormalizedPath(@"c:\temp\project\folder\src\Acme.PhoneBook.Application.csproj"),
            GetNormalizedPath(@"c:\temp\project\folder\src\Acme.PhoneBook.EntityFrameworkCore.csproj")
        }
            );

        npmTargets.ShouldContain(GetNormalizedPath(@"c:\temp\project\folder\src\Acme.PhoneBook.Host.csproj"));
        npmTargets.ShouldContain(GetNormalizedPath(@"c:\temp\project\folder\src\Acme.PhoneBook.Web.Host.csproj"));
    }
示例#21
0
        public void FindWithSolutionFile()
        {
            using (var fs = new DisposableFileSystem())
            {
                fs.CreateFile("MySolution.sln")
                .CreateFolder("src/project")
                .CreateFile("src/project/proj1.csproj");
                var finder = new ProjectFinder(fs.RootPath);


                var projectFiles = finder.FindProjects();
                var project      = projectFiles.First();


                Assert.Single(projectFiles);
                Assert.Equal("proj1.csproj", project.Name);
            }
        }
        /// <summary>
        /// This function is the callback used to execute the command when the menu item is clicked.
        /// See the constructor to see how the menu item is associated with this function using
        /// OleMenuCommandService service and MenuCommand class.
        /// </summary>
        /// <param name="sender">Event sender.</param>
        /// <param name="e">Event args.</param>
        private void Execute(object sender, EventArgs e)
        {
            ThreadHelper.ThrowIfNotOnUIThread();

            var componentModel   = ServiceProvider.GetServiceAsync(typeof(SComponentModel)).Result as IComponentModel;
            var currentWorkspace = componentModel.GetService <VisualStudioWorkspace>();

            var projectFinder = new ProjectFinder(currentWorkspace.CurrentSolution);
            var generator     = new Generator();
            var recorder      = new Recorder(projectFinder, generator);

            recorder.Save();

            string message = "Terminé avec succès";
            string title   = "Génération";

            VsShellUtilities.ShowMessageBox(
                this.package,
                message,
                title,
                OLEMSGICON.OLEMSGICON_INFO,
                OLEMSGBUTTON.OLEMSGBUTTON_OK,
                OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);
        }
示例#23
0
 public FindUsagesHandler(BufferParser parser, ISolution solution, ProjectFinder projectFinder)
 {
     _projectFinder = projectFinder;
     _parser        = parser;
     _solution      = solution;
 }
示例#24
0
    public virtual async Task <ModuleWithMastersInfo> AddAsync([NotNull] string solutionFile,
                                                               [NotNull] string moduleName,
                                                               string version,
                                                               bool skipDbMigrations            = false,
                                                               bool withSourceCode              = false,
                                                               bool addSourceCodeToSolutionFile = false,
                                                               bool newTemplate    = false,
                                                               bool newProTemplate = false)
    {
        Check.NotNull(solutionFile, nameof(solutionFile));
        Check.NotNull(moduleName, nameof(moduleName));

        await PublishEventAsync(1, "Retriving module info...");

        var module = await GetModuleInfoAsync(moduleName, newTemplate, newProTemplate);


        await PublishEventAsync(2, "Removing incompatible packages from module...");

        module = RemoveIncompatiblePackages(module, version);

        Logger.LogInformation($"Installing module '{module.Name}' to the solution '{Path.GetFileNameWithoutExtension(solutionFile)}'");

        var projectFiles = ProjectFinder.GetProjectFiles(solutionFile);

        await AddNugetAndNpmReferences(module, projectFiles, !(newTemplate || newProTemplate));

        if (withSourceCode || newTemplate || newProTemplate)
        {
            var modulesFolderInSolution = Path.Combine(Path.GetDirectoryName(solutionFile), "modules");

            await PublishEventAsync(5, $"Downloading source code of {moduleName}");
            await DownloadSourceCodesToSolutionFolder(module, modulesFolderInSolution, version, newTemplate, newProTemplate);

            await PublishEventAsync(6, $"Deleting incompatible projects from the module source code");
            await RemoveUnnecessaryProjectsAsync(Path.GetDirectoryName(solutionFile), module, projectFiles);

            if (addSourceCodeToSolutionFile)
            {
                await PublishEventAsync(7, $"Adding module to solution file");

                await SolutionFileModifier.AddModuleToSolutionFileAsync(module, solutionFile);
            }

            await PublishEventAsync(8, $"Changing nuget references to local references");

            if (newTemplate || newProTemplate)
            {
                await NugetPackageToLocalReferenceConverter.Convert(module, solutionFile, $"{module.Name}.");
            }
            else
            {
                await NugetPackageToLocalReferenceConverter.Convert(module, solutionFile);
            }

            await AddAngularSourceCode(modulesFolderInSolution, solutionFile, module.Name, newTemplate || newProTemplate);
        }
        else
        {
            await AddAngularPackages(solutionFile, module);
        }

        await RunBundleForBlazorAsync(projectFiles, module);

        await ModifyDbContext(projectFiles, module, skipDbMigrations);

        var documentationLink = module.GetFirstDocumentationLinkOrNull();

        if (documentationLink != null)
        {
            CmdHelper.OpenWebPage(documentationLink);
        }

        return(module);
    }
示例#25
0
        private static void PerformCommands(ISet <string> exlcudedSlns, ISet <string> inputFiles, OptionValues optionValues)
        {
            var projectFinder = new ProjectFinder(optionValues.BasePath, true);

            foreach (var project in projectFinder.AllProjectsInPath())
            {
                ValidateProject(project, optionValues);
            }

            if (optionValues.IncludeAllSLNsAsInputs)
            {
                var slnFiles = projectFinder.AllProjectsInPath()
                               .Where(projectFinder.ProjectHasMatchingSLNFile)
                               .Select(projectFinder.GetSLNFileForProject)
                               .Select(x => x.FullName)
                               .Distinct();
                _logger.Info("Adding SLN inputs:");
                foreach (var slnFile in slnFiles.OrderBy(x => x))
                {
                    inputFiles.Add(slnFile);
                    _logger.Info("\t" + slnFile);
                }
            }

            var dependencyInfo = Soldr.Resolver.BuildDependencyResolver.GetDependencyInfo(projectFinder, inputFiles, exlcudedSlns, optionValues.RecursionLevel); //, optionValues.Dependents);

            if (optionValues.GenerateGraphviz)
            {
                GenerateGraphViz(dependencyInfo.SolutionDependencyGraph);
            }

            if (optionValues.PrintSolutionBuildOrder)
            {
                PrintSolutionBuildOrder(dependencyInfo);
            }

            if (optionValues.PrintProjectBuildOrder)
            {
                PrintProjectBuildOrder(dependencyInfo);
            }

            if (optionValues.GenerateMSBuildFiles)
            {
                GenerateMSBuildFiles(dependencyInfo, false == optionValues.OutputMultipleMSBuildFiles);
            }

            if (optionValues.GenerateNUSpecFiles)
            {
                GenerateNUSpecFiles(dependencyInfo, optionValues);
            }

            if (optionValues.GenerateNugetPackagesConfig)
            {
                GenerateNugetPackagesConfig(dependencyInfo, optionValues);
            }

            if (optionValues.UpdateComponents)
            {
                PerformUpdateComponents(projectFinder, dependencyInfo, optionValues);
                Console.Error.WriteLine("Dependencies updated.");
            }
            else if (optionValues.Build)
            {
                PerformBuild(projectFinder, dependencyInfo, optionValues);
                Console.Error.WriteLine("Build complete.");
            }
        }
示例#26
0
 public ProjectFinderTests()
 {
     _filesystem = new Mock <IFilesystem>(MockBehavior.Strict);
     _testee     = new ProjectFinder(_filesystem.Object);
 }
示例#27
0
 public PhaseController(ProjectFinder projectFinder, IPhaseDetector phaseDetector)
 {
     this.projectFinder = projectFinder;
     this.phaseDetector = phaseDetector;
 }
示例#28
0
        protected override int Run(BuildEngine engine)
        {
			string targetName = String.Join(",", _buildTask.Targets);
			if (String.IsNullOrEmpty(targetName))
				targetName = "(default)";
			int errors = 0;

			if (_target.TextLog != null)
                errors += new LogFileOutput(_target.TextLog.AbsolutePath(_namedValues), _target.TextLog.Level).Perform(engine);
            if (_target.XmlLog != null)
                errors += new XmlFileOutput(_target.XmlLog.AbsolutePath(_namedValues), _target.XmlLog.Level).Perform(engine);

			//Globals must preceed project loading
			errors += new SetGlobal(MSProp.Configuration, _target.Configuration).Perform(engine);
			errors += new SetGlobal(MSProp.Platform, _target.Platform.ToString()).Perform(engine);

            foreach (KeyValuePair<string,string> property in _properties)
                    engine.Properties.SetValue(property.Key, property.Value);

			foreach (BuildProperty prop in _target.BuildProperties)
				if (prop.IsGlobal)
					engine.Properties.SetValue(prop.Name, Environment.ExpandEnvironmentVariables(prop.Value));

            Log.Info("CSBuild {0} {1} - Runtime={2}, Configuration={3}, Platform={4}",
                targetName.ToLower(), _target.GroupName.ToLower(), engine.Framework.ToString().Insert(2,"."),
                engine.Properties[MSProp.Configuration], engine.Properties[MSProp.Platform]);

            //Add projects
            ProjectFinder projects = new ProjectFinder(this);
            projects.Add(_config.Projects.AddProjects);
            projects.Add(_target.AddProjects);
            projects.Remove(_config.Projects.RemoveProjects);
            projects.Remove(_target.RemoveProjects);
			errors += projects.Perform(engine);

			if (errors > 0 && !_config.Options.ContinueOnError)
				return errors;

			//Add #defines
			List<string> defines = new List<string>();
			foreach (BuildDefineConst define in _target.DefineConstants)
				defines.Add(define.Value);
			if (defines.Count > 0)
				errors += new DefineConstants(defines.ToArray()).Perform(engine);

			//Project configuration
			foreach (BuildProperty property in _target.BuildProperties)
				if(!property.IsGlobal)
					errors += new SetProjectProperty(property.Name, Environment.ExpandEnvironmentVariables(property.Value)).Perform(engine);

			if (_target.TargetFramework != null)
				errors += new SetProjectProperty(MSProp.TargetFrameworkVersion, _target.TargetFramework.Version.ToString().Insert(2, ".")).Perform(engine);
			if(_target.OutputPath != null)
                errors += new SetProjectPathProperty(MSProp.OutputPath, _target.OutputPath.AbsolutePath(_namedValues)).Perform(engine);
			if(_target.IntermediateFiles != null)
                errors += new SetProjectPathProperty(MSProp.IntermediateOutputPath, _target.IntermediateFiles.AbsolutePath(_namedValues)).Perform(engine);

			errors += new SetSolutionDir().Perform(engine);
			errors += new NewerFrameworkReferences().Perform(engine);

			EnforceReferences folders = new EnforceReferences(engine.Framework, _namedValues, _config.Options.StrictReferences, _config.Options.NoStdReferences, _config.Options.ForceReferencesToFile);
			folders.Add(_config.Projects.ReferenceFolders);
			folders.Add(_target.ReferenceFolders);
			errors += folders.Perform(engine);

			if (errors > 0 && !_config.Options.ContinueOnError)
				return errors;

			System.Diagnostics.TraceLevel warningLevel;
			bool saveChanges = _config.Options.SaveProjectChanges(out warningLevel);
			if (_target.SaveProjectChanges != null)
			{
				saveChanges = _target.SaveProjectChanges.Enabled;
				warningLevel = _target.SaveProjectChanges.LogLevel;
			}
			if(saveChanges)
				errors += new SaveModifiedProjects(warningLevel).Perform(engine);

			//Build it
			errors += _buildTask.Perform(engine);
			return errors;
        }
 public GotoImplementationHandler(ISolution solution, BufferParser bufferParser, ProjectFinder projectFinder)
 {
     _solution      = solution;
     _bufferParser  = bufferParser;
     _projectFinder = projectFinder;
 }
 public Recorder(ProjectFinder projectFinder, Generator generator)
 {
     this.projectFinder = projectFinder;
     this.generator     = generator;
 }