[LUNGO e TECNICO] 2 gravi errori nello script missing-entities.php

From: Date: Mon, 06 Sep 2004 09:57:35 +0000
Subject: [LUNGO e TECNICO] 2 gravi errori nello script missing-entities.php
Groups: php.doc.it 
Request: Send a blank email to doc-it+get-668@lists.php.net to get a copy of this message
Quello che sto per spiegarvi vale solo per utenti windows + cygwin: (il messaggio è indirizzato alla ML doc-it ed è in CC a simone cortesi, che ringrazio vivamente in pubblico per gli sforzi che sta facendo per aiutarmi) Spero che qualcuno possa girare in inglese la mia segnalazione, sempre che abbia senso, a quelli di phpdoc@lists.php.net come sapete eseguendo ./configure si vanno ad eseguire in automatico alcuni comandi. Da giormi mi lamento che uno di questi script (missing-entities.php) a me dava errore di un fantomatico percorso non trovato. Finalmente credo di avere centrato il punto. Ci sono 2 errori, non 1. si basano entrambi su presupposti errati da parte dei creatori degli script. Ora cerco di illustrarvelo, poi voi ditemi se quello che dico ha senso oppure no: Prologo Come forse sapete, usando le cygwin la shell bash considera 'user home' la cartella c:\documents and settings\<utente>. Nel mio caso <utente> è Administrator. Le cygwin sono installate nel mio caso sotto c:\cygiwn. Eseguendo il cvs checkout di phpdoc-it la cartella phpdoc-it mi è 'ovviamente' finita in c:\documents and settings\phpdoc-it e al suo interno vi è la mitica cartella scripts dove risiede il mitico missing-entities.php . Ora passiamo alla pratica. mi posiziono in phpdoc-it ed eseguo prima autoconf, poi ./configure. questo script tra le altre richiama proprio missing-entities.php, il quale ad un certo punto recita quanto segue (gli echo di debug gli ho inseriti ovviamente io !). Abbiate pazienza dopo il copia incollo vi spiego tutto passo-passo. --- Codice ---- // Print out info for the viewer and log files echo "\nTesting the manual for missing elements...\n"; // If we are in a scripts dir, go one dir up // (because the NSGMLS path is relative to that directory!) $wrkdir = getcwd(); echo "** Debug: $wrkdir \n"; if (strpos($wrkdir, "scripts") !== FALSE) { chdir(".."); echo "** Debug: $wrkdir \n"; } $NSGMLS = "/usr/bin/onsgmls"; $NSGMLS_OUTPUT = "missing-entities.out"; echo "** Debug: ora NSGMLS vale $NSGMLS\n"; // Support for Windows systems if (substr(PHP_OS, 0, 3) == 'WIN') { $NSGMLS = str_replace("/", "\\", "$NSGMLS"); } echo "** Debug: ora NSGMLS vale $NSGMLS\n"; echo "** Debug 1\n"; // Execute a test of the manual if("" == "") { echo "**** Debug *** \n"; $dbgstring = "$NSGMLS -f $NSGMLS_OUTPUT -i lang-it -D . " . "-s ./dtds/dbxml-4.1.2/phpdocxml.dcl manual.xml"; echo $dbgstring . "\n"; echo "**** Debug ***\n"; exec( "$NSGMLS -f $NSGMLS_OUTPUT -i lang-it -D . " . "-s ./dtds/dbxml-4.1.2/phpdocxml.dcl manual.xml" ); echo "** Debug 2\n"; } else { exec( " $NSGMLS -f $NSGMLS_OUTPUT -i lang-it -D . " . "-s ./dtds/dbxml-4.1.2/phpdocxml.dcl manual.xml" ); } --- Fine Codice --- Praticamente lo scirpt a un certo punto ha bisogno di verificare se PER QUALCHE STRANA RAGIONE viene eseguito da phpdoc-it/script invece di essere in phpdoc-it come gli serve. Per cui memorizza la direcory di lavoro in $wrkdir --- Codice ---- // If we are in a scripts dir, go one dir up // (because the NSGMLS path is relative to that directory!) $wrkdir = getcwd(); echo "** Debug: $wrkdir \n"; --- Fine Codice --- L'echo mi resitutisce : c:\Documents and Settings\Administrator\phpdoc-it. Dopo ciò il codice passa a cercare l'sgml parser. E qui comincian le beghe. Il primo errore è che cerca il file onsgmls.exe nel percorso RELATIVO /usr/bin/. Il fatto è che ora ci troviamo in c:\Documents and Settings\Administrator\phpdoc-it !!!! Difatti il seguente codice: --- Codice ---- $NSGMLS = "/usr/bin/onsgmls"; $NSGMLS_OUTPUT = "missing-entities.out"; echo "** Debug: ora NSGMLS vale $NSGMLS\n"; --- Fine Codice --- mi da come valore: /usr/bin/onsgmls Ok, mi sono detto, aggiriamo l'ostacolo. ho creato sotto phpdoc-it la cartella usr e la sottocartella bin e ci ho messo onsgmls.exe Rieseguo lo script ed ancora non va! ma il problema non era il mio. Ora vi s piego... dopo l'ultimo snippet di codice riportato sopra viene quanto segue (e forser gli autori si sono sentiti dei geni per averci pensato:) Questo è il secondo grave errore dello script --- Codice ---- // Support for Windows systems if (substr(PHP_OS, 0, 3) == 'WIN') { $NSGMLS = str_replace("/", "\\", "$NSGMLS"); } echo "** Debug: Ed ora NSGMLS vale $NSGMLS\n"; --- Fine Codice ---- a questo punto il percorso che va a cercare diventa identico ma usando le barre Windows \ invece delle Unix /. Il problema è che SI sotto sotto windows, ma le cygwin mi danno un ambiente bash. per cui il seguente codice, subito dopo, fallisce. --- Fine Codice ---- if("" == "") { echo "**** Debug *** \n"; $dbgstring = "$NSGMLS -f $NSGMLS_OUTPUT -i lang-it -D . " . "-s ./dtds/dbxml-4.1.2/phpdocxml.dcl manual.xml"; echo $dbgstring . "\n"; echo "**** Debug ***\n"; exec( "$NSGMLS -f $NSGMLS_OUTPUT -i lang-it -D . " . "-s ./dtds/dbxml-4.1.2/phpdocxml.dcl manual.xml" ); echo "** Debug 2\n"; } else { exec( " $NSGMLS -f $NSGMLS_OUTPUT -i lang-it -D . " . "-s ./dtds/dbxml-4.1.2/phpdocxml.dcl manual.xml" ); } --- Fine Codice ---- sappiate che l'IF da esito positivo, per cui viene eseguito il primo caso . vedete l'exec ? il lungo comando che cerca di eseguire, sotituite le rispettive variabili, è: \usr\bin\onsgmls -f missing-entities.out -i lang-it -D . -s ./dtds/dbxml-4.1.2/phpdocxml.dcl manual.xml questo comando fallisce ! ho provato ad eseguire a mano /usr/bin/onsgmls -f missing-entities.out -i lang-it -D . -s ./dtds/dbxml-4.1.2/phpdocxml.dcl manual.xml e questo viene eseguito ! ----------------------------------------- Riassumendo gli errori: 1) Cerca la dir usr/bin sotto phpdoc invece che sotto la radice. Questo ha senso in Linux, ma non sotto le cygwin. Soluzione: Basterebbe forse impostare la radice delle cygwin come directory utente, così /usr sarebbe quelle della directory dove risiedono le cygwin, e /bin esiste già, ed al suo interno davvero risiede onsgmls.exe Se mi spiegate come si fa per impostare in bash un nuovo path per la user home lo faccio e dovrebbe risolversi. Naturalmente bisogna aggiungere questa nota nell'how-to: o si crea una usr/bin sotto phpdoc-it e ci si mette il parser o si cambia la user home 2) L'errore della sostituzione delle / con \. Questo è valido solo per chi usa dei parser windows direttamente sotto Windows. Non funziona invece sotto win+cygwin in quanto le regole grammaticali dei percorsi ora le detta bash e non Windows soluzione: o si aggiunge una verifica aggiuntiva (ma qui non so proprio come) o si toglie questa sostituzione. ---------------------------------------------------------------------------- --- Ok, amici. Io ho finito. Rimane il fatto che cmq non mi riesce di compilare il manuale. in attesa... cordiali saluti. Io rimango iscritto alla lista così seguo le vostre conversazioni. Naturalmente può darsi che tutto questo sia una enorme cagata ed io abbia commesso un errore stupido nel configurare qualcosa , però intanto dopo una settimana di lavoro ho capito dove sta il problema. (Voglio il premio del miglior niubbino, tenendo conto che 7 giorni fa non conoscevo ne le cygwin ne bash, per fortuna conosco benissimo php !) saluti

« previous php.doc.it (#668) next »