From bb55841b999c330960267d1ba350ac2d52205586 Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Thu, 16 Jul 2026 12:35:03 +0300 Subject: [PATCH 1/2] sync SVN r17877: adauga utile/barcode/foxbarcodeqr.prg Co-Authored-By: Claude Fable 5 --- utile/barcode/foxbarcodeqr.prg | 388 +++++++++++++++++++++++++++++++++ 1 file changed, 388 insertions(+) create mode 100644 utile/barcode/foxbarcodeqr.prg diff --git a/utile/barcode/foxbarcodeqr.prg b/utile/barcode/foxbarcodeqr.prg new file mode 100644 index 0000000..52c3e8a --- /dev/null +++ b/utile/barcode/foxbarcodeqr.prg @@ -0,0 +1,388 @@ +*-------------------------------------------------------------------------------------- +* FoxBarcodeQR.prg +*-------------------------------------------------------------------------------------- +* FoxBarcodeQR is a application free software and offers a Barcode tool for the Visual +* FoxPro Community. This is a supplement of FoxBarcode class only for QR Code barcodes. +* This software is provided "as is" without express or implied warranty. +* Use it at your own risk +*-------------------------------------------------------------------------------------- +* Version: 2.10 +* Date : 2021.02.27 +* Author : VFPEncoding +* Email : vfpencoding@gmail.com +* +* Note : VFPEncoding are +* Guillermo Carrero (QEPD) (Barcelona, Spain) and +* Luis Maria Guayan (Tucuman, Argentina) +*-------------------------------------------------------------------------------------- +* Note : This application use the libraries +* BarCodeLibrary.dll (by: Dario Alvarez Aranda, Mexico) +* QRCodeLib.dll (visit: www.validacfd.com) +* Google API - https://developers.google.com/chart/infographics/docs/qr_codes +*-------------------------------------------------------------------------------------- + +*-------------------------------------------------------------------------------------- +* FoxBarcodeQR Class Definition +*-------------------------------------------------------------------------------------- +DEFINE CLASS FoxBarcodeQR AS CUSTOM + + m.cTempPath = "" && Windows Temp folder + SYS(2015) + m.cAppPath = "" && App folder + m.lDeleteTempFiles = .T. && Delete the temporary folder and image files + + m.nVersion = 2.10 && Version + m.lAutoConfigurate = .T. + m.lAutoFit = .F. + m.nBackColor = RGB(255, 255, 255) && White + m.nBarColor = RGB(0, 0, 0) && Black + m.nCorrectionLevel = 1 && 0-[L]ow 7%, 1-[M]edium 15%, 2-[Q]uartile 25%, 3-[H]igh 30%] + m.nEncoding = 4 && Automatic encoding algorithm + m.nMarginPixels = 0 && pixels + m.nModuleWidth = 2 && pixels + m.nHeight = 132 && pixels + m.nWidth = 132 && pixels + m.nSize = 132 && pixels + + *--------------------------------------------------------- + * PROCEDURE QRBarcodeImage() + *--------------------------------------------------------- + * Generated QR Barcode image with BarCodeLibrary.dll + * Parameters: + * tcText: Text to encode + * tcFile: Imagen File Name (optional) + * tnSize: Imagen Size [2..12] (default = 4) + * (Width in pixels is tnSize x 33 pixels) + * (tnSize = 4 -> 132 x 132 pixels) + * tnType: Imagen Type [BMP, JPG or PNG] (default = 0) + * 0 = BMP + * 1 = JPG + * 2 = PNG + *--------------------------------------------------------- + PROCEDURE QRBarcodeImage(tcText, tcFile, tnSize, tnType) + LOCAL lcType, lcFolder + + IF VARTYPE(m.tnSize) <> "N" + m.tnSize = INT(THIS.nSize / 33) && default size: 132 x 132 pixels + ENDIF + + IF VARTYPE(m.tnType) <> "N" + m.tnType = 0 && defaul type: BMP + ENDIF + + m.tnSize = MIN(MAX(m.tnSize, 2), 12) + m.tnType = MIN(MAX(m.tnType, 0), 2) + m.lcType = IIF(m.tnType = 1, "JPG", IIF(m.tnType = 2, "PNG", "BMP")) + + IF EMPTY(m.tcFile) + m.lcFolder = THIS.cTempPath + IF NOT DIRECTORY(m.lcFolder) + MD (m.lcFolder) + ENDIF + m.tcFile = FORCEEXT(m.lcFolder + SYS(2015), m.lcType) + ELSE + m.lcFolder = JUSTPATH(m.tcFile) + IF NOT DIRECTORY(m.lcFolder) AND NOT EMPTY(m.lcFolder) + MD (m.lcFolder) + ENDIF + m.tcFile = FORCEEXT(m.tcFile, m.lcType) + ENDIF + + *-- Declare the functions of BarCodeLibrary.dll + DECLARE INTEGER GenerateFile IN "BarCodeLibrary.dll" ; + STRING cData, STRING cFileName + + DECLARE INTEGER SetConfiguration IN "BarCodeLibrary.dll" ; + INTEGER nSize, INTEGER nImageType + + SetConfiguration(m.tnSize, m.tnType) + GenerateFile(m.tcText, m.tcFile) + + CLEAR DLLS "SetConfiguration", "GenerateFile" + + RETURN m.tcFile + ENDPROC + + *--------------------------------------------------------- + * PROCEDURE FullQRCodeImage() + *--------------------------------------------------------- + * Generated QR Barcode image with QRCodeLib.dll (visit: www.validacfd.com) + * Parameters: + * tcText: Text to encode + * tcFile: Imagen File Name (optional) + * tnSize: Imagen Size in pixels + * tnType: Imagen Type [Only 0=BMP] + *--------------------------------------------------------- + PROCEDURE FullQRCodeImage(tcText, tcFile, tnSize, tnType) + LOCAL lcType, lcFolder + + IF VARTYPE(m.tnSize) <> "N" + m.tnSize = THIS.nSize + ENDIF + m.tnSize = MIN(MAX(m.tnSize, 64), 1280) + STORE m.tnSize TO THIS.nHeight, THIS.nWidth + + *-- Only BMP type + m.tnType = 0 + m.lcType = "BMP" + + IF EMPTY(m.tcFile) + m.lcFolder = THIS.cTempPath + IF NOT DIRECTORY(m.lcFolder) + MD (m.lcFolder) + ENDIF + m.tcFile = FORCEEXT(m.lcFolder + SYS(2015), m.lcType) + ELSE + m.lcFolder = JUSTPATH(m.tcFile) + IF NOT DIRECTORY(m.lcFolder) AND NOT EMPTY(m.lcFolder) + MD (m.lcFolder) + ENDIF + m.tcFile = FORCEEXT(m.tcFile, m.lcType) + ENDIF + CLEAR RESOURCES m.tcFile + + *-- Declare the functions of QRCodeLib.dll (visit: www.validacfd.com) + DECLARE FullQRCode IN "QRCodeLib.dll" ; + INTEGER lAutoConfigurate, ; + INTEGER lAutoFit, ; + LONG nBackColor, ; + LONG nBarColor, ; + STRING cText, ; + INTEGER nCorrectionLevel, ; + INTEGER nEncoding, ; + INTEGER nMarginPixels, ; + INTEGER nModuleWidth, ; + INTEGER nHeight, ; + INTEGER nWidth, ; + STRING cFileName + + FullQRCode(THIS.lAutoConfigurate, THIS.lAutoFit, THIS.nBackColor, THIS.nBarColor, ; + m.tcText, THIS.nCorrectionLevel, THIS.nEncoding, THIS.nMarginPixels, ; + THIS.nModuleWidth, THIS.nHeight, THIS.nWidth, m.tcFile) + + CLEAR DLLS "FullQRCode" + + RETURN m.tcFile + ENDPROC + + *--------------------------------------------------------- + * PROCEDURE FastQRCodeImage() + *--------------------------------------------------------- + * Generated QR Barcode image with QRCodeLib.dll (visit: www.validacfd.com) + * Parameters: + * tcText: Text to encode + * tcFile: Imagen File Name (optional) + *--------------------------------------------------------- + PROCEDURE FastQRCodeImage(tcText, tcFile) + LOCAL lcFolder, lcType + + *-- Only BMP type + m.lcType = "BMP" + + IF EMPTY(m.tcFile) + m.lcFolder = THIS.cTempPath + IF NOT DIRECTORY(m.lcFolder) + MD (m.lcFolder) + ENDIF + m.tcFile = FORCEEXT(m.lcFolder + SYS(2015), m.lcType) + ELSE + m.lcFolder = JUSTPATH(m.tcFile) + IF NOT DIRECTORY(m.lcFolder) AND NOT EMPTY(m.lcFolder) + MD (m.lcFolder) + ENDIF + m.tcFile = FORCEEXT(m.tcFile, m.lcType) + ENDIF + CLEAR RESOURCES m.tcFile + + *-- Declare the functions of QRCodeLib.dll (visit: www.validacfd.com) + DECLARE FastQRCode IN "QRCodeLib.dll" ; + STRING cText, ; + STRING cFileName + + FastQRCode(m.tcText, m.tcFile) + + CLEAR DLLS "FastQRCode" + + RETURN m.tcFile + ENDPROC + + *--------------------------------------------------------- + * PROCEDURE GooQRCodeImage() + *--------------------------------------------------------- + * Generated QR Barcode image with Google API (requires internet connection) + * https://developers.google.com/chart/infographics/docs/qr_codes + * Parametes: + * tcText: Text to encode + * tcFile: Imagen File Name (optional) + * tnSize: Imagen Size in pixels + * tnType: Imagen Type [Only 2=PNG] + *--------------------------------------------------------- + PROCEDURE GooQRCodeImage(tcText, tcFile, tnSize, tnType) + LOCAL lcType, lcFolder, lcUrl, lcCorrection, lnMargin + + IF VARTYPE(m.tnSize) <> "N" + m.tnSize = THIS.nSize && Defaul size = 132 x 132 pixels + ENDIF + + m.tnSize = MIN(MAX(m.tnSize, 72), 540) + m.lnMargin = MIN(MAX(THIS.nMarginPixels, 0), 10) + + *-- Only PNG type + m.tnType = 2 + m.lcType = "PNG" + + IF EMPTY(m.tcFile) + m.lcFolder = THIS.cTempPath + IF NOT DIRECTORY(m.lcFolder) + MD (m.lcFolder) + ENDIF + m.tcFile = FORCEEXT(m.lcFolder + SYS(2015), m.lcType) + ELSE + m.lcFolder = JUSTPATH(m.tcFile) + IF NOT DIRECTORY(m.lcFolder) AND NOT EMPTY(m.lcFolder) + MD (m.lcFolder) + ENDIF + m.tcFile = FORCEEXT(m.tcFile, m.lcType) + ENDIF + CLEAR RESOURCES m.tcFile + + m.lcCorrection = SUBSTR([LMQH], THIS.nCorrectionLevel + 1, 1) + IF EMPTY(m.lcCorrection) + m.lcCorrection = [M] && Default + ENDIF + + m.lcUrl = [https://chart.googleapis.com/chart?cht=qr] + ; + [&chs=] + TRANSFORM(m.tnSize) + [x] + TRANSFORM(m.tnSize) + ; + [&chld=] + m.lcCorrection + [|] + TRANSFORM(m.lnMargin) + ; + [&chl=] + m.tcText + + *-- Declare URLDownloadToFile function + DECLARE LONG URLDownloadToFile IN URLMON.DLL ; + LONG, STRING, STRING, LONG, LONG + + ERASE (m.tcFile) + IF 0 = URLDownloadToFile(0, m.lcUrl, m.tcFile, 0, 0) + RETURN m.tcFile + ELSE + RETURN "" + ENDIF + ENDPROC + + *------------------------------------------------------ + * PROCEDURE QRCodeVersion() + *------------------------------------------------------ + * Returns the version of the QRCodeLib.dll library + *------------------------------------------------------ + PROCEDURE QRCodeVersion() + LOCAL lcVersion + DECLARE STRING QRCodeLibVer IN "QRCodeLib.dll" + m.lcVersion = QRCodeLibVer() + CLEAR DLLS "QRCodeLibVer" + RETURN m.lcVersion + ENDPROC + + *------------------------------------------------------ + * PROCEDURE QRBarcodeVersion() + *------------------------------------------------------ + * Returns the version of the BarCodeLibrary.dll library + *------------------------------------------------------ + PROCEDURE QRBarcodeVersion() + LOCAL lcVersion + DECLARE INTEGER LibraryVersion IN "BarCodeLibrary.dll" + m.lcVersion = LibraryVersion() + CLEAR DLLS "LibraryVersion" + RETURN m.lcVersion + ENDPROC + + *------------------------------------------------------ + * PROCEDURE Init() + *------------------------------------------------------ + PROCEDURE INIT() + THIS.cTempPath = ADDBS(THIS.TempPath() + SYS(2015)) + THIS.cAppPath = FULLPATH("") + STORE THIS.nSize TO THIS.nHeight, THIS.nWidth + ENDPROC + + *------------------------------------------------------ + * PROCEDURE Destroy() + *------------------------------------------------------ + PROCEDURE DESTROY() + IF THIS.lDeleteTempFiles + THIS.EmptyFolder(THIS.cTempPath) + IF DIRECTORY(THIS.cTempPath) + RD (THIS.cTempPath) + ENDIF + ENDIF + ENDPROC + + *------------------------------------------------------ + * PROCEDURE EmptyFolder(tcFolder) + *------------------------------------------------------ + * Empty temporary image folder + *------------------------------------------------------ + PROCEDURE EmptyFolder(tcFolder) + LOCAL loFso AS OBJECT + LOCAL lcMask + DO CASE + CASE EMPTY(m.tcFolder) + RETURN .F. + CASE NOT DIRECTORY(m.tcFolder) + RETURN .F. + ENDCASE + m.lcMask = ADDBS(m.tcFolder) + "*.*" + #IF .T. && Use FSO + m.loFso = CREATEOBJECT("Scripting.FileSystemObject") + m.loFso.DeleteFile(m.lcMask, .T.) + #ELSE && Not Use FSO + ERASE (m.lcMask) + #ENDIF + RETURN .T. + ENDPROC + + *--------------------------------------------------------- + * PROCEDURE TempPath() + *--------------------------------------------------------- + * Returns the path for temporary files + *--------------------------------------------------------- + PROCEDURE TempPath() + LOCAL lcPath, lnRet + LOCAL lnSize + m.lcPath = SPACE(255) + m.lnSize = 255 + DECLARE INTEGER GetTempPath IN WIN32API ; + INTEGER nBufSize, ; + STRING @cPathName + m.lnRet = GetTempPath(m.lnSize, @m.lcPath) + IF m.lnRet <= 0 + m.lcPath = ADDBS(FULLPATH("TEMP")) + ELSE + m.lcPath = ADDBS(SUBSTR(m.lcPath, 1, m.lnRet)) + ENDIF + RETURN m.lcPath + ENDPROC + + *--------------------------------------------------------- + * PROCEDURE Error + *--------------------------------------------------------- + * Error procedure + *--------------------------------------------------------- + PROCEDURE ERROR + LPARAMETERS nError, cMethod, nLine + LOCAL lcErrMsg + LOCAL la[1] + AERROR(la) + m.lcErrMsg = "Error number: " + TRANSFORM(m.la(1, 1)) + CHR(13) + ; + "Error message: " + m.la(1, 2) + CHR(13) + CHR(13) + ; + "Method: " + m.cMethod + CHR(13) + ; + "Line: " + TRANSFORM(m.nLine) + MESSAGEBOX(m.lcErrMsg, 0 + 16, "FoxBarcodeQR error") + ENDPROC + +ENDDEFINE && FoxBarcodeQR + +*-------------------------------------------------------------------------------------- +* END DEFINE FoxBarcodeQR Class +*-------------------------------------------------------------------------------------- + +*-------------------------------------------------------------------------------------- +* End FoxBarcodeQR.prg +*-------------------------------------------------------------------------------------- From 5d84ba121c444f731c2448d968ddf55e33dfcf8c Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Thu, 16 Jul 2026 12:40:12 +0300 Subject: [PATCH 2/2] docs: instructiuni inrolare proiecte noi in fluxul git-text Co-Authored-By: Claude Fable 5 --- docs/inrolare-proiect-git-text.md | 131 ++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 docs/inrolare-proiect-git-text.md diff --git a/docs/inrolare-proiect-git-text.md b/docs/inrolare-proiect-git-text.md new file mode 100644 index 0000000..5d09705 --- /dev/null +++ b/docs/inrolare-proiect-git-text.md @@ -0,0 +1,131 @@ +# Inrolarea unui proiect ROA (Visual FoxPro) in fluxul git-text FoxBin2Prg + +Instructiuni pas cu pas 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 (16.07.2026): ROACONT, ROAGEST, ROAAUTO, ROAIMOB, ROAACNPRO, +ROAFACTURARE + COMUN (romfast/comun.git). Modelul de referinta este ROACONT. + +## Reguli pentru sesiunea care executa + +- Foloseste EXCLUSIV PowerShell pentru comenzi (NU tool-ul 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 (verificabil cu `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-ul partajat exista in `D:\ROA\UTIL\foxbin2prg\`: `git_sync.ps1`, + `vfp_filemap.ps1`, `txt2vcx.ps1`, `roa_sync.ps1`, `test_git_sync.ps1`, + `test_roundtrip.ps1`. Citeste-le inainte (macar help-ul din git_sync.ps1). +2. Proiectul e working copy SVN valid (`svn info D:\ROA\`), cu `COMUN\` + inauntru (external SVN). +3. Repo-ul gitea exista: `git ls-remote git@gitea.romfast.ro:romfast/.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 + +```powershell +& D:\ROA\UTIL\foxbin2prg\git_sync.ps1 -ProjectRoot D:\ROA\ +``` + +- 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 + +```powershell +# doar la reset: Remove-Item -Recurse -Force D:\ROA\\.git +git -C D:\ROA\ init -b main +git -C D:\ROA\ remote add origin git@gitea.romfast.ro:romfast/.git +git -C D:\ROA\ 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 + +```powershell +# daca exista .git vechi: Remove-Item -Recurse -Force D:\ROA\\COMUN\.git +git -C D:\ROA\\COMUN init -b main +git -C D:\ROA\\COMUN remote add origin git@gitea.romfast.ro:romfast/comun.git +git -C D:\ROA\\COMUN fetch origin +git -C D:\ROA\\COMUN reset origin/main # mixed: pastreaza discul +git -C D:\ROA\\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\ROACONT\roa_sync.bat` in radacina proiectului (e generic, foloseste +`%~dp0`) si include-l in commit. Utilizatorul il ruleaza la inceput de sesiune: +svn update -> git_sync -> commit "sync SVN rN" pe main (proiect + COMUN) -> 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.