diff --git a/packages/tokens-studio-for-figma/src/app/store/providers/gitlab/gitlab.tsx b/packages/tokens-studio-for-figma/src/app/store/providers/gitlab/gitlab.tsx index 1ac9935bd..25fd5b6ee 100644 --- a/packages/tokens-studio-for-figma/src/app/store/providers/gitlab/gitlab.tsx +++ b/packages/tokens-studio-for-figma/src/app/store/providers/gitlab/gitlab.tsx @@ -101,7 +101,7 @@ export function useGitLab() { themes, metadata: {}, }; - } catch (e) { + } catch (e: any) { closePushDialog(); console.log('Error pushing to GitLab', e); if (e instanceof Error && e.message === ErrorMessages.GIT_MULTIFILE_PERMISSION_ERROR) { @@ -110,6 +110,12 @@ export function useGitLab() { errorMessage: ErrorMessages.GIT_MULTIFILE_PERMISSION_ERROR, }; } + if (e instanceof Error && e.message === ErrorMessages.GITLAB_PUSH_TO_PROTECTED_BRANCH_ERROR) { + return { + status: 'failure', + errorMessage: ErrorMessages.GITLAB_PUSH_TO_PROTECTED_BRANCH_ERROR, + }; + } return { status: 'failure', errorMessage: ErrorMessages.GITLAB_CREDENTIAL_ERROR, diff --git a/packages/tokens-studio-for-figma/src/app/store/remoteTokens.tsx b/packages/tokens-studio-for-figma/src/app/store/remoteTokens.tsx index 82c1568cf..923bf6cb0 100644 --- a/packages/tokens-studio-for-figma/src/app/store/remoteTokens.tsx +++ b/packages/tokens-studio-for-figma/src/app/store/remoteTokens.tsx @@ -30,6 +30,7 @@ import { isEqual } from '@/utils/isEqual'; import usePullDialog from '../hooks/usePullDialog'; import { Tabs } from '@/constants/Tabs'; import { useTokensStudio } from './providers/tokens-studio'; +import { notifyToUI } from '@/plugin/notifiers'; export type PushOverrides = { branch: string, commitMessage: string }; @@ -325,34 +326,38 @@ export default function useRemoteTokens() { async ({ context = api, overrides }: { context?: StorageTypeCredentials, overrides?: PushOverrides } = {}) => { const isFolder = 'filePath' in context && !context.filePath?.endsWith('.json'); track('pushTokens', { provider: context.provider, isFolder }); + let pushResult; switch (context.provider) { case StorageProviderType.GITHUB: { - await pushTokensToGitHub(context, overrides); + pushResult = await pushTokensToGitHub(context, overrides); break; } case StorageProviderType.GITLAB: { - await pushTokensToGitLab(context); + pushResult = await pushTokensToGitLab(context); break; } case StorageProviderType.BITBUCKET: { - await pushTokensToBitbucket(context); + pushResult = await pushTokensToBitbucket(context); break; } case StorageProviderType.ADO: { - await pushTokensToADO(context); + pushResult = await pushTokensToADO(context); break; } case StorageProviderType.SUPERNOVA: { - await pushTokensToSupernova(context); + pushResult = await pushTokensToSupernova(context); break; } case StorageProviderType.TOKENS_STUDIO: { - await pushTokensToTokensStudio(context); + pushResult = await pushTokensToTokensStudio(context); break; } default: throw new Error('Not implemented'); } + if (pushResult.status && pushResult.status === 'failure') { + notifyToUI(pushResult.errorMessage, { error: true }); + } }, [ api, diff --git a/packages/tokens-studio-for-figma/src/constants/ErrorMessages.ts b/packages/tokens-studio-for-figma/src/constants/ErrorMessages.ts index 5c3a4df49..86b0406f3 100644 --- a/packages/tokens-studio-for-figma/src/constants/ErrorMessages.ts +++ b/packages/tokens-studio-for-figma/src/constants/ErrorMessages.ts @@ -18,4 +18,5 @@ export enum ErrorMessages { ID_NON_EXIST_ERROR = 'ID or Secret should be exist', JSONBIN_CREATE_ERROR = 'Error creating JSONbin token storage', GIT_MULTIFILE_PERMISSION_ERROR = 'You try to save a multi-file project as a free user. Upgrade to Pro or add a json file at the end of the filepath (tokens.json)', + GITLAB_PUSH_TO_PROTECTED_BRANCH_ERROR = '403 Forbidden - You are not allowed to push into this branch', } diff --git a/packages/tokens-studio-for-figma/src/storage/GitlabTokenStorage.ts b/packages/tokens-studio-for-figma/src/storage/GitlabTokenStorage.ts index 2fb9abd00..8d5492a55 100644 --- a/packages/tokens-studio-for-figma/src/storage/GitlabTokenStorage.ts +++ b/packages/tokens-studio-for-figma/src/storage/GitlabTokenStorage.ts @@ -229,16 +229,23 @@ export class GitlabTokenStorage extends GitTokenStorage { }))); } - const response = await this.gitlabClient.Commits.create( - this.projectId, - branch, - message, - gitlabActions, - shouldCreateBranch ? { - startBranch: branches[0], - } : undefined, - ); - return !!response; + try { + const response = await this.gitlabClient.Commits.create( + this.projectId, + branch, + message, + gitlabActions, + shouldCreateBranch ? { + startBranch: branches[0], + } : undefined, + ); + return !!response; + } catch (e: any) { + if (e.cause.description && String(e.cause.description).includes(ErrorMessages.GITLAB_PUSH_TO_PROTECTED_BRANCH_ERROR)) { + throw new Error(ErrorMessages.GITLAB_PUSH_TO_PROTECTED_BRANCH_ERROR); + } + throw new Error(e); + } } public async getLatestCommitDate(): Promise {