Merge branch 'ide-add-last-commit-id-to-api-call' into 'master'
IDE sends last commit ID when committing changes Closes #46192 See merge request gitlab-org/gitlab-ce!19552
This commit is contained in:
commit
f5441083e1
6 changed files with 107 additions and 117 deletions
|
@ -49,31 +49,6 @@ export const setLastCommitMessage = ({ rootState, commit }, data) => {
|
|||
commit(rootTypes.SET_LAST_COMMIT_MSG, commitMsg, { root: true });
|
||||
};
|
||||
|
||||
export const checkCommitStatus = ({ rootState }) =>
|
||||
service
|
||||
.getBranchData(rootState.currentProjectId, rootState.currentBranchId)
|
||||
.then(({ data }) => {
|
||||
const { id } = data.commit;
|
||||
const selectedBranch =
|
||||
rootState.projects[rootState.currentProjectId].branches[rootState.currentBranchId];
|
||||
|
||||
if (selectedBranch.workingReference !== id) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
})
|
||||
.catch(() =>
|
||||
flash(
|
||||
__('Error checking branch data. Please try again.'),
|
||||
'alert',
|
||||
document,
|
||||
null,
|
||||
false,
|
||||
true,
|
||||
),
|
||||
);
|
||||
|
||||
export const updateFilesAfterCommit = ({ commit, dispatch, rootState }, { data }) => {
|
||||
const selectedProject = rootState.projects[rootState.currentProjectId];
|
||||
const lastCommit = {
|
||||
|
@ -128,24 +103,17 @@ export const updateFilesAfterCommit = ({ commit, dispatch, rootState }, { data }
|
|||
|
||||
export const commitChanges = ({ commit, state, getters, dispatch, rootState, rootGetters }) => {
|
||||
const newBranch = state.commitAction !== consts.COMMIT_TO_CURRENT_BRANCH;
|
||||
const payload = createCommitPayload(getters.branchName, newBranch, state, rootState);
|
||||
const getCommitStatus = newBranch ? Promise.resolve(false) : dispatch('checkCommitStatus');
|
||||
const payload = createCommitPayload({
|
||||
branch: getters.branchName,
|
||||
newBranch,
|
||||
state,
|
||||
rootState,
|
||||
});
|
||||
|
||||
commit(types.UPDATE_LOADING, true);
|
||||
|
||||
return getCommitStatus
|
||||
.then(
|
||||
branchChanged =>
|
||||
new Promise(resolve => {
|
||||
if (branchChanged) {
|
||||
// show the modal with a Bootstrap call
|
||||
$('#ide-create-branch-modal').modal('show');
|
||||
} else {
|
||||
resolve();
|
||||
}
|
||||
}),
|
||||
)
|
||||
.then(() => service.commit(rootState.currentProjectId, payload))
|
||||
return service
|
||||
.commit(rootState.currentProjectId, payload)
|
||||
.then(({ data }) => {
|
||||
commit(types.UPDATE_LOADING, false);
|
||||
|
||||
|
@ -220,12 +188,16 @@ export const commitChanges = ({ commit, state, getters, dispatch, rootState, roo
|
|||
);
|
||||
})
|
||||
.catch(err => {
|
||||
let errMsg = __('Error committing changes. Please try again.');
|
||||
if (err.response.data && err.response.data.message) {
|
||||
errMsg += ` (${stripHtml(err.response.data.message)})`;
|
||||
if (err.response.status === 400) {
|
||||
$('#ide-create-branch-modal').modal('show');
|
||||
} else {
|
||||
let errMsg = __('Error committing changes. Please try again.');
|
||||
if (err.response.data && err.response.data.message) {
|
||||
errMsg += ` (${stripHtml(err.response.data.message)})`;
|
||||
}
|
||||
flash(errMsg, 'alert', document, null, false, true);
|
||||
window.dispatchEvent(new Event('resize'));
|
||||
}
|
||||
flash(errMsg, 'alert', document, null, false, true);
|
||||
window.dispatchEvent(new Event('resize'));
|
||||
|
||||
commit(types.UPDATE_LOADING, false);
|
||||
});
|
||||
|
|
|
@ -47,6 +47,7 @@ export default {
|
|||
baseRaw: null,
|
||||
html: data.html,
|
||||
size: data.size,
|
||||
lastCommitSha: data.last_commit_sha,
|
||||
});
|
||||
},
|
||||
[types.SET_FILE_RAW_DATA](state, { file, raw }) {
|
||||
|
|
|
@ -17,6 +17,7 @@ export const dataStructure = () => ({
|
|||
changed: false,
|
||||
staged: false,
|
||||
lastCommitPath: '',
|
||||
lastCommitSha: '',
|
||||
lastCommit: {
|
||||
id: '',
|
||||
url: '',
|
||||
|
@ -104,7 +105,7 @@ export const setPageTitle = title => {
|
|||
document.title = title;
|
||||
};
|
||||
|
||||
export const createCommitPayload = (branch, newBranch, state, rootState) => ({
|
||||
export const createCommitPayload = ({ branch, newBranch, state, rootState }) => ({
|
||||
branch,
|
||||
commit_message: state.commitMessage,
|
||||
actions: rootState.stagedFiles.map(f => ({
|
||||
|
@ -112,6 +113,7 @@ export const createCommitPayload = (branch, newBranch, state, rootState) => ({
|
|||
file_path: f.path,
|
||||
content: f.content,
|
||||
encoding: f.base64 ? 'base64' : 'text',
|
||||
last_commit_id: newBranch ? undefined : f.lastCommitSha,
|
||||
})),
|
||||
start_branch: newBranch ? rootState.currentBranchId : undefined,
|
||||
});
|
||||
|
|
|
@ -197,12 +197,14 @@ class Projects::BlobController < Projects::ApplicationController
|
|||
end
|
||||
|
||||
def show_json
|
||||
set_last_commit_sha
|
||||
path_segments = @path.split('/')
|
||||
path_segments.pop
|
||||
tree_path = path_segments.join('/')
|
||||
|
||||
json = {
|
||||
id: @blob.id,
|
||||
last_commit_sha: @last_commit_sha,
|
||||
path: blob.path,
|
||||
name: blob.name,
|
||||
extension: blob.extension,
|
||||
|
|
|
@ -108,77 +108,6 @@ describe('IDE commit module actions', () => {
|
|||
});
|
||||
});
|
||||
|
||||
describe('checkCommitStatus', () => {
|
||||
beforeEach(() => {
|
||||
store.state.currentProjectId = 'abcproject';
|
||||
store.state.currentBranchId = 'master';
|
||||
store.state.projects.abcproject = {
|
||||
branches: {
|
||||
master: {
|
||||
workingReference: '1',
|
||||
},
|
||||
},
|
||||
};
|
||||
});
|
||||
|
||||
it('calls service', done => {
|
||||
spyOn(service, 'getBranchData').and.returnValue(
|
||||
Promise.resolve({
|
||||
data: {
|
||||
commit: { id: '123' },
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
store
|
||||
.dispatch('commit/checkCommitStatus')
|
||||
.then(() => {
|
||||
expect(service.getBranchData).toHaveBeenCalledWith('abcproject', 'master');
|
||||
|
||||
done();
|
||||
})
|
||||
.catch(done.fail);
|
||||
});
|
||||
|
||||
it('returns true if current ref does not equal returned ID', done => {
|
||||
spyOn(service, 'getBranchData').and.returnValue(
|
||||
Promise.resolve({
|
||||
data: {
|
||||
commit: { id: '123' },
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
store
|
||||
.dispatch('commit/checkCommitStatus')
|
||||
.then(val => {
|
||||
expect(val).toBeTruthy();
|
||||
|
||||
done();
|
||||
})
|
||||
.catch(done.fail);
|
||||
});
|
||||
|
||||
it('returns false if current ref equals returned ID', done => {
|
||||
spyOn(service, 'getBranchData').and.returnValue(
|
||||
Promise.resolve({
|
||||
data: {
|
||||
commit: { id: '1' },
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
store
|
||||
.dispatch('commit/checkCommitStatus')
|
||||
.then(val => {
|
||||
expect(val).toBeFalsy();
|
||||
|
||||
done();
|
||||
})
|
||||
.catch(done.fail);
|
||||
});
|
||||
});
|
||||
|
||||
describe('updateFilesAfterCommit', () => {
|
||||
const data = {
|
||||
id: '123',
|
||||
|
@ -314,6 +243,7 @@ describe('IDE commit module actions', () => {
|
|||
...file('changed'),
|
||||
type: 'blob',
|
||||
active: true,
|
||||
lastCommitSha: '123456789',
|
||||
};
|
||||
store.state.stagedFiles.push(f);
|
||||
store.state.changedFiles = [
|
||||
|
@ -366,6 +296,7 @@ describe('IDE commit module actions', () => {
|
|||
file_path: jasmine.anything(),
|
||||
content: jasmine.anything(),
|
||||
encoding: jasmine.anything(),
|
||||
last_commit_id: undefined,
|
||||
},
|
||||
],
|
||||
start_branch: 'master',
|
||||
|
@ -376,6 +307,32 @@ describe('IDE commit module actions', () => {
|
|||
.catch(done.fail);
|
||||
});
|
||||
|
||||
it('sends lastCommit ID when not creating new branch', done => {
|
||||
store.state.commit.commitAction = '1';
|
||||
|
||||
store
|
||||
.dispatch('commit/commitChanges')
|
||||
.then(() => {
|
||||
expect(service.commit).toHaveBeenCalledWith('abcproject', {
|
||||
branch: jasmine.anything(),
|
||||
commit_message: 'testing 123',
|
||||
actions: [
|
||||
{
|
||||
action: 'update',
|
||||
file_path: jasmine.anything(),
|
||||
content: jasmine.anything(),
|
||||
encoding: jasmine.anything(),
|
||||
last_commit_id: '123456789',
|
||||
},
|
||||
],
|
||||
start_branch: undefined,
|
||||
});
|
||||
|
||||
done();
|
||||
})
|
||||
.catch(done.fail);
|
||||
});
|
||||
|
||||
it('sets last Commit Msg', done => {
|
||||
store
|
||||
.dispatch('commit/commitChanges')
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import * as utils from '~/ide/stores/utils';
|
||||
import { file } from '../helpers';
|
||||
|
||||
describe('Multi-file store utils', () => {
|
||||
describe('setPageTitle', () => {
|
||||
|
@ -63,4 +64,59 @@ describe('Multi-file store utils', () => {
|
|||
expect(foundEntry).toBeUndefined();
|
||||
});
|
||||
});
|
||||
|
||||
describe('createCommitPayload', () => {
|
||||
it('returns API payload', () => {
|
||||
const state = {
|
||||
commitMessage: 'commit message',
|
||||
};
|
||||
const rootState = {
|
||||
stagedFiles: [
|
||||
{
|
||||
...file('staged'),
|
||||
path: 'staged',
|
||||
content: 'updated file content',
|
||||
lastCommitSha: '123456789',
|
||||
},
|
||||
{
|
||||
...file('newFile'),
|
||||
path: 'added',
|
||||
tempFile: true,
|
||||
content: 'new file content',
|
||||
base64: true,
|
||||
lastCommitSha: '123456789',
|
||||
},
|
||||
],
|
||||
currentBranchId: 'master',
|
||||
};
|
||||
const payload = utils.createCommitPayload({
|
||||
branch: 'master',
|
||||
newBranch: false,
|
||||
state,
|
||||
rootState,
|
||||
});
|
||||
|
||||
expect(payload).toEqual({
|
||||
branch: 'master',
|
||||
commit_message: 'commit message',
|
||||
actions: [
|
||||
{
|
||||
action: 'update',
|
||||
file_path: 'staged',
|
||||
content: 'updated file content',
|
||||
encoding: 'text',
|
||||
last_commit_id: '123456789',
|
||||
},
|
||||
{
|
||||
action: 'create',
|
||||
file_path: 'added',
|
||||
content: 'new file content',
|
||||
encoding: 'base64',
|
||||
last_commit_id: '123456789',
|
||||
},
|
||||
],
|
||||
start_branch: undefined,
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Reference in a new issue