Questa guida è pensata per sviluppatori e designer che lavorano con temi WordPress e hanno bisogno di confrontare due versioni di un tema per identificare rapidamente le differenze tra di esse.
In realtà lo script che troverai è in grado di confrontare due cartelle o due file zip a prescindere dal fatto che siano temi per WordPress, Drupal, Prestashop o qualsiasi altri CMS.
Il confronto può essere utile in diversi scenari:
- Aggiornamenti del Tema: Quando si aggiorna un tema alla nuova versione e si desidera vedere quali file sono stati aggiunti, rimossi o modificati e quali righe sono cambiate.
- Debugging: Per trovare differenze nel codice che possono causare bug o problemi tra due versioni del tema.
- Collaborazione: Quando si lavora in un team e si vuole vedere cosa è stato modificato da un collaboratore.
- Ottimizzazione: Per identificare modifiche che possono influire sulle prestazioni o sulla sicurezza del sito.
In questa guida, utilizzeremo uno script Python che può essere eseguito sia in locale (utilizzando ad esempio Visual Studio Code) sia su Google Colab. Lo script analizzerà i file dei temi, confrontando ogni singolo file e generando un report dettagliato che evidenzia le differenze.
Requisiti
Prima di iniziare, assicurati di avere:
- Python installato sulla tua macchina.
- Le librerie Python standard zipfile, difflib, os e pathlib, che sono già incluse nella distribuzione standard di Python.
- Un ambiente di sviluppo come Visual Studio Code o un account Google Colab se preferisci eseguire lo script online.
Struttura delle Cartelle
Crea una cartella di lavoro con la seguente struttura:
<directory_principale>/
│
├── script.py
└── input/
├── tema1.zip (o cartella tema1)
└── tema2.zip (o cartella tema2)
- /: La directory principale dove salverai lo script Python (script.py).
- script.py: Lo script Python che eseguirà il confronto dei temi.
- input/: Una cartella che contiene i due temi da confrontare. I temi possono essere in formato ZIP o come cartelle estratte.
Output
- Lo script genererà un file di report il cui nome includerà i nomi dei due temi confrontati e la data e l’ora corrente (ad esempio, report_tema1_vs_tema2_20240528_1530.txt).
- Il report sarà salvato nella directory principale e includerà:
- File mancanti: Elenco dei file presenti in un tema ma mancanti nell’altro.
- File aggiunti: Elenco dei file presenti in un tema ma aggiunti rispetto all’altro.
- File modificati: Elenco dei file modificati con un confronto dettagliato delle differenze riga per riga.
Spiegazione del Report
Il report generato include una sezione che spiega il formato delle differenze utilizzato (unified diff), che è standard per i confronti di file:
- @@ -a,b +c,d @@: Indica un blocco di differenze dove:
- a e b sono il numero di riga iniziale e il numero di righe nel file originale.
- c e d sono il numero di riga iniziale e il numero di righe nel file modificato.
- -: Le righe rimosse dal file originale.
- +: Le righe aggiunte nel file modificato.
Esempio di Output
Il file di report sarà strutturato come segue:
Formato delle differenze:
@@ -a,b +c,d @@
a: Numero di riga iniziale nel file originale
b: Numero di righe del blocco nel file originale
c: Numero di riga iniziale nel file modificato
d: Numero di righe del blocco nel file modificato
-: Righe rimosse dal file originale
+: Righe aggiunte al file modificato
File mancanti in tema2:
file1.php
file2.css
File aggiunti in tema2:
file3.js
file4.html
File modificato: style.css
--- tema1/style.css
+++ tema2/style.css
@@ -15,7 +15,7 @@
- old line 15
+ new line 15
unchanged line 16
unchanged line 17
unchanged line 18
@@ -25,4 +25,4 @@
- old line 25
+ new line 25
Codice completo
import os
import zipfile
import difflib
from pathlib import Path
from datetime import datetime
def extract_zip_files(input_folder):
for item in os.listdir(input_folder):
item_path = os.path.join(input_folder, item)
if zipfile.is_zipfile(item_path):
with zipfile.ZipFile(item_path, 'r') as zip_ref:
extract_path = os.path.join(input_folder, os.path.splitext(item)[0])
zip_ref.extractall(extract_path)
def get_all_files(folder):
file_list = []
for root, _, files in os.walk(folder):
for file in files:
file_list.append(os.path.relpath(os.path.join(root, file), folder))
return set(file_list)
def compare_files(file1, file2):
with open(file1, 'r', encoding='utf-8', errors='ignore') as f1:
f1_lines = f1.readlines()
with open(file2, 'r', encoding='utf-8', errors='ignore') as f2:
f2_lines = f2.readlines()
diff = difflib.unified_diff(f1_lines, f2_lines, fromfile=file1, tofile=file2, lineterm='')
return [line for line in diff if line.startswith(('---', '+++', '@@', '-', '+'))]
def generate_report(theme1, theme2):
theme1_files = get_all_files(theme1)
theme2_files = get_all_files(theme2)
missing_files = theme1_files - theme2_files
added_files = theme2_files - theme1_files
common_files = theme1_files & theme2_files
report = []
report.append("Formato delle differenze:\n"
"@@ -a,b +c,d @@\n"
"a: Numero di riga iniziale nel file originale\n"
"b: Numero di righe del blocco nel file originale\n"
"c: Numero di riga iniziale nel file modificato\n"
"d: Numero di righe del blocco nel file modificato\n"
"-: Righe rimosse dal file originale\n"
"+: Righe aggiunte al file modificato\n")
if missing_files:
report.append(f"File mancanti in {os.path.basename(theme2)}:\n" + "\n".join(missing_files) + "\n")
if added_files:
report.append(f"File aggiunti in {os.path.basename(theme2)}:\n" + "\n".join(added_files) + "\n")
modified_files = []
for file in common_files:
file1_path = os.path.join(theme1, file)
file2_path = os.path.join(theme2, file)
if not Path(file1_path).read_text(errors='ignore') == Path(file2_path).read_text(errors='ignore'):
diff = compare_files(file1_path, file2_path)
if diff:
modified_files.append(file)
report.append(f"File modificato: {file}\n" + "\n".join(diff) + "\n")
return "\n\n".join(report), modified_files
def main():
input_folder = "input"
extract_zip_files(input_folder)
themes = [os.path.join(input_folder, d) for d in os.listdir(input_folder) if os.path.isdir(os.path.join(input_folder, d))]
if len(themes) != 2:
raise ValueError("Devono esserci esattamente 2 temi da confrontare.")
theme1, theme2 = themes
report, modified_files = generate_report(theme1, theme2)
theme1_name = os.path.basename(theme1)
theme2_name = os.path.basename(theme2)
current_time = datetime.now().strftime("%Y%m%d_%H%M")
report_filename = f"report_{theme1_name}_vs_{theme2_name}_{current_time}.txt"
with open(report_filename, 'w', encoding='utf-8') as report_file:
report_file.write(report)
print(f"Report generato: {report_filename}")
if modified_files:
print("File modificati:\n" + "\n".join(modified_files))
else:
print("Nessun file modificato.")
if __name__ == "__main__":
main()
Conclusione
Seguendo questa guida, sarai in grado di confrontare facilmente due temi WordPress e generare un report dettagliato delle differenze. Questo strumento può aiutarti a identificare rapidamente le modifiche tra le diverse versioni dei temi e a comprendere meglio le variazioni nei file, semplificando il processo di sviluppo e manutenzione del tuo sito WordPress.
Commenti |2
Lascia un commentoMa quanto sei bravo! Ogni volta che ricevo la tua newsletter trovo sempre qualcosa di super interessante. Non vedo l’ora di metterlo in pratica :-)
Grazie mille Stefano :) apprezzo molto!