2008. december 12., péntek

Branch kezelés SVN alatt TortoiseSVN segítségével

Az branchek kezelése előbb-utóbb minden verziókezelést használó projektben előkerül. Ezt a nagyon expert felhasználók minden bizonnyal remekül csinálják különböző parancssori eszközökkel, de azoknak az SVN-t használó fejlesztőknek, akik a grafikus felületeket kedvelik (és persze windowst használnak) azoknak rendelkezésre áll a TortoiseSVN. Jómagam is ezt használom (az AnkhSVN Visual Studio plugin mellett), úgyhogy ezen a kliensen kellett a branchelés "titkait" feltárni.
Az egyik lényeg, hogy a repository létrehozásakor tartsuk be a konvenciót a szerkezetre vonatkozóan, mert a hangzatos branchelés tuljdonképpen nem más, mint ide-ode másolás és merge a trunk és branch könyvtárak (vagy mik) között.


Ha - mint a mi esetünkben - a felépítés eredetileg nem követte ezt a szerkezetet, akkor sincs baj, mert egyszerűen a HEAD reviziót expotálni kell a trunk alá, a másik helyről pedig törölni és máris helyreállt a rend.
Amikor ezzel megvagyunk, akkor a trunk verziót leszedjük, mint working copyt, majd a felbukkanó menüből kiválasztjuk a branch/tag menüt, ami feldob egy dialógus ablakot.
A dialógusablak kitöltésével a branch ág alatt létrehozzuk az új ágat egy megfelelő néven (esetünkben branch1). Amennyiben ezzel akarunk tovább dolgozni - mint általában - akkor ezt tegyük meg working copynak.


Ha ez megvan, akkor már láthatjuk is a reviziós gráfban az új águnkat.


A következő fontos dolog, hogy amikor végeztünk az adott módosítás/feature fejlesztésével, akkor vissza tudjuk illeszteni a főágba a módosításokat. Hosszabb munka esetében éppígy szükséges lehet a főág változásainak rendszeres átvezetése is. Ez a merge-elésnek nevezett eljárás nem meglepő módon a merge menüpont alól érhető el.

Három féle merge eljárást végezhetünk, attól függően, hogy hogyan akarunk tovább dolgozni. Az első esetben átvihetjük a mi változásainkat egy másik ágba, de tovább dolgozunk a saját verziónkkal, a másodikban visszatérhetünk a változásainkkal együtt a főágba, a harmadik esetben pedig a saját munkaváltozatunkba hozhatjuk be a főág változásait úgy, hogy tovább dolgozun a külön ágon.

Maga a merge a szokott módon történik. Ha nincs konfliktus, akkor az eszköz automatikusan összefésüli a változatokat, a konfliktusoat pedig kézzel tudjuk feloldani.

Tudom, a leírás nem kimerítő, de a lényeg remélem benne van.

2008. december 9., kedd

Legutolsóként lefutó JS függvény

Nemrég szükségem volt rá, hogy egy bizonyos javascriptet úgy futtassak le egy usercontrolokat bőven tartalmazó MS-AJAXos ASPX oldalon, hogy MINDENKÉPPEN ő legyen a legutolsó.
Teljesen függetlenül attól, hogy esetleg itt-ott RegisterStartupScript metódusok vagy bármi egyéb megoldások az oldal részeiben most vagy később garázdálkodnak-e, én azt szeretném, ha nem borítanák meg a rendet.
Hosszas guglizás és kísérletezés után találtam egy többé-kevésbé kielégítő megoldást.
Azért csak többé-kevésbé, mert IE és FF esetében az elvárt módon működik, de sajnos opera alatt nem (mást meg sem mertem próbálni :)).


A kulcs az alábbi függvény:


function AddOnload(myfunc)
{
    if (window.addEventListener)
        window.addEventListener('load', myfunc, false);
    else if (window.attachEvent)
        window.attachEvent('onload', myfunc);
}


Ami ugye (kompatibilitási okokból kétféleképpen) feliratkozik az oldal onload eseményére.
Ezt próbáltam különböző módokon meghívni, hogy a kívánt eredményt kapjam.


Az első változat így nézett ki:



<html>
<head>
    <script type="text/javascript">
        function mymessage()
        {
            alert("onload event");
        }
 
        ...
        ...
 
        alert('inline');
        AddOnload(function() { alert('TheLastOne'); });
    </script>
</head>
<body onload="mymessage()">
    ... ...
</body>
</html>



IE-re már jó is volt. Először megjelent az inline kód, utána az online attribútumban megadott végül pedig az ominózus utolsó. FF esetében már sajnos nem ez volt a sorrend. Ott gyakorlatilag inline
függvényhívásként működött a dolog, szerintem helytelenül. Azután eltoltam a feliratkozást az oldal végére, ez a FireFoxot is rávezette arra, hogy mit is akarok tulajdonképpen. Mint említettem Operában továbbra sem jó ez a megoldás, de több időt nem szántam rá.
Őszintén szólva az IE és a FF a 99.9%-át lefedi felhasználóknak, tehát ennyiben hagytam a dolgot.



    1 <html>
    2 <head>
    3     <script type="text/javascript">
    4         function mymessage()
    5         {
    6             alert("onload event");
    7         }
    8 
    9         function AddOnload(myfunc)
   10         {
   11             if (window.addEventListener)
   12                 window.addEventListener('load', myfunc, false);
   13             else if (window.attachEvent)
   14                 window.attachEvent('onload', myfunc);
   15         }
   16     </script>
   17 
   18 </head>
   19 <body onload="mymessage()">
   20     ...
   21     ...
   22 </body>
   23 
   24 <script>
   25     alert('inline');
   26     AddOnload(function() { alert('TheLastOne'); });
   27 </script>
   28 </html>


Elég érdekes, hogy melyik böngésző hogyan értelmezte az utasítást.
A fenti kód lett a végső változat, amely FF és IE esetében egyformán utolsónak hívja a kívánt scriptet.

2008. december 2., kedd

WinMerge beállítása merge tool-ként a TotalCommanderben


Ez a tipp hasznos lehet TC és WinMerge fanoknak.

A dolog meglehetősen egyszerű. Fogd a wincmd.ini fájlt és írd be a konfigurációs szekcióba a következőt:

Comparetool=C:\program files\winmerge\WinMerge.exe

A path értelemszerűen behelyettesítendő. Természetesen a dolog nem titkos, benne volt anno a release notes-ban, vélhetően a helpben is meg lehet találni, de hát ki olvassa ezeket? :)