From 9a4e5caa863c6b293267fe087a2bf5bb8b5249e8 Mon Sep 17 00:00:00 2001 From: James Gatz Date: Fri, 6 Jan 2023 17:36:43 +0200 Subject: [PATCH] Fix/git sync issues (#5626) * Display the push/pull/checkout errors correctly * use branch name to refresh the workspace * fix checkout * fetch the staged changes inside the modal * fix password login with git --- packages/insomnia/src/sync/git/git-vcs.ts | 13 ++++-- .../dropdowns/git-sync-dropdown.tsx | 45 ++++++++++++++----- .../components/modals/git-staging-modal.tsx | 31 ++++++++----- packages/insomnia/src/ui/index.tsx | 2 + .../insomnia/src/ui/routes/git-actions.tsx | 40 +++++++++++++---- packages/insomnia/src/ui/routes/workspace.tsx | 14 +++++- 6 files changed, 108 insertions(+), 37 deletions(-) diff --git a/packages/insomnia/src/sync/git/git-vcs.ts b/packages/insomnia/src/sync/git/git-vcs.ts index ea5917bca6..42e20076d3 100644 --- a/packages/insomnia/src/sync/git/git-vcs.ts +++ b/packages/insomnia/src/sync/git/git-vcs.ts @@ -312,7 +312,7 @@ export class GitVCS { async fetch( singleBranch: boolean, - depth: number, + depth?: number, gitCredentials?: GitCredentials | null, ) { console.log('[git] Fetch remote=origin'); @@ -352,13 +352,20 @@ export class GitVCS { console.log('[git] Checkout', { branch, }); - const branches = await this.listBranches(); + const localBranches = await this.listBranches(); + const remoteBranches = await this.listRemoteBranches(); + const branches = [...localBranches, ...remoteBranches]; if (branches.includes(branch)) { - await git.checkout({ ...this._baseOpts, ref: branch, remote: 'origin' }); + await git.checkout({ + ...this._baseOpts, + ref: branch, + remote: 'origin', + }); } else { await this.branch(branch, true); } + } async undoPendingChanges(fileFilter?: string[]) { diff --git a/packages/insomnia/src/ui/components/dropdowns/git-sync-dropdown.tsx b/packages/insomnia/src/ui/components/dropdowns/git-sync-dropdown.tsx index 71ae56fac6..063e746f56 100644 --- a/packages/insomnia/src/ui/components/dropdowns/git-sync-dropdown.tsx +++ b/packages/insomnia/src/ui/components/dropdowns/git-sync-dropdown.tsx @@ -5,7 +5,7 @@ import { useFetcher, useParams } from 'react-router-dom'; import { docsGitSync } from '../../../common/documentation'; import { GitRepository } from '../../../models/git-repository'; import { getOauth2FormatName } from '../../../sync/git/utils'; -import { GitRepoLoaderData, PushToGitRemoteResult } from '../../routes/git-actions'; +import { GitRepoLoaderData, PullFromGitRemoteResult, PushToGitRemoteResult } from '../../routes/git-actions'; import { type DropdownHandle, Dropdown } from '../base/dropdown/dropdown'; import { DropdownButton } from '../base/dropdown/dropdown-button'; import { DropdownDivider } from '../base/dropdown/dropdown-divider'; @@ -34,7 +34,7 @@ export const GitSyncDropdown: FC = ({ className, gitRepository }) => { const [isGitStagingModalOpen, setIsGitStagingModalOpen] = useState(false); const gitPushFetcher = useFetcher(); - const gitPullFetcher = useFetcher(); + const gitPullFetcher = useFetcher(); const gitCheckoutFetcher = useFetcher(); const gitRepoDataFetcher = useFetcher(); @@ -50,8 +50,6 @@ export const GitSyncDropdown: FC = ({ className, gitRepository }) => { useEffect(() => { const errors = [ ...gitPushFetcher.data?.errors ?? [], - ...gitPullFetcher.data?.errors ?? [], - ...gitCheckoutFetcher.data?.errors ?? [], ]; if (errors.length > 0) { showAlert({ @@ -59,7 +57,31 @@ export const GitSyncDropdown: FC = ({ className, gitRepository }) => { message: errors.join('\n'), }); } - }, [gitCheckoutFetcher.data?.errors, gitPullFetcher.data?.errors, gitPushFetcher.data?.errors]); + }, [gitPushFetcher.data?.errors]); + + useEffect(() => { + const errors = [ + ...gitPullFetcher.data?.errors ?? [], + ]; + if (errors.length > 0) { + showAlert({ + title: 'Pull Failed', + message: errors.join('\n'), + }); + } + }, [gitPullFetcher.data?.errors]); + + useEffect(() => { + const errors = [ + ...gitCheckoutFetcher.data?.errors ?? [], + ]; + if (errors.length > 0) { + showAlert({ + title: 'Checkout Failed', + message: errors.join('\n'), + }); + } + }, [gitCheckoutFetcher.data?.errors]); async function handlePush({ force }: { force: boolean }) { gitPushFetcher.submit({ @@ -82,7 +104,7 @@ export const GitSyncDropdown: FC = ({ className, gitRepository }) => { const isLoading = gitRepoDataFetcher.state === 'loading'; const isButton = !gitRepository || (isLoading && !gitRepoDataFetcher.data) || (gitRepoDataFetcher.data && 'errors' in gitRepoDataFetcher.data); - const { log, branches, branch: currentBranch, remoteBranches, changes, statusNames } = (gitRepoDataFetcher.data && 'log' in gitRepoDataFetcher.data) ? gitRepoDataFetcher.data : { log: [], branches: [], branch: '', remoteBranches: [], changes: [], statusNames: {} }; + const { log, branches, branch: currentBranch, remoteBranches } = (gitRepoDataFetcher.data && 'log' in gitRepoDataFetcher.data) ? gitRepoDataFetcher.data : { log: [], branches: [], branch: '', remoteBranches: [] }; let dropdown: React.ReactNode = null; @@ -236,12 +258,11 @@ export const GitSyncDropdown: FC = ({ className, gitRepository }) => { /> } {isGitLogModalOpen && setIsGitLogModalOpen(false)} />} - {isGitStagingModalOpen && setIsGitStagingModalOpen(false)} - />} + {isGitStagingModalOpen && + setIsGitStagingModalOpen(false)} + /> + } ); }; diff --git a/packages/insomnia/src/ui/components/modals/git-staging-modal.tsx b/packages/insomnia/src/ui/components/modals/git-staging-modal.tsx index f38500f63f..f3b77999f2 100644 --- a/packages/insomnia/src/ui/components/modals/git-staging-modal.tsx +++ b/packages/insomnia/src/ui/components/modals/git-staging-modal.tsx @@ -5,7 +5,7 @@ import { useFetcher, useParams } from 'react-router-dom'; import { strings } from '../../../common/strings'; import * as models from '../../../models'; -import { CommitToGitRepoResult, GitChange, GitRollbackChangesResult } from '../../routes/git-actions'; +import { CommitToGitRepoResult, GitChangesLoaderData, GitRollbackChangesResult } from '../../routes/git-actions'; import { IndeterminateCheckbox } from '../base/indeterminate-checkbox'; import { type ModalHandle, Modal, ModalProps } from '../base/modal'; import { ModalBody } from '../base/modal-body'; @@ -24,16 +24,7 @@ interface Item { editable: boolean; } -type Props = ModalProps & { - changes: GitChange[]; - branch: string; - statusNames: Record; -}; - -export const GitStagingModal: FC = ({ - changes, - branch, - statusNames, +export const GitStagingModal: FC = ({ onHide, }) => { const { organizationId, projectId, workspaceId } = useParams() as { @@ -45,7 +36,7 @@ export const GitStagingModal: FC = ({ const formRef = useRef(null); const [checkAllModified, setCheckAllModified] = React.useState(false); const [checkAllUnversioned, setCheckAllUnversioned] = React.useState(false); - + const gitChangesFetcher = useFetcher(); const gitCommitFetcher = useFetcher(); const rollbackFetcher = useFetcher(); @@ -53,6 +44,22 @@ export const GitStagingModal: FC = ({ modalRef.current?.show(); }, []); + useEffect(() => { + if (gitChangesFetcher.state === 'idle' && !gitChangesFetcher.data) { + gitChangesFetcher.load(`/organization/${organizationId}/project/${projectId}/workspace/${workspaceId}/git/changes`); + } + }, [organizationId, projectId, workspaceId, gitChangesFetcher]); + + const { + changes, + branch, + statusNames, + } = gitChangesFetcher.data || { + changes: [], + branch: '', + statusNames: {}, + }; + const hasChanges = Boolean(changes.length); const modifiedChanges = changes.filter(i => !i.status.includes('added')); diff --git a/packages/insomnia/src/ui/index.tsx b/packages/insomnia/src/ui/index.tsx index bfe5a74812..935ae9336c 100644 --- a/packages/insomnia/src/ui/index.tsx +++ b/packages/insomnia/src/ui/index.tsx @@ -41,6 +41,7 @@ import Root from './routes/root'; import { initializeSentry } from './sentry'; const Project = lazy(() => import('./routes/project')); +const Workspace = lazy(() => import('./routes/workspace')); const UnitTest = lazy(() => import('./routes/unit-test')); const Debug = lazy(() => import('./routes/debug')); const Design = lazy(() => import('./routes/design')); @@ -123,6 +124,7 @@ const router = createMemoryRouter( path: ':workspaceId', id: ':workspaceId', loader: async (...args) => (await import('./routes/workspace')).workspaceLoader(...args), + element: }>, children: [ { path: `${ACTIVITY_DEBUG}`, diff --git a/packages/insomnia/src/ui/routes/git-actions.tsx b/packages/insomnia/src/ui/routes/git-actions.tsx index fccc5d8e56..785b2422e5 100644 --- a/packages/insomnia/src/ui/routes/git-actions.tsx +++ b/packages/insomnia/src/ui/routes/git-actions.tsx @@ -46,8 +46,6 @@ export type GitRepoLoaderData = { branches: string[]; remoteBranches: string[]; gitRepository: GitRepository | null; - changes: GitChange[]; - statusNames: Record; } | { errors: string[]; }; @@ -128,16 +126,12 @@ export const gitRepoLoader: LoaderFunction = async ({ params }): Promise { + const workspaceData = useLoaderData() as WorkspaceLoaderData; + const branch = workspaceData.activeWorkspaceMeta?.cachedGitRepositoryBranch; + return ; +}; + +export default WorkspaceRoute;