sync SVN r18041
This commit is contained in:
@@ -1,7 +1,8 @@
|
||||
# Flux editare .vcx/.scx pe text (comun proiectelor VFP)
|
||||
|
||||
Textul .vc2/.sc2 e sursa de editare; write-back in binar cu `txt2vcx.ps1`, fara VFP IDE.
|
||||
Detalii complete: `D:\ROA\UTIL\foxbin2prg\CLAUDE.md`. Parametrii per proiect: sectiunea de mai jos.
|
||||
Detalii complete: `D:\ROA\UTIL\foxbin2prg\CLAUDE.md`. Parametrii per proiect (nemigrate):
|
||||
`cautare_vcx_vct.md`.
|
||||
|
||||
**Proiecte migrate (ROACONT, COMUN, …): flux in-arbore.** Textul .??2 sta langa binare, il
|
||||
improspateaza `git_sync.ps1 -ProjectRoot <root>` (nu cache extern) — la inceput de sesiune si
|
||||
@@ -20,18 +21,57 @@ fals `roundtrip text1 != text2`. Ruleaza atunci cu lista rebazata:
|
||||
'utile\foxcharts\foxcharts.vcx','utile\web\_webview.vcx')` - si apeleaza scriptul cu `&`, nu cu
|
||||
`powershell -File` (acolo lista nu se leaga ca array).
|
||||
|
||||
## Parametri per proiect (nemigrate, cache extern)
|
||||
## Invariante — se verifica la FIECARE editare, inainte de write-back
|
||||
|
||||
- **ROAGEST**: `-Project 'D:\ROA\ROAGEST\roagest.pjx' -ProjectRoot 'D:\ROA\ROAGEST'
|
||||
-CacheRoot 'D:\ROA\_vfp_textcache\roagest'`; patch-uri de review in
|
||||
`docs/diff_runda<N>_<subiect>.patch`.
|
||||
1. **Membru nou de clasa (proprietate SAU metoda) are intrare in `*<DefinedPropArrayMethod>`**:
|
||||
`*p: nume` / `*m: nume`. Sectiunea "Membri noi de clasa" mai jos.
|
||||
2. **Ordinea alfabetica FoxBin2Prg**: `_` vine DUPA litere, nu inainte (ASCII). Ordinea canonica se
|
||||
citeste din `<staging>\verify\*.vc2`, nu se deduce.
|
||||
3. **CRLF, zero LF izolati**:
|
||||
`perl -e 'local $/; open F,"<:raw",$ARGV[0]; $d=<F>; $crlf=()=$d=~/\r\n/g; $lf=()=$d=~/\n/g; print $lf-$crlf' <fisier>`
|
||||
trebuie sa dea 0.
|
||||
4. **Cens de octeti >= 0x80 identic** cu cel de dinainte de editare:
|
||||
`od -An -tx1 <fisier> | tr ' ' '\n' | grep -v '^$' | awk '$1>"7f"' | sort | uniq -c`
|
||||
(detalii: `conventie_encoding_cp1252.md`).
|
||||
|
||||
**Nici fidelity-check-ul, nici `-DryRun` nu acopera punctele 1, 3 si 4** — trec cu OK peste toate
|
||||
trei. Sunt verificari separate, de facut de mana.
|
||||
|
||||
## Membri noi de clasa: `*p:` / `*m:`
|
||||
|
||||
Orice proprietate sau metoda NOUA cere, pe langa valoarea din `*<PropValue>` / corpul `PROCEDURE`,
|
||||
o intrare in blocul `*<DefinedPropArrayMethod>` al clasei: `*p: nume` pentru proprietate, `*m: nume`
|
||||
pentru metoda. Override-urile de metode mostenite (Init, Show, hook-uri) NU au nevoie de `*m:`.
|
||||
|
||||
Fara acea intrare, esecul e tacut in patru pasi:
|
||||
|
||||
1. textul se scrie si `txt2vcx.ps1` **trece fidelity-check-ul** — fidelity compara text-sursa cu
|
||||
text-regenerat, deci nu are cum sa observe lipsa; binarul primeste valoarea/corpul ca text;
|
||||
2. VFP nu materializeaza membrul pe obiect: `PEMSTATUS(o,'nume',5)` da `.F.`, iar accesul cade cu
|
||||
eroarea 1734 "Property ... is not found" (proprietate) sau "Data type mismatch" la
|
||||
`Createobject` (metoda). Dovedit in ambele sensuri pe o clasa de proba izolata;
|
||||
3. **prima salvare din IDE-ul VFP peste acel binar sterge tacit membrul** — la metode raman doar
|
||||
corpurile `PROCEDURE` orfane, la proprietati dispare si valoarea;
|
||||
4. urmatorul `git_sync` regenereaza textul din binarul deja ciuntit, deci pierderea intra si in
|
||||
`.??2`, si in backup-urile de runda.
|
||||
|
||||
Pasul 3 loveste si definitii `*m:` **deja existente si corecte** (patit pe ROAGEST:
|
||||
`import_adauga_factura.recalc_tva`, `import_nota.do_adauga/do_copie/do_reface`; simptom: crash la
|
||||
`Createobject` cu "Data type mismatch" raportat la linia apelanta). Deci dupa ORICE sesiune IDE pe
|
||||
o clasa atinsa: `git_sync` + compara lista `*p:`/`*m:` cu starea de dinainte.
|
||||
|
||||
Verificare inainte de write-back: `grep -n '\*[pm]: <nume>' <fisier>.vc2`.
|
||||
Pozitia in fisier nu e libera — FoxBin2Prg regenereaza membrul la pozitia lui alfabetica din
|
||||
`*<DefinedPropArrayMethod>` (cu `_` dupa litere); o intrare sau o metoda scrisa in alta parte pica
|
||||
fidelity-check-ul. Sursa de adevar pentru ordine si pozitie: textul din `<staging>\verify\*.vc2`.
|
||||
|
||||
## Pasii unei runde
|
||||
|
||||
0. Refresh cache (obligatoriu dupa orice sesiune IDE — staleness pe mtime):
|
||||
`vcx2txt.ps1 -Project <pjx> -ProjectRoot <root> -CacheRoot <cache> -Types vcx,scx`
|
||||
1. Baseline: `Copy-Item <f>.vc2 <f>.vc2.pre_runda<N>.bak` (in cache; la runde succesive
|
||||
necomise, diff-ul fata de HEAD ar amesteca rundele).
|
||||
0. Refresh text (obligatoriu la inceput de sesiune si dupa orice sesiune IDE — staleness pe
|
||||
mtime): `git_sync.ps1 -ProjectRoot <root>` (proiecte nemigrate: `vcx2txt.ps1 -Project <pjx>
|
||||
-ProjectRoot <root> -CacheRoot <cache> -Types vcx,scx`).
|
||||
1. Baseline: `Copy-Item <f>.vc2 <f>.vc2.pre_runda<N>.bak` (langa binar, in arbore; la runde
|
||||
succesive necomise, diff-ul fata de HEAD ar amesteca rundele).
|
||||
2. Editare byte-safe: PowerShell `[IO.File]::ReadAllText/WriteAllText(..., GetEncoding(1252))` -
|
||||
doar pentru round-trip pe octeti, NU pentru retastat literal diacritice (antetul zice
|
||||
`CPID="1252"`, dar octetii diacriticelor sunt de fapt cp1250: `conventie_encoding_cp1252.md`).
|
||||
@@ -56,7 +96,8 @@ fals `roundtrip text1 != text2`. Ruleaza atunci cu lista rebazata:
|
||||
(`Test-ExclusiveAccess` pe `.vcx`+`.vct`) si refuza cu mesaj clar daca e lock. NU conteaza
|
||||
existenta altor instante `vfp9` — utilizatorul poate lucra in paralel in alt proiect VFP —
|
||||
si NU se omoara procese: cand lock-ul exista, se cere utilizatorului sa inchida sesiunea.
|
||||
5. Write-back: `txt2vcx.ps1 -TextFile <vc2> -ProjectRoot <root> -CacheRoot <cache>`
|
||||
5. Write-back: `txt2vcx.ps1 -TextFile <vc2> -ProjectRoot <root>` (`-CacheRoot` implicit =
|
||||
`-ProjectRoot`; pentru proiecte nemigrate cu cache separat, paseaza-l explicit)
|
||||
(+ `-AllowComun` pentru tinte COMUN — afecteaza toate aplicatiile ROA, deci schimbarea in sine
|
||||
se propune explicit, dar write-back-ul local nu asteapta aprobarea; nimic nu pleaca la celelalte
|
||||
aplicatii pana la commit+push).
|
||||
@@ -75,29 +116,6 @@ fals `roundtrip text1 != text2`. Ruleaza atunci cu lista rebazata:
|
||||
- `.mnx`/`.frx` raman read-only (GENMENU in IDE / round-trip fragil).
|
||||
- Linii complet goale in metode pica fidelity doar pe whitespace; fix: preia `verify\*.vc2`
|
||||
din staging peste cache si reia write-back-ul.
|
||||
- Metoda noua de clasa cere `*m: nume` in `*<DefinedPropArrayMethod>`; fara ea, prima salvare
|
||||
din IDE o arunca tacut, iar refresh-ul urmator absoarbe pierderea in cache (si in .bak-uri).
|
||||
Override-urile de metode de baza (Init, Show, hook-uri) nu au nevoie de `*m:`.
|
||||
- **Proprietate noua de clasa cere identic `*p: nume` in `*<DefinedPropArrayMethod>`** — nu doar
|
||||
valoarea in `*<PropValue>`. Fara `*p:`, valoarea se scrie in text, **trece fidelity-check-ul**
|
||||
(fidelity compara doar text-sursa cu text-regenerat) si ajunge in binar ca text, dar VFP nu o
|
||||
materializeaza pe obiect: `PEMSTATUS(o,'nume',5)` da `.F.` si orice acces cade cu eroarea 1734
|
||||
"Property ... is not found". Dovedit in ambele sensuri pe o clasa de proba izolata (cu `*p:` ->
|
||||
`.T.`, fara -> `.F.`).
|
||||
- **FoxBin2Prg sorteaza alfabetic cu `_` DUPA literele obisnuite**, nu in ordine ASCII brut (unde
|
||||
`'_' (0x5F) < 'v' (0x76)` pe litere mici). O intrare `*p:`/`*m:` scrisa de mana in ordine "ASCII
|
||||
corecta" pica fidelity-check-ul; ordinea canonica se citeste din textul regenerat in
|
||||
`<staging>\verify\*.vc2` (vezi punctul de mai jos despre pozitia metodelor noi — se aplica identic
|
||||
proprietatilor).
|
||||
- FoxBin2Prg NU pastreaza pozitia in text a unei metode noi: o regenereaza la pozitia
|
||||
alfabetica din `*<DefinedPropArrayMethod>`. O metoda scrisa in alta parte a fisierului
|
||||
face fidelity-check-ul sa pice. Sursa de adevar pentru relocare e textul regenerat din
|
||||
`<staging>\verify\` - muta metoda unde apare acolo si reia write-back-ul.
|
||||
- Salvarea din VFP IDE peste un binar scris de txt2vcx poate PIERDE si definitii `*m:` deja
|
||||
existente, desi corpurile PROCEDURE raman (patit pe ROAGEST: `import_adauga_factura.recalc_tva`,
|
||||
`import_nota.do_adauga/do_copie/do_reface`); simptom: crash la Createobject cu
|
||||
"Data type mismatch" raportat la linia apelanta. Dupa orice sesiune IDE pe clasa: refresh
|
||||
cache + compara lista `*m:` cu starea de dinainte.
|
||||
- Nu folosi *Project > Build* ca sa recompilezi un binar vizat: rebuild-ul recompileaza toate
|
||||
`.vcx`/`.vct` din proiect si le rescrie antetul (timestamp compilare) si posibil p-code-ul
|
||||
intern si la librarii neatinse efectiv, aparand fals ca "modificate" in diff — de aici
|
||||
|
||||
Reference in New Issue
Block a user