Mercurial: Auto Commit

img

Mivel legtöbb helyen kérik, hogy ismerj legalább egy verziókövető rendszert, így én is próbálkozom vele. Az egyetlen gondom az, hogy itthon nem sok értelme van a verziókezelésnek, kivéve az, hogy látom, milyen irányba halad a programom.

A verziókezelést főleg nagyobb projektekben, több programozó esetén érdemes kihasználni. Régen mindenki CVS-t, SVN-t használt, amit jelenleg felváltott a Git vagy a Mercurial. Nyílt forrású (open-source) projektekben kifejezetten a Git nyer. A Github megszületésével pedig mondhatjuk, hogy teljesen átvette a hatalmat. Tehát, kérik is, hogy tudd használni, főleg a projektek fejlesztésénél.

Miért van szükség verziókövető rendszerre?

Szerintem erre a válasz baromi egyszerű. Gondolj bele, hogy vagytok 10-en programozók. Ez még nem is számít soknak. 5 ember dolgozik a program egyik részén, 5 ember a másikon. Mindenki a saját moduljait írja, mondjuk az első héten. Ez eddig még nem is okozna galibát, de egy idő után elengedhetetlen, hogy ezeket a modulokat valahogy összekössék. Ilyenkor jön jól a verzió kezelés, főleg az elosztott verzió kezelő rendszerek.

Anno volt egy "nagy" projektünk, ahol 2 programozó (!) dolgozott ugyanazon a rendszeren. Munkatársam a felhasználói felületet írta, én pedig az admint. Persze, sokszor volt, hogy valamelykünk elmaradt, ilyenkor gyorsan fel FTP-re, fájlokba belenyúl, majd lelép. Ilyenkor jött általában az anyázás, asztalcsapkodás, egymás szidása, mert mikor megcsináltunk egy javítást, a másik a felét felülírta, mert ugyanabban a modulban dolgoztunk. Persze, mindig megkérdeztük egymást, hogy kell-e neked most a fájlban valamit csinálni, de így is volt, hogy elfelejtettünk módosítás előtt fájlokat frissíteni, így mindig felülírtunk valamit.

Kértük a főnököt, hogy állítsunk be legalább egy SVN-t valahová, lockolunk, meg szórakozunk vele, de így csak napokkal lassul a munka, főleg, hogy a határidő is szűk volt. Az volt a válasz, hogy szükségtelen, tessék jobban figyelni. Pedig tényleg csak 2 ember munkája volt. Akkor mi történik 10 embernél?

Szerintem ezt sem kell bővebben kifejteni. Az osztott verziókezelők, mint a Git vagy a Mercurial, még nagyobb szabadságot adnak a programozóknak. Az SVN idején - persze van, aki ma is használja - mindenkinek mindenhez joga volt, miután megkapta a renszertulajdonostól a hozzáférést. Sokkal nehezebb volt benne minden, mivel csak egy központi verziód volt, és mindent ebbe commitoltál. Persze okosan ezt is jól lehet használni.

DE az elosztott verzió kezelés teljesen más alapokra helyezi mindezt. A fő lényege az egésznek, hogy van egy központi repository, amiből te klónozással csinálsz egy saját példányt. Így nem a központi repo-t módosítod, hanem a sajátodat. Majd pull requestet küldesz, amit a repo eredeti tulajdonosa, ha jónak látja beépít a rendszerébe. Tehát sokkal egyszerűbbé teszi a közös munkát. Te a saját kódbázisodban olyan káoszt csinálhatsz, amilyet akarsz, a fő kódot ez nem fogja befolyásolni.

Miért van nekem szükségem verziókövető rendszerre?

Egyrészt, mindenhol olvasom, hogy a git-ben való jártasság előny, másrészt hosszú távú terveim között szerepel, hogy a jelenlegi programot nem egyedül fogom fejleszteni. Sőt, néhány éven belül én már nem akarom fejleszteni. Bár ez részletkérdés. A fő ok az volt, hogy a sok változtatást, amit csinálok a rendszerben, valahogyan tudjam követni. Rengetegszer előfordul, hogy megcsinálok egy modult, majd rájövök, hogy így nem lesz tökéletes, ilyenkor általában törlöm az aktuális modult, vagy elkezdem kikommentezni a felesleget, negyon ritkán, ha őrült nagy bakit követek el, a teljes kódot kitörlöm és kezdem elölről. Nah ekkor jött az ötlet, hogy inkább verziózzunk. Ennek nagy előnye, ha eljutok egy ilyen hibáig, akkor vagy visszatérek a még jól működő kódra, vagy kettéválasztom a projektet, és csinálok egy új ágat, amiben már a jó kódom van, vagy rengeteg lehetőségem van.

Egyetlen dolgot gyűlölök, folyamatosan írni a commithoz a message-eket. Első körben, mikor felraktam a Mercurialt, minden apró módosításkor nyomtam a commitot és írtam hozzá, hogy mit csináltam. De ezt napi 12 órában, mindig az aktuális apróságkat is beleírni, mondjuk, ha töröltem egy kommentet, fárasztó volt. A vége felé már magasról tettem rá, hogy mi van a commitban, vagy több időt emésztett fel a message megírása, mint maga a művelet.

