Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/cadot-eu_debs.json
T

1 line
28 KiB
JSON

{"repo": "cadot-eu/debs", "files": {"scripts/gcp.backup": {"93b48955ffc18ea9b661666bc06499ae6634db89": {"t": 1785746384.577084, "n": 13558, "h": "fe143a2bddb25473", "c": "#!/bin/bash\nfor arg in \"$@\"; do\n if [[ \"$arg\" == \"-h\" || \"$arg\" == \"--help\" ]]; then\n echo \"\\\"Commit helper with auto-message generation via DeepSeek API, options: [-f|--force] [-p|--passtest] [-h|--help]\\\"\"\n exit 0\n fi\ndone\n\n\nif [ -f .env ]; then\n while IFS= read -r line; do\n if [[ $line =~ ^[A-Za-z_][A-Za-z0-9_]*= ]]; then\n export \"$line\"\n fi\n done < .env\nfi\n\nif [ -f .env.local ]; then\n while IFS= read -r line; do\n if [[ $line =~ ^[A-Za-z_][A-Za-z0-9_]*= ]]; then\n export \"$line\"\n fi\n done < .env.local\nfi\n\nfunction show_usage() {\n printf \"Usage: $0 [options]\\n\"\n printf \"\\n\"\n printf \"Options:\\n\"\n printf \" -f|--force, Force push\\n\"\n printf \" -p|--passtest, Pass tests\\n\"\n printf \" -h|--help, Print help\\n\"\n \n return 0\n}\n\nforce=0\npasstest=0\nmessage=\"\"\n\n# Charger .env.local uniquement depuis ~/debs ou ~/git/debs (jamais local)\nif [ -f \"$HOME/debs/.env.local\" ]; then\n while IFS= read -r line; do\n if [[ $line =~ ^[A-Za-z_][A-Za-z0-9_]*= ]]; then\n export \"$line\"\n fi\n done < \"$HOME/debs/.env.local\"\nelif [ -f \"$HOME/git/debs/.env.local\" ]; then\n while IFS= read -r line; do\n if [[ $line =~ ^[A-Za-z_][A-Za-z0-9_]*= ]]; then\n export \"$line\"\n fi\n done < \"$HOME/git/debs/.env.local\"\nfi\n\n# Vérifier si DEEPSEEK_MODEL est défini\nif [ -z \"$DEEPSEEK_MODEL\" ]; then\n # Essayer de récupérer DEEPSEEK_MODEL depuis les variables globales\n if [ -f \"$HOME/.bashrc\" ]; then\n source \"$HOME/.bashrc\" 2>/dev/null || true\n fi\n if [ -f \"$HOME/.profile\" ]; then\n source \"$HOME/.profile\" 2>/dev/null || true\n fi\n if [ -f \"$HOME/.env\" ]; then\n while IFS= read -r line; do\n if [[ $line =~ ^DEEPSEEK_MODEL= ]]; then\n export \"$line\"\n echo \"DEEPSEEK_MODEL trouvé dans $HOME/.env\"\n fi\n done < \"$HOME/.env\" 2>/dev/null || true\n fi\n \n # Si toujours pas de DEEPSEEK_MODEL, utiliser une valeur par défaut\n if [ -z \"$DEEPSEEK_MODEL\" ]; then\n export DEEPSEEK_MODEL=\"deepseek-chat\"\n echo \"DEEPSEEK_MODEL non configuré, utilisation du modèle par défaut: deepseek-chat\"\n fi\nfi\n\n# Parsing des options et récupération du message (premier argument non-option)\nwhile [[ $# -gt 0 ]]; do\n case \"$1\" in\n --force|-f)\n force=1\n shift\n ;;\n --passtest|-p)\n passtest=1\n shift\n ;;\n --help|-h)\n show_usage\n exit 0\n ;;\n --)\n shift\n ;;\n -* )\n # Option inconnue, ignorer\n shift\n ;;\n *)\n # Premier argument non-option = message\n message=\"$1\"\n shift\n break\n ;;\n esac\ndone\n\n# Si d'autres arguments après, les ignorer (ou les concaténer si tu veux gérer un message sur plusieurs mots)\nif [[ $# -gt 0 && -z \"$message\" ]]; then\n message=\"$*\"\nfi\n\nif [ ! -d \"tests\" ]; then\n passtest=1\nfi\n\nif [[ $(git status --porcelain) ]] || [ $force == 1 ]; then\n if [ -f bin/phpunit ] && [ $passtest == 0 ]; then\n echo \"Running tests\"\n CURRENT=$(pwd)\n BASENAME=$(basename \"$CURRENT\")\n docker exec -it \"$BASENAME\" bin/phpunit\n fi\n \n if [ $? -ne 0 ]; then\n echo \"ERREUR DANS LES TESTS ARRET\" && exit\n else\n git add .\n \n # Si pas de message fourni, essayer DeepSeek\n if [ -z \"$message\" ]; then\n # Essayer de récupérer DEEPSEEK_API_KEY depuis les variables globales si pas définie localement\n if [ -z \"$DEEPSEEK_API_KEY\" ]; then\n echo \"DEEPSEEK_API_KEY n'est pas configuré localement, recherche dans la configuration globale...\"\n \n # Charger la configuration globale depuis les fichiers de config\n if [ -f \"$HOME/.bashrc\" ]; then\n source \"$HOME/.bashrc\" 2>/dev/null || true\n fi\n if [ -f \"$HOME/.profile\" ]; then\n source \"$HOME/.profile\" 2>/dev/null || true\n fi\n if [ -f \"$HOME/.env\" ]; then\n while IFS= read -r line; do\n if [[ $line =~ ^DEEPSEEK_API_KEY= ]]; then\n export \"$line\"\n echo \"DEEPSEEK_API_KEY trouvé dans $HOME/.env\"\n fi\n done < \"$HOME/.env\" 2>/dev/null || true\n fi\n \n # Vérifier aussi dans les variables d'environnement système\n if [ -z \"$DEEPSEEK_API_KEY\" ] && [ -n \"$(printenv DEEPSEEK_API_KEY)\" ]; then\n export DEEPSEEK_API_KEY=\"$(printenv DEEPSEEK_API_KEY)\"\n echo \"DEEPSEEK_API_KEY trouvé dans les variables d'environnement système\"\n fi\n fi\n \n # Si toujours pas de DEEPSEEK_API_KEY, demander un message manuel\n if [ -z \"$DEEPSEEK_API_KEY\" ]; then\n echo \"DeepSeek n'est pas configuré. Veuillez fournir un message de commit :\"\n read -r message\n if [ -z \"$message\" ]; then\n echo \"Aucun message fourni, abandon.\"\n exit 1\n fi\n else\n # Vérifier que la clé API est valide\n if [[ ! \"$DEEPSEEK_API_KEY\" =~ ^sk- ]]; then\n echo \"Erreur: La clé API ne semble pas être une clé DeepSeek valide.\"\n echo \"Vérifiez que la variable contient bien votre clé DeepSeek.\"\n echo \"Vous pouvez la définir avec: export DEEPSEEK_API_KEY=\\\"sk-votre-cle-api\\\"\"\n exit 1\n fi\n \n # Générer le diff\n DIFF=$(git diff --cached)\n if [ -z \"$DIFF\" ]; then\n DIFF=$(git diff)\n fi\n if [ -z \"$DIFF\" ]; then\n echo \"Aucune modification détectée.\"\n exit 1\n fi\n # Si beaucoup de suppressions/déplacements, ne donner que le nom du dossier\n SUPPR_COUNT=$(echo \"$DIFF\" | grep -E '^delete mode|^rename ' | wc -l)\n if [ \"$SUPPR_COUNT\" -gt 10 ]; then\n DIRNAME=$(basename \"$PWD\")\n echo \"[AVERTISSEMENT] Beaucoup de suppressions/déplacements détectées ($SUPPR_COUNT). Seul le nom du dossier sera envoyé à DeepSeek.\"\n DIFF=\"Suppression ou déplacement massif dans le répertoire : $DIRNAME\"\n else\n # Tronquer le diff si trop volumineux\n MAX_DIFF=20000\n if [ ${#DIFF} -gt $MAX_DIFF ]; then\n echo \"[AVERTISSEMENT] Le diff est trop volumineux, il sera tronqué à $MAX_DIFF caractères pour DeepSeek.\"\n DIFF=\"${DIFF:0:$MAX_DIFF}\\n[...diff tronqué...]\"\n fi\n fi\n echo \"Génération du commit par DeepSeek...\"\n echo \"Modèle utilisé: $DEEPSEEK_MODEL\"\n # Prompt strict pour forcer une réponse JSON et limiter la taille\n PROMPT=\"Donne un commit git au format {\\\"title\\\":\\\"...\\\",\\\"body\\\":\\\"...\\\"} pour ce diff (max 100 tokens). Réponds uniquement par un objet JSON, rien d'autre. Diff: $DIFF\"\n # Utiliser un fichier temporaire pour éviter la limite d'arguments\n TMP_PROMPT=$(mktemp)\n echo -n \"$PROMPT\" > \"$TMP_PROMPT\"\n TMP_JSON=$(mktemp)\n # Générer le JSON manuellement pour éviter la limite d'arguments\n printf '{\"model\": \"'\"$DEEPSEEK_MODEL\"'\", \"messages\": [{\"role\": \"user\", \"content\": ' > \"$TMP_JSON\"\n jq -Rs . < \"$TMP_PROMPT\" >> \"$TMP_JSON\"\n printf '}]}' >> \"$TMP_JSON\"\n rm -f \"$TMP_PROMPT\"\n if [ ! -s \"$TMP_JSON\" ]; then\n echo \"Erreur lors de la préparation du prompt pour DeepSeek (json).\"\n rm -f \"$TMP_JSON\"\n exit 1\n fi\n \n # Afficher la requête pour debug\n echo \"Envoi de la requête à DeepSeek...\"\n echo \"Clé API: ${DEEPSEEK_API_KEY:0:20}...\"\n echo \"Modèle: $DEEPSEEK_MODEL\"\n \n raw_response=$(curl -s -w \"\\nHTTP_CODE:%{http_code}\" -X POST https://api.deepseek.com/v1/chat/completions \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DEEPSEEK_API_KEY\" \\\n --data-binary \"@${TMP_JSON}\")\n \n # Extraire le code HTTP\n HTTP_CODE=$(echo \"$raw_response\" | tail -n1 | sed 's/HTTP_CODE://')\n raw_response=$(echo \"$raw_response\" | head -n -1)\n \n # Vérifier le code HTTP\n if [ \"$HTTP_CODE\" != \"200\" ]; then\n echo \"Erreur HTTP $HTTP_CODE lors de l'appel à DeepSeek.\"\n \n # Gérer spécifiquement l'erreur 401 (Unauthorized)\n if [ \"$HTTP_CODE\" == \"401\" ]; then\n error_msg=$(echo \"$raw_response\" | jq -r '.error.message // \"Unknown error\"')\n echo \"Erreur d'authentification: $error_msg\"\n echo \"Vérifiez que votre clé API DeepSeek est valide et active.\"\n echo \"Vous pouvez la vérifier sur: https://platform.deepseek.com/api-keys\"\n echo \"\"\n echo \"Veuillez fournir un message de commit :\"\n read -r message\n if [ -z \"$message\" ]; then\n echo \"Aucun message fourni, abandon.\"\n exit 1\n fi\n else\n # Gérer les erreurs 500+ et autres - demander directement le message\n error_msg=$(echo \"$raw_response\" | jq -r '.error.message // \"Unknown error\"')\n echo \"Erreur serveur: $error_msg\"\n echo \"\"\n echo \"Veuillez fournir un message de commit :\"\n read -r message\n if [ -z \"$message\" ]; then\n echo \"Aucun message fourni, abandon.\"\n exit 1\n fi\n # Sortir de la boucle DeepSeek et utiliser le message manuel\n goto_commit=true\n fi\n fi\n \n # Si on a un message manuel, ne pas essayer d'extraire la réponse DeepSeek\n if [ \"$goto_commit\" != \"true\" ]; then\n # Vérifier la réponse brute avant extraction\n if [ \"$raw_response\" = \"null\" ] || [ -z \"$raw_response\" ]; then\n echo \"Erreur: DeepSeek a retourné une réponse nulle ou vide.\"\n echo \"Vérifiez votre clé API et le modèle.\"\n echo \"Réponse complète: $raw_response\"\n exit 1\n fi\n \n # Extraire le contenu de la réponse\n raw_response=$(echo \"$raw_response\" | jq -r '.choices[0].message.content')\n rm -f \"$TMP_JSON\"\n # Nettoyer les balises ``` et extraire le JSON proprement\n clean_response=$(echo \"$raw_response\" | tr -d '\\n' | sed 's/```json//g; s/```//g')\n json_commit=$(echo \"$clean_response\" | sed 's/.*{\\(.*\\)}.*/{\\1}/')\n # Vérifier si la réponse est bien un objet JSON (commence par { et finit par })\n if ! echo \"$json_commit\" | grep -q '^{.*}$'; then\n echo \"Erreur: la réponse DeepSeek n'est pas un objet JSON. Réponse brute :\"\n echo \"$raw_response\"\n exit 1\n fi\n commit_title=$(echo \"$json_commit\" | jq -r '.title')\n commit_body=$(echo \"$json_commit\" | jq -r '.body')\n \n # Nettoyer les \\n littéraux dans le titre et le corps\n commit_title=$(echo \"$commit_title\" | sed 's/\\\\n/\\n/g')\n if [ \"$commit_body\" != \"null\" ]; then\n commit_body=$(echo \"$commit_body\" | sed 's/\\\\n/\\n/g')\n fi\n \n if [ -z \"$commit_title\" ] || [ \"$commit_title\" == \"null\" ]; then\n echo \"Erreur lors de la génération du message de commit avec DeepSeek. Réponse brute :\"\n echo \"$raw_response\"\n exit 1\n fi\n echo \"Message de commit généré : $commit_title\"\n message=\"$commit_title\"\n # Ajouter le body si présent\n if [ -n \"$commit_body\" ] && [ \"$commit_body\" != \"null\" ]; then\n message=$(printf \"%s\\n\\n%s\" \"$commit_title\" \"$commit_body\")\n fi\n fi\n fi\n fi\n \n git commit -m \"$message\"\n git submodule foreach \"git add . && git commit -m '$message'\"\n git push --all\n git push --tags\n fi\nelse\n echo \"no modifs ;-)\"\nfi\n"}, "63789ec9b3db2ea2c4ee454523c5d1b8e73e1bbb": {"t": 1785763170.730572, "n": 13558, "h": "fe143a2bddb25473", "c": "#!/bin/bash\nfor arg in \"$@\"; do\n if [[ \"$arg\" == \"-h\" || \"$arg\" == \"--help\" ]]; then\n echo \"\\\"Commit helper with auto-message generation via DeepSeek API, options: [-f|--force] [-p|--passtest] [-h|--help]\\\"\"\n exit 0\n fi\ndone\n\n\nif [ -f .env ]; then\n while IFS= read -r line; do\n if [[ $line =~ ^[A-Za-z_][A-Za-z0-9_]*= ]]; then\n export \"$line\"\n fi\n done < .env\nfi\n\nif [ -f .env.local ]; then\n while IFS= read -r line; do\n if [[ $line =~ ^[A-Za-z_][A-Za-z0-9_]*= ]]; then\n export \"$line\"\n fi\n done < .env.local\nfi\n\nfunction show_usage() {\n printf \"Usage: $0 [options]\\n\"\n printf \"\\n\"\n printf \"Options:\\n\"\n printf \" -f|--force, Force push\\n\"\n printf \" -p|--passtest, Pass tests\\n\"\n printf \" -h|--help, Print help\\n\"\n \n return 0\n}\n\nforce=0\npasstest=0\nmessage=\"\"\n\n# Charger .env.local uniquement depuis ~/debs ou ~/git/debs (jamais local)\nif [ -f \"$HOME/debs/.env.local\" ]; then\n while IFS= read -r line; do\n if [[ $line =~ ^[A-Za-z_][A-Za-z0-9_]*= ]]; then\n export \"$line\"\n fi\n done < \"$HOME/debs/.env.local\"\nelif [ -f \"$HOME/git/debs/.env.local\" ]; then\n while IFS= read -r line; do\n if [[ $line =~ ^[A-Za-z_][A-Za-z0-9_]*= ]]; then\n export \"$line\"\n fi\n done < \"$HOME/git/debs/.env.local\"\nfi\n\n# Vérifier si DEEPSEEK_MODEL est défini\nif [ -z \"$DEEPSEEK_MODEL\" ]; then\n # Essayer de récupérer DEEPSEEK_MODEL depuis les variables globales\n if [ -f \"$HOME/.bashrc\" ]; then\n source \"$HOME/.bashrc\" 2>/dev/null || true\n fi\n if [ -f \"$HOME/.profile\" ]; then\n source \"$HOME/.profile\" 2>/dev/null || true\n fi\n if [ -f \"$HOME/.env\" ]; then\n while IFS= read -r line; do\n if [[ $line =~ ^DEEPSEEK_MODEL= ]]; then\n export \"$line\"\n echo \"DEEPSEEK_MODEL trouvé dans $HOME/.env\"\n fi\n done < \"$HOME/.env\" 2>/dev/null || true\n fi\n \n # Si toujours pas de DEEPSEEK_MODEL, utiliser une valeur par défaut\n if [ -z \"$DEEPSEEK_MODEL\" ]; then\n export DEEPSEEK_MODEL=\"deepseek-chat\"\n echo \"DEEPSEEK_MODEL non configuré, utilisation du modèle par défaut: deepseek-chat\"\n fi\nfi\n\n# Parsing des options et récupération du message (premier argument non-option)\nwhile [[ $# -gt 0 ]]; do\n case \"$1\" in\n --force|-f)\n force=1\n shift\n ;;\n --passtest|-p)\n passtest=1\n shift\n ;;\n --help|-h)\n show_usage\n exit 0\n ;;\n --)\n shift\n ;;\n -* )\n # Option inconnue, ignorer\n shift\n ;;\n *)\n # Premier argument non-option = message\n message=\"$1\"\n shift\n break\n ;;\n esac\ndone\n\n# Si d'autres arguments après, les ignorer (ou les concaténer si tu veux gérer un message sur plusieurs mots)\nif [[ $# -gt 0 && -z \"$message\" ]]; then\n message=\"$*\"\nfi\n\nif [ ! -d \"tests\" ]; then\n passtest=1\nfi\n\nif [[ $(git status --porcelain) ]] || [ $force == 1 ]; then\n if [ -f bin/phpunit ] && [ $passtest == 0 ]; then\n echo \"Running tests\"\n CURRENT=$(pwd)\n BASENAME=$(basename \"$CURRENT\")\n docker exec -it \"$BASENAME\" bin/phpunit\n fi\n \n if [ $? -ne 0 ]; then\n echo \"ERREUR DANS LES TESTS ARRET\" && exit\n else\n git add .\n \n # Si pas de message fourni, essayer DeepSeek\n if [ -z \"$message\" ]; then\n # Essayer de récupérer DEEPSEEK_API_KEY depuis les variables globales si pas définie localement\n if [ -z \"$DEEPSEEK_API_KEY\" ]; then\n echo \"DEEPSEEK_API_KEY n'est pas configuré localement, recherche dans la configuration globale...\"\n \n # Charger la configuration globale depuis les fichiers de config\n if [ -f \"$HOME/.bashrc\" ]; then\n source \"$HOME/.bashrc\" 2>/dev/null || true\n fi\n if [ -f \"$HOME/.profile\" ]; then\n source \"$HOME/.profile\" 2>/dev/null || true\n fi\n if [ -f \"$HOME/.env\" ]; then\n while IFS= read -r line; do\n if [[ $line =~ ^DEEPSEEK_API_KEY= ]]; then\n export \"$line\"\n echo \"DEEPSEEK_API_KEY trouvé dans $HOME/.env\"\n fi\n done < \"$HOME/.env\" 2>/dev/null || true\n fi\n \n # Vérifier aussi dans les variables d'environnement système\n if [ -z \"$DEEPSEEK_API_KEY\" ] && [ -n \"$(printenv DEEPSEEK_API_KEY)\" ]; then\n export DEEPSEEK_API_KEY=\"$(printenv DEEPSEEK_API_KEY)\"\n echo \"DEEPSEEK_API_KEY trouvé dans les variables d'environnement système\"\n fi\n fi\n \n # Si toujours pas de DEEPSEEK_API_KEY, demander un message manuel\n if [ -z \"$DEEPSEEK_API_KEY\" ]; then\n echo \"DeepSeek n'est pas configuré. Veuillez fournir un message de commit :\"\n read -r message\n if [ -z \"$message\" ]; then\n echo \"Aucun message fourni, abandon.\"\n exit 1\n fi\n else\n # Vérifier que la clé API est valide\n if [[ ! \"$DEEPSEEK_API_KEY\" =~ ^sk- ]]; then\n echo \"Erreur: La clé API ne semble pas être une clé DeepSeek valide.\"\n echo \"Vérifiez que la variable contient bien votre clé DeepSeek.\"\n echo \"Vous pouvez la définir avec: export DEEPSEEK_API_KEY=\\\"sk-votre-cle-api\\\"\"\n exit 1\n fi\n \n # Générer le diff\n DIFF=$(git diff --cached)\n if [ -z \"$DIFF\" ]; then\n DIFF=$(git diff)\n fi\n if [ -z \"$DIFF\" ]; then\n echo \"Aucune modification détectée.\"\n exit 1\n fi\n # Si beaucoup de suppressions/déplacements, ne donner que le nom du dossier\n SUPPR_COUNT=$(echo \"$DIFF\" | grep -E '^delete mode|^rename ' | wc -l)\n if [ \"$SUPPR_COUNT\" -gt 10 ]; then\n DIRNAME=$(basename \"$PWD\")\n echo \"[AVERTISSEMENT] Beaucoup de suppressions/déplacements détectées ($SUPPR_COUNT). Seul le nom du dossier sera envoyé à DeepSeek.\"\n DIFF=\"Suppression ou déplacement massif dans le répertoire : $DIRNAME\"\n else\n # Tronquer le diff si trop volumineux\n MAX_DIFF=20000\n if [ ${#DIFF} -gt $MAX_DIFF ]; then\n echo \"[AVERTISSEMENT] Le diff est trop volumineux, il sera tronqué à $MAX_DIFF caractères pour DeepSeek.\"\n DIFF=\"${DIFF:0:$MAX_DIFF}\\n[...diff tronqué...]\"\n fi\n fi\n echo \"Génération du commit par DeepSeek...\"\n echo \"Modèle utilisé: $DEEPSEEK_MODEL\"\n # Prompt strict pour forcer une réponse JSON et limiter la taille\n PROMPT=\"Donne un commit git au format {\\\"title\\\":\\\"...\\\",\\\"body\\\":\\\"...\\\"} pour ce diff (max 100 tokens). Réponds uniquement par un objet JSON, rien d'autre. Diff: $DIFF\"\n # Utiliser un fichier temporaire pour éviter la limite d'arguments\n TMP_PROMPT=$(mktemp)\n echo -n \"$PROMPT\" > \"$TMP_PROMPT\"\n TMP_JSON=$(mktemp)\n # Générer le JSON manuellement pour éviter la limite d'arguments\n printf '{\"model\": \"'\"$DEEPSEEK_MODEL\"'\", \"messages\": [{\"role\": \"user\", \"content\": ' > \"$TMP_JSON\"\n jq -Rs . < \"$TMP_PROMPT\" >> \"$TMP_JSON\"\n printf '}]}' >> \"$TMP_JSON\"\n rm -f \"$TMP_PROMPT\"\n if [ ! -s \"$TMP_JSON\" ]; then\n echo \"Erreur lors de la préparation du prompt pour DeepSeek (json).\"\n rm -f \"$TMP_JSON\"\n exit 1\n fi\n \n # Afficher la requête pour debug\n echo \"Envoi de la requête à DeepSeek...\"\n echo \"Clé API: ${DEEPSEEK_API_KEY:0:20}...\"\n echo \"Modèle: $DEEPSEEK_MODEL\"\n \n raw_response=$(curl -s -w \"\\nHTTP_CODE:%{http_code}\" -X POST https://api.deepseek.com/v1/chat/completions \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DEEPSEEK_API_KEY\" \\\n --data-binary \"@${TMP_JSON}\")\n \n # Extraire le code HTTP\n HTTP_CODE=$(echo \"$raw_response\" | tail -n1 | sed 's/HTTP_CODE://')\n raw_response=$(echo \"$raw_response\" | head -n -1)\n \n # Vérifier le code HTTP\n if [ \"$HTTP_CODE\" != \"200\" ]; then\n echo \"Erreur HTTP $HTTP_CODE lors de l'appel à DeepSeek.\"\n \n # Gérer spécifiquement l'erreur 401 (Unauthorized)\n if [ \"$HTTP_CODE\" == \"401\" ]; then\n error_msg=$(echo \"$raw_response\" | jq -r '.error.message // \"Unknown error\"')\n echo \"Erreur d'authentification: $error_msg\"\n echo \"Vérifiez que votre clé API DeepSeek est valide et active.\"\n echo \"Vous pouvez la vérifier sur: https://platform.deepseek.com/api-keys\"\n echo \"\"\n echo \"Veuillez fournir un message de commit :\"\n read -r message\n if [ -z \"$message\" ]; then\n echo \"Aucun message fourni, abandon.\"\n exit 1\n fi\n else\n # Gérer les erreurs 500+ et autres - demander directement le message\n error_msg=$(echo \"$raw_response\" | jq -r '.error.message // \"Unknown error\"')\n echo \"Erreur serveur: $error_msg\"\n echo \"\"\n echo \"Veuillez fournir un message de commit :\"\n read -r message\n if [ -z \"$message\" ]; then\n echo \"Aucun message fourni, abandon.\"\n exit 1\n fi\n # Sortir de la boucle DeepSeek et utiliser le message manuel\n goto_commit=true\n fi\n fi\n \n # Si on a un message manuel, ne pas essayer d'extraire la réponse DeepSeek\n if [ \"$goto_commit\" != \"true\" ]; then\n # Vérifier la réponse brute avant extraction\n if [ \"$raw_response\" = \"null\" ] || [ -z \"$raw_response\" ]; then\n echo \"Erreur: DeepSeek a retourné une réponse nulle ou vide.\"\n echo \"Vérifiez votre clé API et le modèle.\"\n echo \"Réponse complète: $raw_response\"\n exit 1\n fi\n \n # Extraire le contenu de la réponse\n raw_response=$(echo \"$raw_response\" | jq -r '.choices[0].message.content')\n rm -f \"$TMP_JSON\"\n # Nettoyer les balises ``` et extraire le JSON proprement\n clean_response=$(echo \"$raw_response\" | tr -d '\\n' | sed 's/```json//g; s/```//g')\n json_commit=$(echo \"$clean_response\" | sed 's/.*{\\(.*\\)}.*/{\\1}/')\n # Vérifier si la réponse est bien un objet JSON (commence par { et finit par })\n if ! echo \"$json_commit\" | grep -q '^{.*}$'; then\n echo \"Erreur: la réponse DeepSeek n'est pas un objet JSON. Réponse brute :\"\n echo \"$raw_response\"\n exit 1\n fi\n commit_title=$(echo \"$json_commit\" | jq -r '.title')\n commit_body=$(echo \"$json_commit\" | jq -r '.body')\n \n # Nettoyer les \\n littéraux dans le titre et le corps\n commit_title=$(echo \"$commit_title\" | sed 's/\\\\n/\\n/g')\n if [ \"$commit_body\" != \"null\" ]; then\n commit_body=$(echo \"$commit_body\" | sed 's/\\\\n/\\n/g')\n fi\n \n if [ -z \"$commit_title\" ] || [ \"$commit_title\" == \"null\" ]; then\n echo \"Erreur lors de la génération du message de commit avec DeepSeek. Réponse brute :\"\n echo \"$raw_response\"\n exit 1\n fi\n echo \"Message de commit généré : $commit_title\"\n message=\"$commit_title\"\n # Ajouter le body si présent\n if [ -n \"$commit_body\" ] && [ \"$commit_body\" != \"null\" ]; then\n message=$(printf \"%s\\n\\n%s\" \"$commit_title\" \"$commit_body\")\n fi\n fi\n fi\n fi\n \n git commit -m \"$message\"\n git submodule foreach \"git add . && git commit -m '$message'\"\n git push --all\n git push --tags\n fi\nelse\n echo \"no modifs ;-)\"\nfi\n"}}}}