miércoles, 10 de marzo de 2010

En github solo se tarda 60 SEGUNDOS

Esta mañana, entre a la internet con la idea de migrar un proyecto que tenia en googlecode (con svn) a git (y el mas conocido repositorio gratuito en internet de git es github)
El hecho de tener que migrar commits de svn a git ademas de la registracion, setup del repo git y demas cosas me hacian imaginar q seria una experiencia de trabajo.
Pero me soprendi: no solo registrarse y crear el repositorio fueron tres simples clicks, sino que tambien hay literalmente un boton "migrar SVN a GIT" en el cual solo te pedia la url del servidor svn... tras la operatoria (que encima fue rapida), pude ver mis commits convertidos a git.
Asi que el que este entusiasmado con git, sabe que no solo puede registrarse facilmente a un repositorio git gratuito sino que puede tambien migrar cualquier repositorio de svn para no perder la valiosa informacion de los commits en la mudanza.

Enlaces:

GitHub:
http://github.com/

GoogleCode ( Aun asi esta bueno si quieren usar un repo svn y el issue-tracker les puede gustar :) ):
http://code.google.com/

miércoles, 24 de febrero de 2010

Analisis de mergeo en git

Cada vez que se mergea una rama en otra, es necesario conocer que modificaciones se estarian introduciendo concretamente en la rama de destino antes de proceder al mergeo mismo.

El comando git-merge-base permite saber cual es el "common parent" de dos commits dados, es el "merge-base" el que define que segemento de cambios se incluiran al hacer el mergeo.

Supongamos que se quiere mergear a la rama xxxxx, los cambios de la rama yyyyy, pero antes se desea conocer que cambios se incluiran


# se cambia la rama de trabajo a yyyyy
$ git checkout yyyyy

# se busca el "merge base
$ git merge-base HEAD xxxxx
123456789abcdef

# se analizan los cambios que se incluiran viendo el segemento de cambios desde el merge-base
# hasta el ultimo commit de xxxxx
$ git log 123456789abcdef..xxxxx
( aparece una enumeracion de los commits que se van a incluir si se procede al mergeo)

# o tambien, se podria
$ git log $(git merge-base HEAD xxxxx)..xxxxx
( aparece la misma salida que del comando anterior)

# si se aceptan los commits vistos en el log, se procede al mergeo
git merge xxxxx


NOTA: Ademas de usar estos practicos comandos ayuda bastante mantener una nomeclatura y una gestion ordenada de las ramas que permitan tener en claro cuales son los "merge-base" de los mergeo que se ejecutaran.

miércoles, 9 de diciembre de 2009

Recuperar commits "perdidos" en git

Cada tanto puede pasar que de checkout en checkout, nos encontramos con:

"¡oh no!, todos los commits que hice hoy no estan en la rama, incluso nisiquiera se donde estan"

Pareciera que todo el trabajo del dia quedo "perdido", pero no es asi, si se commiteo, esos commits estan en alguna parte... quiza no apuntados por ninguna referencia, pero estan.

Una de las maneras mas practicas de encontrarlo es usando el comando


git reflog


Que da por salida un registro de las operaciones que se hicieron, algo como esto:


8705300... HEAD@{0}: commit: aplicado metodo para desactivar los metodos privado
104683b... HEAD@{1}: commit: corregida restauracion de constantes
0a714ab... HEAD@{2}: commit: corregido error
f47b0e6... HEAD@{3}: commit: implementado metodo para activar y desactivar privi
7760e03... HEAD@{4}: commit: definido metodo permit, para definir muy facilmente
2936507... HEAD@{5}: commit: renombrado metodo para preguntar el permiso para ej
93757af... HEAD@{6}: commit: agregados enable y disable privileges con prints
4a2e9c3... HEAD@{7}: commit: agregado metodos para crear bloques unprivileged y
f19eb66... HEAD@{8}: commit: completado holder de manera que puede tener el codi
abc82d0... HEAD@{9}: commit: separado metodo create_holder
5185142... HEAD@{10}: commit (initial): primer commit


Incluye los "SHA1" de los commits hechos recientemente, de los cuales se pueden tomar los cambios y enviarlos al lugar correspondiente con git merge, crear branches o lo que sea necesario hacer.

domingo, 29 de noviembre de 2009

Sandbox de codigo ruby

La semana pasada empece el desarrollo de una libreria de ruby que permita crear "sandbox" de codigo ruby

Un sandbox (traducido literalmente del ingles como "caja de arena") es un entorno "protegido" que permite ejecutar programas de una manera en la que no es posible que estos programas afecten a lo que esta "afuera" del sandbox (Por ej: ejecutar un programa de manera que no pueda tener acceso al sistema de archivos de la computadora en la que se esta ejecutando)
Enlace
Para el caso particular de ruby, cuando se da, por ejemplo, el caso del desarrollo de una plataforma que ejecuta dinamicamente codigo enviado por muchos usuarios... es esperable que este codigo no pueda acceder al sistema de archivos o a la bases de datos de la aplicacion (el caso de una aplicacion Rails). En ese caso un "sandbox" que encierre al codigo en su ejecucion restringiria la ejecucion de codigo no deseado.

