Files
comun/docs/inrolare-proiect-git-text.md
Marius Mutu c4d869921d verificare partener: garda pe cont NULL, hook-uri de disciplina, docs compactate
- ooperatii_comune: verific_partener nu mai construieste SQL NULL cand contul
  primit e NULL (EMPTY(.NULL.) e .F. in VFP)
- utile\context_watch.ps1 si utile\docs_revizie_check.ps1: masurarea contextului
  sesiunii si cadenta reviziei de documentatie, prin hook-uri Claude Code
  (instalare in docs\monitorizare-context.md)
- reguli_lucru: delegare la subagenti, modificari minime si scoped, scrierea si
  revizuirea documentatiei, changelog strictul necesar (regulile 3, 6, 9, 11, 12)
- scripturi-migrare-db: continutul unui script (scoped, fara select, idempotent)
- teste noi pentru cele doua erori din achizitia de import
- restul documentatiei compactata, fara pierdere de reguli

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RYbiinqXxdEqXi53x4Ro7K
2026-08-02 22:30:44 +03:00

6.7 KiB

Inrolarea unui proiect ROA (Visual FoxPro) in fluxul git-text FoxBin2Prg

Pasi pentru o sesiune Claude Code care inroleaza un proiect ROA in fluxul in care git urmareste DOAR versiunile text FoxBin2Prg (.vc2/.sc2/.fr2/.mn2/.lb2/.pj2/.dc2/.db2) generate in arbore, langa binarele VFP. SVN ramane sursa de adevar si nu se atinge (niciun svn commit fara acordul explicit al utilizatorului).

Proiecte deja inrolate: ROACONT, ROAGEST, ROAAUTO, ROAIMOB, ROAACNPRO, ROAFACTURARE + COMUN (romfast/comun.git). Modelul de referinta e ROACONT.

Reguli pentru sesiunea care executa

  • Foloseste EXCLUSIV PowerShell (NU Bash — bash.exe crapa pe aceste masini si lasa stackdump-uri).
  • NU face niciun svn commit. NU modifica binarele VFP. La final binarele trebuie sa fie byte-identice (svn status: niciun binar M).
  • Rularile de conversie dureaza zeci de minute pe proiecte mari: sunt incrementale, daca expira timeout-ul tool-ului se reiau pana la capat.
  • Nu rula doua conversii git_sync in paralel pe acelasi arbore.

Preconditii

  1. Tooling partajat in D:\ROA\UTIL\foxbin2prg\: git_sync.ps1, vfp_filemap.ps1, txt2vcx.ps1, test_git_sync.ps1, test_roundtrip.ps1. Citeste-le inainte (macar help-ul din git_sync.ps1). roa_sync.ps1 (+ test_roa_sync.ps1) traieste in COMUN\scripts\ si vine singur cu svn update; in foxbin2prg a ramas doar un stub de compatibilitate.
  2. Proiectul e working copy SVN valid (svn info D:\ROA\<PROIECT>), cu COMUN\ inauntru (external SVN).
  3. Repo-ul gitea exista: git ls-remote git@gitea.romfast.ro:romfast/<proiect>.git. Daca nu exista, cere utilizatorului sa-l creeze din interfata gitea (NU crea repo-uri prin API din proprie initiativa).
  4. SVN global-ignores pe masina contine *.vc2 *.sc2 *.fr2 *.mn2 *.lb2 *.pj2 *.dc2 *.db2 *.dbf.cfg (in %APPDATA%\Subversion\config, sectiunea [miscellany]). Fara asta, textele apar ca ? in svn status si risca svn add accidental.
  5. Daca proiectul ARE deja git cu istoric si urmeaza reset: confirmarea utilizatorului ca nu exista clone active pe alte masini (force-push rescrie istoria).

Pasi

1. Inventar prealabil (inainte de orice stergere)

  • Exista .git? Noteaza git remote -v si branch-ul. Exista COMUN\.git?
  • git ls-files *.dbf (daca exista repo vechi): tabelele urmarite azi ca binare sunt candidate la conversie .db2 (cerinta: tot ce e convertibil trece pe text).

2. Conversia completa

