=== GH Theme Sync ===
Contributors: w3lab
Tags: github, deploy, theme, ci/cd, git
Requires at least: 5.8
Tested up to: 6.7
Requires PHP: 7.4
Stable tag: 1.7.0
License: GPLv2 or later

Deploy WordPress teme sa GitHub-a, bez SSH-a i bez Git-a na serveru — radi i na shared hostingu. Podrazumevano svaki deploy zahteva ručnu potvrdu.

== Opis ==

GH Theme Sync povezuje jedan GitHub repozitorijum (temu) sa jednim WordPress sajtom.
Kada pushuješ na praćenu granu, GitHub webhook pozove WordPress REST endpoint.

Podrazumevano ponašanje: push SAMO javlja da postoji nova verzija — u WordPress
adminu se pojavi upozorenje ("Nova verzija čeka potvrdu"), a stvarni deploy se
dešava tek kad neko ručno klikne "Deploy Now". Ovo je namerno, da nijedna izmena
ne ode uživo bez da je čovek to eksplicitno potvrdi.

Ako želiš da se push odmah automatski deploy-uje bez ručne potvrde, uključi
"Automatski deploy pri push-u" u podešavanjima (sekcija 1) — tada webhook
zakazuje (preko WP-Cron-a) preuzimanje najnovije verzije teme direktno sa
GitHub-a (kao zip arhiva, preko GitHub API-ja) i postavi je u
wp-content/themes/{tvoj-folder}, uz automatski backup prethodne verzije, bez
ikakve ručne akcije.

U oba slučaja, ručni "Deploy Now" (sekcija 3) uvek radi i može u realnom
vremenu da deploy-uje bilo koju granu, nezavisno od podešene.

Ne zahteva:
* SSH pristup serveru
* Git instaliran na serveru
* FTP

Podržava privatne repozitorijume preko GitHub Personal Access Tokena
(fine-grained token sa "read-only" pristupom na Contents je dovoljan).

== Podešavanje ==

1. Instaliraj i aktiviraj plugin.
2. Idi na Podešavanja → GH Theme Sync i unesi GitHub owner, repo, granu,
   naziv foldera teme i (za privatan repo) Personal Access Token.
3. Sačuvaj — plugin generiše webhook secret.
4. U GitHub repozitorijumu: Settings → Webhooks → Add webhook.
   - Payload URL i Secret kopiraj sa stranice podešavanja plugina.
   - Content type: application/json
   - Events: samo "push" event.
5. Sačuvaj webhook u GitHub-u — GitHub odmah šalje "ping" event, koji bi
   trebalo da vidiš u istoriji deploy-eva u WordPress adminu (zeleno).
6. Testiraj: pushuj commit na praćenu granu. Podrazumevano se ništa ne
   deploy-uje automatski — u adminu će se pojaviti upozorenje "Nova verzija
   čeka potvrdu". Klikni "Deploy Now" da je postaviš uživo (ili uključi
   "Automatski deploy pri push-u" u podešavanjima ako želiš da to ide samo).

== Napomene o pouzdanosti ==

* Podrazumevano svaki push samo javlja da postoji nova verzija — deploy se
  dešava tek na ručni klik "Deploy Now". Ako je "Automatski deploy pri
  push-u" uključen, webhook odmah vraća odgovor GitHub-u i zakazuje stvarni
  deploy preko WP-Cron-a (da izbegnemo GitHub-ov ~10s timeout na webhook
  pozivima). Podrazumevani WP-Cron radi na poseti sajtu; za pouzdaniji
  timing preporuka je da se ugasi WP_CRON (define('DISABLE_WP_CRON', true))
  i doda pravi server cron (npr. svaki minut) koji poziva wp-cron.php.
* Pri svakom deploy-u se pravi backup prethodne verzije teme, čuva se
  podešeni broj poslednjih verzija (podrazumevano 3, uključujući aktivnu).
* Ako deploy ne uspe (npr. loš zip), plugin pokušava da vrati backup nazad
  da sajt ne ostane bez teme.

