Configurando um repositório Subversion

Ultimamente tenho configurado alguns repositórios Subversion usando a seção Version Control System do Ubuntu Server Guide, que consiste de:

  1. Instalar o servidor: sudo apt-get install subversion libapache2-svn
  2. Criar um novo projeto: svnadmin create /var/svn-repos/projeto
  3. Criar um arquivo de senhas: htpasswd2 /etc/subversion/passwd user_name
  4. Editar /etc/apache2/apache2.conf acrescentando uma entrada para o repositório do novo projeto
     <Location /svn/projeto>
      DAV svn
      SVNPath /var/svn-repos/projeto
      AuthType Basic
      AuthName "Your repository name"
      AuthUserFile /etc/subversion/passwd
      <LimitExcept GET PROPFIND OPTIONS REPORT>
      Require valid-user
      </LimitExcept>
      </Location>
  5. Uma rápida reiniciada no apache com /etc/init.d/apache2 restart e pronto.

O problema é que eles esqueceram de incluir uma parte sobre como inicializar o repositório com uma estrutura decente, então é o seguinte:

cd /tmp
mkdir projeto
mkdir projeto/trunk
mkdir projeto/branches
mkdir projeto/tags
svn import /tmp/projeto file:///var/svn-repos/projeto/ -m “initial import”
chown -R www-data:subversion /var/svn-repos/projeto
rm /tmp/projeto -rf

Desnecessário dizer que tudo tem de ser feito no servidor como root (sudo -s).

O primeiro Autotools é inesquecível!

Depois de muitas e muitas baixadas de tar.gzês de terceiros, pra descompactar e dar ./configure ; make ; make install, usar autotools em meu próprio projeto dá uma sensação muito boa! Sou praticamente gente grande! =P

Mas tenho de admitir começar foi complicado, são muitas as informações, felizmente pude contar com este excelente tutorial:

Ele faz um progresso gradual, com boas explicações e exercícios. Uma pena que o exemplo com GTK+ esteja totalmente deprecated. Para compensar esse problema e tocar meu projeto, usei um ardil descarado: criei um projeto GTK+ chamado gtk-foo no Anjuta (apt-get install anjuta autogen), sem suporte a internacionalização, pra não complicar as coisas.

Copiei os arquivos autogen.sh e configure.in, Makefile.am, aclocal.m4 e src/Makefile.am de gtk-foo para logicparser. Além disso foi necessário criar os conhecidos arquivos README, NEWS, ChangeLog, etc, conforme manda a tradição. Também foi necessário copiar alguns scripts de /usr/share/automake-1.9 para o diretório do projeto: depcomp, install-sh e missing.

Depois disso alguns ajustes precisaram ser feitos, como em lp_app.h, por exemplo, que guardava a indicação de onde encontrar o arquivo lp_gui.glade, já que o make install deveria colocar o arquivo glade em /usr/local/share/logicparser/glade.

Como ficou o trecho do header lp_app.h:

// For testing propose use the local (not installed) glade file
//#define GLADE_FILE "lp_gui.glade"
#define GLADE_FILE PACKAGE_GLADE_DIR"/lp_gui.glade"

O macro PACKAGE_GLADE_DIR é setado pelo compilador e foi definido em src/Makefile.am:

gladedir = $(datadir)/logicparser/glade
glade_DATA = lp_gui.glade

INCLUDES = \

-DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \
-DPACKAGE_SRC_DIR=\""$(srcdir)"\" \
-DPACKAGE_DATA_DIR=\""$(datadir)"\" \
-DPACKAGE_GLADE_DIR=\""$(gladedir)"\" \
$(PACKAGE_CFLAGS)

AM_CFLAGS =\

-Wall\
-g

bin_PROGRAMS = logicparser

logicparser_SOURCES = \

logicparser.c \
lp_app.c \
lp_graph.c \
lp_test.c \
logicparser.h \
lp_app.h \
lp_graph.h \
main.c

logicparser_LDFLAGS =

logicparser_LDADD = $(PACKAGE_LIBS)

EXTRA_DIST = $(glade_DATA)

O que mais gostei nesse início de uso do Autotools foi o make dist, que gera um logicparser-x.y.z.tar.gz. E por falar nele, podem baixar a última versão (0.4.2) na seção de Downloads: http://code.google.com/p/logicparser/downloads/list

Resta aprender como incluir suporte à internacionalização (provavelmente com ajuda do Anjuta :) e build para Win32. Mas agora chega, estou caindo de sono. Se interessou, veja o site do autotut mencionado acima.

Compilando LogicParser em Win32 com MinGW e MSYS

Minha primeira e emocionante compilação de algo que estava desenvolvendo no Linux no insalubre ambiente Win32. Primeiro o screenshot e depois a história:

LogicParser no Windows

