从git仓库安装app时更新为使用默认分支

This commit is contained in:
jingrow 2025-10-27 05:13:18 +08:00
parent 46aac3eaf4
commit f042823922
3 changed files with 74 additions and 66 deletions

View File

@ -278,8 +278,7 @@ async function performInstall() {
installMessage.value = t('正在安装应用...') installMessage.value = t('正在安装应用...')
const params = new URLSearchParams({ const params = new URLSearchParams({
repo_url: app.value.repository_url, repo_url: app.value.repository_url
branch: app.value.branch || 'main'
}) })
response = await axios.post('/jingrow/install-from-git', params, { response = await axios.post('/jingrow/install-from-git', params, {

View File

@ -316,8 +316,7 @@ async function performInstall(app: any) {
installMessage.value = t('正在安装应用...') installMessage.value = t('正在安装应用...')
const params = new URLSearchParams({ const params = new URLSearchParams({
repo_url: app.repository_url, repo_url: app.repository_url
branch: app.branch || 'main'
}) })
response = await axios.post('/jingrow/install-from-git', params, { response = await axios.post('/jingrow/install-from-git', params, {

View File

@ -503,7 +503,7 @@ async def get_installed_apps(request: Request):
@router.post("/jingrow/install-from-git") @router.post("/jingrow/install-from-git")
async def install_from_git(repo_url: str = Form(...), branch: str = Form('main')): async def install_from_git(repo_url: str = Form(...)):
"""从 git 仓库克隆并安装应用或扩展包""" """从 git 仓库克隆并安装应用或扩展包"""
import subprocess import subprocess
@ -516,9 +516,9 @@ async def install_from_git(repo_url: str = Form(...), branch: str = Form('main')
clone_dir = tmp_dir / f"git_clone_{uuid.uuid4().hex[:8]}" clone_dir = tmp_dir / f"git_clone_{uuid.uuid4().hex[:8]}"
try: try:
# 使用 git clone 克隆仓库 # 使用 git clone 克隆仓库(使用仓库默认分支)
result = subprocess.run( result = subprocess.run(
['git', 'clone', '-b', branch, repo_url, str(clone_dir)], ['git', 'clone', repo_url, str(clone_dir)],
capture_output=True, capture_output=True,
text=True, text=True,
timeout=300 timeout=300
@ -529,75 +529,85 @@ async def install_from_git(repo_url: str = Form(...), branch: str = Form('main')
raise HTTPException(status_code=400, detail=f"Git 克隆失败: {result.stderr}") raise HTTPException(status_code=400, detail=f"Git 克隆失败: {result.stderr}")
# 直接使用克隆的目录进行分析和安装 # 直接使用克隆的目录进行分析和安装
from jingrow.utils.app_installer import analyze_package, install_files, is_app_installed from jingrow.utils.app_installer import analyze_package, install_files, is_app_installed, install_package
# 分析包结构 # 分析包结构
package_info = analyze_package(str(clone_dir)) package_info = analyze_package(str(clone_dir))
if not package_info.get('success'): if not package_info.get('success'):
raise HTTPException(status_code=400, detail=package_info.get('error', '无法识别应用')) raise HTTPException(status_code=400, detail=package_info.get('error', '无法识别应用'))
has_hooks = package_info['data'].get('has_hooks', False)
app_name = package_info['data'].get('app_name') app_name = package_info['data'].get('app_name')
if not app_name: if not app_name:
raise HTTPException(status_code=400, detail='无法识别应用名称') raise HTTPException(status_code=400, detail='无法识别应用名称')
# 如果应用已安装,先删除旧版本 # 判断是扩展包还是独立应用
if is_app_installed(app_name): if not has_hooks:
apps_dir, _ = get_app_directories() # 作为扩展包安装到 jingrow 应用内部
app_dir = apps_dir / app_name result = install_package(str(clone_dir), package_info['data'])
if app_dir.exists(): shutil.rmtree(clone_dir, ignore_errors=True)
shutil.rmtree(app_dir) return result
else:
# 安装后端文件 # 独立应用安装
backend_result = None # 如果应用已安装,先删除旧版本
if package_info['data'].get('has_backend'): if is_app_installed(app_name):
backend_result = install_files(str(clone_dir), app_name, package_info['data'], is_backend=True) apps_dir, _ = get_app_directories()
if not backend_result.get('success'): app_dir = apps_dir / app_name
raise HTTPException(status_code=400, detail=backend_result.get('error')) if app_dir.exists():
shutil.rmtree(app_dir)
# 安装前端文件
frontend_result = None # 安装后端文件
if package_info['data'].get('has_frontend'): backend_result = None
frontend_result = install_files(str(clone_dir), app_name, package_info['data'], is_backend=False) if package_info['data'].get('has_backend'):
if not frontend_result.get('success'): backend_result = install_files(str(clone_dir), app_name, package_info['data'], is_backend=True)
raise HTTPException(status_code=400, detail=frontend_result.get('error')) if not backend_result.get('success'):
raise HTTPException(status_code=400, detail=backend_result.get('error'))
# 清理临时文件
shutil.rmtree(clone_dir, ignore_errors=True) # 安装前端文件
frontend_result = None
# 只有独立应用才需要注册到 Local Installed Apps if package_info['data'].get('has_frontend'):
app_dir = backend_result.get('app_dir') if backend_result else None frontend_result = install_files(str(clone_dir), app_name, package_info['data'], is_backend=False)
if not frontend_result.get('success'):
if app_dir: raise HTTPException(status_code=400, detail=frontend_result.get('error'))
try:
from jingrow.utils.jingrow_api import get_single_pagetype # 清理临时文件
pagetype_result = get_single_pagetype("Local Installed Apps") shutil.rmtree(clone_dir, ignore_errors=True)
apps_list = pagetype_result.get('config', {}).get('local_installed_apps', []) if pagetype_result.get('success') else []
# 只有独立应用才需要注册到 Local Installed Apps
app_exists = False app_dir = backend_result.get('app_dir') if backend_result else None
for app in apps_list:
if app.get('app_name', '') == app_name: if app_dir:
app.update({'app_version': '1.0.0', 'git_branch': branch, 'git_repo': repo_url}) try:
app_exists = True from jingrow.utils.jingrow_api import get_single_pagetype
break pagetype_result = get_single_pagetype("Local Installed Apps")
apps_list = pagetype_result.get('config', {}).get('local_installed_apps', []) if pagetype_result.get('success') else []
if not app_exists:
apps_list.append({'app_name': app_name, 'app_version': '1.0.0', 'git_branch': branch, 'git_repo': repo_url}) app_exists = False
for app in apps_list:
await _update_local_installed_apps(apps_list) if app.get('app_name', '') == app_name:
app.update({'app_version': '1.0.0', 'git_repo': repo_url})
# 同步文件到数据库 app_exists = True
_import_app_package_and_pagetypes(app_name, {'app_name': app_name, 'backend_result': backend_result, 'frontend_result': frontend_result}) break
except Exception as e:
logger.error(f"Failed to register app: {e}") if not app_exists:
apps_list.append({'app_name': app_name, 'app_version': '1.0.0', 'git_repo': repo_url})
return {
'success': True, await _update_local_installed_apps(apps_list)
'message': f'应用 {app_name} 安装成功',
'app_name': app_name, # 同步文件到数据库
'package_info': package_info['data'], _import_app_package_and_pagetypes(app_name, {'app_name': app_name, 'backend_result': backend_result, 'frontend_result': frontend_result})
'backend_result': backend_result, except Exception as e:
'frontend_result': frontend_result logger.error(f"Failed to register app: {e}")
}
return {
'success': True,
'message': f'应用 {app_name} 安装成功',
'app_name': app_name,
'package_info': package_info['data'],
'backend_result': backend_result,
'frontend_result': frontend_result
}
except subprocess.TimeoutExpired: except subprocess.TimeoutExpired:
if clone_dir.exists(): if clone_dir.exists():