Git para SVN de forma manual

Tem esse projeto que eu comecei usando o Git, mas tenho que entregar em um SVN.

Daí para não bagunçar o checkout que fiz do SVN resolvi continuar usando o Git e copiar os arquivos para o diretório onde está o checkout do SVN.

Para saber quais arquivos tenho que copiar uso o

git diff <id_do_commit_que_ainda_não_copiei> --name-only

Para copiar os arquivos listados eu uso o xargs* com cp.

xargs -I {} cp {} ../projeto_no_svn/{}

Assim, para cada arquivo listado pelo git diff, o xargs vai executar um comando:

cp diretorio/arquivo.algumacoisa ../projeto_no_svn/diretorio/arquivo.algumacoisa

O comando completo fica:

git diff <id_do_commit_que_ainda_não_copiei> --name-only | xargs -I {} cp {} ../projeto_no_svn/{}

* Fonte: http://www.cyberciti.biz/faq/linux-unix-bsd-xargs-construct-argument-lists-utility/

Uninstall all gems

Sabe quando você manda um bundle install fora do gemset que você pensava que estava?
E, que você se dá conta de que está usando o Ruby do MacOS? E, que quando você tenta usar o gem uninstall nome_da_gem ele dá um erro parecido com:
cannot uninstall, check `gem list -d

Então, como limpar a besteira?

Primeiro, monta um arquivo com as gems que foram instaladas:
gem list | grep '(' | sed "s/ .*//" > installed_gems

Daí você lê o arquivo e manda apagar cada uma das versões instaladas
cat installed_gems | xargs sudo gem uninstall -x -a -i "/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8"

Só apagar o arquivo com a lista das gems instaladas.
rm installed_gems

Pronto. Acabei de remover todas as gems instaladas no Ruby do MacOS.

Fontes:
http://docs.rubygems.org/read/chapter/10#page38
http://www.ruby-forum.com/topic/174847#765923

Recuperar a versão de uma dependência, em um pom, no bash

No projeto que estou trabalhando, estou usando Maven, mas nem todas suas dependências estão.

Uma destas dependências continua sendo alterada, e para colocar ela no meu projeto devemos seguir os segintes passos:

  1. O jar cliente é gerado, sempre com o mesmo nome, a partir da execução de um script ant;
  2. Instalo o jar no repositório local do maven, mudando o nome do jar para adicionar a tag do CVS.

Um desenvolvedor do time precisou fazer um script que baixa essa dependência e faz esse processo de build. Mas, para isso precisava da versão do jar, que o projeto em que trabalho depende. A forma para fazer isso foi ler o pom.xml e pegar a versão que o projeto depende.

Seguem os passos:

1. Pegar a tag com a dependência:
grep -B 2 -A 2 "foo-client" pom.xml

Resultado:

<dependency>
    <groupId>com.beyondclick.foo</groupId>
    <artifactId>foo-client</artifactId>
    <version>1.2.42</version>
</dependency>

2. Pegar, somente, a tag com a versão:
grep '<version>'

Resultado:

    <version>1.2.42</version>

3. Pegar somente o conteúdo. Para isso vou usar o sed, substituindo a tag por nada 😉
sed 's#</*version>##g'

Observe o uso do ‘/*’ para informar que deve substituir o fechamento da tag e o ‘g’, no final, para indicar que deve substituir todas as ocorrências.
Resultado:

    1.2.42

Finalmente, encadeando tudo no bash:
grep -B 2 -A 2 "foo-client" pom.xml | grep '<version>' | sed 's#</*version>##g'

Apagar os arquivos retornados pelo find

Sabe quando você precisa apagar uma lista de arquivos com um determinado padrão? O mais comum é apagar um conjunto de arquivos de uma mesma extensão.

No meu caso, estou querendo apagar os arquivos com extensão .orig, criados pelo git após um merge.

Eu posso usar o find para achar os arquivos terminados com .orig:
find . -iname \*.orig

Depois apagar um a um, usando rm.
rm ./caminho/para/o/arquivo/e_nome_do_arquivo.orig

Mas, se forem muitos arquivos, mais do que um, vou perder um tempo enorme selecionando o nome, copiando e colando com o rm.
Por isso, achei mais interessante usar o resultdo do find como argumento para o rm, através do conceito de pipe, do Bash:
find . -iname \*.orig | xargs rm

Pronto. Arquivos apagados!

CVS – removendo diretórios

Estou trabalhando em um projeto com CVS e preciso remover uma pasta que foi adicionada incorretamente.
O problema é que o CVS não tem remove para pastas, só para arquivos. Quando uma pasta fica vazia ele remove a pasta. O que me leva a seguinte solução:

Para cada arquivo dentro da pasta que você quer remover:

  1. rm nome_do_arquivo
  2. cvs remove nome_do_arquivo

Dá pra entender que iria ser um porre, né? Então, eis que o bash aparece para salvar o dia:

ls -a | grep -v -E “CVS|^\.” | xargs -i bash -c “rm {}; cvs remove {}”

Apaga todos os arquivos da pasta, e remove do cvs, sem apagar os arquivos da pasta do CVS.