0
0

修改上传逻辑,增加了分支名输入的功能

This commit is contained in:
xubing
2025-12-03 21:40:53 +08:00
parent 9a34cd24e4
commit 5aae34ea36
7 changed files with 375 additions and 136 deletions

View File

@@ -5,6 +5,12 @@
"url": "http://117.72.162.127:3000/xb/test.git",
"username": "xb",
"token": "582e19830c58bdbfa8962f881ec873cce208ead0"
},
{
"name": "动力学模型",
"url": "http://117.72.162.127:3000/xb/build.git",
"username": "xb",
"token": "582e19830c58bdbfa8962f881ec873cce208ead0"
}
]
}

View File

@@ -24,7 +24,6 @@ var __importStar = (this && this.__importStar) || function (mod) {
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ConfigPanel = void 0;
// src/panels/ConfigPanel.ts
const vscode = __importStar(require("vscode"));
const path = __importStar(require("path"));
const ProjectView_1 = require("./views/ProjectView");
@@ -58,9 +57,6 @@ class ConfigPanel {
this.currentAircraftId = '';
this.currentContainerId = '';
this.currentModuleFolderId = '';
// 上传相关
this.pendingUploadFolderId = null;
this.pendingGitUploadFolderId = null;
// 仓库配置
this.repoConfigs = [];
// 状态管理
@@ -96,7 +92,7 @@ class ConfigPanel {
await this.loadRepoConfigs();
}
/**
* 弹出仓库选择弹窗
* 弹出仓库选择弹窗(仅用于“获取仓库 -> 获取分支”)
*/
async openRepoSelect() {
await this.loadRepoConfigs();
@@ -112,7 +108,25 @@ class ConfigPanel {
});
}
/**
* 仓库选择确认后的统一入口
* 弹出“上传代码”时的仓库 + 分支选择弹窗
*/
async openUploadRepoSelect(folderId, folderType) {
await this.loadRepoConfigs();
if (this.repoConfigs.length === 0) {
vscode.window.showWarningMessage('尚未配置任何仓库,请先点击右上角 "仓库配置" 按钮编辑 dcsp-repos.json。');
return;
}
if (this.isWebviewDisposed)
return;
this.panel.webview.postMessage({
type: 'showUploadRepoSelect',
repos: this.repoConfigs.map(r => ({ name: r.name })),
folderId,
folderType
});
}
/**
* “获取仓库”弹窗确认后:用于拉取分支
*/
async handleRepoSelectedForBranches(repoName) {
await this.loadRepoConfigs();
@@ -121,39 +135,37 @@ class ConfigPanel {
vscode.window.showErrorMessage(`在仓库配置中未找到名为 "${repoName}" 的仓库`);
return;
}
// 1⃣ Local 模块上传local -> git
if (this.pendingUploadFolderId) {
const localFolderId = this.pendingUploadFolderId;
this.pendingUploadFolderId = null;
await this.processLocalUpload(localFolderId, repo);
return;
}
// 2⃣ Git 模块上传git -> repo
if (this.pendingGitUploadFolderId) {
const gitFolderId = this.pendingGitUploadFolderId;
this.pendingGitUploadFolderId = null;
await this.processGitUpload(gitFolderId, repo);
return;
}
// 3⃣ 默认:获取分支(用于"获取仓库"-> 克隆)
this.currentRepoForBranches = repo;
await this.fetchBranchesForRepo(repo);
}
async processLocalUpload(folderId, repo) {
const folder = this.projectService.getModuleFolder(folderId);
if (!folder || folder.type !== 'local') {
vscode.window.showErrorMessage("未找到要上传的本地模块文件夹");
/**
* “上传代码”弹窗确认后:根据 folderType 决定上传逻辑,并使用用户输入的 branchName
*/
async handleUploadRepoSelected(folderId, folderType, repoName, branchName) {
const trimmedBranch = (branchName || '').trim();
if (!trimmedBranch) {
vscode.window.showErrorMessage('分支名称不能为空');
return;
}
const fullPath = this.projectService.getModuleFolderFullPath(folder);
if (!fullPath) {
vscode.window.showErrorMessage("无法确定本地模块文件夹路径");
await this.loadRepoConfigs();
const repo = this.repoConfigs.find(r => r.name === repoName);
if (!repo) {
vscode.window.showErrorMessage(`在仓库配置中未找到名为 "${repoName}" 的仓库`);
return;
}
const branchName = path.basename(fullPath);
await this.uploadLocalModuleFolder(folderId, repo.url, branchName, repo.username, repo.token);
if (folderType === 'local') {
// 本地模块 -> 选中仓库 + 指定分支
await this.uploadLocalModuleFolder(folderId, repo.url, trimmedBranch, repo.username, repo.token);
}
async processGitUpload(folderId, repo) {
else {
// Git 模块 -> 选中仓库 + 指定分支
await this.processGitUploadWithBranch(folderId, repo, trimmedBranch);
}
}
/**
* Git 模块上传(可能换仓库 / 改名),使用用户指定的分支
*/
async processGitUploadWithBranch(folderId, repo, branchName) {
const folder = this.projectService.getModuleFolder(folderId);
if (!folder || folder.type !== 'git') {
vscode.window.showErrorMessage("未找到要上传的 Git 模块文件夹");
@@ -168,12 +180,12 @@ class ConfigPanel {
vscode.window.showErrorMessage("无法确定 Git 模块文件夹路径");
return;
}
// 2.1 未改名 + 还是原来的仓库 → 直接在原分支上 push更新代码
// 未改名 + 还是原来的仓库 → 直接在原分支上 push更新代码
if (!isRenamed && isSameRepo) {
await this.uploadGitModuleFolder(folderId);
return;
}
// 2.2 改了名字 或 换了仓库 → 使用"当前文件夹名"作为分支,推送到选中仓库
// 改了名字 或 换了仓库 → 使用“用户输入的分支名”进行推送
await vscode.window.withProgress({
location: vscode.ProgressLocation.Notification,
title: `正在上传 Git 仓库: ${folder.name}`,
@@ -181,7 +193,7 @@ class ConfigPanel {
}, async (progress) => {
try {
progress.report({ increment: 0, message: '准备上传...' });
await GitService_1.GitService.pushToRepoUrl(fullPath, repo.url, newFolderName, repo.username, repo.token);
await GitService_1.GitService.pushToRepoUrl(fullPath, repo.url, branchName, repo.username, repo.token);
this.projectService.updateModuleFolder(folderId, {
uploaded: true,
originalFolderName: newFolderName,
@@ -189,7 +201,7 @@ class ConfigPanel {
});
await this.saveCurrentProjectData();
progress.report({ increment: 100, message: '完成' });
vscode.window.showInformationMessage(`✅ Git 仓库已上传到 ${repo.name} 的分支 ${newFolderName}`);
vscode.window.showInformationMessage(`✅ Git 仓库已上传到 ${repo.name} 的分支 ${branchName}`);
this.updateWebview();
}
catch (error) {
@@ -264,10 +276,12 @@ class ConfigPanel {
'renameModuleFolder': (data) => this.renameModuleFolder(data.folderId, data.newName),
// 上传功能
'uploadGitModuleFolder': (data) => this.uploadGitModuleFolder(data.folderId, data.username, data.password),
'openRepoSelectForUpload': (data) => this.handleOpenRepoSelectForUpload(data.folderId),
'openRepoSelectForUpload': (data) => this.openUploadRepoSelect(data.folderId, 'local'),
'uploadLocalModuleFolder': (data) => this.uploadLocalModuleFolder(data.folderId, data.repoUrl, data.branchName),
'openRepoSelectForGitUpload': (data) => this.openRepoSelectForGitUpload(data.folderId),
'repoSelectedForGitUpload': (data) => this.handleRepoSelectedForGitUpload(data.folderId, data.repoName)
'openRepoSelectForGitUpload': (data) => this.openUploadRepoSelect(data.folderId, 'git'),
// 旧的 repoSelectedForGitUpload 保留兼容的话可以转发到 handleRepoSelectedForBranches但现在不再使用
// 新增:上传时仓库 + 分支选择确认
'uploadRepoSelected': (data) => this.handleUploadRepoSelected(data.folderId, data.folderType, data.repoName, data.branchName)
};
const handler = messageHandlers[data.type];
if (handler) {
@@ -327,21 +341,6 @@ class ConfigPanel {
console.log('❌ 取消分支选择');
this.updateWebview();
}
async handleOpenRepoSelectForUpload(folderId) {
console.log("📌 Local 上传:收到 openRepoSelectForUploadfolderId =", folderId);
this.pendingUploadFolderId = folderId;
await this.openRepoSelect();
}
async openRepoSelectForGitUpload(folderId) {
console.log('📌 Git 上传:收到 openRepoSelectForGitUploadfolderId =', folderId);
this.pendingGitUploadFolderId = folderId;
await this.openRepoSelect();
}
async handleRepoSelectedForGitUpload(folderId, repoName) {
// 兼容:如果前端用的是 repoSelectedForGitUpload 事件,则这里转成统一逻辑
this.pendingGitUploadFolderId = folderId;
await this.handleRepoSelectedForBranches(repoName);
}
// =============================================
// 项目管理方法
// =============================================
@@ -879,7 +878,7 @@ class ConfigPanel {
progress.report({ increment: 10, message: '初始化 Git 仓库...' });
await GitService_1.GitService.initRepository(fullPath, branchName);
progress.report({ increment: 20, message: '添加远程仓库...' });
await GitService_1.GitService.addRemote(fullPath, repoUrl);
await GitService_1.GitService.addRemote(fullPath, repoUrl, username, token);
progress.report({ increment: 40, message: '提交初始文件...' });
await GitService_1.GitService.commitInitialFiles(fullPath);
progress.report({ increment: 60, message: '推送到远程仓库...' });

File diff suppressed because one or more lines are too long

View File

@@ -255,7 +255,7 @@ class BaseView {
`;
}
/**
* 获取仓库选择对话框的脚本(ConfigView需要
* 获取仓库选择对话框的脚本ConfigView 使用
*/
getRepoSelectScript() {
return `
@@ -267,6 +267,7 @@ class BaseView {
}
window.__dcspRepoDialogInitialized = true;
// ① 仅用于“获取仓库 -> 拉取分支”的弹窗
function showRepoSelectDialog(repos) {
// 移除已有弹窗
var existing = document.getElementById('repoSelectModal');
@@ -350,11 +351,120 @@ class BaseView {
}
}
// ② 专门用于“上传代码”的仓库+分支弹窗
function showUploadRepoSelectDialog(repos, folderId, folderType) {
var existing = document.getElementById('uploadRepoSelectModal');
if (existing) {
existing.remove();
}
var overlay = document.createElement('div');
overlay.className = 'modal-overlay';
overlay.id = 'uploadRepoSelectModal';
var hasRepos = Array.isArray(repos) && repos.length > 0;
var optionsHtml = '';
if (hasRepos) {
for (var i = 0; i < repos.length; i++) {
var r = repos[i];
if (!r || !r.name) continue;
optionsHtml += '<option value="' + r.name + '">' + r.name + '</option>';
}
}
var disabledAttr = hasRepos ? '' : 'disabled';
var noRepoTip = '';
if (!hasRepos) {
noRepoTip = '<div style="margin-top:8px; font-size:12px; color: var(--vscode-descriptionForeground);">当前配置中没有仓库,请先在"仓库配置"中添加。</div>';
}
overlay.innerHTML =
'<div class="modal-dialog">' +
'<div class="modal-title">上传到仓库</div>' +
'<div style="margin-bottom: 10px;">' +
'<label style="display:block; margin-bottom:6px;">请选择仓库:</label>' +
'<select id="uploadRepoSelect" style="width:100%; padding:6px; background: var(--vscode-input-background); color: var(--vscode-input-foreground); border:1px solid var(--vscode-input-border); border-radius:4px;">' +
optionsHtml +
'</select>' +
noRepoTip +
'</div>' +
'<div style="margin-bottom: 10px;">' +
'<label style="display:block; margin-bottom:6px;">请输入分支名称:</label>' +
'<input type="text" id="uploadBranchInput" style="width:100%; padding:6px; background: var(--vscode-input-background); color: var(--vscode-input-foreground); border:1px solid var(--vscode-input-border); border-radius:4px;" placeholder="如main、develop、feature/xxx">' +
'<div style="font-size:12px; color: var(--vscode-descriptionForeground); margin-top:4px;">将把代码推送到该分支,如不存在则自动创建</div>' +
'</div>' +
'<div class="modal-buttons">' +
'<button class="modal-btn modal-btn-secondary" id="uploadRepoSelectCancelBtn">取消</button>' +
'<button class="modal-btn modal-btn-primary" id="uploadRepoSelectOkBtn" ' + disabledAttr + '>确定</button>' +
'</div>' +
'</div>';
document.body.appendChild(overlay);
var cancelBtn = document.getElementById('uploadRepoSelectCancelBtn');
var okBtn = document.getElementById('uploadRepoSelectOkBtn');
var repoSelect = document.getElementById('uploadRepoSelect');
var branchInput = document.getElementById('uploadBranchInput');
if (cancelBtn) {
cancelBtn.addEventListener('click', function () {
if (typeof vscode !== 'undefined') {
vscode.postMessage({
type: 'uploadRepoSelectCanceled',
folderId: folderId,
folderType: folderType
});
}
overlay.remove();
});
}
if (okBtn) {
okBtn.addEventListener('click', function () {
if (!hasRepos || !repoSelect) {
overlay.remove();
return;
}
var repoName = repoSelect.value;
var branchName = branchInput ? branchInput.value.trim() : '';
if (!repoName) {
alert('请选择一个仓库');
return;
}
if (!branchName) {
alert('请输入分支名称');
return;
}
if (typeof vscode !== 'undefined') {
vscode.postMessage({
type: 'uploadRepoSelected',
repoName: repoName,
branchName: branchName,
folderId: folderId,
folderType: folderType
});
}
overlay.remove();
});
}
setTimeout(function () {
if (branchInput) {
branchInput.focus();
}
}, 100);
}
window.addEventListener('message', function (event) {
var message = event.data;
if (!message || !message.type) return;
if (message.type === 'showRepoSelect') {
// 旧逻辑:仅用于获取分支
showRepoSelectDialog(message.repos || []);
} else if (message.type === 'showUploadRepoSelect') {
// 新逻辑:上传代码用(仓库 + 分支)
showUploadRepoSelectDialog(message.repos || [], message.folderId, message.folderType);
}
});
})();

View File

@@ -1 +1 @@
{"version":3,"file":"BaseView.js","sourceRoot":"","sources":["../../../src/panels/views/BaseView.ts"],"names":[],"mappings":";;;AAGA,MAAsB,QAAQ;IAG1B,YAAY,YAAwB;QAChC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACrC,CAAC;IAID;;OAEG;IACO,uBAAuB;QAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAmPN,CAAC;IACN,CAAC;IAED;;OAEG;IACO,mBAAmB;QACzB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAqGN,CAAC;IACN,CAAC;IAED;;OAEG;IACO,SAAS;QACf,OAAO,IAAI,CAAC,uBAAuB,EAAE,CAAC;IAC1C,CAAC;CACJ;AArXD,4BAqXC"}
{"version":3,"file":"BaseView.js","sourceRoot":"","sources":["../../../src/panels/views/BaseView.ts"],"names":[],"mappings":";;;AAEA,MAAsB,QAAQ;IAG1B,YAAY,YAAwB;QAChC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACrC,CAAC;IAID;;OAEG;IACO,uBAAuB;QAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAmPN,CAAC;IACN,CAAC;IAED;;OAEG;IACO,mBAAmB;QACzB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAmNN,CAAC;IACN,CAAC;IAED;;OAEG;IACO,SAAS;QACf,OAAO,IAAI,CAAC,uBAAuB,EAAE,CAAC;IAC1C,CAAC;CACJ;AAneD,4BAmeC"}

View File

@@ -1,4 +1,3 @@
// src/panels/ConfigPanel.ts
import * as vscode from 'vscode';
import * as path from 'path';
import { ProjectView } from './views/ProjectView';
@@ -41,10 +40,6 @@ export class ConfigPanel {
private currentContainerId: string = '';
private currentModuleFolderId: string = '';
// 上传相关
private pendingUploadFolderId: string | null = null;
private pendingGitUploadFolderId: string | null = null;
// 仓库配置
private repoConfigs: RepoConfigItem[] = [];
private currentRepoForBranches: RepoConfigItem | undefined;
@@ -125,7 +120,7 @@ export class ConfigPanel {
}
/**
* 弹出仓库选择弹窗
* 弹出仓库选择弹窗(仅用于“获取仓库 -> 获取分支”)
*/
private async openRepoSelect(): Promise<void> {
await this.loadRepoConfigs();
@@ -144,7 +139,28 @@ export class ConfigPanel {
}
/**
* 仓库选择确认后的统一入口
* 弹出“上传代码”时的仓库 + 分支选择弹窗
*/
private async openUploadRepoSelect(folderId: string, folderType: 'git' | 'local'): Promise<void> {
await this.loadRepoConfigs();
if (this.repoConfigs.length === 0) {
vscode.window.showWarningMessage('尚未配置任何仓库,请先点击右上角 "仓库配置" 按钮编辑 dcsp-repos.json。');
return;
}
if (this.isWebviewDisposed) return;
this.panel.webview.postMessage({
type: 'showUploadRepoSelect',
repos: this.repoConfigs.map(r => ({ name: r.name })),
folderId,
folderType
});
}
/**
* “获取仓库”弹窗确认后:用于拉取分支
*/
private async handleRepoSelectedForBranches(repoName: string): Promise<void> {
await this.loadRepoConfigs();
@@ -155,51 +171,55 @@ export class ConfigPanel {
return;
}
// 1⃣ Local 模块上传local -> git
if (this.pendingUploadFolderId) {
const localFolderId = this.pendingUploadFolderId;
this.pendingUploadFolderId = null;
await this.processLocalUpload(localFolderId, repo);
return;
}
// 2⃣ Git 模块上传git -> repo
if (this.pendingGitUploadFolderId) {
const gitFolderId = this.pendingGitUploadFolderId;
this.pendingGitUploadFolderId = null;
await this.processGitUpload(gitFolderId, repo);
return;
}
// 3⃣ 默认:获取分支(用于"获取仓库"-> 克隆)
this.currentRepoForBranches = repo;
await this.fetchBranchesForRepo(repo);
}
private async processLocalUpload(folderId: string, repo: RepoConfigItem): Promise<void> {
const folder = this.projectService.getModuleFolder(folderId);
if (!folder || folder.type !== 'local') {
vscode.window.showErrorMessage("未找到要上传的本地模块文件夹");
/**
* “上传代码”弹窗确认后:根据 folderType 决定上传逻辑,并使用用户输入的 branchName
*/
private async handleUploadRepoSelected(
folderId: string,
folderType: 'git' | 'local',
repoName: string,
branchName: string
): Promise<void> {
const trimmedBranch = (branchName || '').trim();
if (!trimmedBranch) {
vscode.window.showErrorMessage('分支名称不能为空');
return;
}
const fullPath = this.projectService.getModuleFolderFullPath(folder);
if (!fullPath) {
vscode.window.showErrorMessage("无法确定本地模块文件夹路径");
await this.loadRepoConfigs();
const repo = this.repoConfigs.find(r => r.name === repoName);
if (!repo) {
vscode.window.showErrorMessage(`在仓库配置中未找到名为 "${repoName}" 的仓库`);
return;
}
const branchName = path.basename(fullPath);
if (folderType === 'local') {
// 本地模块 -> 选中仓库 + 指定分支
await this.uploadLocalModuleFolder(
folderId,
repo.url,
branchName,
trimmedBranch,
repo.username,
repo.token
);
} else {
// Git 模块 -> 选中仓库 + 指定分支
await this.processGitUploadWithBranch(folderId, repo, trimmedBranch);
}
}
private async processGitUpload(folderId: string, repo: RepoConfigItem): Promise<void> {
/**
* Git 模块上传(可能换仓库 / 改名),使用用户指定的分支
*/
private async processGitUploadWithBranch(
folderId: string,
repo: RepoConfigItem,
branchName: string
): Promise<void> {
const folder = this.projectService.getModuleFolder(folderId);
if (!folder || folder.type !== 'git') {
vscode.window.showErrorMessage("未找到要上传的 Git 模块文件夹");
@@ -218,13 +238,13 @@ export class ConfigPanel {
return;
}
// 2.1 未改名 + 还是原来的仓库 → 直接在原分支上 push更新代码
// 未改名 + 还是原来的仓库 → 直接在原分支上 push更新代码
if (!isRenamed && isSameRepo) {
await this.uploadGitModuleFolder(folderId);
return;
}
// 2.2 改了名字 或 换了仓库 → 使用"当前文件夹名"作为分支,推送到选中仓库
// 改了名字 或 换了仓库 → 使用“用户输入的分支名”进行推送
await vscode.window.withProgress({
location: vscode.ProgressLocation.Notification,
title: `正在上传 Git 仓库: ${folder.name}`,
@@ -236,12 +256,11 @@ export class ConfigPanel {
await GitService.pushToRepoUrl(
fullPath,
repo.url,
newFolderName,
branchName,
repo.username,
repo.token
);
this.projectService.updateModuleFolder(folderId, {
uploaded: true,
originalFolderName: newFolderName,
@@ -251,7 +270,7 @@ export class ConfigPanel {
await this.saveCurrentProjectData();
progress.report({ increment: 100, message: '完成' });
vscode.window.showInformationMessage(`✅ Git 仓库已上传到 ${repo.name} 的分支 ${newFolderName}`);
vscode.window.showInformationMessage(`✅ Git 仓库已上传到 ${repo.name} 的分支 ${branchName}`);
this.updateWebview();
} catch (error: any) {
console.error('❌ Git 上传到新仓库/分支失败:', error);
@@ -336,10 +355,17 @@ export class ConfigPanel {
// 上传功能
'uploadGitModuleFolder': (data) => this.uploadGitModuleFolder(data.folderId, data.username, data.password),
'openRepoSelectForUpload': (data) => this.handleOpenRepoSelectForUpload(data.folderId),
'openRepoSelectForUpload': (data) => this.openUploadRepoSelect(data.folderId, 'local'),
'uploadLocalModuleFolder': (data) => this.uploadLocalModuleFolder(data.folderId, data.repoUrl, data.branchName),
'openRepoSelectForGitUpload': (data) => this.openRepoSelectForGitUpload(data.folderId),
'repoSelectedForGitUpload': (data) => this.handleRepoSelectedForGitUpload(data.folderId, data.repoName)
'openRepoSelectForGitUpload': (data) => this.openUploadRepoSelect(data.folderId, 'git'),
// 旧的 repoSelectedForGitUpload 保留兼容的话可以转发到 handleRepoSelectedForBranches但现在不再使用
// 新增:上传时仓库 + 分支选择确认
'uploadRepoSelected': (data) => this.handleUploadRepoSelected(
data.folderId,
data.folderType,
data.repoName,
data.branchName
)
};
const handler = messageHandlers[data.type];
@@ -409,24 +435,6 @@ export class ConfigPanel {
this.updateWebview();
}
private async handleOpenRepoSelectForUpload(folderId: string): Promise<void> {
console.log("📌 Local 上传:收到 openRepoSelectForUploadfolderId =", folderId);
this.pendingUploadFolderId = folderId;
await this.openRepoSelect();
}
private async openRepoSelectForGitUpload(folderId: string): Promise<void> {
console.log('📌 Git 上传:收到 openRepoSelectForGitUploadfolderId =', folderId);
this.pendingGitUploadFolderId = folderId;
await this.openRepoSelect();
}
private async handleRepoSelectedForGitUpload(folderId: string, repoName: string): Promise<void> {
// 兼容:如果前端用的是 repoSelectedForGitUpload 事件,则这里转成统一逻辑
this.pendingGitUploadFolderId = folderId;
await this.handleRepoSelectedForBranches(repoName);
}
// =============================================
// 项目管理方法
// =============================================
@@ -755,7 +763,14 @@ export class ConfigPanel {
console.log(`📥 开始克隆分支: ${branch}`);
try {
const folderNames = GitService.generateModuleFolderName(url, branch);
await this.addGitModuleFolder(url,repoDisplayName,folderNames.folderName,branch,this.currentRepoForBranches?.username,this.currentRepoForBranches?.token);
await this.addGitModuleFolder(
url,
repoDisplayName,
folderNames.folderName,
branch,
this.currentRepoForBranches?.username,
this.currentRepoForBranches?.token
);
successCount++;
console.log(`✅ 分支克隆成功: ${branch}`);
@@ -785,7 +800,7 @@ export class ConfigPanel {
branch?: string,
username?: string,
token?: string
): Promise<void> {
): Promise<void> {
try {
if (!url || !url.startsWith('http')) {
vscode.window.showErrorMessage('请输入有效的 Git 仓库 URL');
@@ -1100,7 +1115,7 @@ export class ConfigPanel {
await GitService.initRepository(fullPath, branchName);
progress.report({ increment: 20, message: '添加远程仓库...' });
await GitService.addRemote(fullPath, repoUrl);
await GitService.addRemote(fullPath, repoUrl, username, token);
progress.report({ increment: 40, message: '提交初始文件...' });
await GitService.commitInitialFiles(fullPath);

View File

@@ -1,4 +1,3 @@
// src/panels/views/BaseView.ts
import * as vscode from 'vscode';
export abstract class BaseView {
@@ -261,7 +260,7 @@ export abstract class BaseView {
}
/**
* 获取仓库选择对话框的脚本(ConfigView需要
* 获取仓库选择对话框的脚本ConfigView 使用
*/
protected getRepoSelectScript(): string {
return `
@@ -273,6 +272,7 @@ export abstract class BaseView {
}
window.__dcspRepoDialogInitialized = true;
// ① 仅用于“获取仓库 -> 拉取分支”的弹窗
function showRepoSelectDialog(repos) {
// 移除已有弹窗
var existing = document.getElementById('repoSelectModal');
@@ -356,11 +356,120 @@ export abstract class BaseView {
}
}
// ② 专门用于“上传代码”的仓库+分支弹窗
function showUploadRepoSelectDialog(repos, folderId, folderType) {
var existing = document.getElementById('uploadRepoSelectModal');
if (existing) {
existing.remove();
}
var overlay = document.createElement('div');
overlay.className = 'modal-overlay';
overlay.id = 'uploadRepoSelectModal';
var hasRepos = Array.isArray(repos) && repos.length > 0;
var optionsHtml = '';
if (hasRepos) {
for (var i = 0; i < repos.length; i++) {
var r = repos[i];
if (!r || !r.name) continue;
optionsHtml += '<option value="' + r.name + '">' + r.name + '</option>';
}
}
var disabledAttr = hasRepos ? '' : 'disabled';
var noRepoTip = '';
if (!hasRepos) {
noRepoTip = '<div style="margin-top:8px; font-size:12px; color: var(--vscode-descriptionForeground);">当前配置中没有仓库,请先在"仓库配置"中添加。</div>';
}
overlay.innerHTML =
'<div class="modal-dialog">' +
'<div class="modal-title">上传到仓库</div>' +
'<div style="margin-bottom: 10px;">' +
'<label style="display:block; margin-bottom:6px;">请选择仓库:</label>' +
'<select id="uploadRepoSelect" style="width:100%; padding:6px; background: var(--vscode-input-background); color: var(--vscode-input-foreground); border:1px solid var(--vscode-input-border); border-radius:4px;">' +
optionsHtml +
'</select>' +
noRepoTip +
'</div>' +
'<div style="margin-bottom: 10px;">' +
'<label style="display:block; margin-bottom:6px;">请输入分支名称:</label>' +
'<input type="text" id="uploadBranchInput" style="width:100%; padding:6px; background: var(--vscode-input-background); color: var(--vscode-input-foreground); border:1px solid var(--vscode-input-border); border-radius:4px;" placeholder="如main、develop、feature/xxx">' +
'<div style="font-size:12px; color: var(--vscode-descriptionForeground); margin-top:4px;">将把代码推送到该分支,如不存在则自动创建</div>' +
'</div>' +
'<div class="modal-buttons">' +
'<button class="modal-btn modal-btn-secondary" id="uploadRepoSelectCancelBtn">取消</button>' +
'<button class="modal-btn modal-btn-primary" id="uploadRepoSelectOkBtn" ' + disabledAttr + '>确定</button>' +
'</div>' +
'</div>';
document.body.appendChild(overlay);
var cancelBtn = document.getElementById('uploadRepoSelectCancelBtn');
var okBtn = document.getElementById('uploadRepoSelectOkBtn');
var repoSelect = document.getElementById('uploadRepoSelect');
var branchInput = document.getElementById('uploadBranchInput');
if (cancelBtn) {
cancelBtn.addEventListener('click', function () {
if (typeof vscode !== 'undefined') {
vscode.postMessage({
type: 'uploadRepoSelectCanceled',
folderId: folderId,
folderType: folderType
});
}
overlay.remove();
});
}
if (okBtn) {
okBtn.addEventListener('click', function () {
if (!hasRepos || !repoSelect) {
overlay.remove();
return;
}
var repoName = repoSelect.value;
var branchName = branchInput ? branchInput.value.trim() : '';
if (!repoName) {
alert('请选择一个仓库');
return;
}
if (!branchName) {
alert('请输入分支名称');
return;
}
if (typeof vscode !== 'undefined') {
vscode.postMessage({
type: 'uploadRepoSelected',
repoName: repoName,
branchName: branchName,
folderId: folderId,
folderType: folderType
});
}
overlay.remove();
});
}
setTimeout(function () {
if (branchInput) {
branchInput.focus();
}
}, 100);
}
window.addEventListener('message', function (event) {
var message = event.data;
if (!message || !message.type) return;
if (message.type === 'showRepoSelect') {
// 旧逻辑:仅用于获取分支
showRepoSelectDialog(message.repos || []);
} else if (message.type === 'showUploadRepoSelect') {
// 新逻辑:上传代码用(仓库 + 分支)
showUploadRepoSelectDialog(message.repos || [], message.folderId, message.folderType);
}
});
})();