Commit a83dd664 authored by Phil Hughes's avatar Phil Hughes

refactored to use data we already have

this required moving some data store actions & mutations around
parent 0c0a779f
...@@ -24,8 +24,6 @@ const Api = { ...@@ -24,8 +24,6 @@ const Api = {
commitPipelinesPath: '/:project_id/commit/:sha/pipelines', commitPipelinesPath: '/:project_id/commit/:sha/pipelines',
branchSinglePath: '/api/:version/projects/:id/repository/branches/:branch', branchSinglePath: '/api/:version/projects/:id/repository/branches/:branch',
createBranchPath: '/api/:version/projects/:id/repository/branches', createBranchPath: '/api/:version/projects/:id/repository/branches',
pipelinesPath: '/api/:version/projects/:id/pipelines',
pipelineJobsPath: '/:project_path/pipelines/:id/builds.json',
group(groupId, callback) { group(groupId, callback) {
const url = Api.buildUrl(Api.groupPath).replace(':id', groupId); const url = Api.buildUrl(Api.groupPath).replace(':id', groupId);
...@@ -238,20 +236,6 @@ const Api = { ...@@ -238,20 +236,6 @@ const Api = {
}); });
}, },
pipelines(projectPath, params = {}) {
const url = Api.buildUrl(this.pipelinesPath).replace(':id', encodeURIComponent(projectPath));
return axios.get(url, { params });
},
pipelineJobs(projectPath, pipelineId, params = {}) {
const url = Api.buildUrl(this.pipelineJobsPath)
.replace(':project_path', projectPath)
.replace(':id', pipelineId);
return axios.get(url, { params });
},
buildUrl(url) { buildUrl(url) {
let urlRoot = ''; let urlRoot = '';
if (gon.relative_url_root != null) { if (gon.relative_url_root != null) {
......
...@@ -31,6 +31,7 @@ export default { ...@@ -31,6 +31,7 @@ export default {
computed: { computed: {
...mapState(['currentBranchId', 'currentProjectId']), ...mapState(['currentBranchId', 'currentProjectId']),
...mapGetters(['currentProject', 'lastCommit']), ...mapGetters(['currentProject', 'lastCommit']),
...mapState('pipelines', ['latestPipeline']),
}, },
watch: { watch: {
lastCommit() { lastCommit() {
...@@ -51,14 +52,14 @@ export default { ...@@ -51,14 +52,14 @@ export default {
} }
}, },
methods: { methods: {
...mapActions(['pipelinePoll', 'stopPipelinePolling']), ...mapActions('pipelines', ['fetchLatestPipeline', 'stopPipelinePolling']),
startTimer() { startTimer() {
this.intervalId = setInterval(() => { this.intervalId = setInterval(() => {
this.commitAgeUpdate(); this.commitAgeUpdate();
}, 1000); }, 1000);
}, },
initPipelinePolling() { initPipelinePolling() {
this.pipelinePoll(); this.fetchLatestPipeline();
this.isPollingInitialized = true; this.isPollingInitialized = true;
}, },
commitAgeUpdate() { commitAgeUpdate() {
...@@ -81,18 +82,18 @@ export default { ...@@ -81,18 +82,18 @@ export default {
> >
<span <span
class="ide-status-pipeline" class="ide-status-pipeline"
v-if="lastCommit.pipeline && lastCommit.pipeline.details" v-if="latestPipeline && latestPipeline.details"
> >
<ci-icon <ci-icon
:status="lastCommit.pipeline.details.status" :status="latestPipeline.details.status"
v-tooltip v-tooltip
:title="lastCommit.pipeline.details.status.text" :title="latestPipeline.details.status.text"
/> />
Pipeline Pipeline
<a <a
class="monospace" class="monospace"
:href="lastCommit.pipeline.details.status.details_path">#{{ lastCommit.pipeline.id }}</a> :href="latestPipeline.details.status.details_path">#{{ latestPipeline.id }}</a>
{{ lastCommit.pipeline.details.status.text }} {{ latestPipeline.details.status.text }}
for for
</span> </span>
......
...@@ -73,7 +73,10 @@ export default { ...@@ -73,7 +73,10 @@ export default {
> >
{{ stage.name }} {{ stage.name }}
</strong> </strong>
<div class="append-right-8"> <div
v-if="!stage.isLoading || stage.jobs.length"
class="append-right-8"
>
<span class="badge"> <span class="badge">
{{ jobsCount }} {{ jobsCount }}
</span> </span>
......
...@@ -15,21 +15,14 @@ export default { ...@@ -15,21 +15,14 @@ export default {
JobsList, JobsList,
}, },
computed: { computed: {
...mapGetters(['currentProject']),
...mapGetters('pipelines', ['jobsCount', 'failedJobsCount', 'failedStages']), ...mapGetters('pipelines', ['jobsCount', 'failedJobsCount', 'failedStages']),
...mapState('pipelines', ['isLoadingPipeline', 'latestPipeline', 'stages', 'isLoadingJobs']), ...mapState('pipelines', ['isLoadingPipeline', 'latestPipeline', 'stages', 'isLoadingJobs']),
statusIcon() {
return {
group: this.latestPipeline.status,
icon: `status_${this.latestPipeline.status}`,
};
},
}, },
created() { created() {
return this.fetchLatestPipeline().then(() => this.fetchStages()); this.fetchLatestPipeline();
}, },
methods: { methods: {
...mapActions('pipelines', ['fetchLatestPipeline', 'fetchStages']), ...mapActions('pipelines', ['fetchLatestPipeline']),
}, },
}; };
</script> </script>
...@@ -46,7 +39,7 @@ export default { ...@@ -46,7 +39,7 @@ export default {
class="ide-tree-header ide-pipeline-header" class="ide-tree-header ide-pipeline-header"
> >
<ci-icon <ci-icon
:status="statusIcon" :status="latestPipeline.details.status"
:size="24" :size="24"
/> />
<span class="prepend-left-8"> <span class="prepend-left-8">
...@@ -54,7 +47,7 @@ export default { ...@@ -54,7 +47,7 @@ export default {
Pipeline Pipeline
</strong> </strong>
<a <a
:href="currentProject.web_url + '/pipelines/' + latestPipeline.id" :href="latestPipeline.details.status.details_path"
target="_blank" target="_blank"
> >
#{{ latestPipeline.id }} #{{ latestPipeline.id }}
...@@ -66,7 +59,7 @@ export default { ...@@ -66,7 +59,7 @@ export default {
<template slot="title"> <template slot="title">
Jobs Jobs
<span <span
v-if="!isLoadingJobs || jobsCount" v-if="jobsCount"
class="badge" class="badge"
> >
{{ jobsCount }} {{ jobsCount }}
...@@ -81,7 +74,7 @@ export default { ...@@ -81,7 +74,7 @@ export default {
<template slot="title"> <template slot="title">
Failed Jobs Failed Jobs
<span <span
v-if="!isLoadingJobs || failedJobsCount" v-if="failedJobsCount"
class="badge" class="badge"
> >
{{ failedJobsCount }} {{ failedJobsCount }}
......
import Visibility from 'visibilityjs';
import flash from '~/flash'; import flash from '~/flash';
import { __ } from '~/locale'; import { __ } from '~/locale';
import service from '../../services'; import service from '../../services';
import * as types from '../mutation_types'; import * as types from '../mutation_types';
import Poll from '../../../lib/utils/poll';
let eTagPoll;
export const getProjectData = ( export const getProjectData = (
{ commit, state, dispatch }, { commit, state, dispatch },
...@@ -91,61 +87,3 @@ export const refreshLastCommitData = ({ commit, state, dispatch }, { projectId, ...@@ -91,61 +87,3 @@ export const refreshLastCommitData = ({ commit, state, dispatch }, { projectId,
.catch(() => { .catch(() => {
flash(__('Error loading last commit.'), 'alert', document, null, false, true); flash(__('Error loading last commit.'), 'alert', document, null, false, true);
}); });
export const pollSuccessCallBack = ({ commit, state, dispatch }, { data }) => {
if (data.pipelines && data.pipelines.length) {
const lastCommitHash =
state.projects[state.currentProjectId].branches[state.currentBranchId].commit.id;
const lastCommitPipeline = data.pipelines.find(
pipeline => pipeline.commit.id === lastCommitHash,
);
commit(types.SET_LAST_COMMIT_PIPELINE, {
projectId: state.currentProjectId,
branchId: state.currentBranchId,
pipeline: lastCommitPipeline || {},
});
}
return data;
};
export const pipelinePoll = ({ getters, dispatch }) => {
eTagPoll = new Poll({
resource: service,
method: 'lastCommitPipelines',
data: {
getters,
},
successCallback: ({ data }) => dispatch('pollSuccessCallBack', { data }),
errorCallback: () => {
flash(
__('Something went wrong while fetching the latest pipeline status.'),
'alert',
document,
null,
false,
true,
);
},
});
if (!Visibility.hidden()) {
eTagPoll.makeRequest();
}
Visibility.change(() => {
if (!Visibility.hidden()) {
eTagPoll.restart();
} else {
eTagPoll.stop();
}
});
};
export const stopPipelinePolling = () => {
eTagPoll.stop();
};
export const restartPipelinePolling = () => {
eTagPoll.restart();
};
import Visibility from 'visibilityjs';
import axios from 'axios'; import axios from 'axios';
import { __ } from '../../../../locale'; import { __ } from '../../../../locale';
import Api from '../../../../api';
import flash from '../../../../flash'; import flash from '../../../../flash';
import Poll from '../../../../lib/utils/poll';
import service from '../../../services';
import * as types from './mutation_types'; import * as types from './mutation_types';
let eTagPoll;
export const stopPipelinePolling = () => eTagPoll.stop();
export const restartPipelinePolling = () => eTagPoll.restart();
export const requestLatestPipeline = ({ commit }) => commit(types.REQUEST_LATEST_PIPELINE); export const requestLatestPipeline = ({ commit }) => commit(types.REQUEST_LATEST_PIPELINE);
export const receiveLatestPipelineError = ({ commit }) => { export const receiveLatestPipelineError = ({ commit, dispatch }) => {
flash(__('There was an error loading latest pipeline')); flash(__('There was an error loading latest pipeline'));
commit(types.RECEIVE_LASTEST_PIPELINE_ERROR); commit(types.RECEIVE_LASTEST_PIPELINE_ERROR);
dispatch('stopPipelinePolling');
}; };
export const receiveLatestPipelineSuccess = ({ commit }, pipeline) => export const receiveLatestPipelineSuccess = ({ rootGetters, commit }, { pipelines }) => {
commit(types.RECEIVE_LASTEST_PIPELINE_SUCCESS, pipeline); if (pipelines && pipelines.length) {
const lastCommitHash = rootGetters.lastCommit && rootGetters.lastCommit.id;
export const fetchLatestPipeline = ({ dispatch, rootState }, sha) => { const lastCommitPipeline = pipelines.find(pipeline => pipeline.commit.id === lastCommitHash);
dispatch('requestLatestPipeline');
return Api.pipelines(rootState.currentProjectId, { sha, per_page: '1' }) commit(types.RECEIVE_LASTEST_PIPELINE_SUCCESS, lastCommitPipeline);
.then(({ data }) => { }
dispatch('receiveLatestPipelineSuccess', data.pop());
})
.catch(() => dispatch('receiveLatestPipelineError'));
}; };
export const requestStages = ({ commit }) => commit(types.REQUEST_STAGES); export const fetchLatestPipeline = ({ dispatch, rootGetters }) => {
export const receiveStagesError = ({ commit }) => { if (eTagPoll) return;
flash(__('There was an error loading job stages'));
commit(types.RECEIVE_STAGES_ERROR); dispatch('requestLatestPipeline');
};
export const receiveStagesSuccess = ({ commit }, data) => eTagPoll = new Poll({
commit(types.RECEIVE_STAGES_SUCCESS, data); resource: service,
method: 'lastCommitPipelines',
data: { getters: rootGetters },
successCallback: ({ data }) => dispatch('receiveLatestPipelineSuccess', data),
errorCallback: () => dispatch('receiveLatestPipelineError'),
});
export const fetchStages = ({ dispatch, state, rootState }) => { if (!Visibility.hidden()) {
dispatch('requestStages'); eTagPoll.makeRequest();
}
Api.pipelineJobs(rootState.currentProjectId, state.latestPipeline.id) Visibility.change(() => {
.then(({ data }) => dispatch('receiveStagesSuccess', data)) if (!Visibility.hidden()) {
.catch(() => dispatch('receiveStagesError')); eTagPoll.restart();
} else {
eTagPoll.stop();
}
});
}; };
export const requestJobs = ({ commit }, id) => commit(types.REQUEST_JOBS, id); export const requestJobs = ({ commit }, id) => commit(types.REQUEST_JOBS, id);
...@@ -51,9 +65,7 @@ export const fetchJobs = ({ dispatch }, stage) => { ...@@ -51,9 +65,7 @@ export const fetchJobs = ({ dispatch }, stage) => {
axios axios
.get(stage.dropdown_path) .get(stage.dropdown_path)
.then(({ data }) => { .then(({ data }) => dispatch('receiveJobsSuccess', { id: stage.id, data }))
dispatch('receiveJobsSuccess', { id: stage.id, data });
})
.catch(() => dispatch('receiveJobsError', stage.id)); .catch(() => dispatch('receiveJobsError', stage.id));
}; };
......
...@@ -2,10 +2,6 @@ export const REQUEST_LATEST_PIPELINE = 'REQUEST_LATEST_PIPELINE'; ...@@ -2,10 +2,6 @@ export const REQUEST_LATEST_PIPELINE = 'REQUEST_LATEST_PIPELINE';
export const RECEIVE_LASTEST_PIPELINE_ERROR = 'RECEIVE_LASTEST_PIPELINE_ERROR'; export const RECEIVE_LASTEST_PIPELINE_ERROR = 'RECEIVE_LASTEST_PIPELINE_ERROR';
export const RECEIVE_LASTEST_PIPELINE_SUCCESS = 'RECEIVE_LASTEST_PIPELINE_SUCCESS'; export const RECEIVE_LASTEST_PIPELINE_SUCCESS = 'RECEIVE_LASTEST_PIPELINE_SUCCESS';
export const REQUEST_STAGES = 'REQUEST_STAGES';
export const RECEIVE_STAGES_ERROR = 'RECEIVE_STAGES_ERROR';
export const RECEIVE_STAGES_SUCCESS = 'RECEIVE_STAGES_SUCCESS';
export const REQUEST_JOBS = 'REQUEST_JOBS'; export const REQUEST_JOBS = 'REQUEST_JOBS';
export const RECEIVE_JOBS_ERROR = 'RECEIVE_JOBS_ERROR'; export const RECEIVE_JOBS_ERROR = 'RECEIVE_JOBS_ERROR';
export const RECEIVE_JOBS_SUCCESS = 'RECEIVE_JOBS_SUCCESS'; export const RECEIVE_JOBS_SUCCESS = 'RECEIVE_JOBS_SUCCESS';
...@@ -12,32 +12,19 @@ export default { ...@@ -12,32 +12,19 @@ export default {
state.isLoadingPipeline = false; state.isLoadingPipeline = false;
if (pipeline) { if (pipeline) {
state.latestPipeline = { state.latestPipeline = pipeline;
id: pipeline.id, state.stages = pipeline.details.stages.map((stage, i) => {
status: pipeline.status, const foundStage = state.stages.find(s => s.id === i);
}; return {
...stage,
id: i,
isCollapsed: foundStage ? foundStage.isCollapsed : false,
isLoading: foundStage ? foundStage.isLoading : false,
jobs: foundStage ? foundStage.jobs : [],
};
});
} }
}, },
[types.REQUEST_STAGES](state) {
state.isLoadingJobs = true;
},
[types.RECEIVE_STAGES_ERROR](state) {
state.isLoadingJobs = false;
},
[types.RECEIVE_STAGES_SUCCESS](state, stages) {
state.isLoadingJobs = false;
state.stages = stages.map((stage, i) => {
const foundStage = state.stages.find(s => s.id === i);
return {
...stage,
id: i,
isCollapsed: foundStage ? foundStage.isCollapsed : false,
isLoading: foundStage ? foundStage.isLoading : false,
jobs: foundStage ? foundStage.jobs : [],
};
});
},
[types.REQUEST_JOBS](state, id) { [types.REQUEST_JOBS](state, id) {
state.stages = state.stages.reduce( state.stages = state.stages.reduce(
(acc, stage) => (acc, stage) =>
......
...@@ -23,7 +23,6 @@ export const SET_BRANCH = 'SET_BRANCH'; ...@@ -23,7 +23,6 @@ export const SET_BRANCH = 'SET_BRANCH';
export const SET_BRANCH_COMMIT = 'SET_BRANCH_COMMIT'; export const SET_BRANCH_COMMIT = 'SET_BRANCH_COMMIT';
export const SET_BRANCH_WORKING_REFERENCE = 'SET_BRANCH_WORKING_REFERENCE'; export const SET_BRANCH_WORKING_REFERENCE = 'SET_BRANCH_WORKING_REFERENCE';
export const TOGGLE_BRANCH_OPEN = 'TOGGLE_BRANCH_OPEN'; export const TOGGLE_BRANCH_OPEN = 'TOGGLE_BRANCH_OPEN';
export const SET_LAST_COMMIT_PIPELINE = 'SET_LAST_COMMIT_PIPELINE';
// Tree mutation types // Tree mutation types
export const SET_DIRECTORY_DATA = 'SET_DIRECTORY_DATA'; export const SET_DIRECTORY_DATA = 'SET_DIRECTORY_DATA';
......
...@@ -14,10 +14,6 @@ export default { ...@@ -14,10 +14,6 @@ export default {
treeId: `${projectPath}/${branchName}`, treeId: `${projectPath}/${branchName}`,
active: true, active: true,
workingReference: '', workingReference: '',
commit: {
...branch.commit,
pipeline: {},
},
}, },
}, },
}); });
...@@ -32,9 +28,4 @@ export default { ...@@ -32,9 +28,4 @@ export default {
commit, commit,
}); });
}, },
[types.SET_LAST_COMMIT_PIPELINE](state, { projectId, branchId, pipeline }) {
Object.assign(state.projects[projectId].branches[branchId].commit, {
pipeline,
});
},
}; };
...@@ -76,16 +76,7 @@ class Projects::PipelinesController < Projects::ApplicationController ...@@ -76,16 +76,7 @@ class Projects::PipelinesController < Projects::ApplicationController
end end
def builds def builds
respond_to do |format| render_show
format.html do
render_show
end
format.json do
render json: PipelineSerializer
.new(project: @project, current_user: @current_user)
.represent_stages(@pipeline)
end
end
end end
def failures def failures
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment