You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
231 lines
5.5 KiB
231 lines
5.5 KiB
import { ReadCommitResult } from "isomorphic-git"
|
|
import { allChangedButNotStagedFiles, getFilesByStatus, getFilesWithNotModifiedStatus } from "../lib/fileHelpers"
|
|
import { branch, commitChange, defaultGitState, fileStatusResult, gitState, setRemoteBranchCommitsAction, setLocalBranchCommitsAction, setBranchDifferencesAction, setDefaultRemoteAction, setRemotesAction, setUpstreamAction } from "../types"
|
|
import { Actions } from "./actions"
|
|
|
|
export const gitReducer = (state: gitState = defaultGitState, action: Actions): gitState => {
|
|
switch (action.type) {
|
|
|
|
case 'FILE_STATUS':
|
|
return {
|
|
...state,
|
|
fileStatusResult: action.payload,
|
|
staged: getFilesByStatus("staged", action.payload),
|
|
modified: getFilesByStatus("modified", action.payload),
|
|
untracked: getFilesByStatus("untracked", action.payload),
|
|
deleted: getFilesByStatus("deleted", action.payload),
|
|
allchangesnotstaged: allChangedButNotStagedFiles(action.payload)
|
|
}
|
|
|
|
case 'FILE_STATUS_MERGE':
|
|
action.payload.map((fileStatusResult: fileStatusResult) => {
|
|
const file = state.fileStatusResult.find(stateFile => {
|
|
return stateFile.filename === fileStatusResult.filename
|
|
})
|
|
if (file) {
|
|
file.status = fileStatusResult.status
|
|
file.statusNames = fileStatusResult.statusNames
|
|
}
|
|
})
|
|
|
|
return {
|
|
...state,
|
|
staged: getFilesByStatus("staged", state.fileStatusResult),
|
|
modified: getFilesByStatus("modified", state.fileStatusResult),
|
|
untracked: getFilesByStatus("untracked", state.fileStatusResult),
|
|
deleted: getFilesByStatus("deleted", state.fileStatusResult),
|
|
allchangesnotstaged: allChangedButNotStagedFiles(state.fileStatusResult)
|
|
}
|
|
|
|
case 'SET_COMMITS':
|
|
return {
|
|
...state,
|
|
commits: action.payload,
|
|
localCommitCount: action.payload.length
|
|
}
|
|
|
|
case 'SET_BRANCHES':
|
|
return {
|
|
...state,
|
|
branches: action.payload
|
|
}
|
|
|
|
case 'SET_CURRENT_BRANCH':
|
|
return {
|
|
...state,
|
|
currentBranch: action.payload
|
|
}
|
|
|
|
case 'SET_CURRENT_HEAD':
|
|
return {
|
|
...state,
|
|
currentHead: action.payload
|
|
}
|
|
|
|
case 'SET_CAN_USE_APP':
|
|
return {
|
|
...state,
|
|
canUseApp: action.payload
|
|
}
|
|
case 'SET_REPO_NAME':
|
|
return {
|
|
...state,
|
|
reponame: action.payload
|
|
}
|
|
case 'SET_LOADING':
|
|
return {
|
|
...state,
|
|
loading: action.payload
|
|
}
|
|
|
|
case 'SET_REPOS':
|
|
return {
|
|
...state,
|
|
repositories: action.payload
|
|
}
|
|
|
|
case 'SET_REMOTE_BRANCHES':
|
|
return {
|
|
...state,
|
|
remoteBranches: action.payload
|
|
}
|
|
|
|
case 'SET_CAN_COMMIT':
|
|
return {
|
|
...state,
|
|
canCommit: action.payload
|
|
}
|
|
|
|
case 'SET_REMOTES':
|
|
return {
|
|
...state,
|
|
remotes: action.payload
|
|
}
|
|
|
|
case 'SET_UPSTREAM':
|
|
return {
|
|
...state,
|
|
upstream: action.payload
|
|
}
|
|
|
|
case 'SET_COMMIT_CHANGES':
|
|
|
|
action.payload.forEach((change: commitChange) => {
|
|
state.commitChanges.find((c) => c.hashModified === change.hashModified && c.hashOriginal === change.hashOriginal && c.path === change.path) ? null : state.commitChanges.push(change)
|
|
})
|
|
|
|
return {
|
|
...state,
|
|
commitChanges: [...state.commitChanges]
|
|
}
|
|
|
|
case 'RESET_REMOTE_BRANCH_COMMITS':
|
|
if (state.remoteBranchCommits[action.payload.branch.name]) {
|
|
delete state.remoteBranchCommits[action.payload.branch.name]
|
|
}
|
|
return {
|
|
...state,
|
|
remoteBranchCommits: { ...state.remoteBranchCommits }
|
|
}
|
|
|
|
case 'SET_REMOTE_BRANCH_COMMITS':
|
|
if (state.remoteBranchCommits[action.payload.branch.name]) {
|
|
state.remoteBranchCommits[action.payload.branch.name].push(...action.payload.commits)
|
|
} else {
|
|
state.remoteBranchCommits[action.payload.branch.name] = action.payload.commits
|
|
}
|
|
return {
|
|
...state,
|
|
remoteBranchCommits: { ...state.remoteBranchCommits }
|
|
}
|
|
|
|
case 'SET_LOCAL_BRANCH_COMMITS':
|
|
|
|
state.localBranchCommits[action.payload.branch.name] = action.payload.commits
|
|
return {
|
|
...state,
|
|
localBranchCommits: { ...state.localBranchCommits }
|
|
}
|
|
|
|
case 'SET_BRANCH_DIFFERENCES':
|
|
|
|
state.branchDifferences[`${action.payload.remote.name}/${action.payload.branch.name}`] = action.payload.branchDifference
|
|
|
|
return {
|
|
...state,
|
|
branchDifferences: { ...state.branchDifferences }
|
|
}
|
|
|
|
case 'RESET_BRANCH_DIFFERENCES':
|
|
return {
|
|
...state,
|
|
branchDifferences: {}
|
|
}
|
|
|
|
case 'SET_GITHUB_USER':
|
|
return {
|
|
...state,
|
|
gitHubUser: action.payload
|
|
}
|
|
|
|
case 'SET_GITHUB_ACCESS_TOKEN':
|
|
return {
|
|
...state,
|
|
gitHubAccessToken: action.payload
|
|
}
|
|
|
|
case 'SET_SCOPES':
|
|
return {
|
|
...state,
|
|
gitHubScopes: action.payload
|
|
}
|
|
|
|
case 'SET_USER_EMAILS':
|
|
return {
|
|
...state,
|
|
userEmails: action.payload
|
|
}
|
|
|
|
case 'SET_DEFAULT_REMOTE':
|
|
return {
|
|
...state,
|
|
defaultRemote: action.payload
|
|
}
|
|
|
|
case 'SET_LOG':
|
|
if (state.log.length > 0 && state.log[[...state.log].length - 1].message === action.payload.message) {
|
|
return {
|
|
...state,
|
|
log: [...state.log]
|
|
}
|
|
}
|
|
return {
|
|
...state,
|
|
log: [...state.log, action.payload]
|
|
}
|
|
|
|
case 'CLEAR_LOG':
|
|
return {
|
|
...state,
|
|
log: []
|
|
}
|
|
|
|
case 'SET_STORAGE':
|
|
return {
|
|
...state,
|
|
storage: action.payload
|
|
}
|
|
case 'SET_TIMESTAMP':
|
|
return {
|
|
...state,
|
|
timestamp: action.payload
|
|
}
|
|
|
|
case 'SET_GIT_LOG_COUNT':
|
|
return {
|
|
...state,
|
|
gitLogCount: action.payload
|
|
}
|
|
}
|
|
|
|
}
|
|
|