viernes, 21 de mayo de 2010

Git en tu prompt

Ultimamente, GIT está causando furor entre los miembros del labo. Aunque el cambio desde Subversion puede ser algo traumático si no se digieren bien los nuevos conceptos, el cambio de paradigma hacia el control de versiones distribuidos merece mucho la pena. Una buena introducción es el libro online Pro Git (recomendación vía Álvaro).

Hoy quiero compartir un snippet que permite personalizar el PROMTP de bash para que muestre en que rama de un repositorio GIT estamos trabajando y un asterisco si tenemos cambios pendientes. Para usarlo, basta con que lo copiéis a vuestro home y lo llaméis desde el .bashrc.

function git_dirty {
[[ $(git status 2> /dev/null | tail -n1) != "nothing to commit (working directory clean)" ]] && echo "*"
}
function git_prompt {
__git_ps1 '%s' | sed -e "s/\(.*\)/\1$(git_dirty):/"
}
function proml {
local BLUE="\[\033[0;34m\]"
local LIGHT_BLUE="\[\033[1;34m\]"
local RED="\[\033[0;31m\]"
local LIGHT_RED="\[\033[1;31m\]"
local GREEN="\[\033[0;32m\]"
local LIGHT_GREEN="\[\033[1;32m\]"
local YELLOW="\[\033[1;33m\]"
local WHITE="\[\033[1;37m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local NO_COLOR="\[\033[0m\]"
case $TERM in
xterm*)
TITLEBAR='\[\033]0;\u@\h:\w\007\]'
;;
*)
TITLEBAR=""
;;
esac
if [ "`whoami`" = "root" ]; then
PS1="$LIGHT_RED[<<\u>>$YELLOW@\h$LIGHT_RED]\
[$WHITE\$(git_prompt)$LIGHT_BLUE\W$LIGHT_RED]\
$YELLOW\$$NO_COLOR "
else
PS1="$LIGHT_BLUE[$WHITE\u@\h$LIGHT_BLUE]\
[$WHITE\$(git_prompt)$LIGHT_BLUE\W]\
\$$NO_COLOR "
fi
PS2="$WHITE>$NO_COLOR "
PS4="$WHITE+$NO_COLOR "
}
proml
view raw .promptrc hosted with ❤ by GitHub

Como característica extra, el prompt cambia de color si abrís una shell de root para que no se os olvide cerrarla.


Actualización: si utilizáis el git desde los ports de mac, echadle un vistazo a este hilo para habilitar el comando __git_ps1

martes, 11 de mayo de 2010

Remontadas

Los sistemas de ficheros compartidos por red son muy útiles a mi me simplifican mucho la tarea de almacenar copias de seguridad en una máquina diferente. Basta con tener montada la partición y usarla como si fuese local.

Sin embargo, cuando hay problemas de red o cortes de luz puede ser necesario montar o remontar esas particiones y se puede tardar bastante tiempo en detectar si no se tiene cuidado. Una forma de atacar el problema es tener a mano un script en el cron. A continuación pego el que acabamos de poner en funcionamiento en el labo:

#!/usr/bin/perl -w
use strict;
use Getopt::Long;
# PUT YOUR MOUNTPOINTS HERE
# No trailing slashes
use constant MOUNT_POINTS => qw(
/mnt
);
sub parse_mount {
my $mounts = {};
for (split /\n/, qx/mount/) {
next unless m/((?:\/\S*)+) on ((?:\/\S*)+) type \w+/;
my ($device, $mount_point) = ($1, $2);
$mount_point =~ s/\/*^//;
$mounts->{$mount_point} = $device;
}
return $mounts;
}
my $verbose;
GetOptions ("verbose" => \$verbose);
unless ($verbose) {
close STDOUT;
open STDOUT, "> /dev/null" or die "Can't open /dev/null";
}
for my $mount_point (MOUNT_POINTS) {
print "Mount point '$mount_point'\n";
unless (-d $mount_point) {
print "\tnot a directory\n";
print "\tUmounting... ";
if (system("umount", $mount_point)) {
print "KO\n";
print STDERR "Unable to umount $mount_point\n";
next;
} else {
print "OK\n";
}
}
my $mounts = parse_mount();
if (defined $mounts->{$mount_point}) {
print "\t'$mount_point' OK\n";
next;
}
print "\tMounting... ";
if (system("mount", $mount_point)) {
print "Error\n";
print STDERR "Unable to mount $mount_point\n";
} else {
print "OK\n";
}
}
view raw remount.pl hosted with ❤ by GitHub

Podéis probarlo con la opción --verbose para ver qué hace paso a paso y que puede resumirse en comprobar si el montaje esta ido o desmontado y actuar en consecuencia. No olvidéis sustituir los puntos de montaje al principio del script!