arquivos com barra no nome

August 27, 2009, by Antonio Terceiro - No comments yet

Como em todo sistema operacional que merece alguma forma de respeito a barra ("/") é usada como separador de diretórios, normalmente a gente não consegue criar arquivos com uma barra no nome. Mas nesse post eu quero mostrar que pra ter arquivos com barra no nome:

terceiro@morere:/tmp/slash> ls -l
total 0
terceiro@morere:/tmp/slash> touch filename∕with∕slashes
terceiro@morere:/tmp/slash> ls -l
total 0
-rw-r--r-- 1 terceiro terceiro 0 Ago 27 16:59 filename∕with∕slashes
terceiro@morere:/tmp/slash>

Qual o truque? Simples, basta usar o caractere Unicode 0x2215 ("DIVISION SLASH") no lugar da barra ASCII normal! Basta abrir o gucharmap ("Mapa de caracteres" nos menus que seguem o padrão freedesktop), procurar por ele no Sistema de escrita "Comum" (lado esquerdo da janela), dar um duplo clique e daí copiar o caracter na caixa de texto no rodapé e colá-lo no seu terminal, ou no seu gerenciador de arquivos desktop, tanto faz.

Gucharmap-division-slash

 

Aí você me pergunta: qual a utilidade disso? Bom, eu quero rodar um programa pra um conjunto de branches num repositório git e salvar a saída padrão e e a saído de erro  de cada execução em arquivos com o nome do branch, mas esses branches normalmente teem barras no nome. Como eu quero todos os arquivos de resultado no mesmo diretório, então no meu script eu troco as barras ASCII por essa barra especial. Nas fontes em que eu testei os dois caracteres são idênticos visualmente, mas por baixo dos panos eles são diferentes.



Fazendo o svn diff ser suportável

August 21, 2009, by Antonio Terceiro - No comments yet

Já tem um tempo que eu uso git diariamente, e a opção de colocar cores nas saídas dos comandos é extremamente útil. Especialmente quando você quer ver um diff, isso facilita a sua vida. Daí quando você por algum motivo precisa usar svn de novo, seja pra mandar um patch pra um projeto que ainda usa svn, seja pra um projeto seu que ainda esteja nas trevas, vem aquele diff feio. Seus problemas acabaram:

  1. edite o arquivo ~/.subversion/config, e dentro da seção helpers, diga para o svn usar um comando diferente do default como programa diff:
    diff-cmd = /home/USERNAME/bin/svn-git-diff
    (esse programa pode estar em qualquer diretório que esteja no seu PATH)
  2. esse svn-git-diff é um script bastante simples. O svn vai chamá-lo com um monte de parâmetros, mas os únicos que importam são o sexto e o sétimo, que indicam o arquivo original e a sua versão modificada.
    #!/bin/sh
    export PAGER=/bin/cat
    git diff --no-index "${6}" "${7}"
  3. não se esqueça de tornar esse script executável com
    chmod +x /home/USERNAME/bin/svn-git-diff (o caminho real do arquivo vai depender se onde você o colocou).

E era isso. Agora quando você der svn diff, o diff vai sair colorido assim como quando você está verificando diffs (ou commits) no git.

update: numa versão mais nova do git (1.6.5.2) é necessário passar --no-index pra que o git diff funcione fora de um repositório git.

update 2: é preciso setar PAGER para /bin/cat para que o git não faça um pipe para o less de cada arquivo individualmente, e sim cuspa todo o diff na tela de vez (porque o subversion vai chamar o script uma vez pra cada arquivo alterado).