diff options
author | Phil Hughes <me@iamphill.com> | 2019-06-25 15:26:55 +0100 |
---|---|---|
committer | Phil Hughes <me@iamphill.com> | 2019-06-25 15:26:55 +0100 |
commit | 89278cffdf50d1ddeb146d7ad924f213f69fa102 (patch) | |
tree | 0532657cd40dd4760a9a05e9b8fc7e71af7e736b /app/assets/javascripts/repository/log_tree.js | |
parent | f53b05cfde5aeac73a7c81a2fe951b5642338ae0 (diff) | |
download | gitlab-ce-89278cffdf50d1ddeb146d7ad924f213f69fa102.tar.gz |
Fetch commit message with log_tree endpoint
Diffstat (limited to 'app/assets/javascripts/repository/log_tree.js')
-rw-r--r-- | app/assets/javascripts/repository/log_tree.js | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/app/assets/javascripts/repository/log_tree.js b/app/assets/javascripts/repository/log_tree.js new file mode 100644 index 00000000000..2c19aca2397 --- /dev/null +++ b/app/assets/javascripts/repository/log_tree.js @@ -0,0 +1,64 @@ +import axios from '~/lib/utils/axios_utils'; +import getCommits from './queries/getCommits.query.graphql'; +import getProjectPath from './queries/getProjectPath.query.graphql'; +import getRef from './queries/getRef.query.graphql'; + +let fetchpromise; +let resolvers = []; + +export function normalizeData(data) { + return data.map(d => ({ + sha: d.commit.id, + message: d.commit.message, + committedDate: d.commit.committed_date, + commitPath: d.commit_path, + fileName: d.file_name, + type: d.type, + __typename: 'LogTreeCommit', + })); +} + +export function resolveCommit(commits, { resolve, entry }) { + const commit = commits.find(c => c.fileName === entry.name && c.type === entry.type); + + if (commit) { + resolve(commit); + } +} + +export function fetchLogsTree(client, path, offset, resolver = null) { + if (resolver) { + resolvers.push(resolver); + } + + if (fetchpromise) return fetchpromise; + + const { projectPath } = client.readQuery({ query: getProjectPath }); + const { ref } = client.readQuery({ query: getRef }); + + fetchpromise = axios + .get(`${gon.gitlab_url}/${projectPath}/refs/${ref}/logs_tree${path ? `/${path}` : ''}`, { + params: { format: 'json', offset }, + }) + .then(({ data, headers }) => { + const headerLogsOffset = headers['more-logs-offset']; + const { commits } = client.readQuery({ query: getCommits }); + const newCommitData = [...commits, ...normalizeData(data)]; + client.writeQuery({ + query: getCommits, + data: { commits: newCommitData }, + }); + + resolvers.forEach(r => resolveCommit(newCommitData, r)); + + fetchpromise = null; + + if (headerLogsOffset) { + fetchLogsTree(client, path, headerLogsOffset); + } else { + resolvers = []; + } + }); + + return fetchpromise; +} |