== Bezbednost ==

* Webhook poziv se prihvata samo ako HMAC-SHA256 potpis (X-Hub-Signature-256)
  odgovara secret-u — svako ko ne zna secret ne može da okine deploy.
* GitHub token se čuva šifrovano (AES-256-CBC, ključ izveden iz WP salts).
* Podešavanjima i ručnom deploy-u pristupa samo korisnik sa
  "manage_options" pravima (administrator).

== Changelog ==

= 1.7.0 =
* Dugme "Preview" je sada dostupno i u tabu "Deploy" — pravi privremenu kopiju IZABRANE grane (bez stvarnog deploy-a) i otvara je u WordPress-ovom ugrađenom Customizer "Live Preview", isto kao i "Preview" za sačuvane verzije. Banner "preview je aktivan" je sada vidljiv na svakom tabu (ne samo na "Theme versions") i jasno piše da li se pregleda sačuvana verzija ili grana.

= 1.6.1 =
* Dok GitHub owner/repo/theme folder nisu popunjeni i sačuvani, admin ekran sad prikazuje SAMO "Setup" (bez tabova Deploy/Theme versions/Deploy history — nema smisla da budu vidljivi pre nego što je konekcija podešena). Čim se podešavanja sačuvaju, svi tabovi se pojavljuju.

= 1.6.0 =
* Novo dugme "Preview" pored "Activate" za svaku sačuvanu (backup) verziju teme. Napravi PRIVREMENU kopiju te verzije direktno u wp-content/themes/ i otvori je u WordPress-ovom ugrađenom Customizer "Live Preview" — u novom tabu, bez menjanja žive teme (posetioci sajta ne vide ništa drugačije). Napomena: dok je preview aktivan, ta jedna kopija se (privremeno) vidi kao dodatna instalirana tema u Appearance → Themes, jasno označena "(Preview)" — to je kako WordPress-ov ugrađeni preview mehanizam radi. Uklanja se klikom na "Stop preview" (banner se pojavi u tabu "Theme versions" dok je preview aktivan), ili automatski čim se desi sledeći pravi deploy ili "Activate".

= 1.5.1 =
* Ispravka: kolona "Version" u tabeli "Theme versions" je pokazivala "—" za sve verzije deploy-ovane pre uvođenja te kolone (1.4.0), jer njihov .gts-meta.json fajl nema upisano to polje. Sada se za takve (starije) verzije verzija teme čita uživo direktno iz style.css-a te verzije kao fallback, umesto da trajno ostane prazna.

= 1.5.0 =
* Admin ekran je sad organizovan po tabovima ("Deploy", "Theme versions", "Deploy history", "Setup") umesto jedne duge stranice — jasnija podela između onoga što se koristi svakodnevno i jednokratnog podešavanja. Poslednji otvoren tab se pamti (localStorage) i vraća pri sledećoj poseti; tab "Setup" se automatski otvara sam ako owner/repo/theme folder još nisu popunjeni.

= 1.4.1 =
* Preuređen raspored stranice (UX): sekcije koje se koriste svakodnevno — Deploy, Theme versions, Deploy history — sad su na vrhu stranice. Jednokratna podešavanja (konekcija repozitorijuma i GitHub webhook) su sklonjena na dno, u sklopivu sekciju "Setup" (otvara se automatski samo dok podešavanja nisu popunjena).

= 1.4.0 =
* Nova kolona "Version" u tabeli "4. Theme versions" (i u tekstu poruka o deploy-u/aktivaciji) — pokazuje deklarisanu verziju teme (polje "Version:" iz style.css), pored branch-a, commit-a i statusa, za svaku sačuvanu verziju.
* Vizuelno osvežen admin ekran: svaka sekcija je sad izdvojena u karticu, statusi (ACTIVE/backup/SUCCESS/ERROR) prikazani kao stilizovani "pill" bedževi, commit i verzija prikazani kao mali "chip" elementi, doterani razmaci i tabele — bez ikakve promene u funkcionalnosti (svi ID-jevi, akcije i AJAX pozivi su isti).

