diff --git a/install.bat b/install.bat index cb1787a..eb3343a 100644 --- a/install.bat +++ b/install.bat @@ -9,7 +9,8 @@ rem install.bat --force dung lai moi truong ao tu dau rem rem Cai gi va cai o dau: rem %LOCALAPPDATA%\CoworkLocal\venv moi truong ao -rem %LOCALAPPDATA%\CoworkLocal\launcher lien ket de import duoc goi +rem %LOCALAPPDATA%\CoworkLocal\launcher\ lien ket de import duoc goi +rem (mot khoa cho moi thu muc ma nguon) rem rem Vi sao KHONG dat venv trong repo: cac cong chat luong rem (scripts/check_orphan_modules.py, check_imports.py) quet TOAN BO cay thu @@ -88,10 +89,24 @@ if "%FORCE%"=="1" if exist "%VENV%" ( rmdir /s /q "%VENV%" 2>nul ) +rem Chi kiem file python.exe co ton tai la khong du: mot venv dung lai tu ban +rem Python da bi nang cap hoac xoa van con nguyen file do, nhung chay vao la loi +rem ngay. Goi thu mot lenh that de biet no con song. +set "VENV_OK=0" if exist "%VENV%\Scripts\python.exe" ( + "%VENV%\Scripts\python.exe" -c "import sys" >nul 2>&1 + if not errorlevel 1 set "VENV_OK=1" +) + +if "!VENV_OK!"=="1" ( echo [2/5] Môi trường ảo đã có — dùng lại ) else ( - echo [2/5] Tạo môi trường ảo... + if exist "%VENV%" ( + echo [2/5] Môi trường ảo cũ không chạy được — dựng lại từ đầu... + rmdir /s /q "%VENV%" 2>nul + ) else ( + echo [2/5] Tạo môi trường ảo... + ) %PY% -m venv "%VENV%" if errorlevel 1 ( echo [LỖI] Không tạo được môi trường ảo. @@ -135,9 +150,23 @@ if /I "%REPO_NAME%"=="cowork_local" ( goto smoke ) -if not exist "%LAUNCHER%" mkdir "%LAUNCHER%" >nul 2>&1 +rem Junction rieng cho TUNG thu muc ma nguon. Ban truoc dung dung mot duong +rem dan cho ca may, nen hai ban checkout tranh nhau: cai chay sau tro junction +rem ve minh, va tien trinh con cua cai chay truoc (may chu MCP MS365) se import +rem ma nguon cua cai kia. +set "REPO_KEY=" +for /f "delims=" %%K in ('%PY% -c "import hashlib,os,sys;print(hashlib.sha1(os.path.normcase(os.path.abspath(sys.argv[1])).encode()).hexdigest()[:10])" "%REPO%" 2^>nul') do set "REPO_KEY=%%K" +if not defined REPO_KEY set "REPO_KEY=default" +set "PKGROOT=%LAUNCHER%\!REPO_KEY!" + +rem Don junction dung chung cua ban cu: de lai la mot cai bay — mot run.bat cu +rem o thu muc khac se dung lai no va chay nham ma nguon. rmdir KHONG co /s: voi +rem junction thi no xoa lien ket, khong xoa noi dung dich. if exist "%LAUNCHER%\cowork_local" rmdir "%LAUNCHER%\cowork_local" >nul 2>&1 -mklink /J "%LAUNCHER%\cowork_local" "%REPO%" >nul + +if not exist "!PKGROOT!" mkdir "!PKGROOT!" >nul 2>&1 +if exist "!PKGROOT!\cowork_local" rmdir "!PKGROOT!\cowork_local" >nul 2>&1 +mklink /J "!PKGROOT!\cowork_local" "%REPO%" >nul if errorlevel 1 ( echo [LỖI] Không tạo được liên kết thư mục. echo Thư mục "%REPO_NAME%" không phải tên gói Python hợp lệ nên @@ -145,7 +174,7 @@ if errorlevel 1 ( echo mã nguồn thành "cowork_local". goto fail ) -echo [4/5] Đã tạo liên kết: %LAUNCHER%\cowork_local +echo [4/5] Đã tạo liên kết: !PKGROOT!\cowork_local rem -------------------------------------------------------------------------- rem 5. Chay thu mot lan @@ -155,12 +184,25 @@ if "%USE_SYSTEM%"=="1" (set "RUNPY=%PY%") else (set "RUNPY="%VENV%\Scripts\pytho if /I "%REPO_NAME%"=="cowork_local" ( for %%I in ("%REPO%\..") do set "PKGPATH=%%~fI" ) else ( - set "PKGPATH=%LAUNCHER%" + set "PKGPATH=!PKGROOT!" ) echo [5/5] Kiểm tra lại... set "PYTHONPATH=!PKGPATH!" -%RUNPY% -c "import cowork_local, PySide6; print(' cowork_local + PySide6 nạp được')" +rem Kiem ca DANH TINH, khong chi kiem import duoc: neu tren sys.path con mot thu +rem muc khac cung ten "cowork_local" (mot ban checkout cu chang han) thi lenh +rem import van chay tot, va ca buoc kiem tra nay se xanh trong khi ung dung +rem dang chay tu ma nguon KHAC. Duong dan truyen qua bien moi truong de khoi +rem phai boc dau nhay long nhau trong chuoi -c. +set "EXPECT_REPO=%REPO%" +%RUNPY% -c "import os,sys,cowork_local,PySide6; p=os.path.realpath(os.path.dirname(cowork_local.__file__)); e=os.path.realpath(os.environ['EXPECT_REPO']); print(' cowork_local + PySide6 nap duoc'); print(' goi doc tu: '+p); sys.exit(0 if p==e else 3)" +if errorlevel 3 ( + echo [LỖI] Gói import được, nhưng KHÔNG phải từ thư mục mã nguồn này: + echo mong đợi: %REPO% + echo Trên PYTHONPATH hoặc site-packages đang có một "cowork_local" khác + echo chen lên trước. Gỡ nó đi rồi chạy lại install.bat. + goto fail +) if errorlevel 1 ( echo [LỖI] Cài xong nhưng vẫn chưa import được gói. goto fail diff --git a/run.bat b/run.bat index 6c54853..21d133d 100644 --- a/run.bat +++ b/run.bat @@ -63,26 +63,64 @@ rem -------------------------------------------------------------------------- rem 2. Duong dan de import duoc goi "cowork_local" rem rem Thu muc ma nguon phai mang dung ten "cowork_local" thi Python moi import -rem duoc no. Neu khong, install.bat da tao mot junction; o day chi kiem tra va -rem tu dung lai neu no bi xoa — de nguoi dung khong phai chay lai install.bat -rem chi vi mot thu muc tam bi don. +rem duoc no. Neu khong, ta tro mot junction toi no. +rem +rem Junction duoc TAO LAI moi lan chay, khong phai chi khi thieu. Ban truoc chi +rem hoi "co ton tai khong", nen mot junction con lai tu checkout KHAC van duoc +rem dung lai im lang: run.bat nam trong thu muc nay nhung ung dung chay tu thu +rem muc kia. Trieu chung la "sua code xong chay van y nguyen" — mat rat lau moi +rem nghi ra, vi khong co gi bao loi ca. Tao lai ton vai mili giay va bo han ca +rem lop loi do. install.bat cung lam dung nhu vay. rem -------------------------------------------------------------------------- +rem Junction rieng cho TUNG thu muc ma nguon, khong dung chung mot cai. +rem +rem Ban truoc dung dung mot duong dan %LAUNCHER%\cowork_local cho ca may. Hai +rem ban checkout thi tranh nhau no: cai chay sau tro junction ve minh, va tien +rem trinh con cua cai chay truoc (may chu MCP MS365, sinh ra sau khi app da mo) +rem se import ma nguon cua cai kia. Rat kho lan ra, vi khong co gi bao loi. +rem +rem Khoa lay tu bam SHA1 cua duong dan tuyet doi (normcase, nen khong phan biet +rem hoa thuong nhu Windows). Moi thu muc ma nguon co mot khoa on dinh, khong +rem bao gio dung chung. for %%I in ("%REPO%") do set "REPO_NAME=%%~nxI" if /I "%REPO_NAME%"=="cowork_local" ( for %%I in ("%REPO%\..") do set "PKGPATH=%%~fI" ) else ( - if not exist "%LAUNCHER%\cowork_local" ( - if not exist "%LAUNCHER%" mkdir "%LAUNCHER%" >nul 2>&1 - mklink /J "%LAUNCHER%\cowork_local" "%REPO%" >nul 2>&1 - if errorlevel 1 ( - echo. - echo [LỖI] Không tạo được liên kết thư mục. Chạy install.bat lại. - echo. - pause - exit /b 1 - ) + set "REPO_KEY=" + for /f "delims=" %%K in ('!RUNPY! -c "import hashlib,os,sys;print(hashlib.sha1(os.path.normcase(os.path.abspath(sys.argv[1])).encode()).hexdigest()[:10])" "%REPO%" 2^>nul') do set "REPO_KEY=%%K" + if not defined REPO_KEY set "REPO_KEY=default" + set "PKGPATH=%LAUNCHER%\!REPO_KEY!" + if not exist "!PKGPATH!" mkdir "!PKGPATH!" >nul 2>&1 + if exist "!PKGPATH!\cowork_local" rmdir "!PKGPATH!\cowork_local" >nul 2>&1 + mklink /J "!PKGPATH!\cowork_local" "%REPO%" >nul 2>&1 + if errorlevel 1 ( + echo. + echo [LOI] Khong tao duoc lien ket thu muc: + echo "!PKGPATH!\cowork_local" -> "%REPO%" + echo. + echo Thuong gap khi ma nguon nam tren o mang, hoac tren o dia dinh + echo dang khong phai NTFS - junction khong tro sang duoc. + echo Cach khac: chep ma nguon ve o dia trong may, hoac doi ten thu + echo muc ma nguon thanh cowork_local la khong can junction nua. + echo. + pause + exit /b 1 ) - set "PKGPATH=%LAUNCHER%" +) + +rem Chot lai: goi phai THAT SU nhin thay duoc qua duong dan vua dung. Khong co +rem buoc nay thi mot junction hong chi hien ra duoi dang loi Python kho hieu +rem ("'cowork_local' is a package and cannot be directly executed"). +if not exist "!PKGPATH!\cowork_local\__main__.py" ( + echo. + echo [LOI] Khong tim thay cowork_local\__main__.py qua duong dan: + echo "!PKGPATH!" + echo. + echo Ma nguon o "%REPO%" bi thieu file, hoac lien ket dang tro nham cho. + echo Chay install.bat de dung lai tu dau. + echo. + pause + exit /b 1 ) rem --------------------------------------------------------------------------