private static bool LinkProject(Context context, Project project, string shaHash) { Argument.IsNotNull(() => context); Argument.IsNotNull(() => project); try { var projectName = project.GetProjectName(); Log.Info("Handling project '{0}'", projectName); Log.Indent(); var compilables = project.GetCompilableItems().Select(x => x.GetFullFileName()); var projectPdbFile = Path.GetFullPath(project.GetOutputPdbFile()); var projectStcSrvFile = Path.GetFullPath(project.GetOutputSrcSrvFile()); if (!File.Exists(projectPdbFile)) { Log.Warning("No pdb file found for '{0}', is project built in '{1}' mode with pdb files enabled? Expected file is '{2}'", projectName, context.ConfigurationName, projectPdbFile); return false; } Log.Info("Verifying pdb file"); var missingFiles = project.VerifyPdbFiles(compilables); foreach (var missingFile in missingFiles) { Log.Warning("Missing file '{0}' or checksum '{1}' did not match", missingFile.Key, missingFile.Value); } var rawUrl = string.Format("{0}/{{0}}/%var2%", context.Provider.RawGitUrl); var paths = new Dictionary<string, string>(); foreach (var compilable in compilables) { var relativePathForUrl = compilable.Replace(context.SolutionDirectory, string.Empty).Replace("\\", "/"); while (relativePathForUrl.StartsWith("/")) { relativePathForUrl = relativePathForUrl.Substring(1, relativePathForUrl.Length - 1); } paths.Add(compilable, relativePathForUrl); } project.CreateSrcSrv(rawUrl, shaHash, paths); Log.Debug("Created source server link file, updating pdb file '{0}'", context.GetRelativePath(projectPdbFile)); PdbStrHelper.Execute(projectPdbFile, projectStcSrvFile); } catch (Exception ex) { Log.Warning(ex, "An error occurred while processing project '{0}'", project.GetProjectName()); throw; } finally { Log.Unindent(); Log.Info(string.Empty); } return true; }
private static IEnumerable<string> GetSourceList(Project currentProject, PdbStoreManager pdbStoreManager, string pdbFile) { var compilableItems = currentProject.GetCompilableItems(); var indexedFiles = pdbStoreManager.GetIndexedFiles(pdbFile); if (indexedFiles.Any()){ var longestDir = Enumerable.Range(0, indexedFiles.Min(s => s.Length)).Reverse() .Select(len => new { len, possibleMatch = indexedFiles.First().Substring(0, len) }) .Where(@t => indexedFiles.All(f => f.StartsWith(@t.possibleMatch))) .Select(@t => @t.possibleMatch).First(); return compilableItems.Select(compilableItem => new { compilableItem, targetPath = Path.Combine(currentProject.DirectoryPath, compilableItem.EvaluatedInclude) }) .Select(@t => Path.Combine(longestDir, @t.compilableItem.EvaluatedInclude) + "*" + @t.targetPath); } return Enumerable.Empty<string>(); }
private static bool LinkProject(Context context, Project project, string pdbStrFile, string shaHash, string pathPdbDirectory = null) { Argument.IsNotNull(() => context); Argument.IsNotNull(() => project); try { var projectName = project.GetProjectName(); Log.Info("Handling project '{0}'", projectName); Log.Indent(); var compilables = project.GetCompilableItems().Select(x => x.GetFullFileName()).ToList(); var outputPdbFile = project.GetOutputPdbFile(); var projectPdbFile = pathPdbDirectory != null ? Path.Combine(pathPdbDirectory, Path.GetFileName(outputPdbFile)) : Path.GetFullPath(outputPdbFile); var projectSrcSrvFile = projectPdbFile + ".srcsrv"; var srcSrvContext = new SrcSrvContext { Revision = shaHash, RawUrl = context.Provider.RawGitUrl, DownloadWithPowershell = context.DownloadWithPowershell }; if (!File.Exists(projectPdbFile)) { Log.Warning("No pdb file found for '{0}', is project built in '{1}' mode with pdb files enabled? Expected file is '{2}'", projectName, context.ConfigurationName, projectPdbFile); return false; } if (!context.SkipVerify) { Log.Info("Verifying pdb file"); var missingFiles = project.VerifyPdbFiles(compilables, projectPdbFile); foreach (var missingFile in missingFiles) { Log.Warning("Missing file '{0}' or checksum '{1}' did not match", missingFile.Key, missingFile.Value); } } if (!srcSrvContext.RawUrl.Contains("%var2%") && !srcSrvContext.RawUrl.Contains("{0}")) { srcSrvContext.RawUrl = string.Format("{0}/{{0}}/%var2%", srcSrvContext.RawUrl); } foreach (var compilable in compilables) { var relativePathForUrl = ReplaceSlashes(context.Provider, compilable.Replace(context.SolutionDirectory, string.Empty)); while (relativePathForUrl.StartsWith("/")) { relativePathForUrl = relativePathForUrl.Substring(1, relativePathForUrl.Length - 1); } srcSrvContext.Paths.Add(new Tuple<string, string>(compilable, relativePathForUrl)); } // When using the VisualStudioTeamServicesProvider, add extra infomration to dictionary with VSTS-specific data if (context.Provider.GetType().Name.EqualsIgnoreCase("VisualStudioTeamServicesProvider")) { srcSrvContext.VstsData["TFS_COLLECTION"] = context.Provider.CompanyUrl; srcSrvContext.VstsData["TFS_TEAM_PROJECT"] = context.Provider.ProjectName; srcSrvContext.VstsData["TFS_REPO"] = context.Provider.ProjectUrl; } project.CreateSrcSrv(projectSrcSrvFile, srcSrvContext); Log.Debug("Created source server link file, updating pdb file '{0}'", context.GetRelativePath(projectPdbFile)); PdbStrHelper.Execute(pdbStrFile, projectPdbFile, projectSrcSrvFile); } catch (Exception ex) { Log.Warning(ex, "An error occurred while processing project '{0}'", project.GetProjectName()); throw; } finally { Log.Unindent(); Log.Info(string.Empty); } return true; }