Aztán néztem, hogy milyen feladatokat csinálok meg, körülbelül milyen hosszú idő alatt, ezek mennyiben módosítják a kódot. És rájöttem, hogy egyszerűsíthetem is dolgomat.

Auto-Commit. Üdvözöllek!

Elkezdtem a projektet, szokásos módon, beállítottam a fejléceket, beállítottam a vhostot, belőttem mindent, majd hg init, hg add. Jupp. Kész is a Mercurial repositorym. Mivel NetBeanst használok, (húú majd erről is írok, hogy jutottam el a NetBeanshez), alapból be tudom állítani, hogy az aktuális projektemet kezdje el Mercuriallal veerziózni. Eddig nem is lenne probléma. De jött a nagy kérdés, hogy mikor nyomjak commitot, mit írjak bele, tehát az előző projekt szívásai visszatértek.

Nagy levegő. 5 perc Google keresgélés. Majd fél óra tesztelés. Cronba betesz. Auto-Commit Done.

Ez eddig nagyon szép testvéreim, de most csak annyit értem el, hogy az új fájlok bekerülnek, majd mindent commitolok. Ez nekem nem elég. Gyorsan összedobtam PHP-ban (miben másban) egy kis scriptet, ami azért segíti ezt az egészet. Azért PHP, mert ezzel szórakozok egész nap, és így ez volt az egyszerűbb, jól jött gyakorlásként.

Amit a kis script csinál:

  • Lekérdezi a projekt mappájában (kivéve a setup és cache mappákat) az összes .php kiterjesztésű fájlt.
  • Megnézi, hogy az utolsó commit óta melyik változott
  • Mivel minden PHP fájlomnak van egy fejléce, amiben benne vannak az alap infok:
    • Szoftver neve
    • Verzió - (MAJOR.MINOR.MERCURIAL-REPO)
    • Készítő (nem túlzottan változatos)
    • Létrehozás ideje
    • Utolsó módosítás ideje
    • Fájlnév
    • Ha módosult - eredeti fájlnév
    • Utolsó commit message (ez sem túl változatos)
    • Fájlkódolás (UTF-8)
    • Projekt neve
    • Copyrights
  • Ezeket módosítja a megfelelő információkkal kiegészítve
  • Visszaírja a fájlba
  • Mikor minden fájl kész, commit
  • Ha nincs módosított fájl, nincs commit

Baromi egyszerű. Miért kell, hogy a fejlécet módosítsa? Csak esztétikai okoból. Nagyon zavart, mikor átneveztem egy fájt és hetekkel később is ott virított a fejlécben a régi fájlnév. Kézzel meg unalmas volt javítani, így most ezt megteszi helyettem a program.

Egy fejléc valahogy így néz ki a valóságban:

/**
 * Software: Teszt xy
 * Version: 1.0
 * Development version: 1.0.21-cd470a44d0d1
 * Created by: Leoamros <leoamros {at} leoamros {dot} com>
 * Generated: Apr 4, 2015
 * Last modified: Apr 8, 2015
 * Filename: index.php
 * Latest Commit: "Auto Commit - 2015-04-08 220003" by Leoamros <leoamros@leoamros.com>
 * Encoding: UTF-8
 * Project: Teszt prog.
 * Copyright (c) 2015, Leoamros - Smajda László. All Rights Reserved.
 */

Igen tudom, lusta dög vagyok ilyen téren. De azóta nincs gondom a committal. Ha egy file nagy módosításokat tartalmaz persze tudok kézzel is commitot küldeni, így a következő frissítésnél ez bekerül a fájlba is.

Jó lesz-e így hosszútávon?

Ez egy baromi jó kérdés. Lehet, hogy igen, lehet, hogy nem. Persze, akik rendszeresen használják a verziókezelést, azt fogják mondani, hogy most rontottam el az egésznek a lényegét, mert nem erre való. De szerintem, míg egyedül dolgozok a programon teljesen elfogadható megoldás, mert így az új fájlok mindig bekerülnek a repo-ba, a régi fájlok módosításai is mindig bekerülnek, tehát bármikor vissza tudom követni, hogy mivel haladtam, mit csináltam, és persze bármikor vissza is tudom vonni a módosításaimat. Nekem jelenleg ennyi tökéletesen elég.

Majd, mikor bejönnek a számításaim, és többen is fogunk dolgozni a programon, akkor áttérek egy értelmesebb módszerre. Addig pedig teljesen megfelel a kívánalmaknak ez a megoldás is. Nyomon tudom követni a fájljaimat, látom a módosításokat.

Egyedül a Copyright sorral nem tudok mit kezdeni, mert oda valami sokkal bővebbet kellene írni, de nem tudok okosat kitalálni. Mivel nem open-source lesz a projekt, így nem tudom a szokásos sorokat ide illeszteni. Max majd valami olyat lehetne odabiggyeszteni, hogy a program védelem alatt áll (mert tervek szerint fog), és a másolása, módosítása tilos. Bár, ezt egy PHP program esetén... Ki a jó ég figyeli? Főleg, ha egy szomszéd Pistike kezébe kerül a kód.