private protected override void Execute(GitRepository repository) { RepositoryId = repository.GitDirectory; WorkingDirectory = repository.WorkingDirectory; Url = GitOperations.GetRepositoryUrl(repository, RemoteName, Log.LogWarning); Roots = GitOperations.GetSourceRoots(repository, RemoteName, Log.LogWarning); RevisionId = repository.GetHeadCommitSha(); }
public static ITaskItem[] GetSourceRoots(GitRepository repository, string?remoteName, Action <string, object?[]> logWarning) { // Not supported for repositories without a working directory. NullableDebug.Assert(repository.WorkingDirectory != null); var result = new List <TaskItem>(); var repoRoot = repository.WorkingDirectory.EndWithSeparator(); var revisionId = repository.GetHeadCommitSha(); if (revisionId != null) { // Don't report a warning since it has already been reported by GetRepositoryUrl task. string?repositoryUrl = GetRepositoryUrl(repository, remoteName, logWarning: null); // Item metadata are stored msbuild-escaped. GetMetadata unescapes, SetMetadata stores the value as specified. // Escape msbuild special characters so that URL escapes in the URL are preserved when the URL is read by GetMetadata. var item = new TaskItem(Evaluation.ProjectCollection.Escape(repoRoot)); item.SetMetadata(Names.SourceRoot.SourceControl, SourceControlName); item.SetMetadata(Names.SourceRoot.ScmRepositoryUrl, Evaluation.ProjectCollection.Escape(repositoryUrl)); item.SetMetadata(Names.SourceRoot.RevisionId, revisionId); result.Add(item); } else { logWarning(Resources.RepositoryHasNoCommit, Array.Empty <object>()); } foreach (var submodule in repository.GetSubmodules()) { var commitSha = submodule.HeadCommitSha; if (commitSha == null) { logWarning(Resources.SourceCodeWontBeAvailableViaSourceLink, new[] { string.Format(Resources.SubmoduleWithoutCommit, new[] { submodule.Name }) }); continue; } // submodule.<name>.url specifies where to find the submodule. // This variable is calculated based on the entry in .gitmodules by git submodule init and will be present for initialized submodules. // Uninitialized modules don't have source that should be considered during the build. // Relative URLs are relative to the repository directory. // See https://git-scm.com/docs/gitsubmodules. var submoduleConfigUrl = repository.Config.GetVariableValue(SubmoduleSectionName, submodule.Name, UrlVariableName); if (submoduleConfigUrl == null) { continue; } var submoduleUri = NormalizeUrl(repository, submoduleConfigUrl); if (submoduleUri == null) { logWarning(Resources.SourceCodeWontBeAvailableViaSourceLink, new[] { string.Format(Resources.InvalidSubmoduleUrl, submodule.Name, submoduleConfigUrl) }); continue; } var submoduleUrl = ResolveUrl(submoduleUri, repository.Environment, remoteName, recursionDepth: 0, logWarning); if (submoduleUrl == null) { logWarning(Resources.SourceCodeWontBeAvailableViaSourceLink, new[] { string.Format(Resources.InvalidSubmoduleUrl, submodule.Name, submoduleConfigUrl) }); continue; } // Item metadata are stored msbuild-escaped. GetMetadata unescapes, SetMetadata stores the value as specified. // Escape msbuild special characters so that URL escapes and non-ascii characters in the URL and paths are // preserved when read by GetMetadata. var item = new TaskItem(Evaluation.ProjectCollection.Escape(submodule.WorkingDirectoryFullPath.EndWithSeparator())); item.SetMetadata(Names.SourceRoot.SourceControl, SourceControlName); item.SetMetadata(Names.SourceRoot.ScmRepositoryUrl, Evaluation.ProjectCollection.Escape(submoduleUrl)); item.SetMetadata(Names.SourceRoot.RevisionId, commitSha); item.SetMetadata(Names.SourceRoot.ContainingRoot, Evaluation.ProjectCollection.Escape(repoRoot)); item.SetMetadata(Names.SourceRoot.NestedRoot, Evaluation.ProjectCollection.Escape(submodule.WorkingDirectoryRelativePath.EndWithSeparator('/'))); result.Add(item); } foreach (var diagnostic in repository.GetSubmoduleDiagnostics()) { logWarning(Resources.SourceCodeWontBeAvailableViaSourceLink, new[] { diagnostic }); } return(result.ToArray()); }
public static ITaskItem[] GetSourceRoots(GitRepository repository, string remoteName, Action <string, object[]> logWarning) { var result = new List <TaskItem>(); var repoRoot = GetRepositoryRoot(repository); var revisionId = repository.GetHeadCommitSha(); if (revisionId != null) { // Don't report a warning since it has already been reported by GetRepositoryUrl task. string repositoryUrl = GetRepositoryUrl(repository, remoteName, logWarning: null); // Item metadata are stored msbuild-escaped. GetMetadata unescapes, SetMetadata stores the value as specified. // Escape msbuild special characters so that URL escapes in the URL are preserved when the URL is read by GetMetadata. var item = new TaskItem(Evaluation.ProjectCollection.Escape(repoRoot)); item.SetMetadata(Names.SourceRoot.SourceControl, SourceControlName); item.SetMetadata(Names.SourceRoot.ScmRepositoryUrl, Evaluation.ProjectCollection.Escape(repositoryUrl)); item.SetMetadata(Names.SourceRoot.RevisionId, revisionId); result.Add(item); } else { logWarning(Resources.RepositoryHasNoCommit, Array.Empty <object>()); } foreach (var submodule in repository.GetSubmodules()) { var commitSha = submodule.HeadCommitSha; if (commitSha == null) { logWarning(Resources.SourceCodeWontBeAvailableViaSourceLink, new[] { string.Format(Resources.SubmoduleWithoutCommit, new[] { submodule.Name }) }); continue; } // https://git-scm.com/docs/git-submodule var submoduleUrl = NormalizeUrl(repository.Config, submodule.Url, repoRoot); if (submoduleUrl == null) { logWarning(Resources.SourceCodeWontBeAvailableViaSourceLink, new[] { string.Format(Resources.InvalidSubmoduleUrl, submodule.Name, submodule.Url) }); continue; } // Item metadata are stored msbuild-escaped. GetMetadata unescapes, SetMetadata stores the value as specified. // Escape msbuild special characters so that URL escapes and non-ascii characters in the URL and paths are // preserved when read by GetMetadata. var item = new TaskItem(Evaluation.ProjectCollection.Escape(submodule.WorkingDirectoryFullPath.EndWithSeparator())); item.SetMetadata(Names.SourceRoot.SourceControl, SourceControlName); item.SetMetadata(Names.SourceRoot.ScmRepositoryUrl, Evaluation.ProjectCollection.Escape(submoduleUrl)); item.SetMetadata(Names.SourceRoot.RevisionId, commitSha); item.SetMetadata(Names.SourceRoot.ContainingRoot, Evaluation.ProjectCollection.Escape(repoRoot)); item.SetMetadata(Names.SourceRoot.NestedRoot, Evaluation.ProjectCollection.Escape(submodule.WorkingDirectoryRelativePath.EndWithSeparator('/'))); result.Add(item); } foreach (var diagnostic in repository.GetSubmoduleDiagnostics()) { logWarning(Resources.SourceCodeWontBeAvailableViaSourceLink, new[] { diagnostic }); } return(result.ToArray()); }