private static void IndexSolutions(IEnumerable<string> solutionFilePaths) { var assemblyNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase); foreach (var path in solutionFilePaths) { using (Disposable.Timing("Reading assembly names from " + path)) { foreach (var assemblyName in AssemblyNameExtractor.GetAssemblyNames(path)) { assemblyNames.Add(assemblyName); } } } var federation = new Federation(); foreach (var path in solutionFilePaths) { using (Disposable.Timing("Generating " + path)) { using (var solutionGenerator = new SolutionGenerator( path, Paths.SolutionDestinationFolder, federation: federation)) { solutionGenerator.GlobalAssemblyList = assemblyNames; solutionGenerator.Generate(solutionExplorerRoot: mergedSolutionExplorerRoot); } } GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); } }
public SolutionGenerator( string solutionFilePath, string solutionDestinationFolder, string serverPath = null, ImmutableDictionary<string, string> properties = null, Federation federation = null) { this.SolutionSourceFolder = Path.GetDirectoryName(solutionFilePath); this.SolutionDestinationFolder = solutionDestinationFolder; this.ProjectFilePath = solutionFilePath; this.ServerPath = serverPath; this.solution = CreateSolution(solutionFilePath, properties); this.Federation = federation ?? new Federation(); }
private static void FinalizeProjects(bool emitAssemblyList, Federation federation) { GenerateLooseFilesProject(Constants.MSBuildFiles, Paths.SolutionDestinationFolder); GenerateLooseFilesProject(Constants.TypeScriptFiles, Paths.SolutionDestinationFolder); using (Disposable.Timing("Finalizing references")) { try { var solutionFinalizer = new SolutionFinalizer(Paths.SolutionDestinationFolder); solutionFinalizer.FinalizeProjects(emitAssemblyList, federation, mergedSolutionExplorerRoot); } catch (Exception ex) { Log.Exception(ex, "Failure while finalizing projects"); } } }
public static void IndexSolutions(IEnumerable<string> solutionFilePaths, Dictionary<string, string> properties) { var assemblyNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase); foreach (var path in solutionFilePaths) { using (Disposable.Timing("Reading assembly names from " + path)) { foreach (var assemblyName in AssemblyNameExtractor.GetAssemblyNames(path)) { assemblyNames.Add(assemblyName); } } } var federation = new Federation(); foreach (var path in solutionFilePaths) { using (Disposable.Timing("Generating " + path)) { using (var solutionGenerator = new SolutionGenerator( path, Paths.SolutionDestinationFolder, properties: properties.ToImmutableDictionary(), federation: federation)) { solutionGenerator.GlobalAssemblyList = assemblyNames; solutionGenerator.Generate(solutionExplorerRoot: mergedSolutionExplorerRoot); if (Configuration.ProcessReferencies) Extend.ExtendGenerator.TopReferencedAssemblies(solutionGenerator, federation, mergedSolutionExplorerRoot); } } GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); } }
private static void IndexSolutions(IEnumerable<string> solutionFilePaths, Dictionary<string, string> properties, Federation federation, Dictionary<string, string> serverPathMappings) { var assemblyNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase); foreach (var path in solutionFilePaths) { using (Disposable.Timing("Reading assembly names from " + path)) { foreach (var assemblyName in AssemblyNameExtractor.GetAssemblyNames(path)) { assemblyNames.Add(assemblyName); } } } foreach (var path in solutionFilePaths) { using (Disposable.Timing("Generating " + path)) { using (var solutionGenerator = new SolutionGenerator( path, Paths.SolutionDestinationFolder, properties: properties.ToImmutableDictionary(), federation: federation, serverPathMappings: serverPathMappings)) { solutionGenerator.GlobalAssemblyList = assemblyNames; solutionGenerator.Generate(solutionExplorerRoot: mergedSolutionExplorerRoot); } } GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); } }
private void SetExternalUrlMap(string destinationFolder, Federation federation) { var scriptsJs = Path.Combine(destinationFolder, "scripts.js"); if (File.Exists(scriptsJs)) { var sb = new StringBuilder(); foreach (var server in federation.GetServers()) { if (sb.Length > 0) { sb.Append(","); } sb.Append("\""); sb.Append(server); sb.Append("\""); } if (sb.Length > 0) { var text = File.ReadAllText(scriptsJs); text = Regex.Replace(text, @"/\*EXTERNAL_URL_MAP\*/.*/\*EXTERNAL_URL_MAP\*/", sb.ToString()); File.WriteAllText(scriptsJs, text); } } }
private void DeployFilesToRoot( string destinationFolder, bool emitAssemblyList, Federation federation) { Markup.WriteReferencesNotFoundFile(destinationFolder); string sourcePath = Assembly.GetEntryAssembly().Location; sourcePath = Path.GetDirectoryName(sourcePath); string basePath = sourcePath; sourcePath = Path.Combine(sourcePath, @"Web"); if (!Directory.Exists(sourcePath)) { return; } sourcePath = Path.GetFullPath(sourcePath); FileUtilities.CopyDirectory(sourcePath, destinationFolder); StampOverviewHtmlWithDate(destinationFolder); if (emitAssemblyList) { ToggleSolutionExplorerOff(destinationFolder); } SetExternalUrlMap(destinationFolder, federation); DeployBin(basePath, destinationFolder); }
public void FinalizeProjects(bool emitAssemblyList, Federation federation, Folder<Project> solutionExplorerRoot = null) { SortProcessedAssemblies(); WriteSolutionExplorer(solutionExplorerRoot); CreateReferencesFiles(); CreateMasterDeclarationsIndex(); CreateProjectMap(); CreateReferencingProjectLists(); WriteAggregateStats(); DeployFilesToRoot(SolutionDestinationFolder, emitAssemblyList, federation); if (emitAssemblyList) { var assemblyNames = projects .Where(projectFinalizer => projectFinalizer.ProjectInfoLine != null) .Select(projectFinalizer => projectFinalizer.AssemblyId).ToList(); var sorter = GetCustomRootSorter(); assemblyNames.Sort(sorter); Markup.GenerateResultsHtmlWithAssemblyList(SolutionDestinationFolder, assemblyNames); } else { Markup.GenerateResultsHtml(SolutionDestinationFolder); } }
private static void Main(string[] args) { if (args.Length == 0) { PrintUsage(); return; } var projects = new List <string>(); var properties = new Dictionary <string, string>(); var emitAssemblyList = false; var force = false; var noBuiltInFederations = false; var offlineFederations = new Dictionary <string, string>(); var federations = new HashSet <string>(); var serverPathMappings = new Dictionary <string, string>(); var pluginBlacklist = new List <string>(); foreach (var arg in args) { if (arg.StartsWith("/out:")) { Paths.SolutionDestinationFolder = Path.GetFullPath(arg.Substring("/out:".Length).StripQuotes()); continue; } if (arg.StartsWith("/serverPath:")) { var mapping = arg.Substring("/serverPath:".Length).StripQuotes(); var parts = mapping.Split('='); if (parts.Length != 2) { Log.Write($"Invalid Server Path: '{mapping}'", ConsoleColor.Red); continue; } serverPathMappings.Add(Path.GetFullPath(parts[0]), parts[1]); continue; } if (arg == "/force") { force = true; continue; } if (arg.StartsWith("/in:")) { string inputPath = arg.Substring("/in:".Length).StripQuotes(); try { if (!File.Exists(inputPath)) { continue; } string[] paths = File.ReadAllLines(inputPath); foreach (string path in paths) { AddProject(projects, path); } } catch { Log.Write("Invalid argument: " + arg, ConsoleColor.Red); } continue; } if (arg.StartsWith("/p:")) { var match = Regex.Match(arg, "/p:(?<name>[^=]+)=(?<value>.+)"); if (match.Success) { var propertyName = match.Groups["name"].Value; var propertyValue = match.Groups["value"].Value; properties.Add(propertyName, propertyValue); continue; } } if (arg == "/assemblylist") { emitAssemblyList = true; continue; } if (arg == "/nobuiltinfederations") { noBuiltInFederations = true; Log.Message("Disabling built-in federations."); continue; } if (arg.StartsWith("/federation:")) { string server = arg.Substring("/federation:".Length); Log.Message($"Adding federation '{server}'."); federations.Add(server); continue; } if (arg.StartsWith("/offlinefederation:")) { var match = Regex.Match(arg, "/offlinefederation:(?<server>[^=]+)=(?<file>.+)"); if (match.Success) { var server = match.Groups["server"].Value; var assemblyListFileName = match.Groups["file"].Value; offlineFederations[server] = assemblyListFileName; Log.Message($"Adding federation '{server}' (offline from '{assemblyListFileName}')."); continue; } continue; } if (string.Equals(arg, "/noplugins", StringComparison.OrdinalIgnoreCase)) { SolutionGenerator.LoadPlugins = false; continue; } if (arg.StartsWith("/noplugin:")) { pluginBlacklist.Add(arg.Substring("/noplugin:".Length)); continue; } try { AddProject(projects, arg); } catch (Exception ex) { Log.Write("Exception: " + ex.ToString(), ConsoleColor.Red); } } if (projects.Count == 0) { PrintUsage(); return; } AssertTraceListener.Register(); AppDomain.CurrentDomain.FirstChanceException += FirstChanceExceptionHandler.HandleFirstChanceException; // This loads the real MSBuild from the toolset so that all targets and SDKs can be found // as if a real build is happening MSBuildLocator.RegisterDefaults(); if (Paths.SolutionDestinationFolder == null) { Paths.SolutionDestinationFolder = Path.Combine(Microsoft.SourceBrowser.Common.Paths.BaseAppFolder, "Index"); } var websiteDestination = Paths.SolutionDestinationFolder; // Warning, this will delete and recreate your destination folder Paths.PrepareDestinationFolder(force); Paths.SolutionDestinationFolder = Path.Combine(Paths.SolutionDestinationFolder, "index"); //The actual index files need to be written to the "index" subdirectory Directory.CreateDirectory(Paths.SolutionDestinationFolder); Log.ErrorLogFilePath = Path.Combine(Paths.SolutionDestinationFolder, Log.ErrorLogFile); Log.MessageLogFilePath = Path.Combine(Paths.SolutionDestinationFolder, Log.MessageLogFile); using (Disposable.Timing("Generating website")) { var federation = new Federation(); if (!noBuiltInFederations) { federation.AddFederations(Federation.DefaultFederatedIndexUrls); } federation.AddFederations(federations); foreach (var entry in offlineFederations) { federation.AddFederation(entry.Key, entry.Value); } IndexSolutions(projects, properties, federation, serverPathMappings, pluginBlacklist); FinalizeProjects(emitAssemblyList, federation); WebsiteFinalizer.Finalize(websiteDestination, emitAssemblyList, federation); } }
private static void IndexSolutions(IEnumerable <string> solutionFilePaths, Dictionary <string, string> properties, Federation federation, Dictionary <string, string> serverPathMappings, IEnumerable <string> pluginBlacklist) { var assemblyNames = new HashSet <string>(StringComparer.OrdinalIgnoreCase); foreach (var path in solutionFilePaths) { using (Disposable.Timing("Reading assembly names from " + path)) { foreach (var assemblyName in AssemblyNameExtractor.GetAssemblyNames(path)) { assemblyNames.Add(assemblyName); } } } foreach (var path in solutionFilePaths) { using (Disposable.Timing("Generating " + path)) { using (var solutionGenerator = new SolutionGenerator( path, Paths.SolutionDestinationFolder, properties: properties.ToImmutableDictionary(), federation: federation, serverPathMappings: serverPathMappings, pluginBlacklist: pluginBlacklist)) { solutionGenerator.GlobalAssemblyList = assemblyNames; solutionGenerator.Generate(solutionExplorerRoot: mergedSolutionExplorerRoot); } } GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); } }
public void FinalizeProjects(bool emitAssemblyList, ISet <string> excludedProjects, Federation federation, Folder <Project> solutionExplorerRoot = null) { SortProcessedAssemblies(); WriteSolutionExplorer(excludedProjects, solutionExplorerRoot); CreateReferencesFiles(); CreateMasterDeclarationsIndex(); CreateProjectMap(); CreateReferencingProjectLists(); WriteAggregateStats(); DeployFilesToRoot(SolutionDestinationFolder, emitAssemblyList, federation); if (emitAssemblyList) { var assemblyNames = projects .Where(projectFinalizer => projectFinalizer.ProjectInfoLine != null) .Select(projectFinalizer => projectFinalizer.AssemblyId).ToList(); var sorter = GetCustomRootSorter(); assemblyNames.Sort(sorter); Markup.GenerateResultsHtmlWithAssemblyList(SolutionDestinationFolder, assemblyNames); } else { Markup.GenerateResultsHtml(SolutionDestinationFolder); } }