= 1.3.2 =
* Svi tekstovi u WP admin ekranu (podešavanja, "Ručni deploy", "Verzije teme", "Istorija deploy-eva" i sve poruke koje se tu ispisuju) su prevedeni na engleski umesto srpskog.

= 1.3.1 =
* Bezbednosno očvršćavanje (security hardening), posle internog pregleda koda:
  - `wp-content/gts-theme-backups/` sada dobija `.htaccess` ("deny all") i prazan `index.php` čim se kreira, umesto da se zaštita od direktnog web pristupa oslanja samo na podešavanje hostinga.
  - Dodata zaštita od paralelnog izvršavanja dva deploy-a istovremeno (transient lock, 5 min TTL) — sprečava retku ali moguću korupciju foldera ako dva push-a/deploy-a stignu skoro istovremeno dok je uključen automatski deploy.
  - Neuspeli webhook pozivi (loš/nedostajući HMAC potpis) se sada loguju najviše jednom u 60 sekundi — sprečava da neko ko gađa javni webhook endpoint besmislenim zahtevima zatrpa istoriju deploy-eva i pravi nepotrebne upise u bazu. Sami zahtevi se i dalje uvek odbijaju sa 401.

= 1.3.0 =
* Promena podrazumevanog ponašanja: push na GitHub više NE deploy-uje automatski. Umesto toga se u adminu pojavljuje upozorenje "Nova verzija čeka potvrdu" i deploy se dešava tek na ručni klik "Deploy Now". Ko želi stari (automatski) način rada, može ga vratiti preko novog podešavanja "Automatski deploy pri push-u" u sekciji 1.

= 1.2.2 =
* Ispravka: kolona "Commit" u tabeli "Verzije teme" je ostajala prazna kod ručnog "Deploy Now" (i kod prvog deploy-a posle migracije) jer se SHA ranije dobijao samo iz GitHub webhook payload-a. Sada se za takve deploy-eve SHA vrha grane eksplicitno dohvata sa GitHub API-ja pre deploy-a.

= 1.2.1 =
* Ispravka: kolone "Grana" i "Commit" u tabeli "Verzije teme" su bile prazne na hostinzima gde WP_Filesystem radi preko FTP naloga (čest slučaj na managed hostingu) — meta podaci o verziji (.gts-meta.json) su se pisali golim PHP file funkcijama koje na takvim hostinzima tiho ne uspevaju da upišu fajl u folder koji je unzip_file() napravio pod drugim vlasnikom. Sada se meta fajl dosledno čita/piše preko WP_Filesystem-a, isto kao i sama tema.

= 1.2.0 =
* Backup verzije teme se više NE drže u wp-content/themes/ (gde ih je WordPress prikazivao kao posebne "instalirane teme" u Appearance → Themes) — sada se čuvaju u privatnom wp-content/gts-theme-backups/, van dometa WP-ovog skenera tema. Postojeći stari backup folderi se automatski presele tamo pri prvom sledećem učitavanju admin stranice ili deploy-u.
* Nova sekcija "4. Verzije teme" u adminu: lista poslednjih sačuvanih verzija (podrazumevano 3, uključujući aktivnu) sa dugmetom "Aktiviraj" za trenutnu zamenu — bez novog GitHub deploy-a, bez diranja Customizer/meniji/widget podešavanja (folder aktivne teme ostaje uvek isti, samo mu se sadržaj zameni).
* Novo podešavanje "Broj sačuvanih verzija" (podrazumevano 3, može 2-10).
* Dugme "Očisti sada" za ručno pokretanje čišćenja starijih verzija van redovnog deploy-a.

= 1.1.0 =
* Dodat izbor grane "u realnom vremenu" u sekciji Ručni deploy — dropdown lista svih grana repozitorijuma (učitano preko GitHub API-ja) i deploy-uje se tačno ta grana za taj jedan klik, nezavisno od podešene (praćene) grane iz koraka 1.

= 1.0.0 =
* Prva verzija.
