Listing Apertium element using command-line

From Apertium
Jump to navigation Jump to search

En français

Changes in Apertium implementation mode

Originally, or at least for ten years, the Apertium project was archived on sourceforge using subversion software.

The project was then organised as a tree :

  • The repository apertium directory only countained subdirectories called branches.
  • Each branche included several subdirectories and each of them contained one of the following three elements:
    • Apertium project software,
    • a language pair,
    • the reference files for a language.

Language pairs, could be implemented into 4 distinct subdirectories (incubator, nursery, staging et trunk) according to their progress.

In the current Apertium implementation, any project element is directly located in a first level subdirectory of "apertium" (https://github.com/apertium/) and branches, and branches, which corresponded to first level subdirectories:

  • apertium-incubator
  • apertium-nursery
  • apertium-staging
  • apertium-trunk
  • apertium-languages
  • apertium-tools

only countain a list of project elements.

Listing a project branche

To get the list of elements in a branche, you just need to download the web page :

https://github.com/apertium/apertium-<branche_name>/blob/master/.gitmodules

and extract lines containing "submodule" , or lines containing "path ="

Then, you need to keep only project elements from the extracted lines.

Code example to get data from lines containing "path =" :

#!/bin/sh
wget -q https://github.com/apertium/apertium-$1/blob/master/.gitmodules
fgrep "path =" .gitmodules | sed "s/.*path = // s/<\/td>//" | sort
rm .gitmodules*

Call example (assuming the command is called branchlist)

branchlist trunk

Date of last change for a project element (trivial method)

This method also consists in retrieving information from a web page. This is the page:

https://api.github.com/repos/apertium/<element_name>

You will need to retrieve date and hour fron line containing "pushed_at"

Code example :

#!/bin/sh
wget -q https://api.github.com/repos/apertium/$1
fgrep "pushed_at" $1 | sed "s/.*: \"// s/T/ / s/Z.*//"
rm $1

This system works fine with recently changed Apertium project elements. However, for the other elements, you will never get a date prior to March 2018. The reason is the Apertium project was transferred from sourceforge to github in March 2018.

For the elements not updated for a long time, it is possible to use the command svn list and to take off referencies to git repository files (their name stard by a . ) before searching the most recently changed.

Listing file and subdirectories of a project element

Pour lister des fichiers et répertoires of a project element, on peut exécuter la commande svn list -v sur le sous-répertoire trunk (!!!) de cet élément.

Par exemple, pour le langage apertium-fra :

svn list -v http://github.com/apertium/apertium-fra/trunk

Le message d'une ligne qui apparait au début peut être supprimé, tout comme les fichiers git et la référence au répertoire courant dont les noms commencent par .

Enfin, si on appelle la commande svn list sur un élément qui n'existe pas, subversion demande un mot de passe. On peut éviter ce problème en reriigeant l'entrée standard sur /dev/null

Exemple de code :

#!/bin/sh
svn list -v http://github.com/apertium/$1/trunk < /dev/null | fgrep -v " ." | tail -n +2

Last change date for a project element (using svn)

Solution using svn list -v

Pour chercher la date de dernière modification of a project element, il suffit de chercher dans le résultat d'une commande svn list le dernier fichier qui a été modifié. Dans le cas du projet Apertium, les modifications importantes sont dans le répertoire racine de l'élément du projet. On n'examinera pas le contenu des sous-répertoires.

Cependant, avec la commande svn list -v, deux problèmes se posent pour l'affichage des dates :

  • Un nom de mois abrégé est affiché, ce serait plus facile avec un numéro de mois
  • Pour les fichiers modifiés dans les 6 derniers mois, on a l'heure de modification à la place de l'année. la modification peut avoir eu lieu cette année ou à la fin de l'année précédente.

Il faudra transformer les dates affichées pour résoudre ces problèmes. On pourra faire ces transformations en utilisant 2 commandes sed et en créant deux "sedfiles" (fichiers de commandes sed).

Le premier de ces fichiers dépendra de la langue dans laquelle est affichée les noms de mois. Si l'affichage est en lanque anglaise (ce que l'on peut forcer en faisant LANG=en_US.UTF-8), on pourra utiliser le fichier numerote-mois suivant :