O ambiente de build foi montado usando MinGW/MSYS/msysDTK e o GTK+/Win32 Development Environment. A primeira compilação deu errado, mas setei a variável de ambiente PKG_CONFIG_PATH para /c/temp/GTK/2.0/lib/pkgconfig e tudo correu muito bem, mais fácil do que esperava. Depois vou ver como compilar estático pra fazer um executável morbidamente obeso, mas muito conveniente.

A aba “Graph (Image)” não funciona pois não consegui instalar o GraphViz no computador do CIn pois não tenho privilégios de administrador. Pelo menos isso me ajudou a decidir usar o GraphViz via biblioteca em lugar de usar o g_spawn_sync da GLib para chamá-lo externamente. Além disso, pra esse negócio ficar mesmo cross-platform tenho de usar algumas funções utilitárias da GLib, como g_get_tmp_dir e coisas assim.

Referências úteis nessa empreitada:

LogicParser 0.4

Mais um release do LogicParser, agora a aba “Graph (Image)” é atualizada com imagem representando a árvore parseada da expressão lógica.

LogicParser 0.4

Duas funções muito boas da GLib me ajudaram:

  • g_file_set_contents: escreve todo conteúdo de uma string para um arquivo. Simples e rápida.
  • g_spawn_sync: dispara um processo de forma síncrona, para chamar o dot, do GraphViz.

Juntanto com outras facilidades da GLib, programar em C fica fácil demais. :P

Outra coisa muito útil era o Google Code Search, a referência da GLib é muito boa, mas às vezes você quer ver o código sendo usado, e o code search ajudou bastante. Por exemplo, a especificação do g_spawn_sync tem muitos parâmetros, assustadores numa primeira olhada. “Como devo setar esses parâmetros?” Como todo mundo! No código do eog que achei nessa busca: lang:c g_spawn_sync

Sobre o futuro, o código precisa de mais “polish” e certamente preciso aprender CMake ou Autotools pra fazer um build system de respeito e não meu seboso Makefile. Por ser um projeto pequeno, pode valer à pena aprender Autotools.

Lembrando:

Update: OMG! Agora o Google Hosting disponibiliza uma wiki! Vejam a minha: http://code.google.com/p/logicparser/wiki/LogicParser

Audiobooks

Se tem uma coisa que acho irritante é me deslocar (também odeio calor e verão, mas isso é só mais um fator cumulativo). Quase todo dia viajo 3 horas (ida e volta e meia hora na fila do ônibus) pra universidade, e às vezes mais 3 horas (ida e volta) pra o Espaço Ciência. Se eu tivesse um laptop podia fazer dos ônibus meu escritório e montar um negócio paralelo, mas não creio que eu fosse andar de ônibus com um laptop. ¬¬

Contudo!!! Há uma luz no fim do túnel! Ou melhor, um som: audiolivros! Já ouvi O Hobbit, O Senhor dos Anéis, e agora filosofia Grega, de Tales até Aristóteles.

Continuo não gostando de viajar de ônibus, mas agora sei que toda filosofia ocidental pode ser considerada comentários à respeito de Platão e Aristóteles, que os sofistas viraram advogados e que Sócrates continua o debate, ou melhor, o diálogo, com os neurocientistas pré-socraticos. Enfim, não há nada de novo sob o sol, que continua impiedoso no verão. ¬¬

Nota: Gostei particularmente desse grafo, feito com o GraphViz, das relações de influência entre os filósofos pré-socráticos.

LogicParser 0.2

Segundo release do LogicParser. Está sendo bem divertido voltar a programar em C, ainda mais com a GLib facilitando as coisas. No começo é estranho usar g_print no lugar de printf, e outras coisas, mas quando penso que boa parte da portabilidade estará garantida quando for compilar esse treco em Win32… :)

Neste release adicionei um componente para gerar grafos no no formato da linguagem DOT, processados pela ferramenta homônima do pacote GraphViz.

Aqui está uma expressão na sintaxe compreendida pelo LogicParser:

p1->(f | (!p3))

O grafo gerado:

digraph ParsedTree {
if_then_0 [label=if_then];
if_then_0 -> P1_1;
if_then_0 -> or_2;
P1_1 [label=P1];
or_2 [label=or];
or_2 -> False_3;
or_2 -> not_4;
False_3 [label=False];
not_4 [label=not];
not_4 -> P3_5;
P3_5 [label=P3];
}

A linha de invocação do dot, e a figura gerada:
dot -Tpng grafo.dot -o grafo.png

p1->(f | (!p3))

Além disso tudo está documentado na sintaxe do Doxygen.

Update: ah! O comando mágico para criar um tag no subversion:
svn copy https://logicparser.googlecode.com/svn/trunk \
https://logicparser.googlecode.com/svn/tags/release-0.2 \
-m "Release 0.2 of the 'LogicParser' project."