|
1 | 1 | import * as vscode from 'vscode'; |
2 | | -import { checkBranchNameValid } from '@/core/git/checkBranchNameValid'; |
3 | | - |
4 | | -export const validateBranchInput = async (cwd: string, value: string) => { |
5 | | - try { |
6 | | - if (!value) return vscode.l10n.t('Branch name cannot be empty'); |
7 | | - const isValidBranchName = await checkBranchNameValid(cwd, value); |
8 | | - if (!isValidBranchName) return vscode.l10n.t('Branch name is invalid'); |
9 | | - return ''; |
10 | | - } catch (error) { |
11 | | - return String(error); |
| 2 | + |
| 3 | +/** |
| 4 | + * Sanitize branch name similar to VSCode behavior. Removes or replaces invalid characters according to Git branch naming rules. |
| 5 | + * @see https://github.com/microsoft/vscode/blob/1.107.1/extensions/git/src/commands.ts#L629 |
| 6 | + */ |
| 7 | +export const sanitizeBranchName = (name: string, branchWhitespaceChar = '-') => { |
| 8 | + if (!name) return name; |
| 9 | + |
| 10 | + return name |
| 11 | + .trim() |
| 12 | + .replace(/^-+/, '') |
| 13 | + .replace(/^\.|\/\.|\.\.|~|\^|:|\/$|\.lock$|\.lock\/|\\|\*|\s|^\s*$|\.$|\[|\]$/g, branchWhitespaceChar); |
| 14 | +}; |
| 15 | + |
| 16 | +export const validateBranchName = ( |
| 17 | + name: string, |
| 18 | +): { sanitizedName?: string; validationMessage?: vscode.InputBoxValidationMessage } => { |
| 19 | + const config = vscode.workspace.getConfiguration('git'); |
| 20 | + const branchWhitespaceChar = config.get<string>('branchWhitespaceChar')!; |
| 21 | + const branchValidationRegex = config.get<string>('branchValidationRegex')!; |
| 22 | + const validateName = new RegExp(branchValidationRegex); |
| 23 | + const sanitizedName = sanitizeBranchName(name, branchWhitespaceChar); |
| 24 | + |
| 25 | + if (validateName.test(sanitizedName)) { |
| 26 | + if (name === sanitizedName) { |
| 27 | + return { sanitizedName }; |
| 28 | + } |
| 29 | + return { |
| 30 | + sanitizedName, |
| 31 | + validationMessage: { |
| 32 | + message: vscode.l10n.t('The new branch will be "{0}"', sanitizedName), |
| 33 | + severity: vscode.InputBoxValidationSeverity.Info, |
| 34 | + }, |
| 35 | + }; |
12 | 36 | } |
| 37 | + |
| 38 | + return { |
| 39 | + sanitizedName, |
| 40 | + validationMessage: { |
| 41 | + message: vscode.l10n.t('Branch name needs to match regex: {0}', branchValidationRegex), |
| 42 | + severity: vscode.InputBoxValidationSeverity.Error, |
| 43 | + }, |
| 44 | + }; |
13 | 45 | }; |
0 commit comments