lördag 27 februari 2010

Unison mellan Mac, windows och unix

Jag använder Unison för att synkronisera filer mellan datorer. Det är ett utmärkt verktyg. Fram till nyligen har det inte gått att synkronisera filer mellan olika plattformar på ett enkelt sätt - om man använder svenska tecken. Eller rättare sagt, exotiska tecken som manualen säger, allt utom 7-bits ascii. Sålänge man håller sig till en och samma plattform har det inte varit några problem.

Nu finns en lösning - senaste versionen av unison fungerar utmärkt oberoende av teckenkodning. Jag har fått synkronisering att fungera mellan Mac OS X, Windows och Linux (Debian, Ubuntu) smärtfritt. Jag använder en Debianbaserad linuxserver som "nav" och de övriga maskinerna synkronisera mot den.
Tricket för att få det att fungera är att köra en tillräckligt sen version av unison på alla ställen. Klientens version måste fungera med den version som ligger på servern. Viktigt är att man kan ha flera samtidiga versioner på servern. Detta gör att man kan ha en blandning av olika versioner, utan problem.

En liten kommentar: i texten säger jag att "det inte behövs" osv. Eftersom en del operativsystem är konfigurerbara i all oändlighet är det inte nödvändigtvis sant. Däremot är det sant för den konfiguration som gäller för standardinstallationer.

Här kommer receptet som fungerar för mig:

På servern (Debian Lenny linux):
---------------------------------
Installera unison med apt-get install unison. Det ger version 2.27.57 för mig:
$unison -version
unison version 2.27.57

Detta räcker utmärkt för att synkronisera andra maskiner med samma version, OM DU HAR SAMMA TECKENKODNING. Kör du t ex ubuntu eller debian behövs inget mer göras. Det behövs däremot om du ska köra Mac OS X eller windows som klienter mot servern. Och det ska vi, inte sant!

Nu checkar jag ut version 2.39.6 från unisons repositorie (funkar troligtvis med andra versioner, om du vill ha exakt som jag så lägg till -r403 till kommandot nedan för att få revision 403)
$mkdir -p $HOME/code/thirdparty
$cd $HOME/code/thirdparty
$svn co -r403 https://webdav.seas.upenn.edu/svn/unison/trunk unison
Du måste ha subversion och ocaml installerat. (På min arkitektur (arm) råkar ocamlopt inte finnas, därför använder jag NATIVE=false. Lämna ut det om du inte behöver det)
$cd $HOME/code/thirdparty/unison
$make NATIVE=false
när kompileringen lyckas kör jag
$ $HOME/code/thirdparty/unison/src/unison -version
och får svaret
unison version 2.39.6
vilket betyder att allt är som det ska.



På Mac OS X (som klient)
---------------------------------
På mac gör jag ungefär likadant som på servern. Detta eftersom de färdigbyggda paket för unison (.dmg) inte var tillräckligt aktuella för att det skulle fungera för mig.
Nu ser jag att det dykt upp en 2.40 för Mac, kan vara värt att prova först!
Annars bygger man såhär. Man behöver förmodligen ha installerat utvecklarverktygen på mac för att det ska fungera. (Du behöver make, ssh, subversion, ocaml och möjligtvis fler saker)
$mkdir -p $HOME/code/thirdparty
$cd $HOME/code/thirdparty
$svn co -r403 https://webdav.seas.upenn.edu/svn/unison/trunk unison
$cd $HOME/code/thirdparty/unison
$make

Om allt gick bra har du nu ett fungerande unison. Det ligger i $HOME/code/thirdparty/unison/src/uimacnew/build/Default/
Jag drog mitt till dockningslisten och så funkade allt som tänkt.


Sist men nästan viktigast: peka ut sökvägen till unison på servern i konfigurationsfilen. Konfigurationsfilen ligger i
~/Library/Application Support/Unison/*.prf på mac os x.
Se till att den innehåller raden
servercmd=XXXX/code/thirdparty/unison/src/unison
där XXXX matchar $HOME på servern. Kör $echo $HOME på servern om du inte vet vad det är.


På Windows (som klient)
--------------------------------
På windows fick jag en av de förbyggda programmen att fungera. Här visar sig verkligen styrkan i att köra en distribution och inte bara ett operativsystem - bibliotek, sökvägar, binärer finns enkelt tillgängliga. På Debian kör jag apt-get install unison-gtk och är sedan klar. I windows är man tvungen att installera inte bara unison utan även ssh (via cygwin är lättast) och gtk. Det tog mig säkert en timme att få att fungera.

Du behöver en tillräckligt sen unisonversion för att få det att fungera mot unison som används på servern.

Instruktioner för hur man gör finns när man letar sig fram till downloads för windows på unisons hemsida. Man behöver unisonbinären, gtk-runtime och cygwin. Jag kopierade bara in unisonbinären rakt in i det uppackade gtk-runtime-biblioteket och det fungerade för mig.

Precis som på mac os x behöver du peka ut sökvägen till unison på servern. Profilen redigeras i unisons grafiska gränssnitt. Lägg till servercmd enligt instruktionerna för mac os x.


Om du följt instruktionerna och bett tillräckligt till datorguden kan du nu synkronisera filer utan problem med teckenkodning!

Tidigare inlägg i ämnet: http://paulsundvall.blogspot.com/2009/10/unison-unicode-och-kompatibilitetsprobl.html

Tack till Albin som tipsade mig om att unison uppdaterats!