Bonjour,
La gestion des sources sur les ppa launchpad est compliquée et mal documentée.
je propose donc de vous présenter ma façon de faire.
La 1ere chose à faire est de lire :
https://www.debian.org/doc/manuals/maint-guide/dother.fr.html
FICHIERS :
Projet 1 : Yanacron, logiciel en bash a écritPour cet exemple, je me base sur le projet
Yanacron dont voici les
sources.
Le fichier debian créé via launchpad est disponible
ici.
Télécharger le fichier et extraire son contenu dans un dossier spécifique.
Exemple : ~/yanacron/yanacron/[fichiers sources]
Fichiers et dossiers faisant entièrement partis du logiciel :
Dossiers :
icons : Icône du logiciel
locale : Fichiers de traduction du logiciel
man : Fichiers man (fr et eng)
Fichiers :
yanacron : script bash
yanacron.desktop : raccourci du logiciel
Fichiers du dossier debian :
changelog :
Contient les modifications de la nouvelle version.
Le format de la 1ere ligne et de la dernière sont importants.
compat :
Correspond à la version de debhelper.
Si les paquets sont >= Bionic, on peut changer la valeur à 10.
control :
Très important, contient les infos du projet et de ses paquets.
Si les paquets sont >= Bionic, on peut changer : Build-Depends: debhelper (>= 10)
copyright : Informations sur la licence du logiciel.
files : Ce fichier est automatiquement généré lors de la création des sources.
format : Laisser tel quel, permet l'application de patch.
README : Informations diverses (facultatif).
rules : Ne pas toucher, c'est lui qui permet de faire tout le boulot !
yanacron.docs : Contient les documents liés au logiciel, dans notre cas, le fichier README.
yanacron.install :
Fichier très important qui indique ou déplacer les fichiers.
Attention, les destination ne doivent pas commencer par /.
Cela créera l'architecture du fichier debian.
Les fichiers ne sont pas forcément nommés mais j'utilise souvent le jocker *.
Le fichier yanacron se retrouvera dans le dossier usr/bin.
Le dossier locale/ sera fusionné avec le dossier usr/share/locale.
Les fichiers png du dossier icons seront copiés dans usr/share/icons/hicolor/64x64/apps/ (64x64 car c'est la taille du fichier du projet).
Tous les fichiers desktop seront copiés dans le dossier usr/share/applications.
yanacron.manpages : Liste les fichiers man.
Projet 2 : MKV Extractor Qt5 en python3 et pyqt a écritPour cet exemple, je me base sur le projet
MKV Extractor Qt5 dont voici les
sources.
Le fichier debian créé via launchpad est disponible
ici.
Télécharger le fichier et extraire son contenu dans un dossier spécifique.
Exemple : ~/mkv-extractor-qt5/mkv-extractor-qt5/[fichiers sources]
Fichiers et dossiers faisant entièrement partis du logiciel :
Dossiers :
icons
images
man
QFileDialogCustom
WhatsUp
Fichiers :
CodecListFile.py
mkv-extractor-qt5.desktop
MKVExtractorQt5_cs_CZ.ts
MKVExtractorQt5_es_ES.ts
MKVExtractorQt5_fr_FR.ts
MKVExtractorQt5.py
MKVRessources.qrc
ui_MKVExtractorQt5.ui
Fichiers BDSup2Sub.jar et bdsup2sup.ini : Présent uniquement dans les sources mais non présents dans le paquet deb
Autres fichiers, plus importants :
build.sh : Script convertissant différents fichiers aux formats nécessaires à leur utilisation :
ts => qm
icones/*.png => qrc puis py
ui => py
modification du fichier ui_MKVExtractorQt5.py
clean.sh : Script supprimant les fichiers créés ci-dessus.
Makefile : Script qui sera appelé lors de la création des paquets et lors de sa suppression
Fichiers du dossier debian :
AUTHORS : Infos sur les personnes ayant travaillé sur le logiciel plus ou moins directement.
changelog :
Contient les modifications de la nouvelle version.
Le format de la 1ere ligne et de la dernière sont importants.
compat :
Correspond à la version de debhelper.
Si les paquets sont >= Bionic, on peut changer la valeur à 10
control :
Très important, contient les infos du projet et de ses paquets.
Si les paquets sont >= Bionic, on peut changer : Build-Depends: debhelper (>= 10)
copyright : informations sur la licence du logiciel.
format : laisser tel quel, permet l'application de patch.
files : ce fichier est automatiquement généré lors de la création des sources.
mkv-extractor-qt5.docs : indique que le fichier AUTHORS est un fichier de documentation
mkv-extractor-qt5.install :
Liste tous les fichiers à reprendre et leur destination.
Attention, les destination ne doivent pas commencer par /.
Cela créera l'architecture du fichier debian.
Dans les fichiers listés, ceux créés via le fichier build.sh sont présents.
Les fichiers ne sont pas forcément nommés mais j'utilise souvent le jocker *.
mkv-extractor-qt5.links : Création d'un lien entre le fichier executable qui se trouvera dans /usr/share/mkv-extractor-qt5 et la commande /usr/bin/mkv-extractor-qt5
mkv-extractor-qt5.manpages : Liste des fichiers man.
mkv-extractor-qt5.postrm :
Le script sera exécuté lors de la suppression du paquet debian.
Celui-ci aura pour but de supprimer le fichier de configuration du logiciel en cas de purge.
rules :
Ne pas toucher, c'est lui qui permet de faire tout le boulot !
Dans le cas présent, il est spécifique à python3
Remarque :
Contrairement aux exemples sur le net, ma version ne contient pas "Ubuntu" mais la distribution d'Ubuntu, comme "Bionic" (version extrait du fichier changelog).
Si la version est la même, seul le 1er envoi fonctionnera, launchpad indiquera :
Rejected:
File XXX_1.0.0-0~ubuntu.debian.tar.xz already exists in tests, but uploaded version has different contents.
Donc le fichier changelog :
XXX (1.0.0-0~groovy) groovy; urgency=low ()
et non :
XXX (1.0.0-0~ubuntu) groovy; urgency=low ()
Pour avoir le bon format de date :
LANG=en date '+%a, %d %b %Y %H:%M:%S %z'
Commande debuild :
Cette commande va créer tous les fichiers sources nécessaires.
Go dans le dossier du projet :
~/yanacron/yanacron/ ou
~/mkv-extractor-qt5/mkv-extractor-qt5
Pour avoir les versions supportées d'Ubuntu :
ubuntu-distro-info --date=$(date '+%F') --supported
Récupération de la version du logiciel dans le changelog.
NumberVersion=$(sed -n '1{s/ (/_/; s/-[0-9]\+~.*//p}' debian/changelog)
Création du fichier orig.
tar -ca --exclude-backups -f "../${NumberVersion}.orig.tar.gz" --exclude "debian" ./*
Modification de la version Ubuntu dans le fichier log
UbuntuVersion=bionic
sed -i "s#~[a-Z]\+) [a-Z]\+; urgency#~${UbuntuVersion}) ${UbuntuVersion}; urgency#" "debian/changelog"
Création des sources avec le fichier orig
Key="Clé du PPA"
debuild -S -sa -k${Key}
Si le paquet est compatible avec d'autres versions d'Ubuntu, il faut mettre à jour le fichier changelog :
UbuntuVersion=focal
sed -i "s#~[a-Z]\+) [a-Z]\+; urgency#~${UbuntuVersion}) ${UbuntuVersion}; urgency#" "debian/changelog"
Puis créer des sources sans intégrer le fichier orig, elles ne contiendront que les fichiers debian.
debuild -S -sd -k${Key}
Commande dput :
Commande permettant l'envoi des fichiers sur le(s) ppa.
Envoi des sources en précisant le ppa et le fichier source.
Il faut commencer par la version qui a été créée avec le fichier orig.
PPA="ppa:hizo/tests"
Version="yanacron_1.0-0~bionic"
dput -U "${PPA}" ./*"${Version}_source.changes"
S'il y a d'autres versions d'Ubuntu, rebolotte :
PPA="ppa:hizo/tests"
Version="yanacron_1.0-0~focal"
dput -U "${PPA}" ./*"${Version}_source.changes"
Vous allez recevoir un mail pour chaque source envoyé sur launchpad vous indiquant si c'est accepté ou non.
Vous pouvez nettoyer les fichiers qui ont été créés.
Pour bien comprendre, comparez le contenu des dossiers source et ceux des paquets debian.
Vous verrez d'où on part et le résultat.
Script automatisant tout ça et prenant en charge les patchs :
Il est disponible
ici.
Dépendances :
dput
distro-info
quilt
hizoselect => Disponible sur mon ppa :
https://launchpad.net/~hizo/+archive/ubuntu/bash
Avant de le lancer :
Il faut l'ouvrir est remplir les variables ppas et Key.
On peut le rendre executable.
Lancement :
Soit on le met dans le dossier père du projet et on le lance (
bash launchpad.sh) via un terminal.
Soit on le lance (
bash launchpad.sh) avec l'adresse du dossier père en argument.
bash launchpad.sh peut être remplacé par ./launchpad.sh si le fichier est executable.
Utilisation :
Il suffit de répondre aux questions et de lire les informations affichées.
Pour ce qui est des patchs :
Le script va ouvrir les fichiers à modifier.
Il faut faire les modifications voulues sur le(s) fichier(s).
Il faut sauvegarder les fichiers.
Appuyer sur une touche dans le terminal pour relancer le script.
Il compare les modifications et remet les fichiers comme ils étaient.
Un fichier diff est créé contenant les infos.
La version de la révision du fichier changelog est mis à jour si possible sinon il sera demandé de le faire à la main.
Il ne ne reste, normalement, plus qu'a créer les sources sans utilisation du fichier orig et à uploader les sources sur le(s) ppa.
Code :
#!/bin/bash
# hizoselect : https://launchpad.net/~hizo/+archive/ubuntu/bash
# Liste des ppas sur lesquels on peut uploader les sources
# ex : "ppa:hizo/tests"
ppas=()
# Clé de certification launchpad pour la création des sources
# ex : 598215E1
Key=""
# Si on lui indique un dossier en argument
[[ ${1} && -d "${1}" ]] && cd "${1}"
# Couleurs
FUCHSIA="\033[1;35m"
RAZ="\e[m"
BLEUFONCE="\033[1;34m"
ROUGE="\033[1;31m"
BOLD="\e[1m"
NOBOLD="\e[21m"
UNDER="\e[4m"
NOUNDER="\e[24m"
# Vérification des dépendances
DpkgList=$(dpkg -l)
for Paquet in dput distro-info quilt hizoselect
do
if ! grep -Eq "^ii ${Paquet}" <<< "${DpkgList}"
then
echo -e "${BLEUFONCE}Installation de ${Paquet}\n${RAZ}"
sudo apt -y --force-yes install ${Paquet}
if ! grep -Eq "^ii ${Paquet}" <<< "${DpkgList}"
then
echo -e "${ROUGE}Impossible d'installer le paquet ${Paquet} !"
exit 1
fi
fi
done
# Liste des distributions supportées
mapfile -t Distributions < <(ubuntu-distro-info --date="$(date '+%F')" --supported)
# Création du fichier de config si besoin, il sert pour la gestion des patchs
if [[ ! -e ~/.quiltrc ]]
then
echo 'QUILT_PATCHES=debian/patches
QUILT_NO_DIFF_INDEX=1
QUILT_NO_DIFF_TIMESTAMPS=1
QUILT_REFRESH_ARGS="-p ab"' > ~/.quiltrc
fi
# Action(s) à réaliser
mapfile -t actions < <(hizoselect --title "Quelles actions faut-il faire ?" --answers "2 4" --output "%s" "%t=Application et création de patchs %c=Dans le cas de modifications ne justifiant pas une nouvelle version %s=patch" "%t=Créer les sources ${UNDER}${BOLD}AVEC${NOBOLD}${NOUNDER} le fichier orig %c=Dans le cas d'une nouvelle version %s=avec" "%t=Créer les sources ${UNDER}${BOLD}SANS${NOBOLD}${NOUNDER} le fichier orig %c=Dans le cas de l'utilisation de patchs ou de changement de distribution %s=sans" "%t=Uploader les sources sur les ppa %c=Les ppa seront choisis ici %s=upload" "%t=Nettoyer les fichiers locaux créés %c=Seul le fichier orig.tar.gz sera conservé %=clear")
[[ ${actions[*]} ]] || exit 1
# Question dans le cas où tous les projets sont dans un même dossier
mapfile -t PackageFolders < <(find . -mindepth 1 -maxdepth 1 -type d | sort)
if [[ ${#PackageFolders[@]} -gt 1 ]]
then
package=$(hizoselect --title "Sur quel dossier faut il travailler ?" --max 1 "${PackageFolders[@]}")
[[ ${package} ]] || exit 1
elif [[ ${#PackageFolders[@]} -eq 1 ]]
then
package="${PackageFolders[0]}"
else
echo -e "\n${ROUGE}Aucun dossier trouvé ici.${RAZ}\n"
exit 1
fi
package="${package#*/}"
# Traitement des actions une à une
for action in "${actions[@]}"
do
case "${action}" in
# Gestion des patchs
"patch")
# Déplacement dans le dossier du paquet
cd "${package}" || exit 1
# Si le dossier debian/patches n'existe pas
[[ ! -e "debian/patches" ]] && (mkdir -p "debian/patches"; echo -e "\n${BLEUFONCE}Création du dossier ${FUCHSIA}debian/patches${BLEUFONCE}.${RAZ}";)
# Recherche des patchs existants
mapfile -d '' -t fichiers < <(find "debian/patches/" -iname "*.diff" -printf "%f\0")
# Recherche des patchs
if [[ ${fichiers[*]} ]]
then
# Liste des patchs
mapfile -t liste_patch < <(hizoselect --title "Quel(s) patch(s) faut-il utiliser ?" "${fichiers[@]}" "Nouveau")
[[ ${liste_patch[*]} ]] || exit 1
# S'il n'y a pas de patch, on passe directement en mode création
else
liste_patch=("Nouveau")
fi
# Traitement des patchs un à un
for patch in "${liste_patch[@]}"
do
# Nouveau patch
if [[ ${patch} == "Nouveau" ]]
then
# Nom du nouveau patch
echo -e "\n${FUCHSIA}Quel est le nom de ce nouveau fichier diff ?${RAZ}"
read -p "Nom : " diff_name
liste_patch+=("${diff_name/%.diff}.diff")
# Si un nom est bien donné
if [[ ${diff_name} ]]
then
# Création d'un patch
echo -e "\n${BLEUFONCE}Création du patch ${FUCHSIA}${diff_name}${BLEUFONCE}.${RAZ}"
quilt new "${diff_name/%.diff}.diff"
# Liste des fichiers non binaires potentiellement concernés par le patch
mapfile -d '' -t fichiers < <(find . -type f -not -path "./debian/*" -not -path "./.pc/*" -exec grep -Iq . {} \; -print0)
# Liste des fichiers concernés par le patch
mapfile -t liste_fichiers < <(hizoselect --title "Quel(s) fichier(s) faut-il surveiller ?" "${fichiers[@]}")
[[ ${liste_fichiers[*]} ]] || exit 1
echo -e "\n${BLEUFONCE}Ajout des fichiers au patch et ouverture des fichiers dans votre éditeur.${RAZ}"
# Ajout des fichiers au patch
quilt add "${liste_fichiers[@]}"
# Ouverture des fichiers dans l'éditeur
for Fichier in "${liste_fichiers[@]}"
do
xdg-open "${Fichier}"
done
fi
# Modification d'un patch
else
# Non obligatoire quand il n'y a qu'un seul fichier => voire meme pas du tout, doit etre obligatoire si plusieurs patch
echo -e "\n${BLEUFONCE}Application du patch.${RAZ}"
quilt push "${patch}"
fi
done
# Message attendant que les fichiers soient modifiés dans les éditeurs habituels
echo -e "\n${FUCHSIA}Presser une touche lorsque les modifications des fichiers sont terminées et sauvegardées.${RAZ}"
read -p "En attente..."
# Mise à jour des modifications
echo -e "\n${BLEUFONCE}Mise à jour et retrait des patchs.${RAZ}"
for patch in "${liste_patch[@]}"
do
# On saute les nouveaux patchs
[[ ${patch} == "Nouveau" ]] && continue
quilt refresh "${patch}"
done
# Retrait des patchs
echo -e "\n${BLEUFONCE}Retrait des patchs.${RAZ}"
quilt pop -af
# Incrémentation du numéro de révision debian du changelog (1.0-X)
echo -e "\n${BLEUFONCE}Incrémentation de la révision dans le fichier changelog.${RAZ}"
Revision=$(sed -n '1{s/.*-\([0-9]\+\)~.*/\1/p}' "debian/changelog")
# Si échec de la récupération de la révision
if [[ ${Revision} != *+([0-9])* ]]
then
echo -e "\n${ROUGE}Échec de la récupération de la révision du fichier changelog !! Merci de le modifier manuellement.${RAZ}\n"
xdg-open "debian/changelog"
# Si bonne récupération de la révision
else
(( Revision++ ))
sed -i "1{s/-[0-9]\+~/-${Revision}~/}" "debian/changelog"
fi
cd ..
;;
# Création des sources
"avec"|"sans")
# Déplacement dans le dossier du paquet
cd "${package}" || exit 1
# Sélection des version d'Ubuntu pour lesquels il faut créer des sources
mapfile -t UbuntuVersion < <(hizoselect --title "Quelles versions d'Ubuntu faut il utiliser ?" --text "Il est primordial de suivre l'ordre temporel des distributions !" --answers "*" "${Distributions[@]}")
[[ ${UbuntuVersion[*]} ]] || exit 1
# Création si besoin du fichier orig.tar.gz
NumberVersion=$(sed -n '1{s/ (/_/; s/-[0-9]\+~.*//p}' "debian/changelog")
[[ ! -e "../${NumberVersion}.orig.tar.gz" ]] && tar -ca --exclude-backups -f "../${NumberVersion}.orig.tar.gz" --exclude "debian" ./*
# Création du 1er paquet, avec ou sans fichier orig en fonction de l'action
echo -e "\n${BLEUFONCE}Création des paquets en version ${UbuntuVersion[0]}.${RAZ}"
sed -i "s#~[a-Z]\+) [a-Z]\+; urgency#~${UbuntuVersion[0]}) ${UbuntuVersion[0]}; urgency#" "debian/changelog"
if [[ ${action} == "avec" ]]; then debuild -S -sa -k${Key}
else debuild -S -sd -k${Key}; fi
# Vérification de la bonne sortie
ReturnValue="${?}"
[[ ${ReturnValue} != 0 ]] && echo -e "\n${ROUGE}ATTENTION : debuild a renvoyé le code ${ReturnValue} !!${RAZ}\n"
# Création des autres paquets qui sont tous sans le fichier orig
for Version in "${UbuntuVersion[@]:1}"
do
echo -e "\n${BLEUFONCE}Création des paquets en version ${Version}.${RAZ}"
sed -i "s#~[a-Z]\+) [a-Z]\+; urgency#~${Version}) ${Version}; urgency#" "debian/changelog"
debuild -S -sd -k${Key}
ReturnValue="${?}"
[[ ${ReturnValue} != 0 ]] && echo -e "\n${ROUGE}ATTENTION : debuild a renvoyé le code ${ReturnValue} !!${RAZ}\n"
done
cd ..
;;
# Envoi des sources sur le ppa
"upload")
# Choix du ou des ppa a utiliser pour l'upload
mapfile -t upload < <(hizoselect --title "Où faut-il uploader les sources ?" "${ppas[@]}")
[[ ${upload[*]} ]] || exit 1
# Traitement des ppa un à un
for ppa in "${upload[@]}"
do
echo -e "\n${BLEUFONCE}Upload des sources sur ${FUCHSIA}${ppa}${RAZ}."
# Liste des fichiers changes dans le dossier
Fichiers=(*.changes)
# Traitement des versions, il ne faut pas utiliser dput *.changes car si la version avec le fichier orig n'est pas la 1ere, les fichiers seront rejetés
for Version in "${Distributions[@]}"
do
# Boucle sur les fichiers
for Fichier in "${Fichiers[@]}"
do
# Recherche le fichier source.changes
if [[ ${Fichier} == *${Version}*_source.changes ]]
then
# Envoi des fichiers sur le ppa
dput -U "${ppa}" "${Fichier}"
# Vérification de la bonne sortie
ReturnValue="${?}"
[[ ${ReturnValue} != 0 ]] && echo -e "\n${ROUGE}ATTENTION : dput a renvoyé le code ${ReturnValue} !!${RAZ}\n"
fi
done
done
done
;;
"clear")
# Traite tous les fichiers
for file in *
do
# Suppression des fichiers si répondent aux critères
ext="${file##*.}"
[[ "${ext}" =~ dsc|build|changes|buildinfo || "${file}" == *debian* ]] && [[ -f "${file}" ]] && rm "${file}"
done
;;
esac
done
En espérant que ces exemples vous ont aidé à mieux comprendre et mettre en place vos sources launchpad 🙂
N’hésitez pas à partager vos expériences.