/// <summary> /// Generates a http(s) url to the repository in the remote server, optionally /// pointing to a specific file and specific line range in it. /// </summary> /// <param name="path">The file to generate an url to. Optional.</param> /// <param name="startLine">A specific line, or (if specifying the <paramref name="endLine"/> as well) the start of a range</param> /// <param name="endLine">The end of a line range on the specified file.</param> /// <returns>An UriString with the generated url, or null if the repository has no remote server configured or if it can't be found locally</returns> public UriString GenerateUrl(string path = null, int startLine = -1, int endLine = -1) { if (CloneUrl == null) { return(null); } var sha = HeadSha; // this also incidentally checks whether the repo has a valid LocalPath if (String.IsNullOrEmpty(sha)) { return(CloneUrl.ToRepositoryUrl().AbsoluteUri); } if (path != null && Path.IsPathRooted(path)) { // if the path root doesn't match the repository local path, then ignore it if (!path.StartsWith(LocalPath, StringComparison.OrdinalIgnoreCase)) { Debug.Assert(false, String.Format(CultureInfo.CurrentCulture, "GenerateUrl: path {0} doesn't match repository {1}", path, LocalPath)); path = null; } else { path = path.Substring(LocalPath.Length + 1); } } return(new UriString(GenerateUrl(CloneUrl.ToRepositoryUrl().AbsoluteUri, sha, path, startLine, endLine))); }
/// <summary> /// Generates a http(s) url to the repository in the remote server, optionally /// pointing to a specific file and specific line range in it. /// </summary> /// <param name="path">The file to generate an url to. Optional.</param> /// <param name="startLine">A specific line, or (if specifying the <paramref name="endLine"/> as well) the start of a range</param> /// <param name="endLine">The end of a line range on the specified file.</param> /// <returns>An UriString with the generated url, or null if the repository has no remote server configured or if it can't be found locally</returns> public async Task <UriString> GenerateUrl(string path = null, int startLine = -1, int endLine = -1) { if (CloneUrl == null) { return(null); } var sha = await GitService.GitServiceHelper.GetLatestPushedSha(path ?? LocalPath); // this also incidentally checks whether the repo has a valid LocalPath if (String.IsNullOrEmpty(sha)) { return(CloneUrl.ToRepositoryUrl().AbsoluteUri); } if (path != null && Path.IsPathRooted(path)) { // if the path root doesn't match the repository local path, then ignore it if (!path.StartsWith(LocalPath, StringComparison.OrdinalIgnoreCase)) { Debug.Assert(false, String.Format(CultureInfo.CurrentCulture, "GenerateUrl: path {0} doesn't match repository {1}", path, LocalPath)); path = null; } else { path = path.Substring(LocalPath.Length + 1); } } if (startLine > 0 && endLine > 0 && startLine > endLine) { // if startLine is greater than endLine and both are set, swap them var temp = startLine; startLine = endLine; endLine = temp; } if (startLine == endLine) { // if startLine is the same as endLine don't generate a range link endLine = -1; } return(new UriString(GenerateUrl(CloneUrl.ToRepositoryUrl().AbsoluteUri, sha, path, startLine, endLine))); }