Fix: Readme history

This commit is contained in:
L0m1g 2025-03-03 10:13:59 +01:00
commit a7d708c8ca
4 changed files with 207 additions and 7 deletions

18
LICENCE Normal file
View file

@ -0,0 +1,18 @@
DOUARN License — Défi Ouvert Utilisable Avec Risques Notables
© 2025 L0m1g — Tous droits distribués comme des galettes gratuites
— Préface —
Bienvenue sur DOUARN.
Ici, le code est libre, comme les goélands de Douarnenez : imprévisible, bruyant et parfois il te chie dessus. Utilise-le, transforme-le, fais-en ce que tu veux. Mais si ça tangue, coule ou prend feu, cest ta barque, pas la nôtre.
Le cap est droit, le vent est fort. Bon courage.
— Plus sérieusement —
Le présent logiciel est fourni **"tel quel"**, sans aucune garantie, expresse ou implicite, notamment sans garantie de qualité marchande ou d'adéquation à un usage particulier. En aucune circonstance, les auteurs ou détenteurs des droits ne pourront être tenus responsables de tout dommage direct, indirect, accidentel ou consécutif résultant de lutilisation de ce logiciel.
En utilisant, modifiant ou redistribuant ce code, vous acceptez ces conditions.
**À vos risques et périls.**

View file

@ -2,15 +2,15 @@
![Licence DOUARN](assets/licence-douarn.png) ![Licence DOUARN](assets/licence-douarn.png)
Oyé voyageur, tu rentres ici à tes risques et périls. Si tu veux savoir de quoi il en retourne, commence par lire la LICENCE. Pour faire simple, si tu pète ton ordi avec ce projet, moi et mon goeland, on se marre ! Oyé voyageur, tu rentres ici à tes risques et périls. Si tu veux savoir de quoi il en retourne, commence par lire la LICENCE. Pour faire simple, si tu pète ton ordi avec ce projet, moi et mon goéland, on se marre !
## Philosophie ## Philosophie
**Erminig**, c'est un système : **Erminig**, c'est un système :
- **Personnel** : c'est mon système, pas le le tien, ni celui du voisin. Fork si tu veux, mais viens pas me demander de te faire des paquets. Si t'es pas assez grand pour ça, va faire mumuse sur un installateur Arch que tu appelles distro ; - **Personnel** : c'est mon système, pas le tien, ni celui du voisin. Fork si tu veux, mais viens pas me demander de te faire des paquets. Si t'es pas assez grand pour ça, va faire mumuse sur un installateur Arch que tu appelles distro ;
- **Minimaliste** : mais pragmatique. On est pas dans l'archaisme non plus. J'essaie de suivre la règle unix numéro 1 : 1 outis pour une tache. Simple et efficace. - **Minimaliste** : mais pragmatique. On est pas dans l'archaisme non plus. J'essaie de suivre la règle unix numéro 1 : un outil pour une tache. Simple et efficace ;
- **Artisanal** : Tout est fait à la mimine, ou presque. Je pars de zéro avec patience. de l'artisanat comme il n'y en a plus. - **Artisanal** : Tout est fait à la mimine, ou presque. Je pars de zéro avec patience. De l'artisanat comme il n'y en a plus ;
- **Fièrement breton** : Si tu cause pas un minimum breton, ton cerveau risque de partir en distribil. - **Fièrement breton** : Si tu cause pas un minimum breton, ton cerveau risque de partir en distribil.
## Avertissement ## Avertissement
@ -27,6 +27,6 @@ Oyé voyageur, tu rentres ici à tes risques et périls. Si tu veux savoir de qu
- Si tu comprends pas pourquoi ce système existe, cest que ten as jamais eu besoin. - Si tu comprends pas pourquoi ce système existe, cest que ten as jamais eu besoin.
- Si tes là par curiosité, observe et admire. - Si tes là par curiosité, observe et admire.
-Ce projet est personnel, façonne **pour mes besoins**. Libre à toi de t'en inspirer, mais ici, c'est moi qui tient la barre. - Ce projet est personnel, façonné **pour mes besoins**. Libre à toi de t'en inspirer, mais ici, c'est moi qui tient la barre.
Bienvenue en Bretagne numérique. Bienvenue en Bretagne numérique.

View file

View file

