Tag Archive for tool

Mercurial as a Git client

Days ago I just published a short blog post about using Mercurial as a SVN Client, I know, Subversion is the “now-legacy-vcs-system” and Git with Mercurial are the “cool kids” in the school, why not make them work together?

Well, in the same way we could make Subversion works with Hg (using extensions of course) we could make Git works with Mercurial. It requires a little more work in Windows but it stills easy to do. As usual we start with a TortoiseHg installation. I will try to show its installation in a short set of steps:

  • We need to activate the Mercurial Bookmark and rebase extensions (these extensions are included with standard Mercurial installation). Edit your mercurial.ini file and add the following to the [extensions] section
  • [extensions]
    rebase =
    hgext.bookmarks = 
  • HgGit needs a special python library to handle Git repositories, this library is named dulwich. You need to get it from its source repository, clone it in some directory

    hg clone http://bitbucket.org/abderrahim/dulwich
  • Now we need to get the HgGit source code from its repository, let’s clone it from repository

    hg clone http://bitbucket.org/durin42/hg-git
  • This is the hard part, we need to tell to HgGit the location where the dulwich library is installed. Remember, both HgGit and dalwich are Python libraries, so we’ll edit just a file to show where to get dalwich. Go to the place you cloned HgGit search and open the file __init__.py and add look for the following code and add the code highlighted
    import os
    
    # NOTE: Added for tortoisehg compatibility
    import sys
    sys.path.append('write here the directory where dulwich was cloned')
    
    from mercurial import commands, extensions, hg, util as hgutil
    from mercurial.i18n import _
  • Now let’s activate the extension, open again your mercurial.ini file and add the following line to your [extensions] section

    hggit = directory where hggit where clonedhggit

And that is all, just test your extension installation with hg help extensions And look for hggit

Now you can clone, rebase, push, pull and do whatever you do with mercurial but using remote git repositories, for example, now you can do something like

hg clone http://github.com/castleproject/Castle.Core.git castle

I hope this guide could help you to get more fun from Mercurial, see you later!

Workflow Foundation, Cuándo, Cómo, Dónde

Una pregunta común que recibo a diario es "cúando debo usar Workflow Foundation, en mi lógica de negocio? en mi cliente? como un almacen de persitencia?". Hace unos días un amigo me escribió un correo comentandome esto:

“Entonces en Workflow Foundation debo reemplazar mi lógica de negocio hecha en código por un workflow secuencial”

Esta pregunta coincide con algo sumamente recurrente que suelo escuchar cada vez que hablo acerca de Workflow Foundation: Dónde encaja Workflow Foundation en mi aplicación

Recuerdo a finales del año 2005 cuando las primeras Beta de la Framework 3.0 o “previews” salieron al aire, recuerdo haberme emocionado muchísimo al leer sobre las “Foundations” (de hecho, en ese tiempo estaba cambiando de plataforma y vivía en un período gris y no podía evitar el comparar cosas en .Net con cosas en lo “otro” en que trabajaba). Una de las cosas que más me llamó la atención fue Workflow Foundation, probablemente porque en uno de nuestros proyectos anteriores pasé un buen tiempo desarrollando una máquina secuencial de flujo y bueno me pareció excelente el que ahora una framework incluyera todo un toolset y “runtime” para el manejo de flujos de trabajo.

Hagamos antes un repaso rápido de qué involucra Workflow Foundation (para conocer un poco más acerca de que hace o se trata, recomiendo este link): http://msdn.microsoft.com/en-us/netframework/aa663328.aspx

  • Un runtime para ejecución de procesos (workflows)
  • Una serie de bloques o actividades básicas para la construcción de procesos (Activities)
  • Un toolset completo para el manejo y diseño de procesos (Addins, Services)

Adicionalmente la framework completa puede extenderse, o sea, embeber el runtime en nuestra aplicación, extender los flujos actuales, crear nuestras propias actividades y servicios y hasta embeber el designer de Workflows en nuestra aplicación.

Bien, entonces nace la pregunta de oro, ¿cuándo usar Workflow Foundation?. Bien, podríamos decir que WF puede usarse en las siguientes situaciones

  • Orquestación de pasos o actividades dentro de un modelo de negocio
  • Visibilidad del proceso del negocio
  • Persistencia en un proceso de negocio

Y bueno, para evitar confusiones, vale la pena mencionar cuándo a mi criterio no debe utilizarse Workflow Foundation

  • Para desarrollar la lógica de negocio del sistema
  • Para desarrollar una herramienta de programación para personal no técnico
  • Para reemplazar un DSL ya establecido en la organización
  • Para reemplazar la persistencia de otros aspectos que no están relacionados al proceso en si

