diff options
author | Phil Hughes <me@iamphill.com> | 2018-03-21 11:06:39 +0000 |
---|---|---|
committer | Phil Hughes <me@iamphill.com> | 2018-03-22 10:33:20 +0000 |
commit | ba63bda9550d3d66545e71de1f78a3089c7dc014 (patch) | |
tree | e45edc9102fd2ef9957c3def1642aa040e0d0253 | |
parent | 51c64f3fc7180732621d60f939bfe6157165040f (diff) | |
download | gitlab-ce-ba63bda9550d3d66545e71de1f78a3089c7dc014.tar.gz |
correctly stages and unstages files
after a commit the files are correctly reset
correctly enables the ability to have different staged & unstaged changes in the same file
14 files changed, 82 insertions, 64 deletions
diff --git a/app/assets/javascripts/ide/components/commit_sidebar/list_item.vue b/app/assets/javascripts/ide/components/commit_sidebar/list_item.vue index 93c8fc00f28..92fcb55f94f 100644 --- a/app/assets/javascripts/ide/components/commit_sidebar/list_item.vue +++ b/app/assets/javascripts/ide/components/commit_sidebar/list_item.vue @@ -1,4 +1,5 @@ <script> +import { mapActions } from 'vuex'; import Icon from '~/vue_shared/components/icon.vue'; import StageButton from './stage_button.vue'; import UnstageButton from './unstage_button.vue'; @@ -57,7 +58,7 @@ export default { </button> <component :is="actionComponent" - :file="file" + :path="file.path" /> </div> </template> diff --git a/app/assets/javascripts/ide/components/commit_sidebar/stage_button.vue b/app/assets/javascripts/ide/components/commit_sidebar/stage_button.vue index 0189358d82f..ada23f2993d 100644 --- a/app/assets/javascripts/ide/components/commit_sidebar/stage_button.vue +++ b/app/assets/javascripts/ide/components/commit_sidebar/stage_button.vue @@ -7,8 +7,8 @@ export default { Icon, }, props: { - file: { - type: Object, + path: { + type: String, required: true, }, }, @@ -27,7 +27,7 @@ export default { type="button" class="btn btn-blank append-right-5" :aria-label="__('Stage change')" - @click.stop="stageChange(file)" + @click.stop="stageChange(path)" > <icon name="mobile-issue-close" @@ -38,7 +38,7 @@ export default { type="button" class="btn btn-blank" :aria-label="__('Discard change')" - @click.stop="discardFileChanges(file)" + @click.stop="discardFileChanges(path)" > <icon name="remove" diff --git a/app/assets/javascripts/ide/components/commit_sidebar/unstage_button.vue b/app/assets/javascripts/ide/components/commit_sidebar/unstage_button.vue index fd7ec0366a2..e5d57b9ecc5 100644 --- a/app/assets/javascripts/ide/components/commit_sidebar/unstage_button.vue +++ b/app/assets/javascripts/ide/components/commit_sidebar/unstage_button.vue @@ -7,8 +7,8 @@ export default { Icon, }, props: { - file: { - type: Object, + path: { + type: String, required: true, }, }, @@ -27,7 +27,7 @@ export default { type="button" class="btn btn-blank" :aria-label="__('Unstage change')" - @click="unstageChange(file)" + @click="unstageChange(path)" > <icon name="history" diff --git a/app/assets/javascripts/ide/components/repo_commit_section.vue b/app/assets/javascripts/ide/components/repo_commit_section.vue index d8d447b80f3..caa0f25c827 100644 --- a/app/assets/javascripts/ide/components/repo_commit_section.vue +++ b/app/assets/javascripts/ide/components/repo_commit_section.vue @@ -32,9 +32,8 @@ export default { }, }, computed: { - ...mapState(['stagedFiles', 'rightPanelCollapsed']), + ...mapState(['changedFiles', 'stagedFiles', 'rightPanelCollapsed']), ...mapState('commit', ['commitMessage', 'submitCommitLoading']), - ...mapGetters(['unstagedFiles']), ...mapGetters('commit', [ 'commitButtonDisabled', 'discardDraftButtonDisabled', @@ -74,12 +73,12 @@ export default { </template> </modal> <template - v-if="unstagedFiles.length || stagedFiles.length" + v-if="changedFiles.length || stagedFiles.length" > <commit-files-list icon="unstaged" :title="__('Unstaged')" - :file-list="unstagedFiles" + :file-list="changedFiles" action="stageAllChanges" :action-btn-text="__('Stage all')" item-action-component="stage-button" diff --git a/app/assets/javascripts/ide/lib/common/model.js b/app/assets/javascripts/ide/lib/common/model.js index 73cd684351c..ef395b276af 100644 --- a/app/assets/javascripts/ide/lib/common/model.js +++ b/app/assets/javascripts/ide/lib/common/model.js @@ -69,9 +69,12 @@ export default class Model { ); } - updateContent(content) { + updateContent({ content, changed }) { this.getOriginalModel().setValue(content); - this.getModel().setValue(content); + + if (!changed) { + this.getModel().setValue(content); + } } dispose() { diff --git a/app/assets/javascripts/ide/stores/actions.js b/app/assets/javascripts/ide/stores/actions.js index 639195308b2..1e3e263157c 100644 --- a/app/assets/javascripts/ide/stores/actions.js +++ b/app/assets/javascripts/ide/stores/actions.js @@ -116,11 +116,11 @@ export const scrollToTab = () => { }; export const stageAllChanges = ({ state, commit }) => { - [...state.changedFiles].forEach(file => commit(types.STAGE_CHANGE, file)); + state.changedFiles.forEach(file => commit(types.STAGE_CHANGE, file.path)); }; export const unstageAllChanges = ({ state, commit }) => { - [...state.stagedFiles].forEach(file => commit(types.UNSTAGE_CHANGE, file)); + state.stagedFiles.forEach(file => commit(types.UNSTAGE_CHANGE, file.path)); }; export const updateViewer = ({ commit }, viewer) => { diff --git a/app/assets/javascripts/ide/stores/actions/file.js b/app/assets/javascripts/ide/stores/actions/file.js index 61aa0e983fc..cc908f70bc3 100644 --- a/app/assets/javascripts/ide/stores/actions/file.js +++ b/app/assets/javascripts/ide/stores/actions/file.js @@ -145,10 +145,10 @@ export const discardFileChanges = ({ state, commit }, path) => { eventHub.$emit(`editor.update.model.content.${file.path}`, file.raw); }; -export const stageChange = ({ commit }, file) => { - commit(types.STAGE_CHANGE, file); +export const stageChange = ({ commit }, path) => { + commit(types.STAGE_CHANGE, path); }; -export const unstageChange = ({ commit }, file) => { - commit(types.UNSTAGE_CHANGE, file); +export const unstageChange = ({ commit }, path) => { + commit(types.UNSTAGE_CHANGE, path); }; diff --git a/app/assets/javascripts/ide/stores/getters.js b/app/assets/javascripts/ide/stores/getters.js index 85f9b75636a..c816936306d 100644 --- a/app/assets/javascripts/ide/stores/getters.js +++ b/app/assets/javascripts/ide/stores/getters.js @@ -24,9 +24,8 @@ export const projectsWithTrees = state => }); // eslint-disable-next-line no-confusing-arrow -export const currentIcon = state => +export const collapseButtonIcon = state => state.rightPanelCollapsed ? 'angle-double-left' : 'angle-double-right'; -export const hasChanges = state => !!state.changedFiles.length; - -export const unstagedFiles = state => state.changedFiles.filter(f => !f.staged); +export const hasChanges = state => + !!state.changedFiles.length || !!state.stagedFiles.length; diff --git a/app/assets/javascripts/ide/stores/modules/commit/actions.js b/app/assets/javascripts/ide/stores/modules/commit/actions.js index 5346bbcdfd9..e577ea3c26c 100644 --- a/app/assets/javascripts/ide/stores/modules/commit/actions.js +++ b/app/assets/javascripts/ide/stores/modules/commit/actions.js @@ -100,35 +100,22 @@ export const updateFilesAfterCommit = ( { root: true }, ); - rootState.changedFiles.forEach(entry => { - commit( - rootTypes.SET_LAST_COMMIT_DATA, - { - entry, - lastCommit, - }, - { root: true }, - ); - - eventHub.$emit(`editor.update.model.content.${entry.path}`, entry.content); + rootState.stagedFiles.forEach(file => { + const changedFile = rootState.changedFiles.find(f => f.path === file.path); commit( - rootTypes.SET_FILE_RAW_DATA, + rootTypes.UPDATE_FILE_AFTER_COMMIT, { - file: entry, - raw: entry.content, + file, + lastCommit, }, { root: true }, ); - commit( - rootTypes.TOGGLE_FILE_CHANGED, - { - file: entry, - changed: false, - }, - { root: true }, - ); + eventHub.$emit(`editor.update.model.content.${file.path}`, { + content: file.content, + changed: !!changedFile, + }); }); if ( diff --git a/app/assets/javascripts/ide/stores/modules/commit/getters.js b/app/assets/javascripts/ide/stores/modules/commit/getters.js index f7cdd6adb0c..f6d60e1848f 100644 --- a/app/assets/javascripts/ide/stores/modules/commit/getters.js +++ b/app/assets/javascripts/ide/stores/modules/commit/getters.js @@ -1,12 +1,15 @@ import * as consts from './constants'; -export const discardDraftButtonDisabled = state => state.commitMessage === '' || state.submitCommitLoading; +export const discardDraftButtonDisabled = state => + state.commitMessage === '' || state.submitCommitLoading; export const commitButtonDisabled = (state, getters, rootState) => - getters.discardDraftButtonDisabled || !rootState.changedFiles.length; + getters.discardDraftButtonDisabled || !rootState.stagedFiles.length; export const newBranchName = (state, _, rootState) => - `${gon.current_username}-${rootState.currentBranchId}-patch-${`${new Date().getTime()}`.substr(-5)}`; + `${gon.current_username}-${ + rootState.currentBranchId + }-patch-${`${new Date().getTime()}`.substr(-5)}`; export const branchName = (state, getters, rootState) => { if ( diff --git a/app/assets/javascripts/ide/stores/mutation_types.js b/app/assets/javascripts/ide/stores/mutation_types.js index 49eb30302c6..8be9f6a86e4 100644 --- a/app/assets/javascripts/ide/stores/mutation_types.js +++ b/app/assets/javascripts/ide/stores/mutation_types.js @@ -45,3 +45,5 @@ export const UPDATE_DELAY_VIEWER_CHANGE = 'UPDATE_DELAY_VIEWER_CHANGE'; export const CLEAR_STAGED_CHANGES = 'CLEAR_STAGED_CHANGES'; export const STAGE_CHANGE = 'STAGE_CHANGE'; export const UNSTAGE_CHANGE = 'UNSTAGE_CHANGE'; + +export const UPDATE_FILE_AFTER_COMMIT = 'UPDATE_FILE_AFTER_COMMIT'; diff --git a/app/assets/javascripts/ide/stores/mutations.js b/app/assets/javascripts/ide/stores/mutations.js index 5409ec1ec47..2a165f778ae 100644 --- a/app/assets/javascripts/ide/stores/mutations.js +++ b/app/assets/javascripts/ide/stores/mutations.js @@ -104,6 +104,21 @@ export default { delayViewerUpdated, }); }, + [types.UPDATE_FILE_AFTER_COMMIT](state, { file, lastCommit }) { + const changedFile = state.changedFiles.find(f => f.path === file.path); + + Object.assign(state.entries[file.path], { + raw: file.content, + changed: !!changedFile, + lastCommit: Object.assign(state.entries[file.path].lastCommit, { + id: lastCommit.commit.id, + url: lastCommit.commit_path, + message: lastCommit.commit.message, + author: lastCommit.commit.author_name, + updatedAt: lastCommit.commit.authored_date, + }), + }); + }, ...projectMutations, ...fileMutations, ...treeMutations, diff --git a/app/assets/javascripts/ide/stores/mutations/file.js b/app/assets/javascripts/ide/stores/mutations/file.js index 8e739a83270..f2b54f6b871 100644 --- a/app/assets/javascripts/ide/stores/mutations/file.js +++ b/app/assets/javascripts/ide/stores/mutations/file.js @@ -1,5 +1,4 @@ import * as types from '../mutation_types'; -import { findIndexOfFile, findEntry } from '../utils'; export default { [types.SET_FILE_ACTIVE](state, { path, active }) { @@ -76,31 +75,42 @@ export default { changedFiles: state.changedFiles.filter(f => f.path !== path), }); }, - [types.STAGE_CHANGE](state, file) { - const stagedFile = findEntry(state.stagedFiles, 'blob', file.name); + [types.STAGE_CHANGE](state, path) { + const stagedFile = state.stagedFiles.find(f => f.path === path); - Object.assign(file, { - staged: true, + Object.assign(state, { + changedFiles: state.changedFiles.filter(f => f.path !== path), }); if (stagedFile) { Object.assign(stagedFile, { - ...file, + ...state.entries[path], }); } else { - state.stagedFiles.push({ - ...file, + Object.assign(state, { + stagedFiles: state.stagedFiles.concat({ + ...state.entries[path], + }), }); } }, - [types.UNSTAGE_CHANGE](state, file) { - const indexOfStagedFile = findIndexOfFile(state.stagedFiles, file); - const changedFile = findEntry(state.changedFiles, 'blob', file.name); + [types.UNSTAGE_CHANGE](state, path) { + const changedFile = state.changedFiles.find(f => f.path === path); + const stagedFile = state.stagedFiles.find(f => f.path === path); - state.stagedFiles.splice(indexOfStagedFile, 1); + if (!changedFile && stagedFile) { + Object.assign(state.entries[path], { + ...stagedFile, + changed: true, + }); - Object.assign(changedFile, { - staged: false, + Object.assign(state, { + changedFiles: state.changedFiles.concat(state.entries[path]), + }); + } + + Object.assign(state, { + stagedFiles: state.stagedFiles.filter(f => f.path !== path), }); }, [types.TOGGLE_FILE_CHANGED](state, { file, changed }) { diff --git a/app/assets/javascripts/ide/stores/utils.js b/app/assets/javascripts/ide/stores/utils.js index da0069b63a8..d6f26368811 100644 --- a/app/assets/javascripts/ide/stores/utils.js +++ b/app/assets/javascripts/ide/stores/utils.js @@ -13,7 +13,6 @@ export const dataStructure = () => ({ opened: false, active: false, changed: false, - staged: false, lastCommitPath: '', lastCommit: { id: '', |