En lo que se ve a simple vista en la web, no hay mucho desarrollo al respecto... y lo que hay pareciera ser plugins algo mas especificos de rails como acts_as_runnable_code. Es por eso que comence el proyecto arena-ruby-sandbox, que define la posibilidad de ejecutar el codigo asi:




require "sandbox"

class X
def foo(a)
print "foo(#{a})\n"

# estoy afuera del sandbox, por lo tanto puedo
# hacer cosas "privilegiadas" como crear archivos
# cosa que no puede hacerse desde adentro del sandbox
File.open("foo.txt") do |f|
f.write "foo(#{a})\n"
end

a+5
end

def foo_no_invocable
print "foo_no_invocable\n"
end
end

# instanciar el sandbox
s = Sandbox::Sandbox.new

x = X.new

s.serivice_provider = x
# indica que el metodo foo se puede ejecutar desde adentro del sandbox
s.permit :foo

print s.run("2+2") # => 4

print s.run("foo(2)") # => 7 (y escribe el archivo foo.txt con "foo(2)" )

print s.run("foo_no_invocable") # => NoMethodError (nunca se especifico que foo_no_invocable se podia invocar)

s.run("
File.open('foo.txt') do |f|
f.write \"foo\n\"
end
") # => NameError: uninitialized constant File
# ( la clase File no existe adentro del sandbox
# no se puede acceder al filesystem desde el sandbox
links

http://arena-ruby-sandbox.googlecode.com

martes, 24 de noviembre de 2009

Autocarga perversa

Textualmente, la rdoc del core de ruby, dice asi:

mod.const_missing(sym) => obj

Invoked when a reference is made to an undefined constant in mod. It is passed a symbol for the undefined constant, and returns a value to be used for that constant. The following code is a (very bad) example: if reference is made to an undefined constant, it attempts to load a file whose name is the lowercase version of the constant (thus class Fred is assumed to be in file fred.rb). If found, it returns the value of the loaded class. It therefore implements a perverse kind of autoload facility.


def Object.const_missing(name)
@looked_for ||= {}
str_name = name.to_s
raise "Class not found: #{name}" if @looked_for[str_name]
@looked_for[str_name] = 1
file = str_name.downcase
require file
klass = const_get(name)
return klass if klass
raise "Class not found: #{name}"
end


Esa funcion puede utilizarse para implementar "alguna clase perversa de mecanismo de autocarga", para citar un ejemplo, rails lo utiliza como parte de su funcionamiento habitual para recargar las clases automaticamente sin necesidad de reiniciar el servidor ni ejecutar ningun comando explicito (¿rails = perversion?, esto me emociona).

links

http://ruby-doc.org/core/classes/Module.html#M001693

http://www.google.com.ar/search?q=%22It+therefore+implements+a+perverse+kind+of+autoload+facility%22

domingo, 22 de noviembre de 2009

Web-Base Real Time Syntax Highlighting

Codepress es un editor de codigo fuente, que funciona 100% en javascript (del lado del browser) haciendolo muy simple de instalar y utilizar, por ejemplo, pueden editar el siguiente fragmento de codigo:

NOTA: puede que el highlighting no sea tan "automagico", pero seguro se refresca cada vez que se teclean las comillas dobles... despues cualquier cosa se investiga mas la herramienta...

NOTA2: Todavia no pude hacer andar bien el editor en el contexto del blog... pero al final estan todos los links a las paginas de prueba que muestran todo el potencial de la herramienta



Pagina de demo de codepress: http://bobdawg.org/codepress/
Descarga del paquete: http://sourceforge.net/projects/codepress/files/codepress/codepress-v.0.9.6/
Mi pagina de prueba: http://codepress-test.coolpage.biz/codepress/prueba.html

lunes, 31 de agosto de 2009

Tags remotos en git

Correccion: parametros de git push cambiados para que el envio de la ref sea mas propio

Otro elemento importante que aporta el versionador git, son los tags... No es muy intuitivo tampoco como hacer que los tags sea remotos, pero es parecido a como se hacen los branches e incluso mas simple (ya que no hay nada que trackear)


1) Enviar al repositorio central el ref de ese tag (en el ejemplo es el actual commit)

git push origin HEAD:refs/tags/nombre_del_tag

Este comando envio el "ref" local refs/tags/nombre_del_tag al servidor con el nombre refs/tags/nombre_del_tag
Cuando alguien haga pull del repositorio central recibira los tags y va a poder trabajar con ellos como si los hubieran creado con git tag en su repositorio.