diff --git a/src/app-helpers.js b/src/app-helpers.js index 8531de8..9cebad2 100644 --- a/src/app-helpers.js +++ b/src/app-helpers.js @@ -127,8 +127,8 @@ export function useLanguageLoader(path) { }, [path]); } -export function useCommitsFetcher({ repo, sha, path }) { - return useLoader(async () => getCommits(repo, sha, path), [repo, sha, path]); +export function useCommitsFetcher({ repo, path }) { + return useLoader(async () => getCommits(repo, path), [repo, path]); } export function useDocumentTitle(title) { @@ -138,20 +138,15 @@ export function useDocumentTitle(title) { } export function getUrlParams() { - const [ - , - owner, - reponame, - action, - sha, - ...paths - ] = window.location.pathname.split("/"); + const [, owner, reponame, action, ...paths] = window.location.pathname.split( + "/" + ); if (action !== "commits" && action !== "blob") { return []; } - return [owner + "/" + reponame, sha, "/" + paths.join("/")]; + return [owner + "/" + reponame, "/" + paths.join("/")]; } function login() { diff --git a/src/app.js b/src/app.js index 3407bf9..78d6984 100644 --- a/src/app.js +++ b/src/app.js @@ -17,12 +17,12 @@ export default function App() { return ; } - const [repo, sha, path] = getUrlParams(); + const [repo, path] = getUrlParams(); if (!repo) { return ; } else { - return ; + return ; } } diff --git a/src/github.js b/src/github.js index ba4f486..2353064 100644 --- a/src/github.js +++ b/src/github.js @@ -25,9 +25,37 @@ async function getContent(repo, sha, path) { return { content, url: contentJson.html_url }; } -export async function getCommits(repo, sha, path, top = 10) { +async function splitBranchAndFilePath(repo, path) { + const branchesResponse = await fetch( + `https://api.github.com/repos/${repo}/branches`, + { headers: getHeaders() } + ); + + const branchesJson = await branchesResponse.json(); + const branchNames = branchesJson + .map(branch => branch.name) + .sort(function(a, b) { + // Sort by length so that the longest string is always tried first. + // That way we won't remove any substrings by accident. + return b.length - a.length; + }); + + let branchName = "master"; + let filePath = path; + branchNames.forEach(branch => { + if (path.startsWith("/" + branch)) { + branchName = branch; + filePath = path.replace("/" + branch + "/", ""); + } + }); + return { branchName, filePath }; +} + +export async function getCommits(repo, path, top = 10) { + const { branchName, filePath } = await splitBranchAndFilePath(repo, path); + const commitsResponse = await fetch( - `https://api.github.com/repos/${repo}/commits?sha=${sha}&path=${path}`, + `https://api.github.com/repos/${repo}/commits?sha=${branchName}&path=${filePath}`, { headers: getHeaders() } ); if (!commitsResponse.ok) { @@ -55,7 +83,7 @@ export async function getCommits(repo, sha, path, top = 10) { await Promise.all( commits.map(async commit => { - const info = await getContent(repo, commit.sha, path); + const info = await getContent(repo, commit.sha, filePath); commit.content = info.content; commit.fileUrl = info.url; })