miércoles, 17 de octubre de 2007


script ruby para la busqueda de codigo en un archivo de un repositorio svn

El objetivo del programa es vericar la presencia de codigo en branches de un repositorio.
El codigo a detectar se especifica en un archivo plano con pares: path, expresion-regular
En donde la expresion-regular es la expresion regular a buscar en el path especificado
El programa recibe como parametro la url del repositorio y los branches dentro de esa url sobre
los cuales se iterara para detectar el codigo especificado en el archivo.

ruby check_codigo http://svn.ar.empresa/Proyecto/branches/bugs 0012812 0012813 archivo

Busca en el repositorio http://svn.ar.empresa/Proyecto/branches/bugs, en los branches que comiencen identificados por 0012812 y0012813 lo especificado en archivo.

El archivo archivo debe contener algo como lo siguiente
path expresion-regular
path expresion-regular
... 

#!/usr/bin/ruby -w
# Created by Martin Baspineiro 9/10/2007

# Lectura del archivo
#Obtiene una estructura de datos Hash con pares: archivo en el cual buscar, patron de #busqueda.
def leer_archivo(nombreArchivo)
  busqueda = Hash.new
  IO.readlines(nombreArchivo).each do |line|
     k, v = line.split
     busqueda[k] = v
  end
  busqueda
end

#Busca un conjunto de cadenas descriptas por un patron en un archivo determinado
def buscar_en_archivo(url_branches, branch, archivo, patron)
  out = `svn cat #{url_branches}/#{branch}/#{archivo} | grep --count --regexp=#{patron}`
  cantidad_ocurrencias = out.chomp.to_i
  if cantidad_ocurrencias > 0
     puts "Se encontraron #{cantidad_ocurrencias} ocurrencias"
  else
     puts "No se encontraron ocurrencias"
  end
end

#Verificacion de parametros del script
ids = ARGV
if ids.empty? || ids.length < 3
  puts "uso: #{$0} url_branches bug1_id [bug2_id [bug3_id [...]]] search_file"
  exit 1
end

#Inicializacion de variables
url_branches = ids[0];
branches = ids[1..-2];
puts "#{branches}"
file_name = ids.last;
busqueda = leer_archivo(file_name);

#Busco en los branches, en los archivos especificados un patron determinado
branches.each do |branch|
  puts "========================================================"
  puts "Analizando branch #{branch}..."
  busqueda.each_pair do |key, value|
    puts "========================================================"
    puts "Buscando..."
    puts "En el archivo: #{key}"
    puts "El patron: #{value}"
    puts"========================================================"
    buscar_en_archivo(url_branches, branch, key, value);
  end
end