Hacker bazaar

Salut à tous.

Je n’ai pas été actif sur ce blog ces derniers jours (grippe, tout ça), mais je n’ai pas pour autant été fainéant. J’ai en effet quelques tutos dans les cartons, et en particulier concernant Bazaar (le dvcs qui est mieux que git).

J’ai dernièrement dû hacker Bazaar pour un autre projet que j’annoncerai bientôt. Ça m’a donc permis de me familiariser avec les tripes de la bête et en particulier bzrlib. Car si bazaar est un bon dvcs, sa force reste le fait qu’on peut programmatiquement tout faire grâce à sa bibliothèque.

Voici donc un petit tuto pour lister les fichiers d’une branche de bazaar (et même d’une branche d’un repo sans arbre):

from bzrlib.branch import Branch
b = Branch.open("/emplacement/de/ma/branche/")
t = b.basis_tree()
b.lock_read()
files = t.iter_entries_by_dir()
for f in files:
    print f[0]
b.unlock()

Ce qui pourra donner ceci:

index.php
movicon
run-tests.php
apps/movicon
apps/tests
apps/movicon/app.ini
apps/movicon/controllers
...

Chaque élément de l’itérateur renvoyé par iter_entries_by_dir() est un tuple dans la forme (fichier, objet). L’objet en second membre contient les informations nécessaires pour connaitre la taille du fichier, son hash sha1, et sa référence unique pour pouvoir l’obtenir (ce qui nous intéresse davantage).

On peut donc obtenir un fichier directement et le manipuler à notre guise (le tout sans tree, c’est classe).

... # Voir plus haut
for f in files:
    if f[1].__class__ == bzrlib.inventory.InventoryFile:
        print t.get_file_text(f[1].file_id)
        break
b.unlock()

Ici on itère dans les fichiers encore, et on teste le type du second membre du tuple. On peut soit avoir le type CHKInventoryDirectory (pour un dossier) ou bien InventoryFile (pour un fichier). Lorsqu’il s’agit d’un fichier, on attrape son contenu et on l’affiche dans stdout. ensuite je break pour éviter de flooder la sortie (c’est juste un test).

Évidemment on peut faire une ribambelle d’autre choses avec bzrlib, mais autant commencer par les choses simples.

Vus : 1066
Publié par Etenil : 58