public Aria2cProcessStarter(IFileFinder fileFinder, Aria2cConfig config, Logger logger) : base(fileFinder, logger) { _config = config; }
/// <summary> /// Locates the solution(s) where the specified project is (search up the tree up to the repository path) /// </summary> public static IList<VsSolution> FindContainingSolutions(string repositoryPath, string targetPath, IFileFinder fileFinder) { string solutionsPath = PathUtility.CleanPath(targetPath); repositoryPath = PathUtility.CleanPath(repositoryPath); while (solutionsPath != null && solutionsPath.Contains(repositoryPath)) { var solutionsFound = from solution in GetSolutions(solutionsPath, fileFinder, SearchOption.TopDirectoryOnly) where ExistsInSolution(solution, targetPath) select solution; if (solutionsFound.Any()) { return solutionsFound.ToList(); } if (PathUtility.PathsEquals(solutionsPath, repositoryPath)) { break; } var parent = Directory.GetParent(solutionsPath); solutionsPath = parent != null ? parent.ToString() : null; } return new List<VsSolution>(); }
public AspNet5Builder(IEnvironment environment, IDeploymentSettingsManager settings, IBuildPropertyProvider propertyProvider, IFileFinder fileFinder, string sourcePath, string projectPath, bool isConsoleApp) : base(environment, settings, propertyProvider, sourcePath) { _fileFinder = fileFinder; _projectPath = projectPath; _sourcePath = sourcePath; _isConsoleApp = isConsoleApp; }
public Generator(IFileFinder fileFinder, string @namespace) { _fileFinder = fileFinder; Namespace = @namespace; EnvTable = @namespace + "_env"; LoaderTable = @namespace + "_loader";; AnonymousModulePrefix = @namespace + "_module"; }
/// <summary> /// Locates the unambiguous solution matching this project /// </summary> public static VsSolution FindContainingSolution(string repositoryPath, string targetPath, IFileFinder fileFinder) { var solutions = FindContainingSolutions(repositoryPath, targetPath, fileFinder); // Don't want to use SingleOrDefault since that throws if (solutions.Count == 0 || solutions.Count > 1) { return null; } return solutions[0]; }
public static AspNet5Sdk GetAspNet5Sdk(string rootPath, IFileFinder fileFinder) { AspNet5Sdk aspNetSdk; if (!TryGetAspNet5Sdk(rootPath, fileFinder, out aspNetSdk)) { aspNetSdk = new AspNet5Sdk { Architecture = GetDefaultAspNet5RuntimeArchitecture() }; } return aspNetSdk; }
public static bool TryAspNetCoreWebProject(string rootPath, IFileFinder fileFinder, out string projectJsonPath) { projectJsonPath = null; var projectJsonFiles = fileFinder.ListFiles(rootPath, SearchOption.AllDirectories, ProjectJsonLookupList) .Where(path => Path.GetFileName(path).Equals(ProjectJson, StringComparison.OrdinalIgnoreCase)) .Where(IsWebApplicationProjectFile) .ToList(); if (projectJsonFiles.Any()) { projectJsonPath = projectJsonFiles.First(); return true; } return false; }
public Player(IFileFinder fileFinder, IPlaylistReader playlistReader, IAudioStreamFactory audioStreamFactory, IBackgroundWorkerFactory backgroundWorkerFactory, IFileSystemFacade fileSystem) { this.fileFinder = fileFinder; this.playlistReader = playlistReader; this.backgroundWorkerFactory = backgroundWorkerFactory; this.audioStreamFactory = audioStreamFactory; this.fileSystem = fileSystem; history = new List<string>(); isStopped = true; isPlaying = false; isPaused = false; wasPausedBeforeBadSound = isPaused; loopType = LoopType.None; upto = 0; }
private static bool TryGetAspNet5Sdk(string rootPath, IFileFinder fileFinder, out AspNet5Sdk aspNetSdk) { aspNetSdk = null; var globalJsonFiles = fileFinder.ListFiles(rootPath, SearchOption.AllDirectories, new[] { "*global.json" }) .Where(path => Path.GetFileName(path).Equals("global.json", StringComparison.OrdinalIgnoreCase)) .ToList(); if (globalJsonFiles.Count == 1 && FileSystemHelpers.FileExists(globalJsonFiles.First())) { var parsedGlobalJson = JObject.Parse(FileSystemHelpers.ReadAllText(globalJsonFiles.First())); if (parsedGlobalJson["sdk"] != null) { aspNetSdk = parsedGlobalJson["sdk"].ToObject<AspNet5Sdk>(); if (string.IsNullOrEmpty(aspNetSdk.Architecture)) { aspNetSdk.Architecture = GetDefaultAspNet5RuntimeArchitecture(); } return true; } } return false; }
public static IList<VsSolution> GetSolutions(string path, IFileFinder fileFinder, SearchOption searchOption = SearchOption.AllDirectories) { IEnumerable<string> filesList = fileFinder.ListFiles(path, searchOption, SolutionsLookupList); return filesList.Select(s => new VsSolution(s)).ToList(); }
private ISiteBuilder DetermineProject(string repositoryRoot, string targetPath, IDeploymentSettingsManager perDeploymentSettings, IFileFinder fileFinder) { var solution = VsHelper.FindContainingSolution(repositoryRoot, targetPath, fileFinder); string solutionPath = solution?.Path; var projectTypeGuids = VsHelper.GetProjectTypeGuids(targetPath); if (VsHelper.IsWap(projectTypeGuids)) { return new WapBuilder(_environment, perDeploymentSettings, _propertyProvider, repositoryRoot, targetPath, solutionPath); } else if (AspNetCoreHelper.IsDotnetCorePreview3(targetPath, projectTypeGuids) || targetPath.EndsWith(".xproj", StringComparison.OrdinalIgnoreCase)) { return new AspNetCoreBuilder(_environment, perDeploymentSettings, _propertyProvider, repositoryRoot, targetPath, solutionPath); } else if (VsHelper.IsExecutableProject(targetPath)) { // This is a console app return new DotNetConsoleBuilder(_environment, perDeploymentSettings, _propertyProvider, repositoryRoot, targetPath, solutionPath); } throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Resources.Error_ProjectNotDeployable, targetPath)); }
private ISiteBuilder ResolveProject(string repositoryRoot, string targetPath, IDeploymentSettingsManager perDeploymentSettings, IFileFinder fileFinder, bool tryWebSiteProject, SearchOption searchOption = SearchOption.AllDirectories, bool specificConfiguration = true) { if (DeploymentHelper.IsProject(targetPath)) { // needs to check for project file existence if (!File.Exists(targetPath)) { throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Resources.Error_ProjectDoesNotExist, targetPath)); } return DetermineProject(repositoryRoot, targetPath, perDeploymentSettings, fileFinder); } // Check for loose projects var projects = DeploymentHelper.GetProjects(targetPath, fileFinder, searchOption); if (projects.Count > 1) { // Can't determine which project to build throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Resources.Error_AmbiguousProjects, String.Join(", ", projects))); } else if (projects.Count == 1) { return DetermineProject(repositoryRoot, projects[0], perDeploymentSettings, fileFinder); } // Check for ASP.NET Core project without VS solution or project string projectJson; if (AspNetCoreHelper.TryAspNetCoreWebProject(targetPath, fileFinder, out projectJson)) { return new AspNetCoreBuilder(_environment, perDeploymentSettings, _propertyProvider, repositoryRoot, projectJson); } if (tryWebSiteProject) { // Website projects need a solution to build so look for one in the repository path // that has this website in it. var solutions = VsHelper.FindContainingSolutions(repositoryRoot, targetPath, fileFinder); // More than one solution is ambiguous if (solutions.Count > 1) { ThrowAmbiguousSolutionsError(solutions); } else if (solutions.Count == 1) { // Unambiguously pick the root return new WebSiteBuilder(_environment, perDeploymentSettings, _propertyProvider, repositoryRoot, targetPath, solutions[0].Path); } } // This should only ever happen if the user specifies an invalid directory. // The other case where the method is called we always resolve the path so it's a non issue there. if (specificConfiguration && !Directory.Exists(targetPath)) { throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Resources.Error_ProjectDoesNotExist, targetPath)); } // If there's none then use the basic builder (the site is xcopy deployable) return ResolveNonAspProject(repositoryRoot, targetPath, perDeploymentSettings); }
public static IList<string> GetProjects(string path, IFileFinder fileFinder, SearchOption searchOption = SearchOption.AllDirectories) { IEnumerable<string> filesList = fileFinder.ListFiles(path, searchOption, ProjectFileLookup); return filesList.ToList(); }
private ISiteBuilder DetermineProject(string repositoryRoot, string targetPath, IDeploymentSettingsManager perDeploymentSettings, IFileFinder fileFinder) { if (!DeploymentHelper.IsDeployableProject(targetPath)) { throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Resources.Error_ProjectNotDeployable, targetPath)); } else if (File.Exists(targetPath)) { var solution = VsHelper.FindContainingSolution(repositoryRoot, targetPath, fileFinder); string solutionPath = solution != null ? solution.Path : null; return new WapBuilder(_environment, perDeploymentSettings, _propertyProvider, repositoryRoot, targetPath, solutionPath); } throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Resources.Error_ProjectDoesNotExist, targetPath)); }
public InformationDisplayer(IFileFinder fileFinder, IStateMachine player, IConsoleFacade console) { this.fileFinder = fileFinder; this.player = player; this.console = console; }
/// <summary> /// Constructor. /// </summary> /// <param name="fileFinder">The file finder.</param> /// <param name="mapper">The automapper instance.</param> public TemplateRepository(IFileFinder fileFinder, IMapper mapper) { this.fileFinder = fileFinder; this.mapper = mapper; }
/// <summary> /// Builds and deploys a particular changeset. Puts all build artifacts in a deployments/{id} /// </summary> private async Task Build(string id, ITracer tracer, IDisposable deployStep, IFileFinder fileFinder) { if (String.IsNullOrEmpty(id)) { throw new ArgumentException("The id parameter is null or empty", "id"); } ILogger logger = null; IDeploymentStatusFile currentStatus = null; try { logger = GetLogger(id); ILogger innerLogger = logger.Log(Resources.Log_PreparingDeployment, TrimId(id)); currentStatus = _status.Open(id); currentStatus.Complete = false; currentStatus.StartTime = DateTime.UtcNow; currentStatus.Status = DeployStatus.Building; currentStatus.StatusText = String.Format(CultureInfo.CurrentCulture, Resources.Status_BuildingAndDeploying, id); currentStatus.Save(); ISiteBuilder builder = null; string repositoryRoot = _environment.RepositoryPath; var perDeploymentSettings = DeploymentSettingsManager.BuildPerDeploymentSettingsManager(repositoryRoot, _settings); try { using (tracer.Step("Determining deployment builder")) { builder = _builderFactory.CreateBuilder(tracer, innerLogger, perDeploymentSettings, fileFinder); tracer.Trace("Builder is {0}", builder.GetType().Name); } } catch (Exception ex) { // If we get a TargetInvocationException, use the inner exception instead to avoid // useless 'Exception has been thrown by the target of an invocation' messages var targetInvocationException = ex as System.Reflection.TargetInvocationException; if (targetInvocationException != null) { ex = targetInvocationException.InnerException; } _globalLogger.Log(ex); tracer.TraceError(ex); innerLogger.Log(ex); currentStatus.MarkFailed(); deployStep.Dispose(); return; } var context = new DeploymentContext { NextManifestFilePath = GetDeploymentManifestPath(id), PreviousManifestFilePath = GetActiveDeploymentManifestPath(), Tracer = tracer, Logger = logger, GlobalLogger = _globalLogger, OutputPath = GetOutputPath(_environment, perDeploymentSettings), }; if (context.PreviousManifestFilePath == null) { // In the first deployment we want the wwwroot directory to be cleaned, we do that using a manifest file // That has the expected content of a clean deployment (only one file: hostingstart.html) // This will result in KuduSync cleaning this file. context.PreviousManifestFilePath = Path.Combine(_environment.ScriptPath, Constants.FirstDeploymentManifestFileName); } using (tracer.Step("Building")) { try { await builder.Build(context); TryTouchWebConfig(context); // Run post deployment steps FinishDeployment(id, deployStep); } catch (Exception ex) { tracer.TraceError(ex); currentStatus.MarkFailed(); // End the deploy step deployStep.Dispose(); return; } } } catch (Exception ex) { tracer.TraceError(ex); deployStep.Dispose(); } }
public DraftInfo GetDraftStatus(String file, String physicalFile, IFileFinder fileFinder) { return(new DraftInfo(null, DraftStatus.NeverDrafted, file.TrimStartingPathChars())); }
public IEnumerable <String> GetAllDraftables(IFileFinder fileFinder) { yield break; }
public bool SendPageToDraft(String file, String physicalFile, IFileFinder fileFinder) { return(false); }
public CachedVsProjectsFileFinder(IFileFinder fileFinder) { _fileFinder = fileFinder; }
private ISiteBuilder DetermineProject(string repositoryRoot, string targetPath, IDeploymentSettingsManager perDeploymentSettings, IFileFinder fileFinder) { var solution = VsHelper.FindContainingSolution(repositoryRoot, targetPath, fileFinder); string solutionPath = solution?.Path; var projectTypeGuids = VsHelper.GetProjectTypeGuids(targetPath); if (VsHelper.IsWap(projectTypeGuids)) { return(new WapBuilder(_environment, perDeploymentSettings, _propertyProvider, repositoryRoot, targetPath, solutionPath)); } else if (AspNetCoreHelper.IsDotnetCorePreview3(targetPath, projectTypeGuids) || targetPath.EndsWith(".xproj", StringComparison.OrdinalIgnoreCase)) { return(new AspNetCoreBuilder(_environment, perDeploymentSettings, _propertyProvider, repositoryRoot, targetPath, solutionPath)); } else if (VsHelper.IsExecutableProject(targetPath)) { // This is a console app return(new DotNetConsoleBuilder(_environment, perDeploymentSettings, _propertyProvider, repositoryRoot, targetPath, solutionPath)); } throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Resources.Error_ProjectNotDeployable, targetPath)); }
public static IList <string> GetMsBuildProjects(string path, IFileFinder fileFinder, SearchOption searchOption = SearchOption.AllDirectories) { IEnumerable <string> filesList = fileFinder.ListFiles(path, searchOption, ProjectFileLookup); return(filesList.ToList()); }
public static IList <VsSolution> GetSolutions(string path, IFileFinder fileFinder, SearchOption searchOption = SearchOption.AllDirectories) { IEnumerable <string> filesList = fileFinder.ListFiles(path, searchOption, SolutionsLookupList); return(filesList.Select(s => new VsSolution(s)).ToList()); }
private ISiteBuilder ResolveProject(string repositoryRoot, IDeploymentSettingsManager perDeploymentSettings, IFileFinder fileFinder, bool tryWebSiteProject = false, SearchOption searchOption = SearchOption.AllDirectories) { return(ResolveProject(repositoryRoot, repositoryRoot, perDeploymentSettings, fileFinder, tryWebSiteProject, searchOption, specificConfiguration: false)); }
public PageStack(TemplateEnvironment environment, IFileFinder fileFinder) { this.environment = environment; this.fileFinder = fileFinder; }
private ISiteBuilder ResolveProject(string repositoryRoot, string targetPath, IDeploymentSettingsManager perDeploymentSettings, IFileFinder fileFinder, bool tryWebSiteProject, SearchOption searchOption = SearchOption.AllDirectories, bool specificConfiguration = true) { if (DeploymentHelper.IsProject(targetPath)) { return(DetermineProject(repositoryRoot, targetPath, perDeploymentSettings, fileFinder)); } // Check for loose projects var projects = DeploymentHelper.GetProjects(targetPath, fileFinder, searchOption); if (projects.Count > 1) { // Can't determine which project to build throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Resources.Error_AmbiguousProjects, String.Join(", ", projects))); } else if (projects.Count == 1) { return(DetermineProject(repositoryRoot, projects[0], perDeploymentSettings, fileFinder)); } // Check for ASP.NET 5 project without VS solution or project string projectJson; if (AspNet5Helper.TryAspNet5WebProject(targetPath, out projectJson)) { return(new AspNet5Builder(_environment, perDeploymentSettings, _propertyProvider, repositoryRoot, projectJson, isConsoleApp: false)); } if (AspNet5Helper.TryAspNet5ConsoleAppProject(targetPath, out projectJson)) { return(new AspNet5Builder(_environment, perDeploymentSettings, _propertyProvider, repositoryRoot, projectJson, isConsoleApp: true)); } if (tryWebSiteProject) { // Website projects need a solution to build so look for one in the repository path // that has this website in it. var solutions = VsHelper.FindContainingSolutions(repositoryRoot, targetPath, fileFinder); // More than one solution is ambiguous if (solutions.Count > 1) { ThrowAmbiguousSolutionsError(solutions); } else if (solutions.Count == 1) { // Unambiguously pick the root return(new WebSiteBuilder(_environment, perDeploymentSettings, _propertyProvider, repositoryRoot, targetPath, solutions[0].Path)); } } // This should only ever happen if the user specifies an invalid directory. // The other case where the method is called we always resolve the path so it's a non issue there. if (specificConfiguration && !Directory.Exists(targetPath)) { throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Resources.Error_ProjectDoesNotExist, targetPath)); } // If there's none then use the basic builder (the site is xcopy deployable) return(ResolveNonAspProject(repositoryRoot, targetPath, perDeploymentSettings)); }
public override void SetUp() { fileFinder = CreateMock<IFileFinder>(); playlistReader = CreateMock<IPlaylistReader>(); audioStreamFactory = CreateMock<IAudioStreamFactory>(); backgroundWorkerFactory = CreateMock<IBackgroundWorkerFactory>(); fileSystem = DynamicMock<IFileSystemFacade>(); player = new Player(fileFinder, playlistReader, audioStreamFactory, backgroundWorkerFactory, fileSystem); }
/// <summary> /// Locates the unambiguous solution matching this project /// </summary> public static VsSolution FindContainingSolution(string repositoryPath, string targetPath, IFileFinder fileFinder) { var solutions = FindContainingSolutions(repositoryPath, targetPath, fileFinder); // Don't want to use SingleOrDefault since that throws if (solutions.Count == 0 || solutions.Count > 1) { return(null); } return(solutions[0]); }
public override void SetUp() { _fileSystem = CreateMock<IFileSystemFacade>(); _configSettings = DynamicMock<IConfigSettingsFacade>(); _searchQuery = CreateMock<ISearchQuery>(); _fileFinder = new FileFinder(_fileSystem, _configSettings); }
/// <summary> /// Builds and deploys a particular changeset. Puts all build artifacts in a deployments/{id} /// </summary> private async Task Build(ChangeSet changeSet, ITracer tracer, IDisposable deployStep, IFileFinder fileFinder, DeploymentAnalytics deploymentAnalytics) { if (changeSet == null || String.IsNullOrEmpty(changeSet.Id)) { throw new ArgumentException("The changeSet.Id parameter is null or empty", "changeSet.Id"); } ILogger logger = null; IDeploymentStatusFile currentStatus = null; string buildTempPath = null; string id = changeSet.Id; try { logger = GetLogger(id); ILogger innerLogger = logger.Log(Resources.Log_PreparingDeployment, TrimId(id)); currentStatus = _status.Open(id); currentStatus.Complete = false; currentStatus.StartTime = DateTime.UtcNow; currentStatus.Status = DeployStatus.Building; currentStatus.StatusText = String.Format(CultureInfo.CurrentCulture, Resources.Status_BuildingAndDeploying, id); currentStatus.Save(); ISiteBuilder builder = null; string repositoryRoot = _environment.RepositoryPath; var perDeploymentSettings = DeploymentSettingsManager.BuildPerDeploymentSettingsManager(repositoryRoot, _settings); try { using (tracer.Step("Determining deployment builder")) { builder = _builderFactory.CreateBuilder(tracer, innerLogger, perDeploymentSettings, fileFinder); deploymentAnalytics.ProjectType = builder.ProjectType; tracer.Trace("Builder is {0}", builder.GetType().Name); } } catch (Exception ex) { // If we get a TargetInvocationException, use the inner exception instead to avoid // useless 'Exception has been thrown by the target of an invocation' messages var targetInvocationException = ex as System.Reflection.TargetInvocationException; if (targetInvocationException != null) { ex = targetInvocationException.InnerException; } _globalLogger.Log(ex); innerLogger.Log(ex); MarkStatusComplete(currentStatus, success: false); FailDeployment(tracer, deployStep, deploymentAnalytics, ex); return; } // Create a directory for the script output temporary artifacts // Use tick count (in hex) instead of guid to keep the path for getting to long buildTempPath = Path.Combine(_environment.TempPath, DateTime.UtcNow.Ticks.ToString("x")); FileSystemHelpers.EnsureDirectory(buildTempPath); var context = new DeploymentContext { NextManifestFilePath = GetDeploymentManifestPath(id), PreviousManifestFilePath = GetActiveDeploymentManifestPath(), Tracer = tracer, Logger = logger, GlobalLogger = _globalLogger, OutputPath = GetOutputPath(_environment, perDeploymentSettings), BuildTempPath = buildTempPath, CommitId = id, Message = changeSet.Message }; if (context.PreviousManifestFilePath == null) { // this file (/site/firstDeploymentManifest) capture the last active deployment when disconnecting SCM context.PreviousManifestFilePath = Path.Combine(_environment.SiteRootPath, Constants.FirstDeploymentManifestFileName); if (!FileSystemHelpers.FileExists(context.PreviousManifestFilePath)) { // In the first deployment we want the wwwroot directory to be cleaned, we do that using a manifest file // That has the expected content of a clean deployment (only one file: hostingstart.html) // This will result in KuduSync cleaning this file. context.PreviousManifestFilePath = Path.Combine(_environment.ScriptPath, Constants.FirstDeploymentManifestFileName); } } PreDeployment(tracer); using (tracer.Step("Building")) { try { await builder.Build(context); builder.PostBuild(context); await _functionManager.SyncTriggersAsync(); if (_settings.TouchWebConfigAfterDeployment()) { TryTouchWebConfig(context); } FinishDeployment(id, deployStep); deploymentAnalytics.Result = DeployStatus.Success.ToString(); } catch (Exception ex) { MarkStatusComplete(currentStatus, success: false); FailDeployment(tracer, deployStep, deploymentAnalytics, ex); return; } } } catch (Exception ex) { FailDeployment(tracer, deployStep, deploymentAnalytics, ex); } finally { // Clean the temp folder up CleanBuild(tracer, buildTempPath); } }
private ISiteBuilder ResolveProject(string repositoryRoot, IDeploymentSettingsManager perDeploymentSettings, IFileFinder fileFinder, bool tryWebSiteProject = false, SearchOption searchOption = SearchOption.AllDirectories) { return ResolveProject(repositoryRoot, repositoryRoot, perDeploymentSettings, fileFinder, tryWebSiteProject, searchOption, specificConfiguration: false); }
/// <summary> /// Builds and deploys a particular changeset. Puts all build artifacts in a deployments/{id} /// </summary> private async Task Build(ChangeSet changeSet, ITracer tracer, IDisposable deployStep, IFileFinder fileFinder, DeploymentAnalytics deploymentAnalytics) { if (changeSet == null || String.IsNullOrEmpty(changeSet.Id)) { throw new ArgumentException("The changeSet.Id parameter is null or empty", "changeSet.Id"); } ILogger logger = null; IDeploymentStatusFile currentStatus = null; string buildTempPath = null; string id = changeSet.Id; try { logger = GetLogger(id); ILogger innerLogger = logger.Log(Resources.Log_PreparingDeployment, TrimId(id)); currentStatus = _status.Open(id); currentStatus.Complete = false; currentStatus.StartTime = DateTime.UtcNow; currentStatus.Status = DeployStatus.Building; currentStatus.StatusText = String.Format(CultureInfo.CurrentCulture, Resources.Status_BuildingAndDeploying, id); currentStatus.Save(); ISiteBuilder builder = null; string repositoryRoot = _environment.RepositoryPath; var perDeploymentSettings = DeploymentSettingsManager.BuildPerDeploymentSettingsManager(repositoryRoot, _settings); try { using (tracer.Step("Determining deployment builder")) { builder = _builderFactory.CreateBuilder(tracer, innerLogger, perDeploymentSettings, fileFinder); deploymentAnalytics.ProjectType = builder.ProjectType; tracer.Trace("Builder is {0}", builder.GetType().Name); } } catch (Exception ex) { // If we get a TargetInvocationException, use the inner exception instead to avoid // useless 'Exception has been thrown by the target of an invocation' messages var targetInvocationException = ex as System.Reflection.TargetInvocationException; if (targetInvocationException != null) { ex = targetInvocationException.InnerException; } _globalLogger.Log(ex); innerLogger.Log(ex); MarkStatusComplete(currentStatus, success: false); FailDeployment(tracer, deployStep, deploymentAnalytics, ex); return; } // Create a directory for the script output temporary artifacts // Use tick count (in hex) instead of guid to keep the path for getting to long buildTempPath = Path.Combine(_environment.TempPath, DateTime.UtcNow.Ticks.ToString("x")); FileSystemHelpers.EnsureDirectory(buildTempPath); var context = new DeploymentContext { NextManifestFilePath = GetDeploymentManifestPath(id), PreviousManifestFilePath = GetActiveDeploymentManifestPath(), Tracer = tracer, Logger = logger, GlobalLogger = _globalLogger, OutputPath = GetOutputPath(_environment, perDeploymentSettings), BuildTempPath = buildTempPath, CommitId = id, Message = changeSet.Message }; if (context.PreviousManifestFilePath == null) { // this file (/site/firstDeploymentManifest) capture the last active deployment when disconnecting SCM context.PreviousManifestFilePath = Path.Combine(_environment.SiteRootPath, Constants.FirstDeploymentManifestFileName); if (!FileSystemHelpers.FileExists(context.PreviousManifestFilePath)) { // In the first deployment we want the wwwroot directory to be cleaned, we do that using a manifest file // That has the expected content of a clean deployment (only one file: hostingstart.html) // This will result in KuduSync cleaning this file. context.PreviousManifestFilePath = Path.Combine(_environment.ScriptPath, Constants.FirstDeploymentManifestFileName); } } PreDeployment(tracer); using (tracer.Step("Building")) { try { await builder.Build(context); builder.PostBuild(context); await _autoSwapHandler.HandleAutoSwap(id, context); await _functionManager.SyncTriggersAsync(); if (_settings.TouchWebConfigAfterDeployment()) { TryTouchWebConfig(context); } FinishDeployment(id, deployStep); deploymentAnalytics.Result = DeployStatus.Success.ToString(); } catch (Exception ex) { MarkStatusComplete(currentStatus, success: false); FailDeployment(tracer, deployStep, deploymentAnalytics, ex); return; } } } catch (Exception ex) { FailDeployment(tracer, deployStep, deploymentAnalytics, ex); } finally { // Clean the temp folder up CleanBuild(tracer, buildTempPath); } }
public ISiteBuilder CreateBuilder(ITracer tracer, ILogger logger, IDeploymentSettingsManager settings, IFileFinder fileFinder) { string repositoryRoot = _environment.RepositoryPath; // Use the cached vs projects file finder for: a. better performance, b. ignoring solutions/projects under node_modules fileFinder = new CachedVsProjectsFileFinder(fileFinder); // If there's a custom deployment file then let that take over. var command = settings.GetValue(SettingsKeys.Command); if (!String.IsNullOrEmpty(command)) { return new CustomBuilder(_environment, settings, _propertyProvider, repositoryRoot, command); } // If the user provided specific generator arguments, that overrides any detection logic string scriptGeneratorArgs = settings.GetValue(SettingsKeys.ScriptGeneratorArgs); if (!String.IsNullOrEmpty(scriptGeneratorArgs)) { return new CustomGeneratorCommandSiteBuilder(_environment, settings, _propertyProvider, repositoryRoot, scriptGeneratorArgs); } // If the repository has an explicit pointer to a project path to be deployed // then use it. string targetProjectPath = settings.GetValue(SettingsKeys.Project); if (!String.IsNullOrEmpty(targetProjectPath)) { tracer.Trace("Specific project was specified: " + targetProjectPath); targetProjectPath = Path.GetFullPath(Path.Combine(repositoryRoot, targetProjectPath.TrimStart('/', '\\'))); // Try to resolve the project return ResolveProject(repositoryRoot, targetProjectPath, settings, fileFinder, tryWebSiteProject: true, searchOption: SearchOption.TopDirectoryOnly); } // Get all solutions in the current repository path var solutions = VsHelper.GetSolutions(repositoryRoot, fileFinder).ToList(); if (!solutions.Any()) { return ResolveProject(repositoryRoot, settings, fileFinder, searchOption: SearchOption.AllDirectories); } // More than one solution is ambiguous if (solutions.Count > 1) { // TODO: Show relative paths in error messages ThrowAmbiguousSolutionsError(solutions); } // We have a solution VsSolution solution = solutions[0]; // We need to determine what project to deploy so get a list of all web projects and // figure out with some heuristic, which one to deploy. // TODO: Pick only 1 and throw if there's more than one VsSolutionProject project = solution.Projects.Where(p => p.IsWap || p.IsWebSite || p.IsAspNetCore).FirstOrDefault(); if (project == null) { // Try executable type project project = solution.Projects.Where(p => p.IsExecutable).FirstOrDefault(); if (project != null) { return new DotNetConsoleBuilder(_environment, settings, _propertyProvider, repositoryRoot, project.AbsolutePath, solution.Path); } logger.Log(Resources.Log_NoDeployableProjects, solution.Path); return ResolveNonAspProject(repositoryRoot, null, settings); } if (project.IsWap) { return new WapBuilder(_environment, settings, _propertyProvider, repositoryRoot, project.AbsolutePath, solution.Path); } if (project.IsAspNetCore) { return new AspNetCoreBuilder(_environment, settings, _propertyProvider, repositoryRoot, project.AbsolutePath, solution.Path); } return new WebSiteBuilder(_environment, settings, _propertyProvider, repositoryRoot, project.AbsolutePath, solution.Path); }
/// <summary> /// Locates the solution(s) where the specified project is (search up the tree up to the repository path) /// </summary> public static IList <VsSolution> FindContainingSolutions(string repositoryPath, string targetPath, IFileFinder fileFinder) { string solutionsPath = PathUtilityFactory.Instance.CleanPath(targetPath); repositoryPath = PathUtilityFactory.Instance.CleanPath(repositoryPath); while (solutionsPath != null && solutionsPath.Contains(repositoryPath)) { var solutionsFound = from solution in GetSolutions(solutionsPath, fileFinder, SearchOption.TopDirectoryOnly) where ExistsInSolution(solution, targetPath) select solution; if (solutionsFound.Any()) { return(solutionsFound.ToList()); } if (PathUtilityFactory.Instance.PathsEquals(solutionsPath, repositoryPath)) { break; } var parent = Directory.GetParent(solutionsPath); solutionsPath = parent != null?parent.ToString() : null; } return(new List <VsSolution>()); }
protected ProcessStarter(IFileFinder fileFinder, Logger logger) { _fileFinder = fileFinder; Logger = logger; _process = new Process(); }
public ISiteBuilder CreateBuilder(ITracer tracer, ILogger logger, IDeploymentSettingsManager settings, IFileFinder fileFinder) { string repositoryRoot = _environment.RepositoryPath; // Use the cached vs projects file finder for: a. better performance, b. ignoring solutions/projects under node_modules fileFinder = new CachedVsProjectsFileFinder(fileFinder); // If there's a custom deployment file then let that take over. var command = settings.GetValue(SettingsKeys.Command); if (!String.IsNullOrEmpty(command)) { return(new CustomBuilder(_environment, settings, _propertyProvider, repositoryRoot, command)); } // If the user provided specific generator arguments, that overrides any detection logic string scriptGeneratorArgs = settings.GetValue(SettingsKeys.ScriptGeneratorArgs); if (!String.IsNullOrEmpty(scriptGeneratorArgs)) { return(new CustomGeneratorCommandSiteBuilder(_environment, settings, _propertyProvider, repositoryRoot, scriptGeneratorArgs)); } // If the repository has an explicit pointer to a project path to be deployed // then use it. string targetProjectPath = settings.GetValue(SettingsKeys.Project); if (!String.IsNullOrEmpty(targetProjectPath)) { tracer.Trace("Specific project was specified: " + targetProjectPath); targetProjectPath = Path.GetFullPath(Path.Combine(repositoryRoot, targetProjectPath.TrimStart('/', '\\'))); // Try to resolve the project return(ResolveProject(repositoryRoot, targetProjectPath, settings, fileFinder, tryWebSiteProject: true, searchOption: SearchOption.TopDirectoryOnly)); } // Get all solutions in the current repository path var solutions = VsHelper.GetSolutions(repositoryRoot, fileFinder).ToList(); if (!solutions.Any()) { return(ResolveProject(repositoryRoot, settings, fileFinder, searchOption: SearchOption.AllDirectories)); } // More than one solution is ambiguous if (solutions.Count > 1) { // TODO: Show relative paths in error messages ThrowAmbiguousSolutionsError(solutions); } // We have a solution VsSolution solution = solutions[0]; // We need to determine what project to deploy so get a list of all web projects and // figure out with some heuristic, which one to deploy. // TODO: Pick only 1 and throw if there's more than one VsSolutionProject project = solution.Projects.Where(p => p.IsWap || p.IsWebSite || p.IsAspNet5).FirstOrDefault(); if (project == null) { // Try executable type project project = solution.Projects.Where(p => p.IsExecutable).FirstOrDefault(); if (project != null) { return(new DotNetConsoleBuilder(_environment, settings, _propertyProvider, repositoryRoot, project.AbsolutePath, solution.Path)); } logger.Log(Resources.Log_NoDeployableProjects, solution.Path); return(ResolveNonAspProject(repositoryRoot, null, settings)); } if (project.IsWap) { return(new WapBuilder(_environment, settings, _propertyProvider, repositoryRoot, project.AbsolutePath, solution.Path)); } if (project.IsAspNet5) { return(new AspNet5Builder(_environment, settings, _propertyProvider, repositoryRoot, project.AbsolutePath, isConsoleApp: false)); } return(new WebSiteBuilder(_environment, settings, _propertyProvider, repositoryRoot, project.AbsolutePath, solution.Path)); }
// used when we have a project file private ISiteBuilder DetermineProject(string repositoryRoot, string targetPath, IDeploymentSettingsManager perDeploymentSettings, IFileFinder fileFinder) { var solution = VsHelper.FindContainingSolution(repositoryRoot, targetPath, fileFinder); string solutionPath = solution?.Path; var projectTypeGuids = VsHelper.GetProjectTypeGuids(targetPath); if (VsHelper.IsWap(projectTypeGuids)) { return(new WapBuilder(_environment, perDeploymentSettings, _propertyProvider, repositoryRoot, targetPath, solutionPath)); } else if (AspNetCoreHelper.IsDotnetCoreFromProjectFile(targetPath, projectTypeGuids)) { return(new AspNetCoreBuilder(_environment, perDeploymentSettings, _propertyProvider, repositoryRoot, targetPath, solutionPath)); } else if (VsHelper.IsExecutableProject(targetPath)) { // This is a console app return(new DotNetConsoleBuilder(_environment, perDeploymentSettings, _propertyProvider, repositoryRoot, targetPath, solutionPath)); } else if (FunctionAppHelper.LooksLikeFunctionApp()) { if (FunctionAppHelper.IsCSharpFunctionFromProjectFile(targetPath)) { return(new FunctionMsbuildBuilder(_environment, perDeploymentSettings, _propertyProvider, repositoryRoot, targetPath, solutionPath)); } else { // csx or node function with extensions.csproj return(new FunctionBasicBuilder(_environment, perDeploymentSettings, _propertyProvider, repositoryRoot, Path.GetDirectoryName(targetPath))); } } throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Resources.Error_ProjectNotDeployable, targetPath)); }
public Aria2cProcessStarterWithWindow(IFileFinder fileFinder, Aria2cConfig config, Logger logger) : base(fileFinder, config, logger) { }
public override void SetUp() { player = CreateMock<IStateMachine>(); fileFinder = CreateMock<IFileFinder>(); console = CreateMock<IConsoleFacade>(); informationDisplayer = new InformationDisplayer(fileFinder, player, console); }
public IEnumerable <String> GetAllDraftables(IFileFinder fileFinder) { return(fileFinder.EnumerateContentFiles("", "*.html", SearchOption.AllDirectories)); }