@ -0,0 +1,182 @@
#
# Erminig - Librairie Pakfile
# Copyright (C) 2025 L0m1g
# Sous licence DOUARN - Voir le fichier LICENCE pour les détails
#
# Ce fichier fait partie du projet Erminig.
# Libre comme lair, stable comme un menhir, et salé comme le beurre.
#
import os
import toml
class Pakfile:
"""
Représente un fichier de description de paquet (pakfile.toml)
dans le système de gestion de paquets Erminig.
Cette classe offre les opérations essentielles pour manipuler,
vérifier et modifier les pakfiles.
"""
BASE_PATH = "/var/govel"
def __init__(self, package: str):
"""
Initialise la gestion du pakfile pour un paquet donné.
:param package: Nom du paquet
"""
self.package = package
self.data = {}
def _load(self):
"""
Charge le contenu du pakfile en mémoire
Appelé automatiquement à l'initialisation si le fichier existe
"""
package_dir, pakfile_path = self._get_paths(package)
if not os.path.exists(pakfile_path):
raise FileNotFoundError(f"Pakfile introuvable pour {self.package} dans {pakfile_path}")
with open(pakfile_path, "r", encoding="utf-8") as f:
self.data = toml.load(f)
def _get_paths(self, package: str) -> tuple[str, str]:
"""
Retourne le chemin du dossier du paquet et du pakfile associé.
"""
package_dir = f"{self.BASE_PATH}/{package}"
pakfile_path = f"{package_dir}/pakfile.toml"
return package_dir, pakfile_path
def new(self, package: str):
"""
Crée un nouveau pakfile avec un squelette de base prêt à être édité.
Soulève une erreur si le pakfile existe déjà.
"""
package_dir, pakfile_path = self._get_paths(package)
if os.path.exists(pakfile_path):
raise FileExistsError(f"Le pakfile existe déjà pour {package}")
data = {
"header": {
"copyright": "Copyright (C) 2025 L0m1g",
"license": "Sous licence DOUARN - Voir le fichier LICENCE pour les détails",
"author": "L0m1g",
"maintainer": "L0m1g",
"description": "Description à compléter"
},
"name": package,
"ver": "",
"rev": 1,
"src": [],
"build": "# Ajouter les commandes de construction ici",
"check": "# Ajouter les commandes check ou équivalentes ici",
"install": "# Ajouter les commandes dinstallation ici"
}
os.makedirs(package_dir, exist_ok=True)
with open(pakfile_path, "w", encoding="utf-8") as f:
toml.dump(data, f)
def set(self, key: str, value):
"""
Définit une valeur dans le pakfile et sauvegarde immédiatement
"""
self.data[key] = value
self._save()
def _save(self):
"""
Ecrit le contenu actuel de self.data dans le pakfile correspondant
Créé le répertoire s'il n'existe pas.
"""
package_dir, pakfile_path = self._get_paths(self.package)
os.makedirs(package_dir, exist_ok=True)
with open(pakfile_path, "w", encoding="utf-8") as f:
toml.dump(self.data, f)
def get(self, key: str):
"""
Récupère la valeur d'une clé dans le pakfile
Redirige vers de getters spécifiques
:param key: Clé à récupérer
:return: Valeur associée ou None
"""
match key:
case "name" | "ver" | "rev":
return self._get(key)
case "src" | "deps" | "bdeps":
return self._get_list(key)
case _:
return None
def _get(self, key: str) -> str | None:
"""
Getter générique pour les chaines
"""
return self.data.get(key)
def _get_list(self, key: str) -> list[str]:
"""
Getter spécifique aux listes
"""
return self.data.get(key,[])
def delete(self, package: str) -> bool:
"""
Supprime un paquet non installé et son répertoire associé.
:param package: Nom du paquet à supprimer
:return: True si la suppression a réussi, False sinon
"""
package_dir, pakfile_path = self._get_paths(package)
if not os.path.exists(package_dir):
print(f"Le paquet '{package}' n'existe pas. Rien à supprimer.")
return False
try:
# On vire tout le répertoire et son contenu
for root, dirs, files in os.walk(package_dir, topdown=False):
for file in files:
os.remove(os.path.join(root, file))
for dir in dirs:
os.rmdir(os.path.join(root, dir))
os.rmdir(package_dir)
print(f"Paquet '{package}' supprimé avec succès.")
return True
except Exception as e:
print(f"Erreur lors de la suppression de '{package}': {e}")
return False
def check(self):
"""
Vérifie la validité de la structure du pakfile.
Contrôle la présence et la cohérence des clés obligatoires.
Ne vérifie PAS la disponibilité des sources ou la qualité du code, juste la structure.
"""
required_keys = {"name", "ver", "rev", "src"}
optional_keys = {"deps", "bdeps", "build", "make", "install"}
all_keys = set(self.data.keys())
unknown_keys = all_keys - required_keys - optional_keys
missing_keys = required_keys - all_keys
if missing_keys:
print(f"Clés manquantes dans {self.package}: {', '.join(missing_keys)}")
return False
if unknown_keys:
print(f"Clés inconnues dans {self.package}: {', '.join(unknown_keys)}")
return False
return True