& D:\ROA\UTIL\foxbin2prg\git_sync.ps1 -ProjectRoot D:\ROA\<PROIECT>
  • DbfList implicit acopera Locale\locale*.dbf, Help\*.dbf, DATE\Optiuni_*.dbf si toate dbf-urile COMUN. Tabele de configurare specifice proiectului se adauga cu -DbfList explicit (ATENTIE: parametrii array NU se pot pasa prin powershell -File — invoca scriptul in-process cu &, altfel array-ul se colapseaza). Tabele operationale mari nu se adauga; un .db2 peste 5 MB ramane binar.
  • Esecuri de conversie — se investigheaza fiecare:
    • meniuri pre-VFP9 ("NOT in VFP 9 Format"): raman binare, cu exceptii negate ! in .gitignore; intra in flux doar dupa re-salvare in VFP9 (MODIFY MENU -> save);
    • clase FFC/third-party cu roundtrip fals-negativ (#INCLUDE lipsa in staging izolat, ex. cele 6 din COMUN deja scutite implicit): se adauga la -RoundtripExempt;
    • alte esecuri reale: fisierul ramane binar urmarit (exceptie !) si se raporteaza.
  • Regula: nu se trece mai departe cu esecuri neexplicate (exit code nenul).

3. .gitignore si .gitattributes

  • Copiaza D:\ROA\ROACONT\.gitignore ca model si adapteaza: sectiunea machine-local (exe-ul proiectului, _ref.DBF/FPT/CDX, FOXUSER, .ini/.ARM, log-uri) si sectiunea dbf: fiecare .dbf care are .db2 se ignora INDIVIDUAL (plus .fpt-ul lui). NU ignora: *.??2, *.dbf.cfg, grafica (bmp/ico/jpg/png), ocx, tmpl.
  • .gitattributes cu * -text (SVN ramane autoritatea EOL; git nu normalizeaza).

4. Init/reset repo proiect

# doar la reset: Remove-Item -Recurse -Force D:\ROA\<PROIECT>\.git
git -C D:\ROA\<PROIECT> init -b main
git -C D:\ROA\<PROIECT> remote add origin git@gitea.romfast.ro:romfast/<proiect>.git
git -C D:\ROA\<PROIECT> add -A

VERIFICARE OBLIGATORIE inainte de commit (git ls-files pe staged):

  • 0 binare convertibile urmarite (vcx/vct/scx/sct/frx/frt/mnx/mnt/lbx/lbt/pjx/pjt/dbc/dct/cdx/dcx), cu exceptia celor cu ! justificate;
  • textele .??2 prezente; 0 fisiere din COMUN/ (are repo-ul lui).

Commit: Initial: flux text FoxBin2Prg (git urmareste .??2 in-arbore, binarele VFP git-ignored)

  • linia Co-Authored-By a sesiunii. Push: git push -u origin main (--force doar la reset).

5. Clona COMUN a proiectului

# daca exista .git vechi: Remove-Item -Recurse -Force D:\ROA\<PROIECT>\COMUN\.git
git -C D:\ROA\<PROIECT>\COMUN init -b main
git -C D:\ROA\<PROIECT>\COMUN remote add origin git@gitea.romfast.ro:romfast/comun.git
git -C D:\ROA\<PROIECT>\COMUN fetch origin
git -C D:\ROA\<PROIECT>\COMUN reset origin/main          # mixed: pastreaza discul
git -C D:\ROA\<PROIECT>\COMUN checkout origin/main -- .gitignore

Diferentele ramase in git status = revizii SVN diferite ale clonei (normal). NU comite nimic in comun.git dintr-o clona decalata — comun se comite doar din clona in care s-a lucrat efectiv, dupa svn update.

6. roa_sync.bat

Copiaza D:\ROA\ROAFACTURARE\roa_sync.bat in radacina proiectului (generic, foloseste %~dp0 si cheama COMUN\scripts\roa_sync.ps1) si include-l in commit. Utilizatorul il ruleaza la inceput de sesiune: svn update -> git_sync -> commit "sync SVN rN" pe main (proiect + COMUN) -> reconciliere cu origin + push (doar commit-uri de sync) -> inchide branch-urile claude/* cu diff gol.

7. Verificari finale

  • Acoperire: fiecare binar convertibil din arbore (inclusiv COMUN) are text .??2 langa el (exceptiile ! enumerate si justificate).
  • svn status: niciun binar modificat, niciun .??2 adaugat in SVN.
  • git ls-remote origin main = HEAD-ul local.
  • Raport final: numar texte per tip, esecuri/scutiri, commit hash, push status.

Note operationale

  • Dialogurile modale FoxBin2Prg sunt suprimate de scripturi printr-un foxbin2prg.cfg cu DontShowErrors: 1 scris per-director de staging (cfg-ul global de langa exe NU e fiabil). Daca utilizatorul vede totusi un MessageBox, e un dialog nativ VFP — watchdog-ul din Invoke-FoxBin2PrgSafe il omoara la timeout.
  • Tabelele legate de un DBC au nevoie de .dbc/.dct/.dcx si .cdx langa ele la conversie (git_sync face asta automat in staging).
  • DBF_Conversion_Support: 4 (scris de git_sync in cfg-ul de staging) exporta DATELE in .db2, nu doar structura.
  • Fisierele doar-git (docs, .bat, .gitignore) se comit separat, inainte de sync-ul "sync SVN rN", altfel nimeresc in commit-ul de sincronizare.