Esto es importante, especialmente la primera parte, he visto muchos sistemas que buscan reemplazar o diseñar la lógica de negocio del sistema completamente desde cero usando WF, creo que ese es el ingrediente principal para futuros dolores de cabeza.

En vez de reemplazar o crear la lógica de negocio completamente desde WF, porqué mejor no “orquestamos” esa lógica mediante WF? Un buen indicador de que estamos empleando mal WF es la proliferación de codebehind en el Workflow y de Code Activities. Un buen Workflow debe ser netamente declarativo, eso elimina el uso de Code Activities, de hecho, en Workflow Foundation 4.0 las Code Activities ya no existen.

En resumidas cuentas, Workflow Foundation deben ser un agregado a la lógica de nuestra entidad de negocio y no el core de ella. Debe funcionar como un coordinador entre los pasos o secuencias de cada uno de los servicios o actividades de un proceso actual, debe ser una herramienta de extensión, no una central del desarrollo.

Bueno, como siempre, cuéntenme sus ideas, perspectivas o comentarios al respecto. Soy todo oídos :)

Review, RedGate SQL Source Control

Eliminando directorios de Subversion (.svn) desde la línea de comandos

Subversion es un excelente sistema de control de versiones centralizado (VCS) de código abierto ampliamente utilizado alrededor del mundo no sólo por los desarrolladores sino también por diversas personas que lo usan para mantener un control de cambios en sus documentos varios.

Es común para un usuario de Subversion utilizar el famoso cliente TortoiseSVN para manejar sus directorios de trabajo actuales conectados a un repositorio de Subversion. Como algunos se habran percatado, Subversion crea directorios “ocultos” .svn donde contiene la metadata necesara para trabajar de forma desconectada al repositorio, a veces estos directorios pueden llegar a ser un poco “irritantes” y necesitamos deshacernos de ellos. Recientemente un amigo me llamó con el siguiente problema:

Tengo un problema, el repositorio original no existe, por lo tanto no puedo hacer el “export” de TortoiseSVN de mi repositorio para deshacerme de los directorios .svn, necesito enviarle el código fuente a un cliente pero no quiero enviarle los .svn, ¿cómo hago para deshacerme de ellos? la estructura de directorios es muy compleja por lo que navegar uno a uno y quitarlos es un poco tedioso.

Es ahí cuando sale a la luz nuestro viejo amigo la línea de comando, no es nada que un simple script de Cmd o PowerShell en Windows no pueda resolver. Comencemos con el viejo y ya casi obsoleto Cmd:

for /r %%f in (.svn) do rd /s /q "%%f"

En PowerShell es un poco más complejo, pero igual se puede lograr :)

get-childitem -Include .svn -Recurse -force | Remove-Item -Force –Recurse

Obviamente, cualquiera de los dos comandos deben correrse en el directorio que queremos limpiar.

Saludos!

UPDATE: mi amigo jfroma me sugiere el uso de SVN Export para lograr lo mismo, bueno, recordemos que SVN Export es una operación conectada de Subversion, eso indica que debemos tener conexión al repositorio para efectuarla. Como expongo en mi caso, mi amigo no tiene acceso al repositorio original (para ser exacto según me contó fue borrado), he ahí porqué no podemos usar Export y debemos recurrir a otras “técnicas” tibetanas para lograrlo.

Haciendo publish de un web application con nant

Hace unos días publiqué acerca de haciendo deploy de una solución con un web application project en msbuild. Bien, ahora que necesito pasarla a nant (este proyecto fue el único en que tenía mi building en msbuild) nace la misma pregunta: Y cómo hago para el “publish” de esa web application project?

La respuesta es sencilla, usando msbuild :d, claro, mediante la msbuild task de nantcontrib :D

He aquí el equivalente de la tarea en nant:

<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://nant.sf.net/release/0.86-beta1/nant.xsd" name="WebApp" default="build">
  <property name="project.weboutput" value="publish" />
  <target name="publish">
    <msbuild project="WebApplication1.sln">
        <property name="configuration" value="release" />
        <property name="outdir" value="${project.weboutput}/" />
        <property name="webprojectoutputdir" value="./../${project.weboutput}/" />
    </msbuild>
  </target>
  <target name="clean">
    <delete>
        <fileset>
            <include name="**/bin/**" />
            <include name="**/obj/**"/>
        </fileset>
    </delete>
  </target>
</project>

Claro, vuelvo a recordarles, para que esto funcione simplemente tienen que tener nantcontrib entre su instalación favorita de nant :D