Du Perl pour changer un label Osx

Suite à mes aventures d’svn que j’utilise pour synchroniser des documents entre un windows/un linux et un Macosx. Je cherchais un logiciel sympathique pour afficher le statut dans le Finder -> Les étiquettes de couleurs me semblaient le moyen idéal rapide et non intrusif sur le système.

Et là … erreur, les meilleurs techniques demandent d’utiliser le finder via les applescripts. Non, non, non … pas possible de ne pas le faire soi-même. Eclair de génie, comment faire n’importe quoi n’importe comment => Perl.


Il suffit d’utiliser le module « MacOsx::File::Info », et placer les flags de couleur.

[ccnl_perl]
#!/opt/local/bin/perl

#Orange 14
#Rouge 12
#Jaune 10
#Bleu 8
#Violet 6
#Vert 4
#Gris 2
#None 1

use MacOsx::File::Info;
my $file = $ARGV[0];
my $color= $ARGV[1];
my $info =  MacOSX::File::Info->get($file) or die « pas de $file\n »;
$info->fdFlags($color) or die « probleme de couleur $file\n »;
$info->set($file);
[/ccnl_perl]

Attention la compilation i386/x86_64 : Perso, je suis en i386, car il y a quelques modules qui ne fonctionnent pas encore correctement en 64b (technologie du futur). Comme portage a parfois quelques bugs il faut modifier les Makefile.PL pour ajouter « -arch i386 » pour terminer la compilation.

Code complet pour du Svn
[ccNl_perl]
#!/opt/local/bin/perl
#### $0 clean (pour remettre à zero)
#### $0 (pour mettre à jour en fonction de svn)

use MacOsx::File::Info;
use File::Basename;
use strict;

my $file = $ARGV[0];
my $color= $ARGV[1];

sub setFlag {
my ($file,$color,$recursive) = @_;
my $info = MacOSX::File::Info->get($file);
$info->fdFlags($color) or die « probleme de couleur $file\n »;
$info->set($file);
my $dir = dirname($file);
if ( $dir ne « . » && $recursive == 1 )
{
setFlag($dir,$color,$recursive)
}
}

if (lc($file) eq « clean »)
{
open(dd,’find . | grep -v svn |’);
while (

)
{
chop($_);
setFlag($_,1,0) if !($_=~m/\.$/);
}
close(dd);
}
else
{
open(dd,’svn status|’);
while (

)
{
setFlag($a,4,1) if ($a)=($_ =~m/^\?.* (.*)/);
setFlag($a,12,1) if ($a)=($_ =~m/^A.* (.*)/);
setFlag($a,14,1) if ($a)=($_ =~m/^\M.* (.*)/);
}
close(dd);
}
[/ccNl_perl]