s/ Jan / m01 /
s/ Feb / m02 /
s/ Mar / m03 /
s/ Apr / m04 /
s/ May / m05 /
s/ Jun / m06 /
s/ Jul / m07 /
s/ Aug / m08 /
s/ Sep / m09 /
s/ Oct / m10 /
s/ Nov / m11 /
s/ Dec / m12 /

Un deuxième fichier sed va générer un numéro d'année avant le numéro de mois. Le contenu de ce fichier changera d'un mois à l'autre. On utilisera un premier script pour le générer :

#!/bin/sh
an=`date +%Y` changemois=`date +%m`
> an_mois
mois=01
while [ $mois -le $changemois ] do echo "s/ m$mois /$an $mois /" >> an_mois mois=`expr $mois + 101 | cut -c2-` done
an=`expr $an - 1`
while [ $mois -le 12 ] do echo "s/ m$mois /$an $mois /" >> an_mois mois=`expr $mois + 101 | cut -c2-` done

Le script principal permettant de chercher la date de dernière modification de l'élément du projet va procéder de la manière suivante :

  • faire un svn list -v sur le sous-répertoire trunk de l'élément
  • supprimer les fichiers et répertoires dont le nom commence par .
  • réordonner les colonnes pour faire un affichage an mois jour nom_fichier (attention, pour les répertoire (identifiables par un / après le nom) le champ taille_du_fichier est vide)
  • remplacer les noms de mois abrégés par m suivi d'un numéro de mois (sur 2 chiffres)

Deux cas se présentent alors :

1) Tous les fichiers sont vieux d'au moins 6 mois : toutes les lignes commencent par l'année.

Dans ce cas, on tri les lignes obtenues par ordre alphabétique. La date de la modification la plus récente est celle du fichier (ou du sous-répetoire) qui apparait en dernière ligne.

2) Certains fichiers ont été modifiés dans les 6 dernier mois. On trouve des heures en début de l'igne qu'on peut identifier par la présence du symbole :

Dans ce cas, il suffit de s'intéresser à ces fichiers. On enlèvera l'heure en début de ligne pour mettre l'année à la place. Puis après un tri alphabétique, on prendra la date qui apparail en dernier.

Le script qui effectue ce traitement est le suivant :

#!/bin/sh
liste1=/tmp/listepaire1_$$ liste2=/tmp/listepaire2_$$
svn list -v http://github.com/apertium/$1/trunk < /dev/null | fgrep -v " ." | tail -n +2 > $liste1
grep -v "/$" $liste1 | awk '{print $6 " " $4 " " $5}' > $liste2 grep "/$" $liste1 | awk '{print $5 " " $3 " " $4}' >> $liste2
sed -f numerote-mois $liste2 | sort > $liste1
fgrep : $liste1 > $liste2
if test -s $liste2 then cut -c6- $liste2 | sed -f an_mois | sort | tail -1 | awk '{print $3 " " $2 " " $1}' else tail -1 $liste1 | sed "s/m//" | awk '{print $3 " " $2 " " $1}' fi
rm $liste1 $liste2

Solution using svn list --xml

Avec cette option de la commande svn, le nom du fichier et sa date de mise à jour apparaissent sur des lignes distinctes et sont entourés de balises XML.

Il faudra sélectionner ces lignes et les regrouper.

Comme précédemment, après avoir enlevé les lignes concernant des fichiers dont le nom commence par . puis conservé seulement la date et fait un tri par ordre alphabétique, c'est la date qui apparait en dernier qui nous intéresse.

Voici un exemple de script qui fait le traitement.

#!/bin/sh
svn list --xml http://github.com/apertium/$1/trunk < /dev/null | egrep "<(nam|dat)e>" | paste - - | fgrep -v ">." | sed "s/.*<date>//" | sort | tail -1 | cut -c1-10

Dans cet exemple, la date apparait pous la forme an-mois-jour

On pourrait continuer le traitement pour avoir un affichage jour/mois/an et également afficher l'heure de la mise à jour qui apparaitrait aussi si on n'avait pas tronqué l'affichage aux 10 premiers caractère.