using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Octokit { public class RepositoryContentsClient : ApiClient, IRepositoryContentsClient { public RepositoryContentsClient(IApiConnection apiConnection) : base(apiConnection) { } public Task> GetRoot(string owner, string name) { Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); Ensure.ArgumentNotNullOrEmptyString(name, "name"); return ApiConnection.GetAll(ApiUrls.RepositoryContent(owner, name)); } public async Task> GetForPath(string owner, string name, string path) { Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); Ensure.ArgumentNotNullOrEmptyString(name, "name"); Ensure.ArgumentNotNullOrEmptyString(path, "path"); // First, find content in parent directory. var content = await FindContent(owner, name, path); if (content == null) { // We've asked for a file/folder that don't exist. return new List(); } var url = ApiUrls.RepositoryContent(owner, name, path); // Check which type the content is before fetching/deserializing it. switch (content.Type) { case ContentType.Dir: return await ApiConnection.GetAll(url); case ContentType.File: return new List { await ApiConnection.Get(url) }; case ContentType.Symlink: return new List { await ApiConnection.Get(url) }; case ContentType.Submodule: return new List { await ApiConnection.Get(url) }; default: throw new ArgumentOutOfRangeException(); } } /// /// Gets the preferred README for the specified repository. /// /// /// See the API documentation for more information. /// /// The owner of the repository /// The name of the repository /// Thrown when a general API error occurs. /// public async Task GetReadme(string owner, string name) { Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); Ensure.ArgumentNotNullOrEmptyString(name, "name"); var endpoint = ApiUrls.RepositoryReadme(owner, name); var readmeInfo = await ApiConnection.Get(endpoint, null).ConfigureAwait(false); return new Readme(readmeInfo, ApiConnection); } /// /// Gets the perferred README's HTML for the specified repository. /// /// /// See the API documentation for more information. /// /// The owner of the repository /// The name of the repository /// Thrown when a general API error occurs. /// public Task GetReadmeHtml(string owner, string name) { Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); Ensure.ArgumentNotNullOrEmptyString(name, "name"); return ApiConnection.GetHtml(ApiUrls.RepositoryReadme(owner, name), null); } private async Task FindContent(string owner, string name, string path) { var pathParts = path.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries); var fileOrDirectoryName = pathParts.Last(); var parentPath = string.Join("/", pathParts.TakeWhile(x => x != fileOrDirectoryName)); var parentContentsUri = !string.IsNullOrEmpty(parentPath) ? ApiUrls.RepositoryContent(owner, name, parentPath) : ApiUrls.RepositoryContent(owner, name); var parentContents = await ApiConnection.GetAll(parentContentsUri); return parentContents.FirstOrDefault(x => x.Name == fileOrDirectoryName); } } }