Difference between revisions of "Listage des éléments d'Apertium en ligne de commandes"

From Apertium
Jump to navigation Jump to search
(→‎Solution avec svn list -v: remplissage du chapitre)
(→‎Solution avec svn list -v: simplification en n'utilisant pas de sous répertoire ../sedfiles)
Line 121: Line 121:
 
an=`date +%Y`
 
an=`date +%Y`
 
changemois=`date +%m`<br />
 
changemois=`date +%m`<br />
> ../sedfiles/an_mois<br />
+
> an_mois<br />
 
mois=01<br />
 
mois=01<br />
 
while [ $mois -le $changemois ]
 
while [ $mois -le $changemois ]
 
do
 
do
echo "s/ m$mois /$an $mois /" >> ../sedfiles/an_mois
+
echo "s/ m$mois /$an $mois /" >> an_mois
 
mois=`expr $mois + 101 | cut -c2-`
 
mois=`expr $mois + 101 | cut -c2-`
 
done<br />
 
done<br />
Line 131: Line 131:
 
while [ $mois -le 12 ]
 
while [ $mois -le 12 ]
 
do
 
do
echo "s/ m$mois /$an $mois /" >> ../sedfiles/an_mois
+
echo "s/ m$mois /$an $mois /" >> an_mois
 
mois=`expr $mois + 101 | cut -c2-`
 
mois=`expr $mois + 101 | cut -c2-`
 
done
 
done
Line 161: Line 161:
 
grep -v "/$" $liste1 | awk '{print $6 " " $4 " " $5}' > $liste2
 
grep -v "/$" $liste1 | awk '{print $6 " " $4 " " $5}' > $liste2
 
grep "/$" $liste1 | awk '{print $5 " " $3 " " $4}' >> $liste2<br />
 
grep "/$" $liste1 | awk '{print $5 " " $3 " " $4}' >> $liste2<br />
sed -f ../sedfiles/numerote-mois $liste2 | sort > $liste1<br />
+
sed -f numerote-mois $liste2 | sort > $liste1<br />
 
fgrep : $liste1 > $liste2<br />
 
fgrep : $liste1 > $liste2<br />
 
if test -s $liste2
 
if test -s $liste2
 
then
 
then
cut -c6- $liste2 | sed -f ../sedfiles/an_mois | sort | tail -1 |
+
cut -c6- $liste2 | sed -f an_mois | sort | tail -1 |
 
awk '{print $3 " " $2 " " $1}'
 
awk '{print $3 " " $2 " " $1}'
 
else
 
else

Revision as of 11:42, 13 April 2018

In English

Changement du mode d'implantation d'Apertium

A l'origine, ou en tout cas pendant une dizaine d'années, le projet Apertium était archivé sur sourceforge grâce au logiciel subversion.

Le projet était alors organisé sous la forme d'une arborescence :

  • Le répertoire apertium du dépôt était composé exclusivement de sous-répertoires appelés branches.
  • Chaque branche comportait plusieurs sous-répertoires dont chacun contenait l'un des trois éléments suivants :
    • des logiciels du projet Apertium,
    • une paire de langues,
    • les fichiers de référence d'un langage.

Les paires de langues, pouvaient être implantées dans 4 répertoires distincts (incubator, nursery, staging et trunk) en fonction de leur état d'avancement.

Dans l'implantation actuelle d'Apertium, tous les éléments du projet sont directement implantés dans un sous-répertoire de la racine "apertium" (https://github.com/apertium/) et les branches, qui correspondaient aux sous-répertoires de premier niveau :

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

contient seulement une liste d'éléments du projet.

Listage d'une branche (liste d'éléments) du projet

Pour obtenir la liste des éléments d'une branche, il suffit de récupérer la page web :

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

et d'en extraire soit les lignes contenant "submodule" , soit les lignes contenant "path ="

Ensuite, il suffit de ne conserver ques les noms d'éléments du projet dans les lignes récupérées.

Exemple de code permettant de récupérer les données des lignes contenant "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*

Exemple d'appel (en supposant que la commande s'appelle listebranche) :

listebranche trunk

Date de dernière modification d'un élément du projet (méthode triviale)

Cette méthode consiste aussi à récupérer une information dans une page web. Il s'agit de la page :

https://api.github.com/repos/apertium/<nom_élément>

On récupèrera la date et l'heure qui figure dans le ligne qui contient "pushed_at"

Exemple de code :

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

Ce système fonctionne bien avec les éléments du projet Apertium modifiés récemment. Toutefois, pour les autres éléments, on ne trouve jamais de date antérieure à mars 2018. En effet, c'est en mars 2018 que le projet Apertium a été tranféré de sourceforge à github.

Pour les éléments qui n'ont pas été modifiés depuis longtemps, il est possible d'utiliser la commande svn list et de supprimer les références aux fichiers du dépot git (ils commencent par un . ) avant de chercher le plus récemment modifié.

Listage des fichiers et répertoires d'un élément du projet

Pour lister des fichiers et répertoires d'un élément du projet, 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

Date de dernière modification d'un élément du projet (avec svn)

Solution avec svn list -v

Pour chercher la date de dernière modification d'un élément du projet, 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 avec svn list --xml