From ba3923e3f95945e62ff6f554fc378cb563cdf58e Mon Sep 17 00:00:00 2001 From: AkaTFL <184939597+AkaTFL@users.noreply.github.com> Date: Thu, 12 Jun 2025 15:10:21 +0200 Subject: [PATCH 01/35] ajout des objets --- Objects/blob.py | 4 ++++ Objects/commit.py | 8 ++++++++ Objects/tree.py | 4 ++++ terminal.py | 7 +++++++ test/fichier.txt | 1 + 5 files changed, 24 insertions(+) create mode 100644 Objects/blob.py create mode 100644 Objects/commit.py create mode 100644 Objects/tree.py create mode 100644 terminal.py create mode 100644 test/fichier.txt diff --git a/Objects/blob.py b/Objects/blob.py new file mode 100644 index 0000000..d896763 --- /dev/null +++ b/Objects/blob.py @@ -0,0 +1,4 @@ +class Blob: + def setBlob(self, sha1, donnees): + self.sha1 = sha1 + self.donnees = donnees \ No newline at end of file diff --git a/Objects/commit.py b/Objects/commit.py new file mode 100644 index 0000000..0ba631c --- /dev/null +++ b/Objects/commit.py @@ -0,0 +1,8 @@ +import datetime + +class Commit: + def setCommit(self, sha1, ref, message): + self.sha1 = sha1 + self.date = datetime.datetime.now() + self.ref = ref + self.message = message \ No newline at end of file diff --git a/Objects/tree.py b/Objects/tree.py new file mode 100644 index 0000000..35ebbdd --- /dev/null +++ b/Objects/tree.py @@ -0,0 +1,4 @@ +class Tree: + def setTree(self, sha1, blobsha1): + self.sha1 = sha1 + self.blobsha1 = list(blobsha1) \ No newline at end of file diff --git a/terminal.py b/terminal.py new file mode 100644 index 0000000..26e7735 --- /dev/null +++ b/terminal.py @@ -0,0 +1,7 @@ +import argparse + +parser = argparse.ArgumentParser() +parser.add_argument("--force", help="Hasher le fichier", action="store_true") +args = parser.parse_args() + +print(f"L'option de hashage a pour valeur {args.force}") \ No newline at end of file diff --git a/test/fichier.txt b/test/fichier.txt new file mode 100644 index 0000000..8a458f4 --- /dev/null +++ b/test/fichier.txt @@ -0,0 +1 @@ +Ceci est un fichier de texte \ No newline at end of file From 80479e6c160ba2dc83ba692a03aeba7ec36ef8ee Mon Sep 17 00:00:00 2001 From: AkaTFL <184939597+AkaTFL@users.noreply.github.com> Date: Thu, 12 Jun 2025 15:15:53 +0200 Subject: [PATCH 02/35] maj objets --- Objects/blob.py | 5 ++++- Objects/commit.py | 14 +++++++++++++- Objects/tree.py | 5 ++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Objects/blob.py b/Objects/blob.py index d896763..a2b24e7 100644 --- a/Objects/blob.py +++ b/Objects/blob.py @@ -1,4 +1,7 @@ class Blob: def setBlob(self, sha1, donnees): self.sha1 = sha1 - self.donnees = donnees \ No newline at end of file + self.donnees = donnees + + def getBlobHash(self): + return self.sha1 \ No newline at end of file diff --git a/Objects/commit.py b/Objects/commit.py index 0ba631c..36c0b89 100644 --- a/Objects/commit.py +++ b/Objects/commit.py @@ -5,4 +5,16 @@ def setCommit(self, sha1, ref, message): self.sha1 = sha1 self.date = datetime.datetime.now() self.ref = ref - self.message = message \ No newline at end of file + self.message = message + + def getCommitHash(self): + return self.sha1 + + def getCommitDate(self): + return self.date + + def getCommitRef(self): + return self.ref + + def getCommitMessage(self): + return self.message \ No newline at end of file diff --git a/Objects/tree.py b/Objects/tree.py index 35ebbdd..8435519 100644 --- a/Objects/tree.py +++ b/Objects/tree.py @@ -1,4 +1,7 @@ class Tree: def setTree(self, sha1, blobsha1): self.sha1 = sha1 - self.blobsha1 = list(blobsha1) \ No newline at end of file + self.blobsha1 = list(blobsha1) + + def getTreeHash(self): + return self.sha1 \ No newline at end of file From 268acbaed260b6aa965d8a6fc4a19e4c965f3880 Mon Sep 17 00:00:00 2001 From: Yann N'DA Date: Thu, 12 Jun 2025 15:52:15 +0200 Subject: [PATCH 03/35] added hash function --- hash.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 hash.py diff --git a/hash.py b/hash.py new file mode 100644 index 0000000..252fd96 --- /dev/null +++ b/hash.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 +import sys +import hashlib + +def git_hash_object(file_path): + try: + # 1. Vérifier que le fichier existe + with open(file_path, 'rb') as f: + content = f.read() + + # 2. Construire l'en-tête du blob Git + header = f"blob {len(content)}\0".encode('utf-8') + blob_data = header + content + + # 3. Calculer le SHA-1 + sha1 = hashlib.sha1(blob_data).hexdigest() + + # 4. Afficher le hash + print(sha1) + + except FileNotFoundError: + print("Error: File does not exist or is a directory", file=sys.stderr) + sys.exit(1) + +if __name__ == "__main__": + if len(sys.argv) != 2: + print(f"Usage: {sys.argv[0]} ", file=sys.stderr) + sys.exit(1) + + git_hash_object(sys.argv[1]) From f592db98826d628fa1bebcf01362b180c10c43d0 Mon Sep 17 00:00:00 2001 From: Yann N'DA Date: Fri, 13 Jun 2025 14:09:21 +0200 Subject: [PATCH 04/35] Adding argparse et test des commande {init et commit} --- main.py | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100755 main.py diff --git a/main.py b/main.py new file mode 100755 index 0000000..4965176 --- /dev/null +++ b/main.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python3 +import argparse +import os +import hashlib +import json +import datetime + +def main(): + parser = argparse.ArgumentParser(description="Un mini-Git (Fyt) en Python.") + subparsers = parser.add_subparsers(dest="command", help="Commandes disponibles") + + # git init + parser_init = subparsers.add_parser("init", help="Initialise un dépôt") + + # git add + parser_add = subparsers.add_parser("add", help="Ajoute un fichier à l'index") + parser_add.add_argument("file", help="Fichier à ajouter") + + # git commit -m "message" + parser_commit = subparsers.add_parser("commit", help="Crée un commit") + parser_commit.add_argument("-m", "--message", required=True, help="Message du commit") + + args = parser.parse_args() + + if args.command == "init": + init_repo() + elif args.command == "add": + add_file(args.file) + elif args.command == "commit": + commit_changes(args.message) + else: + parser.print_help() + +def init_repo(): + os.makedirs(".fyt/objects", exist_ok=True) + os.makedirs(".fyt/refs/heads", exist_ok=True) + with open(".fyt/HEAD", "w") as f: + f.write("ref: refs/heads/main\n") + print("Dépôt initialisé.\nVous êtes dans la branche 'main'.") + +def add_file(file_path): + with open(file_path, "rb") as f: + content = f.read() + blob_hash = hashlib.sha1(content).hexdigest() + blob_path = f".fyt/objects/{blob_hash}" + + with open(blob_path, "wb") as f: + f.write(content) + print(f"Fichier '{file_path}' ajouté (Blob: {blob_hash})") + +def commit_changes(message): + # Créer un Tree (simplifié) + tree_data = {"files": []} # En vrai, on stocke une structure de dossiers/fichiers + tree_json = json.dumps(tree_data).encode() + tree_hash = hashlib.sha1(tree_json).hexdigest() + + with open(f".fyt/objects/{tree_hash}", "wb") as f: + f.write(tree_json) + + # Créer un Commit + commit_data = { + "tree": tree_hash, + "message": message, + "date": datetime.datetime.now().isoformat(), + } + commit_json = json.dumps(commit_data).encode() + commit_hash = hashlib.sha1(commit_json).hexdigest() + + with open(f".fyt/objects/{commit_hash}", "wb") as f: + f.write(commit_json) + + # Mettre à jour la référence (branche) + with open(".fyt/refs/heads/main", "w") as f: + f.write(commit_hash) + + print(f"Commit [{commit_hash[:6]}]: {message}") + +if __name__ == "__main__": + main() \ No newline at end of file From 409f1469b601c4730b7fd283c257d5c0c4837726 Mon Sep 17 00:00:00 2001 From: Baptiste Bonnichon-jaques Date: Fri, 13 Jun 2025 14:07:31 +0100 Subject: [PATCH 05/35] efkeo koekeokeo --- Parcours 150km v2.gpx | 8719 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 8719 insertions(+) create mode 100644 Parcours 150km v2.gpx diff --git a/Parcours 150km v2.gpx b/Parcours 150km v2.gpx new file mode 100644 index 0000000..f28ad5d --- /dev/null +++ b/Parcours 150km v2.gpx @@ -0,0 +1,8719 @@ + + + + Parcours 150km v2 + + baptiste Bonnichon-Jaques + + + + 2020 + https://www.openstreetmap.org/copyright + + + + + Parcours 150km v2 + + cycling + + + 48.06 + + + 49.74 + + + 49.910000000000004 + + + 50.370000000000005 + + + 50.61 + + + 50.75 + + + 51.080000000000005 + + + 51.77 + + + 52.31 + + + 52.29 + + + 52.63 + + + 52.800000000000004 + + + 52.88 + + + 53.36000000000001 + + + 53.43000000000001 + + + 53.31 + + + 53.00000000000001 + + + 52.870000000000005 + + + 52.58 + + + 52.29 + + + 52.07000000000001 + + + 52.190000000000005 + + + 52.28000000000001 + + + 52.59 + + + 52.79 + + + 53.03000000000001 + + + 53.17 + + + 53.26 + + + 53.2 + + + 53.14000000000001 + + + 53.13 + + + 52.97 + + + 52.86000000000001 + + + 53.01 + + + 53.45 + + + 54.040000000000006 + + + 54.45 + + + 54.970000000000006 + + + 55.07000000000001 + + + 54.89 + + + 54.84 + + + 55.010000000000005 + + + 55.39 + + + 55.49 + + + 56.11000000000001 + + + 57.49 + + + 58.02 + + + 59.04 + + + 59.78000000000001 + + + 60.56 + + + 61.09 + + + 61.540000000000006 + + + 61.85 + + + 61.93000000000001 + + + 62.480000000000004 + + + 63.160000000000004 + + + 64.53 + + + 64.97 + + + 65.41000000000001 + + + 66.07000000000001 + + + 65.97 + + + 65.7 + + + 65.7 + + + 64.62 + + + 63.65000000000001 + + + 63.65000000000001 + + + 62.51000000000001 + + + 62.330000000000005 + + + 62.37 + + + 62.660000000000004 + + + 62.92 + + + 62.51000000000001 + + + 62.54 + + + 63.99 + + + 64.92 + + + 65.98 + + + 66.95 + + + 66.98 + + + 67.17 + + + 67.41000000000001 + + + 67.18 + + + 66.51 + + + 65.82000000000001 + + + 64.45 + + + 62.81 + + + 61.18000000000001 + + + 58.010000000000005 + + + 56.6 + + + 57.99000000000001 + + + 58.74000000000001 + + + 59.36 + + + 56.86000000000001 + + + 55.650000000000006 + + + 51.45 + + + 47.31 + + + 45.50000000000001 + + + 44.4 + + + 43.190000000000005 + + + 42.39 + + + 41.800000000000004 + + + 40.269999999999996 + + + 40.269999999999996 + + + 37.52 + + + 36.08 + + + 36.28 + + + 36.62 + + + 36.62 + + + 35.57 + + + 35.18 + + + 33.65 + + + 33.65 + + + 33.43 + + + 33.18 + + + 33.89 + + + 33.56 + + + 33.330000000000005 + + + 33.25 + + + 33.25 + + + 33.29 + + + 33.53 + + + 33.59 + + + 33.230000000000004 + + + 33.24 + + + 33.32 + + + 33.28 + + + 33.230000000000004 + + + 32.75 + + + 32.42 + + + 32.42 + + + 32.190000000000005 + + + 31.720000000000006 + + + 31.66 + + + 31.96 + + + 31.82 + + + 32.940000000000005 + + + 33.09 + + + 33.29 + + + 33.29 + + + 33.410000000000004 + + + 33.67 + + + 33.730000000000004 + + + 33.52 + + + 33.53 + + + 33.5 + + + 33.49 + + + 33.42 + + + 32.95 + + + 33.93 + + + 34.04 + + + 33.7 + + + 33.7 + + + 33.29 + + + 33.43 + + + 33.580000000000005 + + + 33.580000000000005 + + + 33.59 + + + 33.59 + + + 33.67 + + + 33.760000000000005 + + + 33.580000000000005 + + + 33.580000000000005 + + + 33.580000000000005 + + + 33.580000000000005 + + + 33.580000000000005 + + + 33.690000000000005 + + + 33.68 + + + 33.68 + + + 33.690000000000005 + + + 33.690000000000005 + + + 33.63 + + + 33.690000000000005 + + + 33.620000000000005 + + + 33.620000000000005 + + + 33.6 + + + 33.56 + + + 33.6 + + + 33.63 + + + 33.730000000000004 + + + 33.68 + + + 33.72 + + + 33.910000000000004 + + + 33.78 + + + 33.940000000000005 + + + 33.72 + + + 33.760000000000005 + + + 33.75 + + + 34.21 + + + 34.32 + + + 34.15 + + + 34.0 + + + 34.02 + + + 34.13 + + + 34.29 + + + 34.34 + + + 34.57 + + + 34.74 + + + 34.86 + + + 34.85000000000001 + + + 34.92 + + + 34.86 + + + 34.72 + + + 35.68 + + + 37.08 + + + 38.45 + + + 37.86000000000001 + + + 36.77 + + + 36.120000000000005 + + + 34.080000000000005 + + + 34.230000000000004 + + + 34.53 + + + 34.61 + + + 34.49 + + + 34.510000000000005 + + + 34.510000000000005 + + + 34.47 + + + 34.690000000000005 + + + 34.870000000000005 + + + 34.58 + + + 34.58 + + + 34.58 + + + 34.760000000000005 + + + 34.82 + + + 34.78 + + + 34.690000000000005 + + + 34.660000000000004 + + + 34.56 + + + 34.57 + + + 34.79 + + + 34.79 + + + 34.79 + + + 34.85000000000001 + + + 35.01 + + + 35.01 + + + 35.02 + + + 34.99 + + + 35.120000000000005 + + + 35.230000000000004 + + + 35.230000000000004 + + + 35.230000000000004 + + + 35.230000000000004 + + + 35.120000000000005 + + + 35.10000000000001 + + + 35.190000000000005 + + + 35.26 + + + 35.26 + + + 35.2 + + + 35.17 + + + 35.160000000000004 + + + 35.160000000000004 + + + 35.230000000000004 + + + 35.230000000000004 + + + 35.230000000000004 + + + 35.230000000000004 + + + 35.18 + + + 35.18 + + + 35.34 + + + 35.42 + + + 35.64000000000001 + + + 35.81 + + + 36.71 + + + 37.68000000000001 + + + 38.01 + + + 38.400000000000006 + + + 38.8 + + + 40.39 + + + 40.370000000000005 + + + 39.589999999999996 + + + 36.93000000000001 + + + 36.76 + + + 37.6 + + + 38.59 + + + 36.78 + + + 36.83 + + + 36.84 + + + 36.56 + + + 36.26 + + + 36.06 + + + 36.01 + + + 36.2 + + + 36.4 + + + 36.76 + + + 37.03 + + + 38.330000000000005 + + + 39.720000000000006 + + + 41.150000000000006 + + + 41.39 + + + 41.25 + + + 41.25 + + + 38.44 + + + 37.69 + + + 37.46 + + + 37.37 + + + 37.1 + + + 37.02 + + + 37.09 + + + 37.11000000000001 + + + 38.85 + + + 40.13 + + + 43.43 + + + 47.300000000000004 + + + 50.57 + + + 53.61000000000001 + + + 58.910000000000004 + + + 63.53 + + + 69.24000000000001 + + + 77.85 + + + 84.04 + + + 88.67000000000002 + + + 90.06 + + + 92.55000000000001 + + + 93.22000000000001 + + + 93.86000000000001 + + + 95.05000000000001 + + + 95.59 + + + 96.05000000000001 + + + 96.39 + + + 97.58000000000001 + + + 97.65 + + + 98.42 + + + 98.73 + + + 98.69000000000001 + + + 98.59 + + + 98.59 + + + 98.58000000000001 + + + 98.62 + + + 98.62 + + + 98.69000000000001 + + + 98.62 + + + 98.58000000000001 + + + 98.87 + + + 99.30000000000001 + + + 99.59 + + + 100.0 + + + 100.27000000000001 + + + 100.27000000000001 + + + 100.18 + + + 100.18 + + + 99.97 + + + 99.80000000000001 + + + 99.65 + + + 99.37000000000002 + + + 99.29 + + + 99.13000000000001 + + + 98.92 + + + 98.49000000000001 + + + 97.51 + + + 97.24000000000001 + + + 96.61 + + + 96.14 + + + 96.39 + + + 96.75 + + + 97.67 + + + 97.67 + + + 97.77000000000001 + + + 97.77000000000001 + + + 97.9 + + + 97.97 + + + 98.15 + + + 98.15 + + + 98.15 + + + 98.13000000000001 + + + 98.13000000000001 + + + 98.13000000000001 + + + 97.97 + + + 98.15 + + + 98.15 + + + 97.89 + + + 97.63000000000001 + + + 98.18 + + + 98.55000000000001 + + + 98.88000000000001 + + + 99.59 + + + 100.2 + + + 100.77000000000001 + + + 100.77000000000001 + + + 100.76 + + + 100.76 + + + 100.76 + + + 100.41000000000001 + + + 100.19 + + + 99.99000000000001 + + + 100.08 + + + 100.22 + + + 100.71000000000001 + + + 101.41000000000001 + + + 101.41000000000001 + + + 101.41000000000001 + + + 101.27000000000001 + + + 101.65 + + + 102.36 + + + 102.75 + + + 103.02000000000001 + + + 102.88000000000001 + + + 102.88000000000001 + + + 102.42000000000002 + + + 101.5 + + + 100.18 + + + 99.24000000000001 + + + 99.03 + + + 99.72 + + + 99.69000000000001 + + + 98.47 + + + 97.79 + + + 97.97 + + + 97.97 + + + 97.97 + + + 97.91000000000001 + + + 97.91000000000001 + + + 97.91000000000001 + + + 97.91000000000001 + + + 97.91000000000001 + + + 97.60000000000001 + + + 97.53 + + + 97.53 + + + 97.53 + + + 97.36 + + + 97.32000000000001 + + + 97.32000000000001 + + + 97.24000000000001 + + + 97.24000000000001 + + + 97.28 + + + 97.25 + + + 97.25 + + + 97.19000000000001 + + + 97.09 + + + 97.09 + + + 97.15 + + + 97.15 + + + 97.23 + + + 97.24000000000001 + + + 97.24000000000001 + + + 97.13000000000001 + + + 97.13000000000001 + + + 97.16000000000001 + + + 97.16000000000001 + + + 97.03 + + + 97.03 + + + 97.05000000000001 + + + 97.32000000000001 + + + 97.42 + + + 97.42 + + + 97.49000000000001 + + + 97.49000000000001 + + + 97.47 + + + 97.47 + + + 97.29 + + + 97.29 + + + 97.29 + + + 97.29 + + + 97.29 + + + 97.18 + + + 97.07000000000001 + + + 97.07000000000001 + + + 96.94000000000001 + + + 96.78 + + + 96.55000000000001 + + + 96.49000000000001 + + + 96.38000000000001 + + + 96.38000000000001 + + + 96.38000000000001 + + + 95.91000000000001 + + + 95.77000000000001 + + + 95.41000000000001 + + + 95.41000000000001 + + + 95.07 + + + 95.08000000000001 + + + 94.88000000000001 + + + 94.88000000000001 + + + 94.71 + + + 94.71 + + + 94.58000000000001 + + + 94.4 + + + 94.27000000000001 + + + 94.11000000000001 + + + 94.11000000000001 + + + 92.9 + + + 92.33000000000001 + + + 91.23 + + + 90.53000000000002 + + + 90.49 + + + 90.38 + + + 90.15 + + + 90.15 + + + 90.09 + + + 89.94 + + + 89.94 + + + 89.92000000000002 + + + 89.89000000000001 + + + 89.89000000000001 + + + 90.02 + + + 90.08000000000001 + + + 90.71000000000001 + + + 90.85000000000001 + + + 91.45 + + + 92.17 + + + 93.05000000000001 + + + 93.26 + + + 93.58000000000001 + + + 94.00000000000001 + + + 94.14 + + + 94.14 + + + 94.14 + + + 94.19000000000001 + + + 94.19000000000001 + + + 94.02000000000001 + + + 93.77000000000001 + + + 93.26 + + + 92.76 + + + 92.71 + + + 92.42 + + + 92.1 + + + 91.82000000000001 + + + 91.52 + + + 91.35 + + + 90.91 + + + 90.79 + + + 90.45 + + + 90.09 + + + 90.09 + + + 89.98 + + + 89.78000000000002 + + + 89.44 + + + 89.44 + + + 89.44 + + + 88.7 + + + 88.7 + + + 88.16 + + + 86.0 + + + 83.33 + + + 80.09 + + + 77.08000000000001 + + + 75.48 + + + 75.31 + + + 75.24 + + + 75.24 + + + 75.24 + + + 75.12 + + + 75.04 + + + 75.03 + + + 76.03 + + + 78.46 + + + 83.80000000000001 + + + 84.62 + + + 86.49000000000001 + + + 86.97 + + + 87.22 + + + 87.3 + + + 87.39 + + + 87.95 + + + 88.27 + + + 88.25000000000001 + + + 88.03000000000002 + + + 86.76 + + + 86.76 + + + 85.20000000000002 + + + 80.02000000000001 + + + 72.18 + + + 68.79 + + + 71.12 + + + 71.31000000000002 + + + 71.88 + + + 72.49000000000001 + + + 73.81 + + + 75.56 + + + 79.23 + + + 83.7 + + + 87.10000000000001 + + + 87.92000000000002 + + + 86.47 + + + 86.16 + + + 85.51 + + + 85.67 + + + 86.49000000000001 + + + 87.59 + + + 89.10000000000001 + + + 89.62 + + + 89.68 + + + 89.7 + + + 89.83 + + + 89.99 + + + 89.99 + + + 90.18 + + + 91.06 + + + 91.84 + + + 92.88 + + + 93.12 + + + 93.50000000000001 + + + 92.30000000000001 + + + 90.08000000000001 + + + 89.12 + + + 89.06000000000002 + + + 89.4 + + + 90.18 + + + 91.48 + + + 92.46000000000001 + + + 92.95 + + + 93.38000000000001 + + + 93.75000000000001 + + + 93.52000000000001 + + + 93.57000000000001 + + + 93.80000000000001 + + + 93.80000000000001 + + + 93.84 + + + 93.94000000000001 + + + 94.06 + + + 94.19000000000001 + + + 94.18 + + + 95.21000000000001 + + + 96.16000000000001 + + + 96.84 + + + 97.58000000000001 + + + 99.0 + + + 99.51 + + + 100.13000000000001 + + + 100.67 + + + 100.99000000000001 + + + 101.36 + + + 101.32000000000001 + + + 101.39 + + + 101.64 + + + 101.59000000000002 + + + 101.54 + + + 101.38000000000001 + + + 101.25 + + + 100.83 + + + 100.68 + + + 100.25 + + + 100.25 + + + 98.95 + + + 96.57000000000001 + + + 94.80000000000001 + + + 95.39 + + + 96.17 + + + 96.35000000000001 + + + 96.46000000000001 + + + 96.59 + + + 96.64 + + + 97.27000000000001 + + + 98.09 + + + 98.09 + + + 98.09 + + + 97.85000000000001 + + + 97.27000000000001 + + + 97.62 + + + 97.48 + + + 96.68 + + + 97.04 + + + 97.4 + + + 97.31 + + + 97.36 + + + 96.93 + + + 97.11 + + + 97.92 + + + 98.14 + + + 98.29 + + + 98.41000000000001 + + + 98.47 + + + 98.72 + + + 98.82000000000001 + + + 99.16000000000001 + + + 99.66000000000001 + + + 100.33 + + + 101.36 + + + 101.83 + + + 101.99000000000001 + + + 101.59000000000002 + + + 100.94 + + + 100.63000000000001 + + + 100.11 + + + 100.11 + + + 100.11 + + + 99.98000000000002 + + + 99.93 + + + 99.93 + + + 100.16000000000001 + + + 100.55000000000001 + + + 100.62000000000002 + + + 100.93 + + + 101.15 + + + 101.34000000000002 + + + 101.05000000000001 + + + 100.84000000000002 + + + 100.63000000000001 + + + 100.39 + + + 100.23000000000002 + + + 100.24000000000001 + + + 100.16000000000001 + + + 100.16000000000001 + + + 100.16000000000001 + + + 99.7 + + + 99.7 + + + 99.17 + + + 99.27000000000001 + + + 99.36 + + + 99.65 + + + 100.44 + + + 101.33 + + + 102.13000000000001 + + + 102.61 + + + 102.89 + + + 103.28000000000002 + + + 104.09 + + + 104.32000000000001 + + + 104.72 + + + 105.07000000000001 + + + 104.99000000000001 + + + 105.4 + + + 105.46000000000001 + + + 105.35000000000001 + + + 105.2 + + + 105.32000000000001 + + + 105.43 + + + 105.82000000000001 + + + 106.02 + + + 106.14000000000001 + + + 105.9 + + + 105.39000000000001 + + + 104.56000000000002 + + + 104.03000000000002 + + + 104.76 + + + 104.81000000000002 + + + 104.52 + + + 104.36 + + + 105.56000000000002 + + + 107.47000000000001 + + + 109.09 + + + 110.27000000000001 + + + 110.36000000000001 + + + 109.9 + + + 108.72000000000001 + + + 107.98 + + + 106.39000000000001 + + + 104.78000000000002 + + + 104.37 + + + 104.4 + + + 104.58 + + + 104.68 + + + 105.00000000000001 + + + 105.42000000000002 + + + 105.39000000000001 + + + 105.47000000000001 + + + 105.4 + + + 105.64000000000001 + + + 105.98 + + + 106.24000000000001 + + + 106.38 + + + 106.66 + + + 106.56 + + + 106.38 + + + 106.11000000000001 + + + 105.99000000000001 + + + 106.22000000000001 + + + 106.42000000000002 + + + 106.45 + + + 106.55 + + + 106.76 + + + 106.85000000000001 + + + 107.04 + + + 106.97000000000001 + + + 107.11000000000001 + + + 107.01 + + + 106.27 + + + 105.59 + + + 105.44 + + + 105.44 + + + 105.44 + + + 104.75000000000001 + + + 104.75000000000001 + + + 104.09 + + + 103.99000000000001 + + + 103.93 + + + 103.93 + + + 103.91 + + + 103.21000000000001 + + + 102.39 + + + 103.04 + + + 104.22 + + + 104.99000000000001 + + + 105.48 + + + 105.48 + + + 105.33 + + + 104.93 + + + 104.93 + + + 104.93 + + + 104.93 + + + 104.93 + + + 104.85000000000001 + + + 105.09 + + + 105.33 + + + 105.62 + + + 105.71000000000001 + + + 105.86000000000001 + + + 105.77 + + + 105.39000000000001 + + + 105.39000000000001 + + + 105.39000000000001 + + + 104.49000000000001 + + + 103.74000000000001 + + + 103.28000000000002 + + + 103.28000000000002 + + + 103.11 + + + 102.88000000000001 + + + 102.86 + + + 102.98 + + + 102.98 + + + 102.98 + + + 102.93 + + + 102.93 + + + 102.93 + + + 102.9 + + + 102.59000000000002 + + + 102.02000000000001 + + + 101.98000000000002 + + + 101.94 + + + 101.71000000000001 + + + 100.75 + + + 99.52000000000001 + + + 98.13000000000001 + + + 96.76 + + + 94.39 + + + 94.72000000000001 + + + 95.91000000000001 + + + 96.23 + + + 95.75 + + + 94.30000000000001 + + + 92.04 + + + 91.69000000000001 + + + 91.69000000000001 + + + 92.43 + + + 93.16000000000001 + + + 94.72000000000001 + + + 96.80000000000001 + + + 97.2 + + + 97.2 + + + 97.2 + + + 97.11 + + + 96.9 + + + 96.72000000000001 + + + 96.78 + + + 95.98 + + + 95.83000000000001 + + + 93.29 + + + 92.85 + + + 92.61000000000001 + + + 92.61000000000001 + + + 92.22000000000001 + + + 91.32000000000001 + + + 90.57000000000001 + + + 88.75000000000001 + + + 87.51 + + + 87.51 + + + 87.05 + + + 87.05 + + + 86.92000000000002 + + + 86.92000000000002 + + + 87.04 + + + 87.04 + + + 87.55 + + + 87.77 + + + 87.77 + + + 87.95 + + + 87.95 + + + 88.63 + + + 88.88 + + + 88.65 + + + 88.04 + + + 86.86 + + + 86.29 + + + 86.27000000000001 + + + 86.27000000000001 + + + 86.64 + + + 87.52 + + + 90.32000000000001 + + + 91.24 + + + 92.94000000000001 + + + 95.47000000000001 + + + 96.88000000000001 + + + 96.88000000000001 + + + 95.34 + + + 92.00000000000001 + + + 90.18 + + + 88.83 + + + 88.02 + + + 88.32000000000001 + + + 90.41 + + + 94.24000000000001 + + + 96.64 + + + 97.73 + + + 97.43 + + + 97.84 + + + 96.01 + + + 95.28 + + + 94.97000000000001 + + + 95.08000000000001 + + + 95.39 + + + 95.54 + + + 96.09 + + + 95.88000000000001 + + + 95.76 + + + 95.77000000000001 + + + 94.97000000000001 + + + 93.78 + + + 90.57000000000001 + + + 86.08 + + + 81.86 + + + 80.67 + + + 80.60000000000001 + + + 80.83000000000001 + + + 81.98 + + + 83.41000000000001 + + + 85.97 + + + 87.28000000000002 + + + 90.15 + + + 93.76 + + + 95.47000000000001 + + + 97.16000000000001 + + + 99.81 + + + 100.91000000000001 + + + 102.08 + + + 104.98 + + + 104.98 + + + 105.31000000000002 + + + 105.99000000000001 + + + 105.71000000000001 + + + 105.29 + + + 105.07000000000001 + + + 104.91 + + + 104.59 + + + 104.85000000000001 + + + 104.68 + + + 104.69 + + + 104.53000000000002 + + + 104.27000000000001 + + + 104.04 + + + 103.38000000000001 + + + 103.38000000000001 + + + 103.28000000000002 + + + 102.93 + + + 102.75 + + + 102.63000000000001 + + + 102.74000000000001 + + + 103.26 + + + 103.66 + + + 104.28000000000002 + + + 105.34 + + + 105.78000000000002 + + + 106.62 + + + 107.14000000000001 + + + 107.06 + + + 106.62 + + + 105.89000000000001 + + + 105.41 + + + 105.14000000000001 + + + 105.25000000000001 + + + 105.72000000000001 + + + 106.02 + + + 106.58000000000001 + + + 107.04 + + + 107.57000000000001 + + + 108.18 + + + 108.27 + + + 108.52 + + + 108.98 + + + 109.14000000000001 + + + 109.88000000000001 + + + 110.22000000000001 + + + 111.06 + + + 111.24000000000001 + + + 112.07000000000001 + + + 113.39 + + + 113.39 + + + 113.39 + + + 114.45 + + + 114.27000000000001 + + + 114.55000000000001 + + + 114.90000000000002 + + + 114.90000000000002 + + + 115.38000000000001 + + + 115.38000000000001 + + + 114.86 + + + 114.67 + + + 114.58000000000001 + + + 114.04 + + + 111.79 + + + 110.28 + + + 108.77000000000001 + + + 107.26 + + + 106.58000000000001 + + + 106.00000000000001 + + + 105.44 + + + 105.38000000000001 + + + 104.93 + + + 104.79 + + + 104.51 + + + 104.49000000000001 + + + 104.50000000000001 + + + 104.57000000000001 + + + 105.3 + + + 106.31000000000002 + + + 107.99 + + + 108.28000000000002 + + + 108.08000000000001 + + + 108.00000000000001 + + + 107.95 + + + 107.64000000000001 + + + 107.85000000000001 + + + 108.06 + + + 106.94000000000001 + + + 105.31000000000002 + + + 104.4 + + + 104.48 + + + 104.59 + + + 104.95000000000002 + + + 106.67000000000002 + + + 107.23 + + + 107.3 + + + 108.08000000000001 + + + 107.07000000000001 + + + 105.31000000000002 + + + 103.61 + + + 102.78 + + + 102.18 + + + 101.59000000000002 + + + 100.98000000000002 + + + 100.55000000000001 + + + 100.34 + + + 100.36 + + + 100.57000000000001 + + + 100.72 + + + 101.12 + + + 101.48000000000002 + + + 100.42 + + + 98.7 + + + 97.54 + + + 97.98 + + + 100.13000000000001 + + + 101.26 + + + 101.29 + + + 101.82000000000001 + + + 102.64 + + + 102.96000000000001 + + + 103.57000000000001 + + + 103.88000000000001 + + + 103.32000000000001 + + + 102.25 + + + 101.74000000000001 + + + 101.56 + + + 100.49000000000001 + + + 99.32000000000001 + + + 99.41000000000001 + + + 99.18 + + + 99.05000000000001 + + + 99.13000000000001 + + + 99.24000000000001 + + + 99.26000000000002 + + + 99.24000000000001 + + + 99.36 + + + 99.52000000000001 + + + 99.47 + + + 99.4 + + + 98.83 + + + 98.83 + + + 98.36 + + + 97.94000000000001 + + + 97.84 + + + 97.83000000000001 + + + 97.89 + + + 97.82000000000001 + + + 97.94000000000001 + + + 97.71000000000001 + + + 97.0 + + + 95.72000000000001 + + + 95.32 + + + 95.66000000000001 + + + 95.94000000000001 + + + 96.98 + + + 98.87 + + + 99.4 + + + 99.72 + + + 99.88000000000001 + + + 99.94000000000001 + + + 100.77000000000001 + + + 101.36 + + + 101.72 + + + 101.87 + + + 101.99000000000001 + + + 101.67 + + + 101.13000000000001 + + + 101.02000000000001 + + + 98.28 + + + 97.79 + + + 97.29 + + + 94.64 + + + 93.92 + + + 92.53 + + + 91.09 + + + 91.09 + + + 89.34 + + + 82.57000000000001 + + + 81.82000000000001 + + + 81.02000000000001 + + + 73.53000000000002 + + + 71.99000000000001 + + + 73.62 + + + 76.44000000000001 + + + 81.57000000000001 + + + 87.44 + + + 88.21000000000001 + + + 92.36000000000001 + + + 94.99000000000001 + + + 96.21000000000001 + + + 97.95 + + + 100.61 + + + 102.14 + + + 102.60000000000001 + + + 102.78 + + + 103.13000000000001 + + + 103.13000000000001 + + + 103.10000000000001 + + + 103.10000000000001 + + + 102.74000000000001 + + + 102.74000000000001 + + + 102.70000000000002 + + + 101.96000000000001 + + + 101.64 + + + 101.64 + + + 101.07000000000001 + + + 101.07000000000001 + + + 98.63000000000001 + + + 95.33000000000001 + + + 91.9 + + + 88.08 + + + 82.01 + + + 77.61000000000001 + + + 75.73 + + + 74.61000000000001 + + + 74.59 + + + 74.59 + + + 74.64000000000001 + + + 74.64000000000001 + + + 74.61000000000001 + + + 74.48 + + + 74.43 + + + 74.37 + + + 74.42 + + + 74.76 + + + 77.43 + + + 80.32000000000001 + + + 85.58 + + + 88.42000000000002 + + + 92.86000000000001 + + + 96.55000000000001 + + + 99.13000000000001 + + + 99.41000000000001 + + + 99.95 + + + 100.13000000000001 + + + 100.06 + + + 99.63000000000001 + + + 99.64 + + + 99.71000000000001 + + + 99.62000000000002 + + + 99.84 + + + 99.64 + + + 99.77000000000001 + + + 99.62000000000002 + + + 99.43 + + + 98.4 + + + 97.18 + + + 96.76 + + + 96.29 + + + 95.08000000000001 + + + 94.79 + + + 94.79 + + + 95.15 + + + 95.39 + + + 95.66000000000001 + + + 95.52000000000001 + + + 95.33000000000001 + + + 94.53 + + + 94.18 + + + 93.41000000000001 + + + 93.41000000000001 + + + 93.58000000000001 + + + 93.62 + + + 93.66000000000001 + + + 93.92 + + + 94.36000000000001 + + + 94.58000000000001 + + + 95.53 + + + 95.53 + + + 95.58000000000001 + + + 95.7 + + + 95.7 + + + 95.80000000000001 + + + 95.77000000000001 + + + 96.16000000000001 + + + 96.49000000000001 + + + 97.33000000000001 + + + 98.79 + + + 100.45 + + + 101.14 + + + 101.64 + + + 101.57000000000001 + + + 101.02000000000001 + + + 100.14 + + + 99.27000000000001 + + + 99.10000000000001 + + + 98.43 + + + 98.35000000000001 + + + 98.39 + + + 98.42 + + + 98.69000000000001 + + + 98.91000000000001 + + + 99.34 + + + 99.75 + + + 100.11 + + + 100.77000000000001 + + + 102.04 + + + 101.92 + + + 101.69 + + + 101.9 + + + 102.09000000000002 + + + 102.11 + + + 102.5 + + + 103.06000000000002 + + + 103.41 + + + 103.41 + + + 103.41 + + + 103.5 + + + 103.66 + + + 104.06000000000002 + + + 104.20000000000002 + + + 104.92000000000002 + + + 105.39000000000001 + + + 106.45 + + + 106.44 + + + 106.25000000000001 + + + 105.93 + + + 105.95 + + + 105.85000000000001 + + + 105.43 + + + 105.25000000000001 + + + 104.69 + + + 103.88000000000001 + + + 103.28000000000002 + + + 103.01 + + + 102.29 + + + 100.89 + + + 100.47 + + + 99.81 + + + 98.99000000000001 + + + 97.92 + + + 96.14 + + + 93.50000000000001 + + + 91.65 + + + 92.04 + + + 93.76 + + + 95.0 + + + 95.88000000000001 + + + 96.66000000000001 + + + 96.69000000000001 + + + 96.31 + + + 96.01 + + + 95.2 + + + 94.79 + + + 90.2 + + + 90.2 + + + 88.73 + + + 83.27000000000001 + + + 80.10000000000001 + + + 78.77000000000001 + + + 78.76 + + + 79.22000000000001 + + + 80.03 + + + 79.94000000000001 + + + 79.61 + + + 79.14 + + + 78.94000000000001 + + + 79.33000000000001 + + + 79.92999999999999 + + + 81.03 + + + 82.88000000000001 + + + 84.35000000000001 + + + 84.54 + + + 83.79 + + + 82.11 + + + 81.09 + + + 81.02000000000001 + + + 81.03 + + + 80.75 + + + 80.37 + + + 80.24000000000001 + + + 80.16000000000001 + + + 80.08000000000001 + + + 79.92999999999999 + + + 79.73 + + + 79.86 + + + 79.86 + + + 79.5 + + + 80.87 + + + 83.72 + + + 86.43 + + + 90.94000000000001 + + + 94.51 + + + 99.07000000000001 + + + 103.4 + + + 104.75000000000001 + + + 105.41 + + + 105.45 + + + 105.22 + + + 105.11000000000001 + + + 104.86000000000001 + + + 104.50000000000001 + + + 104.27000000000001 + + + 104.63000000000001 + + + 104.52 + + + 104.4 + + + 104.01 + + + 103.10000000000001 + + + 102.65 + + + 102.36 + + + 101.92 + + + 101.51 + + + 100.9 + + + 99.81 + + + 98.97 + + + 98.48 + + + 98.22 + + + 98.13000000000001 + + + 98.71000000000001 + + + 99.97 + + + 98.84 + + + 95.35000000000001 + + + 91.27 + + + 90.37 + + + 87.36 + + + 84.83 + + + 84.28 + + + 83.92 + + + 83.93 + + + 83.83 + + + 85.04 + + + 86.69 + + + 86.69 + + + 90.00000000000001 + + + 90.00000000000001 + + + 93.41000000000001 + + + 98.38000000000001 + + + 100.49000000000001 + + + 102.26 + + + 102.67000000000002 + + + 102.67000000000002 + + + 103.17000000000002 + + + 103.8 + + + 104.44 + + + 105.12 + + + 103.81000000000002 + + + 102.98 + + + 102.57000000000001 + + + 102.94 + + + 103.84 + + + 102.76 + + + 102.93 + + + 102.35000000000001 + + + 102.35000000000001 + + + 101.91000000000001 + + + 102.05 + + + 104.50000000000001 + + + 106.56 + + + 107.56 + + + 107.47000000000001 + + + 105.91 + + + 104.89000000000001 + + + 102.84000000000002 + + + 101.94 + + + 101.41000000000001 + + + 100.25 + + + 99.66000000000001 + + + 99.11 + + + 100.23000000000002 + + + 100.17 + + + 100.46000000000001 + + + 101.20000000000002 + + + 101.71000000000001 + + + 101.75 + + + 101.74000000000001 + + + 102.10000000000001 + + + 102.11 + + + 102.13000000000001 + + + 102.39 + + + 102.75 + + + 103.31000000000002 + + + 103.36 + + + 102.73 + + + 101.84000000000002 + + + 100.66000000000001 + + + 99.97 + + + 100.71000000000001 + + + 103.31000000000002 + + + 104.44 + + + 104.57000000000001 + + + 104.60000000000001 + + + 104.57000000000001 + + + 104.70000000000002 + + + 105.69 + + + 105.69 + + + 105.69 + + + 105.83 + + + 106.15 + + + 106.16 + + + 106.08000000000001 + + + 105.73 + + + 105.22 + + + 105.22 + + + 103.84 + + + 102.56000000000002 + + + 103.9 + + + 103.9 + + + 97.01 + + + 93.06 + + + 86.84 + + + 85.27000000000001 + + + 85.39 + + + 85.3 + + + 84.93 + + + 85.22 + + + 87.77 + + + 91.51 + + + 96.67 + + + 101.60000000000001 + + + 103.54 + + + 104.78000000000002 + + + 105.04 + + + 105.33 + + + 105.33 + + + 105.33 + + + 105.33 + + + 105.33 + + + 105.37 + + + 105.35000000000001 + + + 106.11000000000001 + + + 105.38000000000001 + + + 105.24000000000001 + + + 105.10000000000001 + + + 105.03000000000002 + + + 105.03000000000002 + + + 104.38000000000001 + + + 104.38000000000001 + + + 104.38000000000001 + + + 104.01 + + + 103.95000000000002 + + + 103.97 + + + 103.85000000000001 + + + 103.85000000000001 + + + 103.52000000000001 + + + 103.69 + + + 103.85000000000001 + + + 104.20000000000002 + + + 104.36 + + + 104.49000000000001 + + + 104.68 + + + 104.94 + + + 105.13000000000001 + + + 105.43 + + + 105.58 + + + 105.85000000000001 + + + 105.88 + + + 105.38000000000001 + + + 103.67000000000002 + + + 102.84000000000002 + + + 101.89 + + + 101.0 + + + 99.95 + + + 98.67 + + + 98.34 + + + 98.22 + + + 98.04 + + + 98.17 + + + 98.82000000000001 + + + 101.21000000000001 + + + 101.54 + + + 100.02000000000001 + + + 98.52000000000001 + + + 95.92999999999999 + + + 93.11000000000001 + + + 92.84 + + + 92.77000000000001 + + + 92.77000000000001 + + + 92.81 + + + 93.09 + + + 93.18 + + + 93.61000000000001 + + + 97.30000000000001 + + + 101.73000000000002 + + + 104.26 + + + 105.67000000000002 + + + 106.55 + + + 107.65 + + + 108.30000000000001 + + + 108.89000000000001 + + + 108.58000000000001 + + + 108.95 + + + 108.51 + + + 108.94000000000001 + + + 108.94000000000001 + + + 108.98 + + + 108.88 + + + 108.88 + + + 108.91000000000001 + + + 108.91000000000001 + + + 109.24 + + + 109.18 + + + 108.9 + + + 107.67000000000002 + + + 107.4 + + + 107.00000000000001 + + + 105.05 + + + 103.41 + + + 98.83 + + + 94.30000000000001 + + + 91.49 + + + 90.57000000000001 + + + 89.54 + + + 89.05 + + + 89.44 + + + 90.41 + + + 90.48 + + + 92.85 + + + 98.44000000000001 + + + 100.67 + + + 101.76 + + + 101.76 + + + 103.20000000000002 + + + 103.20000000000002 + + + 104.19 + + + 105.85000000000001 + + + 106.97000000000001 + + + 108.57000000000001 + + + 109.61000000000001 + + + 110.46 + + + 110.94000000000001 + + + 111.46000000000001 + + + 111.65 + + + 111.06 + + + 110.34 + + + 110.66000000000001 + + + 110.75000000000001 + + + 110.72000000000001 + + + 110.48 + + + 110.34 + + + 110.16000000000001 + + + 109.92 + + + 109.62 + + + 109.45 + + + 108.87 + + + 108.59 + + + 108.73 + + + 109.00000000000001 + + + 110.09 + + + 110.13000000000001 + + + 110.33000000000001 + + + 110.50000000000001 + + + 110.50000000000001 + + + 110.84 + + + 110.93 + + + 110.95 + + + 111.2 + + + 111.24000000000001 + + + 111.30000000000001 + + + 110.32000000000001 + + + 110.12 + + + 110.01 + + + 110.05000000000001 + + + 110.06 + + + 110.06 + + + 110.29 + + + 110.79 + + + 111.43 + + + 111.95 + + + 112.22000000000001 + + + 112.67 + + + 112.7 + + + 112.51 + + + 112.34 + + + 111.94000000000001 + + + 113.5 + + + 112.66000000000001 + + + 112.45 + + + 111.97000000000001 + + + 111.72000000000001 + + + 111.72000000000001 + + + 111.54 + + + 111.62 + + + 111.43 + + + 111.08000000000001 + + + 110.88000000000001 + + + 110.61000000000001 + + + 110.61000000000001 + + + 110.61000000000001 + + + 110.52000000000001 + + + 110.02000000000001 + + + 109.59 + + + 108.87 + + + 108.78000000000002 + + + 108.64000000000001 + + + 108.95 + + + 107.76 + + + 107.07000000000001 + + + 106.23 + + + 105.93 + + + 104.69 + + + 102.73 + + + 102.41000000000001 + + + 102.12 + + + 100.28 + + + 99.33 + + + 98.33000000000001 + + + 97.14 + + + 96.71000000000001 + + + 96.41000000000001 + + + 95.71000000000001 + + + 95.53 + + + 95.52000000000001 + + + 95.31 + + + 95.26 + + + 95.26 + + + 95.33000000000001 + + + 95.54 + + + 95.42 + + + 95.54 + + + 95.99000000000001 + + + 97.36 + + + 97.36 + + + 97.36 + + + 98.08000000000001 + + + 99.17 + + + 99.81 + + + 101.16000000000001 + + + 102.36 + + + 103.26 + + + 104.47 + + + 105.74000000000001 + + + 106.87 + + + 106.87 + + + 110.05000000000001 + + + 110.05000000000001 + + + 111.87 + + + 111.87 + + + 113.12 + + + 113.38000000000001 + + + 113.61 + + + 113.63000000000001 + + + 112.82000000000001 + + + 112.45 + + + 113.63000000000001 + + + 113.65 + + + 112.65 + + + 111.82000000000001 + + + 111.32 + + + 111.21000000000001 + + + 111.11000000000001 + + + 111.03 + + + 110.85000000000001 + + + 110.81 + + + 110.73 + + + 111.18 + + + 111.30000000000001 + + + 111.85000000000001 + + + 111.33000000000001 + + + 111.81 + + + 111.82000000000001 + + + 111.82000000000001 + + + 112.17 + + + 112.57000000000001 + + + 111.81 + + + 111.83000000000001 + + + 112.11000000000001 + + + 112.05000000000001 + + + 112.05000000000001 + + + 111.76 + + + 111.76 + + + 111.85000000000001 + + + 111.85000000000001 + + + 111.96000000000001 + + + 112.0 + + + 112.08000000000001 + + + 112.08000000000001 + + + 112.18 + + + 112.18 + + + 112.16000000000001 + + + 112.16000000000001 + + + 112.13000000000001 + + + 112.13000000000001 + + + 112.11000000000001 + + + 112.05000000000001 + + + 112.05000000000001 + + + 111.76 + + + 111.76 + + + 111.85000000000001 + + + 111.86000000000001 + + + 111.88000000000001 + + + 111.76 + + + 111.75000000000001 + + + 111.89 + + + 112.37 + + + 114.10000000000001 + + + 115.06 + + + 115.64 + + + 115.05000000000001 + + + 114.73 + + + 114.66000000000001 + + + 115.09 + + + 115.2 + + + 115.52000000000001 + + + 115.53 + + + 115.10000000000001 + + + 115.63000000000001 + + + 116.32000000000001 + + + 118.20000000000002 + + + 119.93 + + + 121.32000000000001 + + + 122.97000000000001 + + + 123.9 + + + 124.52 + + + 125.17 + + + 126.52000000000002 + + + 128.84 + + + 129.47 + + + 129.07999999999998 + + + 127.41000000000003 + + + 124.80000000000001 + + + 123.51 + + + 123.16 + + + 122.44 + + + 121.14000000000001 + + + 121.14000000000001 + + + 120.73 + + + 119.52000000000001 + + + 118.04 + + + 117.18 + + + 116.69000000000001 + + + 116.69000000000001 + + + 116.06 + + + 116.06 + + + 114.89 + + + 114.40000000000002 + + + 114.16000000000001 + + + 114.01 + + + 114.39 + + + 114.80000000000001 + + + 115.32000000000001 + + + 115.67 + + + 116.16000000000001 + + + 116.43 + + + 116.02000000000001 + + + 115.64 + + + 114.54 + + + 113.85000000000001 + + + 113.59 + + + 113.63000000000001 + + + 113.48 + + + 113.5 + + + 113.47000000000001 + + + 113.57000000000001 + + + 113.79000000000002 + + + 113.83000000000001 + + + 114.02000000000001 + + + 114.05000000000001 + + + 114.02000000000001 + + + 113.77000000000001 + + + 113.23 + + + 112.82000000000001 + + + 112.42 + + + 112.19000000000001 + + + 112.0 + + + 111.75000000000001 + + + 111.46000000000001 + + + 111.46000000000001 + + + 111.23 + + + 111.18 + + + 111.13000000000001 + + + 111.23 + + + 111.30000000000001 + + + 111.48 + + + 112.04 + + + 111.96000000000001 + + + 111.39 + + + 110.99000000000001 + + + 110.63000000000001 + + + 110.39000000000001 + + + 110.19000000000001 + + + 110.23 + + + 110.27000000000001 + + + 110.28 + + + 110.23 + + + 110.11000000000001 + + + 110.16000000000001 + + + 110.01 + + + 109.9 + + + 109.92 + + + 109.9 + + + 109.57000000000001 + + + 109.23 + + + 110.2 + + + 110.29 + + + 110.21 + + + 110.27000000000001 + + + 110.24000000000001 + + + 110.25000000000001 + + + 110.26 + + + 110.26 + + + 110.44000000000001 + + + 110.44000000000001 + + + 110.49000000000001 + + + 110.61000000000001 + + + 110.50000000000001 + + + 110.45 + + + 110.54 + + + 111.43 + + + 111.43 + + + 111.56 + + + 110.80000000000001 + + + 110.26 + + + 110.16000000000001 + + + 110.44000000000001 + + + 110.04 + + + 109.28 + + + 109.07000000000001 + + + 110.04 + + + 109.17 + + + 108.78000000000002 + + + 108.25000000000001 + + + 107.74 + + + 107.82000000000001 + + + 108.04 + + + 108.56 + + + 109.31 + + + 109.62 + + + 109.87 + + + 109.97000000000001 + + + 110.06 + + + 109.97000000000001 + + + 109.97000000000001 + + + 110.1 + + + 110.32000000000001 + + + 110.08000000000001 + + + 110.08000000000001 + + + 110.01 + + + 110.08000000000001 + + + 110.06 + + + 110.18 + + + 110.25000000000001 + + + 110.25000000000001 + + + 110.27000000000001 + + + 110.22000000000001 + + + 109.84 + + + 109.37 + + + 109.07000000000001 + + + 108.71000000000001 + + + 109.23 + + + 109.44000000000001 + + + 109.43 + + + 109.43 + + + 107.60000000000001 + + + 107.39000000000001 + + + 107.37 + + + 107.76 + + + 108.2 + + + 108.17 + + + 108.25000000000001 + + + 108.29 + + + 109.14000000000001 + + + 109.77000000000001 + + + 110.08000000000001 + + + 110.19000000000001 + + + 110.31 + + + 110.31 + + + 110.48 + + + 110.41000000000001 + + + 110.44000000000001 + + + 110.82000000000001 + + + 111.24000000000001 + + + 111.48 + + + 111.59 + + + 111.61000000000001 + + + 111.61000000000001 + + + 111.4 + + + 111.04 + + + 111.42 + + + 111.41000000000001 + + + 111.41000000000001 + + + 111.28 + + + 110.80000000000001 + + + 110.72000000000001 + + + 110.9 + + + 111.51 + + + 111.76 + + + 111.77000000000001 + + + 112.0 + + + 112.36000000000001 + + + 112.45 + + + 112.53 + + + 112.98 + + + 113.17 + + + 113.18 + + + 113.98 + + + 114.10000000000001 + + + 114.10000000000001 + + + 113.68 + + + 113.68 + + + 113.58000000000001 + + + 113.87 + + + 113.77000000000001 + + + 113.65 + + + 113.55000000000001 + + + 113.71000000000001 + + + 113.60000000000001 + + + 113.41000000000001 + + + 113.0 + + + 112.9 + + + 112.85000000000001 + + + 112.69000000000001 + + + 112.69000000000001 + + + 112.57000000000001 + + + 112.15 + + + 112.15 + + + 111.93 + + + 111.98 + + + 111.96000000000001 + + + 112.10000000000001 + + + 112.13000000000001 + + + 112.26 + + + 113.54000000000002 + + + 116.27000000000001 + + + 118.04 + + + 119.72 + + + 120.42000000000002 + + + 120.86000000000001 + + + 120.99000000000001 + + + 120.81000000000002 + + + 120.05 + + + 118.25 + + + 114.39 + + + 112.91000000000001 + + + 112.53 + + + 111.83000000000001 + + + 111.23 + + + 110.51 + + + 110.04 + + + 109.76 + + + 109.43 + + + 108.42 + + + 108.55000000000001 + + + 108.77000000000001 + + + 109.46000000000001 + + + 109.78 + + + 109.89000000000001 + + + 110.02000000000001 + + + 110.02000000000001 + + + 110.32000000000001 + + + 110.32000000000001 + + + 110.45 + + + 110.72000000000001 + + + 110.72000000000001 + + + 111.55000000000001 + + + 111.65 + + + 111.62 + + + 111.45 + + + 110.83000000000001 + + + 110.12 + + + 109.28 + + + 107.72000000000001 + + + 105.41 + + + 102.10000000000001 + + + 101.60000000000001 + + + 100.67 + + + 99.02000000000001 + + + 96.68 + + + 94.24000000000001 + + + 91.58000000000001 + + + 91.32000000000001 + + + 91.26 + + + 91.51 + + + 91.82000000000001 + + + 92.66000000000001 + + + 92.69000000000001 + + + 92.69000000000001 + + + 92.69000000000001 + + + 92.73 + + + 92.73 + + + 92.80000000000001 + + + 92.72000000000001 + + + 93.59 + + + 100.36 + + + 104.72 + + + 106.55 + + + 107.31 + + + 107.79 + + + 108.18 + + + 108.4 + + + 108.42 + + + 108.96000000000001 + + + 108.79 + + + 108.69000000000001 + + + 108.56 + + + 108.09 + + + 108.43 + + + 108.31 + + + 108.45 + + + 108.04 + + + 107.82000000000001 + + + 107.80000000000001 + + + 107.65 + + + 107.51 + + + 107.41 + + + 107.41 + + + 107.78000000000002 + + + 107.73 + + + 107.71000000000001 + + + 107.71000000000001 + + + 107.69000000000001 + + + 107.19000000000001 + + + 106.56 + + + 105.62 + + + 102.33 + + + 101.33 + + + 100.63000000000001 + + + 100.52000000000001 + + + 101.20000000000002 + + + 101.67 + + + 101.84000000000002 + + + 102.04 + + + 102.97 + + + 104.75000000000001 + + + 105.08 + + + 105.08 + + + 105.34 + + + 105.34 + + + 105.34 + + + 105.57000000000001 + + + 105.67000000000002 + + + 105.69 + + + 105.69 + + + 105.67000000000002 + + + 105.7 + + + 106.41 + + + 107.33000000000001 + + + 107.33000000000001 + + + 107.48 + + + 107.75000000000001 + + + 108.38 + + + 108.50000000000001 + + + 108.73 + + + 108.78000000000002 + + + 109.16000000000001 + + + 109.39000000000001 + + + 109.7 + + + 109.80000000000001 + + + 110.08000000000001 + + + 110.29 + + + 110.60000000000001 + + + 110.77000000000001 + + + 110.91000000000001 + + + 111.05000000000001 + + + 110.88000000000001 + + + 110.83000000000001 + + + 110.79 + + + 110.77000000000001 + + + 111.04 + + + 110.95 + + + 110.95 + + + 110.84 + + + 110.66000000000001 + + + 110.65 + + + 110.54 + + + 110.73 + + + 110.50000000000001 + + + 110.46 + + + 110.43 + + + 112.18 + + + 113.81 + + + 116.09 + + + 116.52000000000001 + + + 116.67 + + + 116.44000000000001 + + + 116.44000000000001 + + + 116.2 + + + 115.08000000000001 + + + 115.08000000000001 + + + 114.29 + + + 111.88000000000001 + + + 110.02000000000001 + + + 109.98 + + + 109.98 + + + 109.97000000000001 + + + 109.97000000000001 + + + 109.97000000000001 + + + 109.93 + + + 109.93 + + + 109.85 + + + 110.00000000000001 + + + 109.86000000000001 + + + 109.88000000000001 + + + 109.82000000000001 + + + 109.64000000000001 + + + 109.64000000000001 + + + 109.64000000000001 + + + 109.66000000000001 + + + 109.66000000000001 + + + 109.66000000000001 + + + 109.66000000000001 + + + 109.62 + + + 109.62 + + + 109.53 + + + 109.4 + + + 109.31 + + + 108.89000000000001 + + + 108.77000000000001 + + + 108.84 + + + 108.78000000000002 + + + 108.71000000000001 + + + 108.89000000000001 + + + 109.08000000000001 + + + 108.9 + + + 108.81 + + + 108.83000000000001 + + + 108.76 + + + 108.71000000000001 + + + 108.69000000000001 + + + 108.69000000000001 + + + 108.69000000000001 + + + 108.66000000000001 + + + 108.57000000000001 + + + 108.26 + + + 108.31 + + + 108.22000000000001 + + + 107.81 + + + 107.55000000000001 + + + 107.37 + + + 107.2 + + + 107.2 + + + 107.2 + + + 107.21000000000001 + + + 107.2 + + + 107.24 + + + 107.14000000000001 + + + 106.91 + + + 106.16 + + + 105.85000000000001 + + + 105.25000000000001 + + + 104.72 + + + 102.31000000000002 + + + 101.52000000000001 + + + 101.52000000000001 + + + 101.39 + + + 101.25 + + + 101.32000000000001 + + + 101.53 + + + 101.84000000000002 + + + 102.49000000000001 + + + 103.99000000000001 + + + 105.72000000000001 + + + 106.13 + + + 106.46000000000001 + + + 106.61000000000001 + + + 106.86000000000001 + + + 106.86000000000001 + + + 107.33000000000001 + + + 107.57000000000001 + + + 107.75000000000001 + + + 107.83000000000001 + + + 107.83000000000001 + + + 107.84 + + + 107.93 + + + 107.97000000000001 + + + 107.97000000000001 + + + 108.07000000000001 + + + 108.07000000000001 + + + 108.07000000000001 + + + 107.9 + + + 107.80000000000001 + + + 107.75000000000001 + + + 107.71000000000001 + + + 107.73 + + + 108.32000000000001 + + + 108.59 + + + 109.04 + + + 109.26 + + + 109.30000000000001 + + + 109.24 + + + 109.24 + + + 109.11000000000001 + + + 109.11000000000001 + + + 108.9 + + + 108.78000000000002 + + + 108.77000000000001 + + + 108.78000000000002 + + + 109.05000000000001 + + + 109.03000000000002 + + + 109.39000000000001 + + + 109.65 + + + 109.82000000000001 + + + 109.55000000000001 + + + 109.36000000000001 + + + 109.66000000000001 + + + 109.71000000000001 + + + 109.81 + + + 109.75000000000001 + + + 109.85 + + + 109.86000000000001 + + + 109.68 + + + 109.68 + + + 109.59 + + + 109.59 + + + 109.56 + + + 109.34 + + + 108.44000000000001 + + + 107.97000000000001 + + + 107.74 + + + 107.77 + + + 107.99 + + + 108.19000000000001 + + + 108.55000000000001 + + + 108.55000000000001 + + + 108.55000000000001 + + + 108.55000000000001 + + + 108.55000000000001 + + + 108.80000000000001 + + + 108.93 + + + 108.94000000000001 + + + 109.00000000000001 + + + 108.89000000000001 + + + 109.01 + + + 109.37 + + + 109.37 + + + 109.41000000000001 + + + 109.41000000000001 + + + 109.41000000000001 + + + 109.41000000000001 + + + 109.41000000000001 + + + 109.57000000000001 + + + 109.57000000000001 + + + 109.57000000000001 + + + 109.48 + + + 109.48 + + + 109.48 + + + 109.15 + + + 108.57000000000001 + + + 108.57000000000001 + + + 107.60000000000001 + + + 106.23 + + + 104.54 + + + 104.54 + + + 104.11 + + + 104.11 + + + 103.48 + + + 103.55 + + + 103.93 + + + 103.93 + + + 104.15 + + + 104.86000000000001 + + + 105.12 + + + 105.31000000000002 + + + 105.31000000000002 + + + 105.39000000000001 + + + 105.39000000000001 + + + 105.54 + + + 105.66 + + + 105.83 + + + 105.95 + + + 106.02 + + + 105.89000000000001 + + + 105.58 + + + 104.85000000000001 + + + 104.84 + + + 105.04 + + + 105.15 + + + 105.15 + + + 105.15 + + + 104.88000000000001 + + + 104.9 + + + 104.74000000000001 + + + 104.82000000000001 + + + 104.9 + + + 104.9 + + + 104.85000000000001 + + + 105.24000000000001 + + + 105.12 + + + 104.61 + + + 104.61 + + + 103.91 + + + 103.58 + + + 103.08 + + + 102.93 + + + 102.23 + + + 102.09000000000002 + + + 101.65 + + + 101.17 + + + 100.07000000000001 + + + 98.2 + + + 97.7 + + + 97.67 + + + 99.43 + + + 100.24000000000001 + + + 100.67 + + + 101.02000000000001 + + + 101.17 + + + 101.17 + + + 101.45000000000002 + + + 101.08 + + + 100.96000000000001 + + + 100.59000000000002 + + + 100.15 + + + 100.21000000000001 + + + 100.28 + + + 100.28 + + + 99.9 + + + 99.85000000000001 + + + 99.87000000000002 + + + 100.01 + + + 100.02000000000001 + + + 100.13000000000001 + + + 100.31 + + + 100.47 + + + 100.68 + + + 100.72 + + + 101.14 + + + 104.01 + + + 106.3 + + + 107.27 + + + 107.4 + + + 106.75000000000001 + + + 106.23 + + + 105.28000000000002 + + + 104.39000000000001 + + + 104.39000000000001 + + + 102.11 + + + 102.11 + + + 101.62 + + + 101.33 + + + 100.85000000000001 + + + 100.77000000000001 + + + 100.91000000000001 + + + 100.57000000000001 + + + 100.35000000000001 + + + 100.35000000000001 + + + 100.35000000000001 + + + 100.08 + + + 100.08 + + + 99.92 + + + 99.96000000000001 + + + 99.93 + + + 99.67 + + + 99.68 + + + 99.68 + + + 99.68 + + + 99.68 + + + 99.44000000000001 + + + 99.44000000000001 + + + 98.9 + + + 98.32000000000001 + + + 98.31 + + + 98.33000000000001 + + + 98.33000000000001 + + + 98.19000000000001 + + + 98.88000000000001 + + + 99.37000000000002 + + + 99.95 + + + 100.0 + + + 99.9 + + + 99.44000000000001 + + + 98.9 + + + 97.72 + + + 96.08000000000001 + + + 94.83000000000001 + + + 94.42 + + + 94.89 + + + 94.89 + + + 95.56 + + + 96.39 + + + 96.39 + + + 96.95 + + + 97.81 + + + 97.9 + + + 98.08000000000001 + + + 97.82000000000001 + + + 97.74000000000001 + + + 97.74000000000001 + + + 97.74000000000001 + + + 98.15 + + + 99.51 + + + 100.83 + + + 100.48000000000002 + + + 100.99000000000001 + + + 100.99000000000001 + + + 101.75 + + + 102.03 + + + 102.20000000000002 + + + 102.42000000000002 + + + 102.62 + + + 102.47 + + + 102.38000000000001 + + + 102.85000000000001 + + + 103.81000000000002 + + + 103.64000000000001 + + + 103.07000000000001 + + + 102.89 + + + 101.89 + + + 101.77000000000001 + + + 102.04 + + + 102.35000000000001 + + + 102.55 + + + 103.03000000000002 + + + 103.07000000000001 + + + 103.62 + + + 103.68 + + + 103.43 + + + 103.52000000000001 + + + 103.51 + + + 103.5 + + + 102.59000000000002 + + + 100.92 + + + 99.02000000000001 + + + 98.07000000000001 + + + 98.42 + + + 99.42 + + + 100.37000000000002 + + + 100.9 + + + 101.27000000000001 + + + 102.14 + + + 102.4 + + + 102.49000000000001 + + + 102.04 + + + 101.08 + + + 99.13000000000001 + + + 97.23 + + + 97.26 + + + 98.44000000000001 + + + 98.48 + + + 96.85000000000001 + + + 95.44000000000001 + + + 94.22000000000001 + + + 93.4 + + + 93.4 + + + 93.28 + + + 93.28 + + + 92.65 + + + 92.65 + + + 92.11000000000001 + + + 91.76 + + + 91.72000000000001 + + + 91.84 + + + 91.84 + + + 91.91 + + + 91.87 + + + 91.77 + + + 90.73 + + + 89.00000000000001 + + + 84.88000000000001 + + + 83.4 + + + 82.05000000000001 + + + 79.44000000000001 + + + 78.72000000000001 + + + 73.44 + + + 71.52 + + + 64.32000000000001 + + + 64.32000000000001 + + + 59.97 + + + 58.46 + + + 58.59 + + + 58.54 + + + 58.400000000000006 + + + 59.04 + + + 59.04 + + + 60.940000000000005 + + + 64.62 + + + 70.21000000000001 + + + 73.16 + + + 77.83000000000001 + + + 81.33000000000001 + + + 85.25 + + + 87.72 + + + 89.64000000000001 + + + 92.04 + + + 92.71 + + + 92.72000000000001 + + + 92.95 + + + 92.95 + + + 93.15 + + + 93.31 + + + 93.92 + + + 94.95 + + + 95.29 + + + 95.32 + + + 95.23 + + + 94.89 + + + 94.98 + + + 94.69000000000001 + + + 94.18 + + + 93.47000000000001 + + + 93.21 + + + 92.79 + + + 91.35 + + + 88.13000000000001 + + + 83.56 + + + 76.74 + + + 69.24000000000001 + + + 62.870000000000005 + + + 57.99000000000001 + + + 53.61000000000001 + + + 49.980000000000004 + + + 47.300000000000004 + + + 43.43 + + + 39.650000000000006 + + + 38.34 + + + 37.03 + + + 37.040000000000006 + + + 37.1 + + + 37.37 + + + 37.46 + + + 37.56 + + + 37.75000000000001 + + + 38.67 + + + 41.31 + + + 41.39 + + + 41.370000000000005 + + + 40.980000000000004 + + + 39.720000000000006 + + + 38.330000000000005 + + + 36.76 + + + 36.76 + + + 36.2 + + + 36.2 + + + 36.01 + + + 36.26 + + + 36.35 + + + 36.56 + + + 36.910000000000004 + + + 36.83 + + + 36.95 + + + 38.580000000000005 + + + 37.24 + + + 36.7 + + + 37.01 + + + 39.620000000000005 + + + 40.07 + + + 40.230000000000004 + + + 38.78 + + + 37.68000000000001 + + + 36.13 + + + 35.52 + + + 35.42 + + + 35.42 + + + 35.32 + + + 35.18 + + + 35.230000000000004 + + + 35.230000000000004 + + + 35.160000000000004 + + + 35.160000000000004 + + + 35.160000000000004 + + + 35.160000000000004 + + + 35.160000000000004 + + + 35.17 + + + 35.26 + + + 35.26 + + + 35.26 + + + 35.26 + + + 35.2 + + + 35.17 + + + 35.160000000000004 + + + 35.160000000000004 + + + 35.230000000000004 + + + 35.230000000000004 + + + 35.230000000000004 + + + 35.230000000000004 + + + 35.18 + + + 35.18 + + + 35.34 + + + 35.42 + + + 35.64000000000001 + + + 35.81 + + + 36.71 + + + 37.28 + + + 37.28 + + + 37.28 + + + 37.05 + + + 36.47 + + + 36.26 + + + 36.26 + + + 36.17 + + + 36.17 + + + 36.06 + + + 35.33 + + + 35.26 + + + 35.26 + + + 35.21000000000001 + + + 35.21000000000001 + + + 35.01 + + + 35.01 + + + 35.08 + + + 35.10000000000001 + + + 35.10000000000001 + + + 34.870000000000005 + + + 34.84 + + + 34.730000000000004 + + + 34.78 + + + 34.74 + + + 34.760000000000005 + + + 34.760000000000005 + + + 34.7 + + + 34.74 + + + 34.81 + + + 34.81 + + + 34.81 + + + 34.75 + + + 34.85000000000001 + + + 34.800000000000004 + + + 34.800000000000004 + + + 34.800000000000004 + + + 34.730000000000004 + + + 34.82 + + + 34.84 + + + 34.93 + + + 34.93 + + + 34.95 + + + 34.82 + + + 34.800000000000004 + + + 34.800000000000004 + + + 34.68 + + + 34.68 + + + 34.74 + + + 34.72 + + + 34.60000000000001 + + + 34.65 + + + 34.800000000000004 + + + 34.83 + + + 34.83 + + + 34.83 + + + 34.83 + + + 34.83 + + + 34.79 + + + 34.7 + + + 34.75 + + + 34.96 + + + 34.96 + + + 34.96 + + + 35.18 + + + 35.18 + + + 35.14 + + + 35.14 + + + 35.15 + + + 35.230000000000004 + + + 35.230000000000004 + + + 35.14 + + + 35.14 + + + 35.4 + + + 35.45 + + + 35.54 + + + 35.660000000000004 + + + 35.68 + + + 35.88 + + + 35.980000000000004 + + + 36.34 + + + 36.67 + + + 41.870000000000005 + + + 39.78 + + + 36.77 + + + 36.38 + + + 36.38 + + + 36.51 + + + 36.57000000000001 + + + 36.480000000000004 + + + 36.33 + + + 36.04 + + + 35.79 + + + 35.620000000000005 + + + 35.660000000000004 + + + 35.620000000000005 + + + 35.68 + + + 36.0 + + + 36.0 + + + 36.0 + + + 36.47 + + + 36.47 + + + 36.47 + + + 36.63 + + + 36.65 + + + 36.47 + + + 36.58 + + + 36.76 + + + 36.76 + + + 36.660000000000004 + + + 36.46000000000001 + + + 36.050000000000004 + + + 36.06 + + + 36.11 + + + 35.910000000000004 + + + 35.910000000000004 + + + 35.84 + + + 35.75 + + + 35.81 + + + 35.78000000000001 + + + 36.04 + + + 36.1 + + + 36.04 + + + 36.04 + + + 35.97 + + + 35.99 + + + 36.04 + + + 36.01 + + + 36.11 + + + 36.06 + + + 36.120000000000005 + + + 36.09 + + + 36.08 + + + 36.11 + + + 36.11 + + + 36.2 + + + 37.57000000000001 + + + 37.73 + + + 37.480000000000004 + + + 35.2 + + + 37.21 + + + 38.02 + + + 38.02 + + + 36.87 + + + 36.97 + + + 36.97 + + + 36.88 + + + 36.97 + + + 37.02 + + + 36.76 + + + 36.14000000000001 + + + 36.2 + + + 36.1 + + + 36.120000000000005 + + + 36.28 + + + 36.45 + + + 36.68000000000001 + + + 37.11000000000001 + + + 37.51 + + + 42.080000000000005 + + + 42.690000000000005 + + + 43.25 + + + 43.96000000000001 + + + 44.46000000000001 + + + 40.720000000000006 + + + 40.720000000000006 + + + 39.830000000000005 + + + 39.150000000000006 + + + 38.830000000000005 + + + 40.36 + + + 42.510000000000005 + + + 42.74 + + + 42.89 + + + 42.97 + + + 43.59 + + + 44.47 + + + 46.06 + + + 46.760000000000005 + + + 49.510000000000005 + + + 50.830000000000005 + + + 54.49 + + + 54.910000000000004 + + + 55.910000000000004 + + + 56.02 + + + 55.34 + + + 55.14 + + + 54.96 + + + 54.3 + + + 53.96 + + + 53.910000000000004 + + + 53.980000000000004 + + + 53.980000000000004 + + + 53.980000000000004 + + + 54.050000000000004 + + + 54.050000000000004 + + + 54.36000000000001 + + + 54.81 + + + 55.07000000000001 + + + 55.800000000000004 + + + 56.440000000000005 + + + 56.28 + + + 56.28 + + + 56.28 + + + 56.400000000000006 + + + 56.61000000000001 + + + 56.61000000000001 + + + 56.6 + + + 56.99 + + + 56.89 + + + 56.88 + + + 56.980000000000004 + + + 56.95 + + + 56.64 + + + 56.300000000000004 + + + 55.86000000000001 + + + 55.190000000000005 + + + 54.400000000000006 + + + 53.39000000000001 + + + 52.22 + + + 51.88 + + + 51.78000000000001 + + + 51.78000000000001 + + + 51.78000000000001 + + + 51.730000000000004 + + + 51.730000000000004 + + + 51.61 + + + 51.61 + + + 51.61 + + + 51.06 + + + 50.57 + + + 49.78 + + + 49.160000000000004 + + + 48.720000000000006 + + + 48.480000000000004 + + + 48.690000000000005 + + + 49.31 + + + 50.31000000000001 + + + 51.02 + + + 51.60000000000001 + + + 52.620000000000005 + + + 53.300000000000004 + + + 53.56 + + + 53.57000000000001 + + + 53.57000000000001 + + + 53.51 + + + 53.49 + + + 53.49 + + + 53.46000000000001 + + + 53.46000000000001 + + + 51.84 + + + 49.31 + + + 48.1 + + + 47.92 + + + 48.160000000000004 + + + 48.830000000000005 + + + 49.96 + + + 50.67000000000001 + + + 51.49 + + + 51.96000000000001 + + + 52.45 + + + 52.63 + + + 52.800000000000004 + + + 52.95 + + + 53.19 + + + 53.300000000000004 + + + 53.540000000000006 + + + 53.84 + + + 53.22 + + + 53.08 + + + 52.94 + + + 52.65 + + + 52.190000000000005 + + + 52.10000000000001 + + + 52.0 + + + 52.24 + + + 52.4 + + + 51.88 + + + 50.760000000000005 + + + 50.03 + + + 49.13 + + + 47.900000000000006 + + + 47.42 + + + 47.17 + + + 44.94 + + + 44.61 + + + 44.61 + + + 44.52 + + + 44.45 + + + 44.46000000000001 + + + 44.79 + + + 44.96000000000001 + + + 44.910000000000004 + + + 45.21000000000001 + + + 45.36000000000001 + + + 45.12 + + + 45.06 + + + 44.94 + + + 44.94 + + + 44.97 + + + 45.970000000000006 + + + 47.910000000000004 + + + 47.93000000000001 + + + 48.040000000000006 + + + 49.74 + + + 49.910000000000004 + + + 50.370000000000005 + + + 50.61 + + + 50.75 + + + 51.080000000000005 + + + 51.77 + + + 52.31 + + + 52.29 + + + 52.36 + + + 52.53000000000001 + + + 52.52 + + + 52.42 + + + 52.43000000000001 + + + + From 75a96c5b0ec2a720dbecaedc1d776b3b42fc442f Mon Sep 17 00:00:00 2001 From: bnjjs1998 Date: Fri, 13 Jun 2025 18:34:44 +0100 Subject: [PATCH 06/35] he --- terminal.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/terminal.py b/terminal.py index 26e7735..c6884d1 100644 --- a/terminal.py +++ b/terminal.py @@ -4,4 +4,8 @@ parser.add_argument("--force", help="Hasher le fichier", action="store_true") args = parser.parse_args() -print(f"L'option de hashage a pour valeur {args.force}") \ No newline at end of file +print(f"L'option de hashage a pour valeur {args.force}") + + +#test + From a6e478c957586cb42a0ff72e5b6eb8ca56c0265b Mon Sep 17 00:00:00 2001 From: Yann N'DA Date: Mon, 16 Jun 2025 21:08:55 +0200 Subject: [PATCH 07/35] =?UTF-8?q?suppression=20du=20fichier=20que=20baptis?= =?UTF-8?q?te=20=C3=A0=20ajouter=20au=20repo=20de=20mani=C3=A8re=20totalem?= =?UTF-8?q?ent=20gratuite,=20sous=20couvert=20de=20test.=20Alors=20qu'il?= =?UTF-8?q?=20avait=20pas=20la=20bonne=20adresse=20mail=20sur=20son=20?= =?UTF-8?q?=C3=A9diteur=20de=20code=20=C3=A0=20la=20noix=20!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Parcours 150km v2.gpx | 8719 ----------------------------------------- 1 file changed, 8719 deletions(-) delete mode 100644 Parcours 150km v2.gpx diff --git a/Parcours 150km v2.gpx b/Parcours 150km v2.gpx deleted file mode 100644 index f28ad5d..0000000 --- a/Parcours 150km v2.gpx +++ /dev/null @@ -1,8719 +0,0 @@ - - - - Parcours 150km v2 - - baptiste Bonnichon-Jaques - - - - 2020 - https://www.openstreetmap.org/copyright - - - - - Parcours 150km v2 - - cycling - - - 48.06 - - - 49.74 - - - 49.910000000000004 - - - 50.370000000000005 - - - 50.61 - - - 50.75 - - - 51.080000000000005 - - - 51.77 - - - 52.31 - - - 52.29 - - - 52.63 - - - 52.800000000000004 - - - 52.88 - - - 53.36000000000001 - - - 53.43000000000001 - - - 53.31 - - - 53.00000000000001 - - - 52.870000000000005 - - - 52.58 - - - 52.29 - - - 52.07000000000001 - - - 52.190000000000005 - - - 52.28000000000001 - - - 52.59 - - - 52.79 - - - 53.03000000000001 - - - 53.17 - - - 53.26 - - - 53.2 - - - 53.14000000000001 - - - 53.13 - - - 52.97 - - - 52.86000000000001 - - - 53.01 - - - 53.45 - - - 54.040000000000006 - - - 54.45 - - - 54.970000000000006 - - - 55.07000000000001 - - - 54.89 - - - 54.84 - - - 55.010000000000005 - - - 55.39 - - - 55.49 - - - 56.11000000000001 - - - 57.49 - - - 58.02 - - - 59.04 - - - 59.78000000000001 - - - 60.56 - - - 61.09 - - - 61.540000000000006 - - - 61.85 - - - 61.93000000000001 - - - 62.480000000000004 - - - 63.160000000000004 - - - 64.53 - - - 64.97 - - - 65.41000000000001 - - - 66.07000000000001 - - - 65.97 - - - 65.7 - - - 65.7 - - - 64.62 - - - 63.65000000000001 - - - 63.65000000000001 - - - 62.51000000000001 - - - 62.330000000000005 - - - 62.37 - - - 62.660000000000004 - - - 62.92 - - - 62.51000000000001 - - - 62.54 - - - 63.99 - - - 64.92 - - - 65.98 - - - 66.95 - - - 66.98 - - - 67.17 - - - 67.41000000000001 - - - 67.18 - - - 66.51 - - - 65.82000000000001 - - - 64.45 - - - 62.81 - - - 61.18000000000001 - - - 58.010000000000005 - - - 56.6 - - - 57.99000000000001 - - - 58.74000000000001 - - - 59.36 - - - 56.86000000000001 - - - 55.650000000000006 - - - 51.45 - - - 47.31 - - - 45.50000000000001 - - - 44.4 - - - 43.190000000000005 - - - 42.39 - - - 41.800000000000004 - - - 40.269999999999996 - - - 40.269999999999996 - - - 37.52 - - - 36.08 - - - 36.28 - - - 36.62 - - - 36.62 - - - 35.57 - - - 35.18 - - - 33.65 - - - 33.65 - - - 33.43 - - - 33.18 - - - 33.89 - - - 33.56 - - - 33.330000000000005 - - - 33.25 - - - 33.25 - - - 33.29 - - - 33.53 - - - 33.59 - - - 33.230000000000004 - - - 33.24 - - - 33.32 - - - 33.28 - - - 33.230000000000004 - - - 32.75 - - - 32.42 - - - 32.42 - - - 32.190000000000005 - - - 31.720000000000006 - - - 31.66 - - - 31.96 - - - 31.82 - - - 32.940000000000005 - - - 33.09 - - - 33.29 - - - 33.29 - - - 33.410000000000004 - - - 33.67 - - - 33.730000000000004 - - - 33.52 - - - 33.53 - - - 33.5 - - - 33.49 - - - 33.42 - - - 32.95 - - - 33.93 - - - 34.04 - - - 33.7 - - - 33.7 - - - 33.29 - - - 33.43 - - - 33.580000000000005 - - - 33.580000000000005 - - - 33.59 - - - 33.59 - - - 33.67 - - - 33.760000000000005 - - - 33.580000000000005 - - - 33.580000000000005 - - - 33.580000000000005 - - - 33.580000000000005 - - - 33.580000000000005 - - - 33.690000000000005 - - - 33.68 - - - 33.68 - - - 33.690000000000005 - - - 33.690000000000005 - - - 33.63 - - - 33.690000000000005 - - - 33.620000000000005 - - - 33.620000000000005 - - - 33.6 - - - 33.56 - - - 33.6 - - - 33.63 - - - 33.730000000000004 - - - 33.68 - - - 33.72 - - - 33.910000000000004 - - - 33.78 - - - 33.940000000000005 - - - 33.72 - - - 33.760000000000005 - - - 33.75 - - - 34.21 - - - 34.32 - - - 34.15 - - - 34.0 - - - 34.02 - - - 34.13 - - - 34.29 - - - 34.34 - - - 34.57 - - - 34.74 - - - 34.86 - - - 34.85000000000001 - - - 34.92 - - - 34.86 - - - 34.72 - - - 35.68 - - - 37.08 - - - 38.45 - - - 37.86000000000001 - - - 36.77 - - - 36.120000000000005 - - - 34.080000000000005 - - - 34.230000000000004 - - - 34.53 - - - 34.61 - - - 34.49 - - - 34.510000000000005 - - - 34.510000000000005 - - - 34.47 - - - 34.690000000000005 - - - 34.870000000000005 - - - 34.58 - - - 34.58 - - - 34.58 - - - 34.760000000000005 - - - 34.82 - - - 34.78 - - - 34.690000000000005 - - - 34.660000000000004 - - - 34.56 - - - 34.57 - - - 34.79 - - - 34.79 - - - 34.79 - - - 34.85000000000001 - - - 35.01 - - - 35.01 - - - 35.02 - - - 34.99 - - - 35.120000000000005 - - - 35.230000000000004 - - - 35.230000000000004 - - - 35.230000000000004 - - - 35.230000000000004 - - - 35.120000000000005 - - - 35.10000000000001 - - - 35.190000000000005 - - - 35.26 - - - 35.26 - - - 35.2 - - - 35.17 - - - 35.160000000000004 - - - 35.160000000000004 - - - 35.230000000000004 - - - 35.230000000000004 - - - 35.230000000000004 - - - 35.230000000000004 - - - 35.18 - - - 35.18 - - - 35.34 - - - 35.42 - - - 35.64000000000001 - - - 35.81 - - - 36.71 - - - 37.68000000000001 - - - 38.01 - - - 38.400000000000006 - - - 38.8 - - - 40.39 - - - 40.370000000000005 - - - 39.589999999999996 - - - 36.93000000000001 - - - 36.76 - - - 37.6 - - - 38.59 - - - 36.78 - - - 36.83 - - - 36.84 - - - 36.56 - - - 36.26 - - - 36.06 - - - 36.01 - - - 36.2 - - - 36.4 - - - 36.76 - - - 37.03 - - - 38.330000000000005 - - - 39.720000000000006 - - - 41.150000000000006 - - - 41.39 - - - 41.25 - - - 41.25 - - - 38.44 - - - 37.69 - - - 37.46 - - - 37.37 - - - 37.1 - - - 37.02 - - - 37.09 - - - 37.11000000000001 - - - 38.85 - - - 40.13 - - - 43.43 - - - 47.300000000000004 - - - 50.57 - - - 53.61000000000001 - - - 58.910000000000004 - - - 63.53 - - - 69.24000000000001 - - - 77.85 - - - 84.04 - - - 88.67000000000002 - - - 90.06 - - - 92.55000000000001 - - - 93.22000000000001 - - - 93.86000000000001 - - - 95.05000000000001 - - - 95.59 - - - 96.05000000000001 - - - 96.39 - - - 97.58000000000001 - - - 97.65 - - - 98.42 - - - 98.73 - - - 98.69000000000001 - - - 98.59 - - - 98.59 - - - 98.58000000000001 - - - 98.62 - - - 98.62 - - - 98.69000000000001 - - - 98.62 - - - 98.58000000000001 - - - 98.87 - - - 99.30000000000001 - - - 99.59 - - - 100.0 - - - 100.27000000000001 - - - 100.27000000000001 - - - 100.18 - - - 100.18 - - - 99.97 - - - 99.80000000000001 - - - 99.65 - - - 99.37000000000002 - - - 99.29 - - - 99.13000000000001 - - - 98.92 - - - 98.49000000000001 - - - 97.51 - - - 97.24000000000001 - - - 96.61 - - - 96.14 - - - 96.39 - - - 96.75 - - - 97.67 - - - 97.67 - - - 97.77000000000001 - - - 97.77000000000001 - - - 97.9 - - - 97.97 - - - 98.15 - - - 98.15 - - - 98.15 - - - 98.13000000000001 - - - 98.13000000000001 - - - 98.13000000000001 - - - 97.97 - - - 98.15 - - - 98.15 - - - 97.89 - - - 97.63000000000001 - - - 98.18 - - - 98.55000000000001 - - - 98.88000000000001 - - - 99.59 - - - 100.2 - - - 100.77000000000001 - - - 100.77000000000001 - - - 100.76 - - - 100.76 - - - 100.76 - - - 100.41000000000001 - - - 100.19 - - - 99.99000000000001 - - - 100.08 - - - 100.22 - - - 100.71000000000001 - - - 101.41000000000001 - - - 101.41000000000001 - - - 101.41000000000001 - - - 101.27000000000001 - - - 101.65 - - - 102.36 - - - 102.75 - - - 103.02000000000001 - - - 102.88000000000001 - - - 102.88000000000001 - - - 102.42000000000002 - - - 101.5 - - - 100.18 - - - 99.24000000000001 - - - 99.03 - - - 99.72 - - - 99.69000000000001 - - - 98.47 - - - 97.79 - - - 97.97 - - - 97.97 - - - 97.97 - - - 97.91000000000001 - - - 97.91000000000001 - - - 97.91000000000001 - - - 97.91000000000001 - - - 97.91000000000001 - - - 97.60000000000001 - - - 97.53 - - - 97.53 - - - 97.53 - - - 97.36 - - - 97.32000000000001 - - - 97.32000000000001 - - - 97.24000000000001 - - - 97.24000000000001 - - - 97.28 - - - 97.25 - - - 97.25 - - - 97.19000000000001 - - - 97.09 - - - 97.09 - - - 97.15 - - - 97.15 - - - 97.23 - - - 97.24000000000001 - - - 97.24000000000001 - - - 97.13000000000001 - - - 97.13000000000001 - - - 97.16000000000001 - - - 97.16000000000001 - - - 97.03 - - - 97.03 - - - 97.05000000000001 - - - 97.32000000000001 - - - 97.42 - - - 97.42 - - - 97.49000000000001 - - - 97.49000000000001 - - - 97.47 - - - 97.47 - - - 97.29 - - - 97.29 - - - 97.29 - - - 97.29 - - - 97.29 - - - 97.18 - - - 97.07000000000001 - - - 97.07000000000001 - - - 96.94000000000001 - - - 96.78 - - - 96.55000000000001 - - - 96.49000000000001 - - - 96.38000000000001 - - - 96.38000000000001 - - - 96.38000000000001 - - - 95.91000000000001 - - - 95.77000000000001 - - - 95.41000000000001 - - - 95.41000000000001 - - - 95.07 - - - 95.08000000000001 - - - 94.88000000000001 - - - 94.88000000000001 - - - 94.71 - - - 94.71 - - - 94.58000000000001 - - - 94.4 - - - 94.27000000000001 - - - 94.11000000000001 - - - 94.11000000000001 - - - 92.9 - - - 92.33000000000001 - - - 91.23 - - - 90.53000000000002 - - - 90.49 - - - 90.38 - - - 90.15 - - - 90.15 - - - 90.09 - - - 89.94 - - - 89.94 - - - 89.92000000000002 - - - 89.89000000000001 - - - 89.89000000000001 - - - 90.02 - - - 90.08000000000001 - - - 90.71000000000001 - - - 90.85000000000001 - - - 91.45 - - - 92.17 - - - 93.05000000000001 - - - 93.26 - - - 93.58000000000001 - - - 94.00000000000001 - - - 94.14 - - - 94.14 - - - 94.14 - - - 94.19000000000001 - - - 94.19000000000001 - - - 94.02000000000001 - - - 93.77000000000001 - - - 93.26 - - - 92.76 - - - 92.71 - - - 92.42 - - - 92.1 - - - 91.82000000000001 - - - 91.52 - - - 91.35 - - - 90.91 - - - 90.79 - - - 90.45 - - - 90.09 - - - 90.09 - - - 89.98 - - - 89.78000000000002 - - - 89.44 - - - 89.44 - - - 89.44 - - - 88.7 - - - 88.7 - - - 88.16 - - - 86.0 - - - 83.33 - - - 80.09 - - - 77.08000000000001 - - - 75.48 - - - 75.31 - - - 75.24 - - - 75.24 - - - 75.24 - - - 75.12 - - - 75.04 - - - 75.03 - - - 76.03 - - - 78.46 - - - 83.80000000000001 - - - 84.62 - - - 86.49000000000001 - - - 86.97 - - - 87.22 - - - 87.3 - - - 87.39 - - - 87.95 - - - 88.27 - - - 88.25000000000001 - - - 88.03000000000002 - - - 86.76 - - - 86.76 - - - 85.20000000000002 - - - 80.02000000000001 - - - 72.18 - - - 68.79 - - - 71.12 - - - 71.31000000000002 - - - 71.88 - - - 72.49000000000001 - - - 73.81 - - - 75.56 - - - 79.23 - - - 83.7 - - - 87.10000000000001 - - - 87.92000000000002 - - - 86.47 - - - 86.16 - - - 85.51 - - - 85.67 - - - 86.49000000000001 - - - 87.59 - - - 89.10000000000001 - - - 89.62 - - - 89.68 - - - 89.7 - - - 89.83 - - - 89.99 - - - 89.99 - - - 90.18 - - - 91.06 - - - 91.84 - - - 92.88 - - - 93.12 - - - 93.50000000000001 - - - 92.30000000000001 - - - 90.08000000000001 - - - 89.12 - - - 89.06000000000002 - - - 89.4 - - - 90.18 - - - 91.48 - - - 92.46000000000001 - - - 92.95 - - - 93.38000000000001 - - - 93.75000000000001 - - - 93.52000000000001 - - - 93.57000000000001 - - - 93.80000000000001 - - - 93.80000000000001 - - - 93.84 - - - 93.94000000000001 - - - 94.06 - - - 94.19000000000001 - - - 94.18 - - - 95.21000000000001 - - - 96.16000000000001 - - - 96.84 - - - 97.58000000000001 - - - 99.0 - - - 99.51 - - - 100.13000000000001 - - - 100.67 - - - 100.99000000000001 - - - 101.36 - - - 101.32000000000001 - - - 101.39 - - - 101.64 - - - 101.59000000000002 - - - 101.54 - - - 101.38000000000001 - - - 101.25 - - - 100.83 - - - 100.68 - - - 100.25 - - - 100.25 - - - 98.95 - - - 96.57000000000001 - - - 94.80000000000001 - - - 95.39 - - - 96.17 - - - 96.35000000000001 - - - 96.46000000000001 - - - 96.59 - - - 96.64 - - - 97.27000000000001 - - - 98.09 - - - 98.09 - - - 98.09 - - - 97.85000000000001 - - - 97.27000000000001 - - - 97.62 - - - 97.48 - - - 96.68 - - - 97.04 - - - 97.4 - - - 97.31 - - - 97.36 - - - 96.93 - - - 97.11 - - - 97.92 - - - 98.14 - - - 98.29 - - - 98.41000000000001 - - - 98.47 - - - 98.72 - - - 98.82000000000001 - - - 99.16000000000001 - - - 99.66000000000001 - - - 100.33 - - - 101.36 - - - 101.83 - - - 101.99000000000001 - - - 101.59000000000002 - - - 100.94 - - - 100.63000000000001 - - - 100.11 - - - 100.11 - - - 100.11 - - - 99.98000000000002 - - - 99.93 - - - 99.93 - - - 100.16000000000001 - - - 100.55000000000001 - - - 100.62000000000002 - - - 100.93 - - - 101.15 - - - 101.34000000000002 - - - 101.05000000000001 - - - 100.84000000000002 - - - 100.63000000000001 - - - 100.39 - - - 100.23000000000002 - - - 100.24000000000001 - - - 100.16000000000001 - - - 100.16000000000001 - - - 100.16000000000001 - - - 99.7 - - - 99.7 - - - 99.17 - - - 99.27000000000001 - - - 99.36 - - - 99.65 - - - 100.44 - - - 101.33 - - - 102.13000000000001 - - - 102.61 - - - 102.89 - - - 103.28000000000002 - - - 104.09 - - - 104.32000000000001 - - - 104.72 - - - 105.07000000000001 - - - 104.99000000000001 - - - 105.4 - - - 105.46000000000001 - - - 105.35000000000001 - - - 105.2 - - - 105.32000000000001 - - - 105.43 - - - 105.82000000000001 - - - 106.02 - - - 106.14000000000001 - - - 105.9 - - - 105.39000000000001 - - - 104.56000000000002 - - - 104.03000000000002 - - - 104.76 - - - 104.81000000000002 - - - 104.52 - - - 104.36 - - - 105.56000000000002 - - - 107.47000000000001 - - - 109.09 - - - 110.27000000000001 - - - 110.36000000000001 - - - 109.9 - - - 108.72000000000001 - - - 107.98 - - - 106.39000000000001 - - - 104.78000000000002 - - - 104.37 - - - 104.4 - - - 104.58 - - - 104.68 - - - 105.00000000000001 - - - 105.42000000000002 - - - 105.39000000000001 - - - 105.47000000000001 - - - 105.4 - - - 105.64000000000001 - - - 105.98 - - - 106.24000000000001 - - - 106.38 - - - 106.66 - - - 106.56 - - - 106.38 - - - 106.11000000000001 - - - 105.99000000000001 - - - 106.22000000000001 - - - 106.42000000000002 - - - 106.45 - - - 106.55 - - - 106.76 - - - 106.85000000000001 - - - 107.04 - - - 106.97000000000001 - - - 107.11000000000001 - - - 107.01 - - - 106.27 - - - 105.59 - - - 105.44 - - - 105.44 - - - 105.44 - - - 104.75000000000001 - - - 104.75000000000001 - - - 104.09 - - - 103.99000000000001 - - - 103.93 - - - 103.93 - - - 103.91 - - - 103.21000000000001 - - - 102.39 - - - 103.04 - - - 104.22 - - - 104.99000000000001 - - - 105.48 - - - 105.48 - - - 105.33 - - - 104.93 - - - 104.93 - - - 104.93 - - - 104.93 - - - 104.93 - - - 104.85000000000001 - - - 105.09 - - - 105.33 - - - 105.62 - - - 105.71000000000001 - - - 105.86000000000001 - - - 105.77 - - - 105.39000000000001 - - - 105.39000000000001 - - - 105.39000000000001 - - - 104.49000000000001 - - - 103.74000000000001 - - - 103.28000000000002 - - - 103.28000000000002 - - - 103.11 - - - 102.88000000000001 - - - 102.86 - - - 102.98 - - - 102.98 - - - 102.98 - - - 102.93 - - - 102.93 - - - 102.93 - - - 102.9 - - - 102.59000000000002 - - - 102.02000000000001 - - - 101.98000000000002 - - - 101.94 - - - 101.71000000000001 - - - 100.75 - - - 99.52000000000001 - - - 98.13000000000001 - - - 96.76 - - - 94.39 - - - 94.72000000000001 - - - 95.91000000000001 - - - 96.23 - - - 95.75 - - - 94.30000000000001 - - - 92.04 - - - 91.69000000000001 - - - 91.69000000000001 - - - 92.43 - - - 93.16000000000001 - - - 94.72000000000001 - - - 96.80000000000001 - - - 97.2 - - - 97.2 - - - 97.2 - - - 97.11 - - - 96.9 - - - 96.72000000000001 - - - 96.78 - - - 95.98 - - - 95.83000000000001 - - - 93.29 - - - 92.85 - - - 92.61000000000001 - - - 92.61000000000001 - - - 92.22000000000001 - - - 91.32000000000001 - - - 90.57000000000001 - - - 88.75000000000001 - - - 87.51 - - - 87.51 - - - 87.05 - - - 87.05 - - - 86.92000000000002 - - - 86.92000000000002 - - - 87.04 - - - 87.04 - - - 87.55 - - - 87.77 - - - 87.77 - - - 87.95 - - - 87.95 - - - 88.63 - - - 88.88 - - - 88.65 - - - 88.04 - - - 86.86 - - - 86.29 - - - 86.27000000000001 - - - 86.27000000000001 - - - 86.64 - - - 87.52 - - - 90.32000000000001 - - - 91.24 - - - 92.94000000000001 - - - 95.47000000000001 - - - 96.88000000000001 - - - 96.88000000000001 - - - 95.34 - - - 92.00000000000001 - - - 90.18 - - - 88.83 - - - 88.02 - - - 88.32000000000001 - - - 90.41 - - - 94.24000000000001 - - - 96.64 - - - 97.73 - - - 97.43 - - - 97.84 - - - 96.01 - - - 95.28 - - - 94.97000000000001 - - - 95.08000000000001 - - - 95.39 - - - 95.54 - - - 96.09 - - - 95.88000000000001 - - - 95.76 - - - 95.77000000000001 - - - 94.97000000000001 - - - 93.78 - - - 90.57000000000001 - - - 86.08 - - - 81.86 - - - 80.67 - - - 80.60000000000001 - - - 80.83000000000001 - - - 81.98 - - - 83.41000000000001 - - - 85.97 - - - 87.28000000000002 - - - 90.15 - - - 93.76 - - - 95.47000000000001 - - - 97.16000000000001 - - - 99.81 - - - 100.91000000000001 - - - 102.08 - - - 104.98 - - - 104.98 - - - 105.31000000000002 - - - 105.99000000000001 - - - 105.71000000000001 - - - 105.29 - - - 105.07000000000001 - - - 104.91 - - - 104.59 - - - 104.85000000000001 - - - 104.68 - - - 104.69 - - - 104.53000000000002 - - - 104.27000000000001 - - - 104.04 - - - 103.38000000000001 - - - 103.38000000000001 - - - 103.28000000000002 - - - 102.93 - - - 102.75 - - - 102.63000000000001 - - - 102.74000000000001 - - - 103.26 - - - 103.66 - - - 104.28000000000002 - - - 105.34 - - - 105.78000000000002 - - - 106.62 - - - 107.14000000000001 - - - 107.06 - - - 106.62 - - - 105.89000000000001 - - - 105.41 - - - 105.14000000000001 - - - 105.25000000000001 - - - 105.72000000000001 - - - 106.02 - - - 106.58000000000001 - - - 107.04 - - - 107.57000000000001 - - - 108.18 - - - 108.27 - - - 108.52 - - - 108.98 - - - 109.14000000000001 - - - 109.88000000000001 - - - 110.22000000000001 - - - 111.06 - - - 111.24000000000001 - - - 112.07000000000001 - - - 113.39 - - - 113.39 - - - 113.39 - - - 114.45 - - - 114.27000000000001 - - - 114.55000000000001 - - - 114.90000000000002 - - - 114.90000000000002 - - - 115.38000000000001 - - - 115.38000000000001 - - - 114.86 - - - 114.67 - - - 114.58000000000001 - - - 114.04 - - - 111.79 - - - 110.28 - - - 108.77000000000001 - - - 107.26 - - - 106.58000000000001 - - - 106.00000000000001 - - - 105.44 - - - 105.38000000000001 - - - 104.93 - - - 104.79 - - - 104.51 - - - 104.49000000000001 - - - 104.50000000000001 - - - 104.57000000000001 - - - 105.3 - - - 106.31000000000002 - - - 107.99 - - - 108.28000000000002 - - - 108.08000000000001 - - - 108.00000000000001 - - - 107.95 - - - 107.64000000000001 - - - 107.85000000000001 - - - 108.06 - - - 106.94000000000001 - - - 105.31000000000002 - - - 104.4 - - - 104.48 - - - 104.59 - - - 104.95000000000002 - - - 106.67000000000002 - - - 107.23 - - - 107.3 - - - 108.08000000000001 - - - 107.07000000000001 - - - 105.31000000000002 - - - 103.61 - - - 102.78 - - - 102.18 - - - 101.59000000000002 - - - 100.98000000000002 - - - 100.55000000000001 - - - 100.34 - - - 100.36 - - - 100.57000000000001 - - - 100.72 - - - 101.12 - - - 101.48000000000002 - - - 100.42 - - - 98.7 - - - 97.54 - - - 97.98 - - - 100.13000000000001 - - - 101.26 - - - 101.29 - - - 101.82000000000001 - - - 102.64 - - - 102.96000000000001 - - - 103.57000000000001 - - - 103.88000000000001 - - - 103.32000000000001 - - - 102.25 - - - 101.74000000000001 - - - 101.56 - - - 100.49000000000001 - - - 99.32000000000001 - - - 99.41000000000001 - - - 99.18 - - - 99.05000000000001 - - - 99.13000000000001 - - - 99.24000000000001 - - - 99.26000000000002 - - - 99.24000000000001 - - - 99.36 - - - 99.52000000000001 - - - 99.47 - - - 99.4 - - - 98.83 - - - 98.83 - - - 98.36 - - - 97.94000000000001 - - - 97.84 - - - 97.83000000000001 - - - 97.89 - - - 97.82000000000001 - - - 97.94000000000001 - - - 97.71000000000001 - - - 97.0 - - - 95.72000000000001 - - - 95.32 - - - 95.66000000000001 - - - 95.94000000000001 - - - 96.98 - - - 98.87 - - - 99.4 - - - 99.72 - - - 99.88000000000001 - - - 99.94000000000001 - - - 100.77000000000001 - - - 101.36 - - - 101.72 - - - 101.87 - - - 101.99000000000001 - - - 101.67 - - - 101.13000000000001 - - - 101.02000000000001 - - - 98.28 - - - 97.79 - - - 97.29 - - - 94.64 - - - 93.92 - - - 92.53 - - - 91.09 - - - 91.09 - - - 89.34 - - - 82.57000000000001 - - - 81.82000000000001 - - - 81.02000000000001 - - - 73.53000000000002 - - - 71.99000000000001 - - - 73.62 - - - 76.44000000000001 - - - 81.57000000000001 - - - 87.44 - - - 88.21000000000001 - - - 92.36000000000001 - - - 94.99000000000001 - - - 96.21000000000001 - - - 97.95 - - - 100.61 - - - 102.14 - - - 102.60000000000001 - - - 102.78 - - - 103.13000000000001 - - - 103.13000000000001 - - - 103.10000000000001 - - - 103.10000000000001 - - - 102.74000000000001 - - - 102.74000000000001 - - - 102.70000000000002 - - - 101.96000000000001 - - - 101.64 - - - 101.64 - - - 101.07000000000001 - - - 101.07000000000001 - - - 98.63000000000001 - - - 95.33000000000001 - - - 91.9 - - - 88.08 - - - 82.01 - - - 77.61000000000001 - - - 75.73 - - - 74.61000000000001 - - - 74.59 - - - 74.59 - - - 74.64000000000001 - - - 74.64000000000001 - - - 74.61000000000001 - - - 74.48 - - - 74.43 - - - 74.37 - - - 74.42 - - - 74.76 - - - 77.43 - - - 80.32000000000001 - - - 85.58 - - - 88.42000000000002 - - - 92.86000000000001 - - - 96.55000000000001 - - - 99.13000000000001 - - - 99.41000000000001 - - - 99.95 - - - 100.13000000000001 - - - 100.06 - - - 99.63000000000001 - - - 99.64 - - - 99.71000000000001 - - - 99.62000000000002 - - - 99.84 - - - 99.64 - - - 99.77000000000001 - - - 99.62000000000002 - - - 99.43 - - - 98.4 - - - 97.18 - - - 96.76 - - - 96.29 - - - 95.08000000000001 - - - 94.79 - - - 94.79 - - - 95.15 - - - 95.39 - - - 95.66000000000001 - - - 95.52000000000001 - - - 95.33000000000001 - - - 94.53 - - - 94.18 - - - 93.41000000000001 - - - 93.41000000000001 - - - 93.58000000000001 - - - 93.62 - - - 93.66000000000001 - - - 93.92 - - - 94.36000000000001 - - - 94.58000000000001 - - - 95.53 - - - 95.53 - - - 95.58000000000001 - - - 95.7 - - - 95.7 - - - 95.80000000000001 - - - 95.77000000000001 - - - 96.16000000000001 - - - 96.49000000000001 - - - 97.33000000000001 - - - 98.79 - - - 100.45 - - - 101.14 - - - 101.64 - - - 101.57000000000001 - - - 101.02000000000001 - - - 100.14 - - - 99.27000000000001 - - - 99.10000000000001 - - - 98.43 - - - 98.35000000000001 - - - 98.39 - - - 98.42 - - - 98.69000000000001 - - - 98.91000000000001 - - - 99.34 - - - 99.75 - - - 100.11 - - - 100.77000000000001 - - - 102.04 - - - 101.92 - - - 101.69 - - - 101.9 - - - 102.09000000000002 - - - 102.11 - - - 102.5 - - - 103.06000000000002 - - - 103.41 - - - 103.41 - - - 103.41 - - - 103.5 - - - 103.66 - - - 104.06000000000002 - - - 104.20000000000002 - - - 104.92000000000002 - - - 105.39000000000001 - - - 106.45 - - - 106.44 - - - 106.25000000000001 - - - 105.93 - - - 105.95 - - - 105.85000000000001 - - - 105.43 - - - 105.25000000000001 - - - 104.69 - - - 103.88000000000001 - - - 103.28000000000002 - - - 103.01 - - - 102.29 - - - 100.89 - - - 100.47 - - - 99.81 - - - 98.99000000000001 - - - 97.92 - - - 96.14 - - - 93.50000000000001 - - - 91.65 - - - 92.04 - - - 93.76 - - - 95.0 - - - 95.88000000000001 - - - 96.66000000000001 - - - 96.69000000000001 - - - 96.31 - - - 96.01 - - - 95.2 - - - 94.79 - - - 90.2 - - - 90.2 - - - 88.73 - - - 83.27000000000001 - - - 80.10000000000001 - - - 78.77000000000001 - - - 78.76 - - - 79.22000000000001 - - - 80.03 - - - 79.94000000000001 - - - 79.61 - - - 79.14 - - - 78.94000000000001 - - - 79.33000000000001 - - - 79.92999999999999 - - - 81.03 - - - 82.88000000000001 - - - 84.35000000000001 - - - 84.54 - - - 83.79 - - - 82.11 - - - 81.09 - - - 81.02000000000001 - - - 81.03 - - - 80.75 - - - 80.37 - - - 80.24000000000001 - - - 80.16000000000001 - - - 80.08000000000001 - - - 79.92999999999999 - - - 79.73 - - - 79.86 - - - 79.86 - - - 79.5 - - - 80.87 - - - 83.72 - - - 86.43 - - - 90.94000000000001 - - - 94.51 - - - 99.07000000000001 - - - 103.4 - - - 104.75000000000001 - - - 105.41 - - - 105.45 - - - 105.22 - - - 105.11000000000001 - - - 104.86000000000001 - - - 104.50000000000001 - - - 104.27000000000001 - - - 104.63000000000001 - - - 104.52 - - - 104.4 - - - 104.01 - - - 103.10000000000001 - - - 102.65 - - - 102.36 - - - 101.92 - - - 101.51 - - - 100.9 - - - 99.81 - - - 98.97 - - - 98.48 - - - 98.22 - - - 98.13000000000001 - - - 98.71000000000001 - - - 99.97 - - - 98.84 - - - 95.35000000000001 - - - 91.27 - - - 90.37 - - - 87.36 - - - 84.83 - - - 84.28 - - - 83.92 - - - 83.93 - - - 83.83 - - - 85.04 - - - 86.69 - - - 86.69 - - - 90.00000000000001 - - - 90.00000000000001 - - - 93.41000000000001 - - - 98.38000000000001 - - - 100.49000000000001 - - - 102.26 - - - 102.67000000000002 - - - 102.67000000000002 - - - 103.17000000000002 - - - 103.8 - - - 104.44 - - - 105.12 - - - 103.81000000000002 - - - 102.98 - - - 102.57000000000001 - - - 102.94 - - - 103.84 - - - 102.76 - - - 102.93 - - - 102.35000000000001 - - - 102.35000000000001 - - - 101.91000000000001 - - - 102.05 - - - 104.50000000000001 - - - 106.56 - - - 107.56 - - - 107.47000000000001 - - - 105.91 - - - 104.89000000000001 - - - 102.84000000000002 - - - 101.94 - - - 101.41000000000001 - - - 100.25 - - - 99.66000000000001 - - - 99.11 - - - 100.23000000000002 - - - 100.17 - - - 100.46000000000001 - - - 101.20000000000002 - - - 101.71000000000001 - - - 101.75 - - - 101.74000000000001 - - - 102.10000000000001 - - - 102.11 - - - 102.13000000000001 - - - 102.39 - - - 102.75 - - - 103.31000000000002 - - - 103.36 - - - 102.73 - - - 101.84000000000002 - - - 100.66000000000001 - - - 99.97 - - - 100.71000000000001 - - - 103.31000000000002 - - - 104.44 - - - 104.57000000000001 - - - 104.60000000000001 - - - 104.57000000000001 - - - 104.70000000000002 - - - 105.69 - - - 105.69 - - - 105.69 - - - 105.83 - - - 106.15 - - - 106.16 - - - 106.08000000000001 - - - 105.73 - - - 105.22 - - - 105.22 - - - 103.84 - - - 102.56000000000002 - - - 103.9 - - - 103.9 - - - 97.01 - - - 93.06 - - - 86.84 - - - 85.27000000000001 - - - 85.39 - - - 85.3 - - - 84.93 - - - 85.22 - - - 87.77 - - - 91.51 - - - 96.67 - - - 101.60000000000001 - - - 103.54 - - - 104.78000000000002 - - - 105.04 - - - 105.33 - - - 105.33 - - - 105.33 - - - 105.33 - - - 105.33 - - - 105.37 - - - 105.35000000000001 - - - 106.11000000000001 - - - 105.38000000000001 - - - 105.24000000000001 - - - 105.10000000000001 - - - 105.03000000000002 - - - 105.03000000000002 - - - 104.38000000000001 - - - 104.38000000000001 - - - 104.38000000000001 - - - 104.01 - - - 103.95000000000002 - - - 103.97 - - - 103.85000000000001 - - - 103.85000000000001 - - - 103.52000000000001 - - - 103.69 - - - 103.85000000000001 - - - 104.20000000000002 - - - 104.36 - - - 104.49000000000001 - - - 104.68 - - - 104.94 - - - 105.13000000000001 - - - 105.43 - - - 105.58 - - - 105.85000000000001 - - - 105.88 - - - 105.38000000000001 - - - 103.67000000000002 - - - 102.84000000000002 - - - 101.89 - - - 101.0 - - - 99.95 - - - 98.67 - - - 98.34 - - - 98.22 - - - 98.04 - - - 98.17 - - - 98.82000000000001 - - - 101.21000000000001 - - - 101.54 - - - 100.02000000000001 - - - 98.52000000000001 - - - 95.92999999999999 - - - 93.11000000000001 - - - 92.84 - - - 92.77000000000001 - - - 92.77000000000001 - - - 92.81 - - - 93.09 - - - 93.18 - - - 93.61000000000001 - - - 97.30000000000001 - - - 101.73000000000002 - - - 104.26 - - - 105.67000000000002 - - - 106.55 - - - 107.65 - - - 108.30000000000001 - - - 108.89000000000001 - - - 108.58000000000001 - - - 108.95 - - - 108.51 - - - 108.94000000000001 - - - 108.94000000000001 - - - 108.98 - - - 108.88 - - - 108.88 - - - 108.91000000000001 - - - 108.91000000000001 - - - 109.24 - - - 109.18 - - - 108.9 - - - 107.67000000000002 - - - 107.4 - - - 107.00000000000001 - - - 105.05 - - - 103.41 - - - 98.83 - - - 94.30000000000001 - - - 91.49 - - - 90.57000000000001 - - - 89.54 - - - 89.05 - - - 89.44 - - - 90.41 - - - 90.48 - - - 92.85 - - - 98.44000000000001 - - - 100.67 - - - 101.76 - - - 101.76 - - - 103.20000000000002 - - - 103.20000000000002 - - - 104.19 - - - 105.85000000000001 - - - 106.97000000000001 - - - 108.57000000000001 - - - 109.61000000000001 - - - 110.46 - - - 110.94000000000001 - - - 111.46000000000001 - - - 111.65 - - - 111.06 - - - 110.34 - - - 110.66000000000001 - - - 110.75000000000001 - - - 110.72000000000001 - - - 110.48 - - - 110.34 - - - 110.16000000000001 - - - 109.92 - - - 109.62 - - - 109.45 - - - 108.87 - - - 108.59 - - - 108.73 - - - 109.00000000000001 - - - 110.09 - - - 110.13000000000001 - - - 110.33000000000001 - - - 110.50000000000001 - - - 110.50000000000001 - - - 110.84 - - - 110.93 - - - 110.95 - - - 111.2 - - - 111.24000000000001 - - - 111.30000000000001 - - - 110.32000000000001 - - - 110.12 - - - 110.01 - - - 110.05000000000001 - - - 110.06 - - - 110.06 - - - 110.29 - - - 110.79 - - - 111.43 - - - 111.95 - - - 112.22000000000001 - - - 112.67 - - - 112.7 - - - 112.51 - - - 112.34 - - - 111.94000000000001 - - - 113.5 - - - 112.66000000000001 - - - 112.45 - - - 111.97000000000001 - - - 111.72000000000001 - - - 111.72000000000001 - - - 111.54 - - - 111.62 - - - 111.43 - - - 111.08000000000001 - - - 110.88000000000001 - - - 110.61000000000001 - - - 110.61000000000001 - - - 110.61000000000001 - - - 110.52000000000001 - - - 110.02000000000001 - - - 109.59 - - - 108.87 - - - 108.78000000000002 - - - 108.64000000000001 - - - 108.95 - - - 107.76 - - - 107.07000000000001 - - - 106.23 - - - 105.93 - - - 104.69 - - - 102.73 - - - 102.41000000000001 - - - 102.12 - - - 100.28 - - - 99.33 - - - 98.33000000000001 - - - 97.14 - - - 96.71000000000001 - - - 96.41000000000001 - - - 95.71000000000001 - - - 95.53 - - - 95.52000000000001 - - - 95.31 - - - 95.26 - - - 95.26 - - - 95.33000000000001 - - - 95.54 - - - 95.42 - - - 95.54 - - - 95.99000000000001 - - - 97.36 - - - 97.36 - - - 97.36 - - - 98.08000000000001 - - - 99.17 - - - 99.81 - - - 101.16000000000001 - - - 102.36 - - - 103.26 - - - 104.47 - - - 105.74000000000001 - - - 106.87 - - - 106.87 - - - 110.05000000000001 - - - 110.05000000000001 - - - 111.87 - - - 111.87 - - - 113.12 - - - 113.38000000000001 - - - 113.61 - - - 113.63000000000001 - - - 112.82000000000001 - - - 112.45 - - - 113.63000000000001 - - - 113.65 - - - 112.65 - - - 111.82000000000001 - - - 111.32 - - - 111.21000000000001 - - - 111.11000000000001 - - - 111.03 - - - 110.85000000000001 - - - 110.81 - - - 110.73 - - - 111.18 - - - 111.30000000000001 - - - 111.85000000000001 - - - 111.33000000000001 - - - 111.81 - - - 111.82000000000001 - - - 111.82000000000001 - - - 112.17 - - - 112.57000000000001 - - - 111.81 - - - 111.83000000000001 - - - 112.11000000000001 - - - 112.05000000000001 - - - 112.05000000000001 - - - 111.76 - - - 111.76 - - - 111.85000000000001 - - - 111.85000000000001 - - - 111.96000000000001 - - - 112.0 - - - 112.08000000000001 - - - 112.08000000000001 - - - 112.18 - - - 112.18 - - - 112.16000000000001 - - - 112.16000000000001 - - - 112.13000000000001 - - - 112.13000000000001 - - - 112.11000000000001 - - - 112.05000000000001 - - - 112.05000000000001 - - - 111.76 - - - 111.76 - - - 111.85000000000001 - - - 111.86000000000001 - - - 111.88000000000001 - - - 111.76 - - - 111.75000000000001 - - - 111.89 - - - 112.37 - - - 114.10000000000001 - - - 115.06 - - - 115.64 - - - 115.05000000000001 - - - 114.73 - - - 114.66000000000001 - - - 115.09 - - - 115.2 - - - 115.52000000000001 - - - 115.53 - - - 115.10000000000001 - - - 115.63000000000001 - - - 116.32000000000001 - - - 118.20000000000002 - - - 119.93 - - - 121.32000000000001 - - - 122.97000000000001 - - - 123.9 - - - 124.52 - - - 125.17 - - - 126.52000000000002 - - - 128.84 - - - 129.47 - - - 129.07999999999998 - - - 127.41000000000003 - - - 124.80000000000001 - - - 123.51 - - - 123.16 - - - 122.44 - - - 121.14000000000001 - - - 121.14000000000001 - - - 120.73 - - - 119.52000000000001 - - - 118.04 - - - 117.18 - - - 116.69000000000001 - - - 116.69000000000001 - - - 116.06 - - - 116.06 - - - 114.89 - - - 114.40000000000002 - - - 114.16000000000001 - - - 114.01 - - - 114.39 - - - 114.80000000000001 - - - 115.32000000000001 - - - 115.67 - - - 116.16000000000001 - - - 116.43 - - - 116.02000000000001 - - - 115.64 - - - 114.54 - - - 113.85000000000001 - - - 113.59 - - - 113.63000000000001 - - - 113.48 - - - 113.5 - - - 113.47000000000001 - - - 113.57000000000001 - - - 113.79000000000002 - - - 113.83000000000001 - - - 114.02000000000001 - - - 114.05000000000001 - - - 114.02000000000001 - - - 113.77000000000001 - - - 113.23 - - - 112.82000000000001 - - - 112.42 - - - 112.19000000000001 - - - 112.0 - - - 111.75000000000001 - - - 111.46000000000001 - - - 111.46000000000001 - - - 111.23 - - - 111.18 - - - 111.13000000000001 - - - 111.23 - - - 111.30000000000001 - - - 111.48 - - - 112.04 - - - 111.96000000000001 - - - 111.39 - - - 110.99000000000001 - - - 110.63000000000001 - - - 110.39000000000001 - - - 110.19000000000001 - - - 110.23 - - - 110.27000000000001 - - - 110.28 - - - 110.23 - - - 110.11000000000001 - - - 110.16000000000001 - - - 110.01 - - - 109.9 - - - 109.92 - - - 109.9 - - - 109.57000000000001 - - - 109.23 - - - 110.2 - - - 110.29 - - - 110.21 - - - 110.27000000000001 - - - 110.24000000000001 - - - 110.25000000000001 - - - 110.26 - - - 110.26 - - - 110.44000000000001 - - - 110.44000000000001 - - - 110.49000000000001 - - - 110.61000000000001 - - - 110.50000000000001 - - - 110.45 - - - 110.54 - - - 111.43 - - - 111.43 - - - 111.56 - - - 110.80000000000001 - - - 110.26 - - - 110.16000000000001 - - - 110.44000000000001 - - - 110.04 - - - 109.28 - - - 109.07000000000001 - - - 110.04 - - - 109.17 - - - 108.78000000000002 - - - 108.25000000000001 - - - 107.74 - - - 107.82000000000001 - - - 108.04 - - - 108.56 - - - 109.31 - - - 109.62 - - - 109.87 - - - 109.97000000000001 - - - 110.06 - - - 109.97000000000001 - - - 109.97000000000001 - - - 110.1 - - - 110.32000000000001 - - - 110.08000000000001 - - - 110.08000000000001 - - - 110.01 - - - 110.08000000000001 - - - 110.06 - - - 110.18 - - - 110.25000000000001 - - - 110.25000000000001 - - - 110.27000000000001 - - - 110.22000000000001 - - - 109.84 - - - 109.37 - - - 109.07000000000001 - - - 108.71000000000001 - - - 109.23 - - - 109.44000000000001 - - - 109.43 - - - 109.43 - - - 107.60000000000001 - - - 107.39000000000001 - - - 107.37 - - - 107.76 - - - 108.2 - - - 108.17 - - - 108.25000000000001 - - - 108.29 - - - 109.14000000000001 - - - 109.77000000000001 - - - 110.08000000000001 - - - 110.19000000000001 - - - 110.31 - - - 110.31 - - - 110.48 - - - 110.41000000000001 - - - 110.44000000000001 - - - 110.82000000000001 - - - 111.24000000000001 - - - 111.48 - - - 111.59 - - - 111.61000000000001 - - - 111.61000000000001 - - - 111.4 - - - 111.04 - - - 111.42 - - - 111.41000000000001 - - - 111.41000000000001 - - - 111.28 - - - 110.80000000000001 - - - 110.72000000000001 - - - 110.9 - - - 111.51 - - - 111.76 - - - 111.77000000000001 - - - 112.0 - - - 112.36000000000001 - - - 112.45 - - - 112.53 - - - 112.98 - - - 113.17 - - - 113.18 - - - 113.98 - - - 114.10000000000001 - - - 114.10000000000001 - - - 113.68 - - - 113.68 - - - 113.58000000000001 - - - 113.87 - - - 113.77000000000001 - - - 113.65 - - - 113.55000000000001 - - - 113.71000000000001 - - - 113.60000000000001 - - - 113.41000000000001 - - - 113.0 - - - 112.9 - - - 112.85000000000001 - - - 112.69000000000001 - - - 112.69000000000001 - - - 112.57000000000001 - - - 112.15 - - - 112.15 - - - 111.93 - - - 111.98 - - - 111.96000000000001 - - - 112.10000000000001 - - - 112.13000000000001 - - - 112.26 - - - 113.54000000000002 - - - 116.27000000000001 - - - 118.04 - - - 119.72 - - - 120.42000000000002 - - - 120.86000000000001 - - - 120.99000000000001 - - - 120.81000000000002 - - - 120.05 - - - 118.25 - - - 114.39 - - - 112.91000000000001 - - - 112.53 - - - 111.83000000000001 - - - 111.23 - - - 110.51 - - - 110.04 - - - 109.76 - - - 109.43 - - - 108.42 - - - 108.55000000000001 - - - 108.77000000000001 - - - 109.46000000000001 - - - 109.78 - - - 109.89000000000001 - - - 110.02000000000001 - - - 110.02000000000001 - - - 110.32000000000001 - - - 110.32000000000001 - - - 110.45 - - - 110.72000000000001 - - - 110.72000000000001 - - - 111.55000000000001 - - - 111.65 - - - 111.62 - - - 111.45 - - - 110.83000000000001 - - - 110.12 - - - 109.28 - - - 107.72000000000001 - - - 105.41 - - - 102.10000000000001 - - - 101.60000000000001 - - - 100.67 - - - 99.02000000000001 - - - 96.68 - - - 94.24000000000001 - - - 91.58000000000001 - - - 91.32000000000001 - - - 91.26 - - - 91.51 - - - 91.82000000000001 - - - 92.66000000000001 - - - 92.69000000000001 - - - 92.69000000000001 - - - 92.69000000000001 - - - 92.73 - - - 92.73 - - - 92.80000000000001 - - - 92.72000000000001 - - - 93.59 - - - 100.36 - - - 104.72 - - - 106.55 - - - 107.31 - - - 107.79 - - - 108.18 - - - 108.4 - - - 108.42 - - - 108.96000000000001 - - - 108.79 - - - 108.69000000000001 - - - 108.56 - - - 108.09 - - - 108.43 - - - 108.31 - - - 108.45 - - - 108.04 - - - 107.82000000000001 - - - 107.80000000000001 - - - 107.65 - - - 107.51 - - - 107.41 - - - 107.41 - - - 107.78000000000002 - - - 107.73 - - - 107.71000000000001 - - - 107.71000000000001 - - - 107.69000000000001 - - - 107.19000000000001 - - - 106.56 - - - 105.62 - - - 102.33 - - - 101.33 - - - 100.63000000000001 - - - 100.52000000000001 - - - 101.20000000000002 - - - 101.67 - - - 101.84000000000002 - - - 102.04 - - - 102.97 - - - 104.75000000000001 - - - 105.08 - - - 105.08 - - - 105.34 - - - 105.34 - - - 105.34 - - - 105.57000000000001 - - - 105.67000000000002 - - - 105.69 - - - 105.69 - - - 105.67000000000002 - - - 105.7 - - - 106.41 - - - 107.33000000000001 - - - 107.33000000000001 - - - 107.48 - - - 107.75000000000001 - - - 108.38 - - - 108.50000000000001 - - - 108.73 - - - 108.78000000000002 - - - 109.16000000000001 - - - 109.39000000000001 - - - 109.7 - - - 109.80000000000001 - - - 110.08000000000001 - - - 110.29 - - - 110.60000000000001 - - - 110.77000000000001 - - - 110.91000000000001 - - - 111.05000000000001 - - - 110.88000000000001 - - - 110.83000000000001 - - - 110.79 - - - 110.77000000000001 - - - 111.04 - - - 110.95 - - - 110.95 - - - 110.84 - - - 110.66000000000001 - - - 110.65 - - - 110.54 - - - 110.73 - - - 110.50000000000001 - - - 110.46 - - - 110.43 - - - 112.18 - - - 113.81 - - - 116.09 - - - 116.52000000000001 - - - 116.67 - - - 116.44000000000001 - - - 116.44000000000001 - - - 116.2 - - - 115.08000000000001 - - - 115.08000000000001 - - - 114.29 - - - 111.88000000000001 - - - 110.02000000000001 - - - 109.98 - - - 109.98 - - - 109.97000000000001 - - - 109.97000000000001 - - - 109.97000000000001 - - - 109.93 - - - 109.93 - - - 109.85 - - - 110.00000000000001 - - - 109.86000000000001 - - - 109.88000000000001 - - - 109.82000000000001 - - - 109.64000000000001 - - - 109.64000000000001 - - - 109.64000000000001 - - - 109.66000000000001 - - - 109.66000000000001 - - - 109.66000000000001 - - - 109.66000000000001 - - - 109.62 - - - 109.62 - - - 109.53 - - - 109.4 - - - 109.31 - - - 108.89000000000001 - - - 108.77000000000001 - - - 108.84 - - - 108.78000000000002 - - - 108.71000000000001 - - - 108.89000000000001 - - - 109.08000000000001 - - - 108.9 - - - 108.81 - - - 108.83000000000001 - - - 108.76 - - - 108.71000000000001 - - - 108.69000000000001 - - - 108.69000000000001 - - - 108.69000000000001 - - - 108.66000000000001 - - - 108.57000000000001 - - - 108.26 - - - 108.31 - - - 108.22000000000001 - - - 107.81 - - - 107.55000000000001 - - - 107.37 - - - 107.2 - - - 107.2 - - - 107.2 - - - 107.21000000000001 - - - 107.2 - - - 107.24 - - - 107.14000000000001 - - - 106.91 - - - 106.16 - - - 105.85000000000001 - - - 105.25000000000001 - - - 104.72 - - - 102.31000000000002 - - - 101.52000000000001 - - - 101.52000000000001 - - - 101.39 - - - 101.25 - - - 101.32000000000001 - - - 101.53 - - - 101.84000000000002 - - - 102.49000000000001 - - - 103.99000000000001 - - - 105.72000000000001 - - - 106.13 - - - 106.46000000000001 - - - 106.61000000000001 - - - 106.86000000000001 - - - 106.86000000000001 - - - 107.33000000000001 - - - 107.57000000000001 - - - 107.75000000000001 - - - 107.83000000000001 - - - 107.83000000000001 - - - 107.84 - - - 107.93 - - - 107.97000000000001 - - - 107.97000000000001 - - - 108.07000000000001 - - - 108.07000000000001 - - - 108.07000000000001 - - - 107.9 - - - 107.80000000000001 - - - 107.75000000000001 - - - 107.71000000000001 - - - 107.73 - - - 108.32000000000001 - - - 108.59 - - - 109.04 - - - 109.26 - - - 109.30000000000001 - - - 109.24 - - - 109.24 - - - 109.11000000000001 - - - 109.11000000000001 - - - 108.9 - - - 108.78000000000002 - - - 108.77000000000001 - - - 108.78000000000002 - - - 109.05000000000001 - - - 109.03000000000002 - - - 109.39000000000001 - - - 109.65 - - - 109.82000000000001 - - - 109.55000000000001 - - - 109.36000000000001 - - - 109.66000000000001 - - - 109.71000000000001 - - - 109.81 - - - 109.75000000000001 - - - 109.85 - - - 109.86000000000001 - - - 109.68 - - - 109.68 - - - 109.59 - - - 109.59 - - - 109.56 - - - 109.34 - - - 108.44000000000001 - - - 107.97000000000001 - - - 107.74 - - - 107.77 - - - 107.99 - - - 108.19000000000001 - - - 108.55000000000001 - - - 108.55000000000001 - - - 108.55000000000001 - - - 108.55000000000001 - - - 108.55000000000001 - - - 108.80000000000001 - - - 108.93 - - - 108.94000000000001 - - - 109.00000000000001 - - - 108.89000000000001 - - - 109.01 - - - 109.37 - - - 109.37 - - - 109.41000000000001 - - - 109.41000000000001 - - - 109.41000000000001 - - - 109.41000000000001 - - - 109.41000000000001 - - - 109.57000000000001 - - - 109.57000000000001 - - - 109.57000000000001 - - - 109.48 - - - 109.48 - - - 109.48 - - - 109.15 - - - 108.57000000000001 - - - 108.57000000000001 - - - 107.60000000000001 - - - 106.23 - - - 104.54 - - - 104.54 - - - 104.11 - - - 104.11 - - - 103.48 - - - 103.55 - - - 103.93 - - - 103.93 - - - 104.15 - - - 104.86000000000001 - - - 105.12 - - - 105.31000000000002 - - - 105.31000000000002 - - - 105.39000000000001 - - - 105.39000000000001 - - - 105.54 - - - 105.66 - - - 105.83 - - - 105.95 - - - 106.02 - - - 105.89000000000001 - - - 105.58 - - - 104.85000000000001 - - - 104.84 - - - 105.04 - - - 105.15 - - - 105.15 - - - 105.15 - - - 104.88000000000001 - - - 104.9 - - - 104.74000000000001 - - - 104.82000000000001 - - - 104.9 - - - 104.9 - - - 104.85000000000001 - - - 105.24000000000001 - - - 105.12 - - - 104.61 - - - 104.61 - - - 103.91 - - - 103.58 - - - 103.08 - - - 102.93 - - - 102.23 - - - 102.09000000000002 - - - 101.65 - - - 101.17 - - - 100.07000000000001 - - - 98.2 - - - 97.7 - - - 97.67 - - - 99.43 - - - 100.24000000000001 - - - 100.67 - - - 101.02000000000001 - - - 101.17 - - - 101.17 - - - 101.45000000000002 - - - 101.08 - - - 100.96000000000001 - - - 100.59000000000002 - - - 100.15 - - - 100.21000000000001 - - - 100.28 - - - 100.28 - - - 99.9 - - - 99.85000000000001 - - - 99.87000000000002 - - - 100.01 - - - 100.02000000000001 - - - 100.13000000000001 - - - 100.31 - - - 100.47 - - - 100.68 - - - 100.72 - - - 101.14 - - - 104.01 - - - 106.3 - - - 107.27 - - - 107.4 - - - 106.75000000000001 - - - 106.23 - - - 105.28000000000002 - - - 104.39000000000001 - - - 104.39000000000001 - - - 102.11 - - - 102.11 - - - 101.62 - - - 101.33 - - - 100.85000000000001 - - - 100.77000000000001 - - - 100.91000000000001 - - - 100.57000000000001 - - - 100.35000000000001 - - - 100.35000000000001 - - - 100.35000000000001 - - - 100.08 - - - 100.08 - - - 99.92 - - - 99.96000000000001 - - - 99.93 - - - 99.67 - - - 99.68 - - - 99.68 - - - 99.68 - - - 99.68 - - - 99.44000000000001 - - - 99.44000000000001 - - - 98.9 - - - 98.32000000000001 - - - 98.31 - - - 98.33000000000001 - - - 98.33000000000001 - - - 98.19000000000001 - - - 98.88000000000001 - - - 99.37000000000002 - - - 99.95 - - - 100.0 - - - 99.9 - - - 99.44000000000001 - - - 98.9 - - - 97.72 - - - 96.08000000000001 - - - 94.83000000000001 - - - 94.42 - - - 94.89 - - - 94.89 - - - 95.56 - - - 96.39 - - - 96.39 - - - 96.95 - - - 97.81 - - - 97.9 - - - 98.08000000000001 - - - 97.82000000000001 - - - 97.74000000000001 - - - 97.74000000000001 - - - 97.74000000000001 - - - 98.15 - - - 99.51 - - - 100.83 - - - 100.48000000000002 - - - 100.99000000000001 - - - 100.99000000000001 - - - 101.75 - - - 102.03 - - - 102.20000000000002 - - - 102.42000000000002 - - - 102.62 - - - 102.47 - - - 102.38000000000001 - - - 102.85000000000001 - - - 103.81000000000002 - - - 103.64000000000001 - - - 103.07000000000001 - - - 102.89 - - - 101.89 - - - 101.77000000000001 - - - 102.04 - - - 102.35000000000001 - - - 102.55 - - - 103.03000000000002 - - - 103.07000000000001 - - - 103.62 - - - 103.68 - - - 103.43 - - - 103.52000000000001 - - - 103.51 - - - 103.5 - - - 102.59000000000002 - - - 100.92 - - - 99.02000000000001 - - - 98.07000000000001 - - - 98.42 - - - 99.42 - - - 100.37000000000002 - - - 100.9 - - - 101.27000000000001 - - - 102.14 - - - 102.4 - - - 102.49000000000001 - - - 102.04 - - - 101.08 - - - 99.13000000000001 - - - 97.23 - - - 97.26 - - - 98.44000000000001 - - - 98.48 - - - 96.85000000000001 - - - 95.44000000000001 - - - 94.22000000000001 - - - 93.4 - - - 93.4 - - - 93.28 - - - 93.28 - - - 92.65 - - - 92.65 - - - 92.11000000000001 - - - 91.76 - - - 91.72000000000001 - - - 91.84 - - - 91.84 - - - 91.91 - - - 91.87 - - - 91.77 - - - 90.73 - - - 89.00000000000001 - - - 84.88000000000001 - - - 83.4 - - - 82.05000000000001 - - - 79.44000000000001 - - - 78.72000000000001 - - - 73.44 - - - 71.52 - - - 64.32000000000001 - - - 64.32000000000001 - - - 59.97 - - - 58.46 - - - 58.59 - - - 58.54 - - - 58.400000000000006 - - - 59.04 - - - 59.04 - - - 60.940000000000005 - - - 64.62 - - - 70.21000000000001 - - - 73.16 - - - 77.83000000000001 - - - 81.33000000000001 - - - 85.25 - - - 87.72 - - - 89.64000000000001 - - - 92.04 - - - 92.71 - - - 92.72000000000001 - - - 92.95 - - - 92.95 - - - 93.15 - - - 93.31 - - - 93.92 - - - 94.95 - - - 95.29 - - - 95.32 - - - 95.23 - - - 94.89 - - - 94.98 - - - 94.69000000000001 - - - 94.18 - - - 93.47000000000001 - - - 93.21 - - - 92.79 - - - 91.35 - - - 88.13000000000001 - - - 83.56 - - - 76.74 - - - 69.24000000000001 - - - 62.870000000000005 - - - 57.99000000000001 - - - 53.61000000000001 - - - 49.980000000000004 - - - 47.300000000000004 - - - 43.43 - - - 39.650000000000006 - - - 38.34 - - - 37.03 - - - 37.040000000000006 - - - 37.1 - - - 37.37 - - - 37.46 - - - 37.56 - - - 37.75000000000001 - - - 38.67 - - - 41.31 - - - 41.39 - - - 41.370000000000005 - - - 40.980000000000004 - - - 39.720000000000006 - - - 38.330000000000005 - - - 36.76 - - - 36.76 - - - 36.2 - - - 36.2 - - - 36.01 - - - 36.26 - - - 36.35 - - - 36.56 - - - 36.910000000000004 - - - 36.83 - - - 36.95 - - - 38.580000000000005 - - - 37.24 - - - 36.7 - - - 37.01 - - - 39.620000000000005 - - - 40.07 - - - 40.230000000000004 - - - 38.78 - - - 37.68000000000001 - - - 36.13 - - - 35.52 - - - 35.42 - - - 35.42 - - - 35.32 - - - 35.18 - - - 35.230000000000004 - - - 35.230000000000004 - - - 35.160000000000004 - - - 35.160000000000004 - - - 35.160000000000004 - - - 35.160000000000004 - - - 35.160000000000004 - - - 35.17 - - - 35.26 - - - 35.26 - - - 35.26 - - - 35.26 - - - 35.2 - - - 35.17 - - - 35.160000000000004 - - - 35.160000000000004 - - - 35.230000000000004 - - - 35.230000000000004 - - - 35.230000000000004 - - - 35.230000000000004 - - - 35.18 - - - 35.18 - - - 35.34 - - - 35.42 - - - 35.64000000000001 - - - 35.81 - - - 36.71 - - - 37.28 - - - 37.28 - - - 37.28 - - - 37.05 - - - 36.47 - - - 36.26 - - - 36.26 - - - 36.17 - - - 36.17 - - - 36.06 - - - 35.33 - - - 35.26 - - - 35.26 - - - 35.21000000000001 - - - 35.21000000000001 - - - 35.01 - - - 35.01 - - - 35.08 - - - 35.10000000000001 - - - 35.10000000000001 - - - 34.870000000000005 - - - 34.84 - - - 34.730000000000004 - - - 34.78 - - - 34.74 - - - 34.760000000000005 - - - 34.760000000000005 - - - 34.7 - - - 34.74 - - - 34.81 - - - 34.81 - - - 34.81 - - - 34.75 - - - 34.85000000000001 - - - 34.800000000000004 - - - 34.800000000000004 - - - 34.800000000000004 - - - 34.730000000000004 - - - 34.82 - - - 34.84 - - - 34.93 - - - 34.93 - - - 34.95 - - - 34.82 - - - 34.800000000000004 - - - 34.800000000000004 - - - 34.68 - - - 34.68 - - - 34.74 - - - 34.72 - - - 34.60000000000001 - - - 34.65 - - - 34.800000000000004 - - - 34.83 - - - 34.83 - - - 34.83 - - - 34.83 - - - 34.83 - - - 34.79 - - - 34.7 - - - 34.75 - - - 34.96 - - - 34.96 - - - 34.96 - - - 35.18 - - - 35.18 - - - 35.14 - - - 35.14 - - - 35.15 - - - 35.230000000000004 - - - 35.230000000000004 - - - 35.14 - - - 35.14 - - - 35.4 - - - 35.45 - - - 35.54 - - - 35.660000000000004 - - - 35.68 - - - 35.88 - - - 35.980000000000004 - - - 36.34 - - - 36.67 - - - 41.870000000000005 - - - 39.78 - - - 36.77 - - - 36.38 - - - 36.38 - - - 36.51 - - - 36.57000000000001 - - - 36.480000000000004 - - - 36.33 - - - 36.04 - - - 35.79 - - - 35.620000000000005 - - - 35.660000000000004 - - - 35.620000000000005 - - - 35.68 - - - 36.0 - - - 36.0 - - - 36.0 - - - 36.47 - - - 36.47 - - - 36.47 - - - 36.63 - - - 36.65 - - - 36.47 - - - 36.58 - - - 36.76 - - - 36.76 - - - 36.660000000000004 - - - 36.46000000000001 - - - 36.050000000000004 - - - 36.06 - - - 36.11 - - - 35.910000000000004 - - - 35.910000000000004 - - - 35.84 - - - 35.75 - - - 35.81 - - - 35.78000000000001 - - - 36.04 - - - 36.1 - - - 36.04 - - - 36.04 - - - 35.97 - - - 35.99 - - - 36.04 - - - 36.01 - - - 36.11 - - - 36.06 - - - 36.120000000000005 - - - 36.09 - - - 36.08 - - - 36.11 - - - 36.11 - - - 36.2 - - - 37.57000000000001 - - - 37.73 - - - 37.480000000000004 - - - 35.2 - - - 37.21 - - - 38.02 - - - 38.02 - - - 36.87 - - - 36.97 - - - 36.97 - - - 36.88 - - - 36.97 - - - 37.02 - - - 36.76 - - - 36.14000000000001 - - - 36.2 - - - 36.1 - - - 36.120000000000005 - - - 36.28 - - - 36.45 - - - 36.68000000000001 - - - 37.11000000000001 - - - 37.51 - - - 42.080000000000005 - - - 42.690000000000005 - - - 43.25 - - - 43.96000000000001 - - - 44.46000000000001 - - - 40.720000000000006 - - - 40.720000000000006 - - - 39.830000000000005 - - - 39.150000000000006 - - - 38.830000000000005 - - - 40.36 - - - 42.510000000000005 - - - 42.74 - - - 42.89 - - - 42.97 - - - 43.59 - - - 44.47 - - - 46.06 - - - 46.760000000000005 - - - 49.510000000000005 - - - 50.830000000000005 - - - 54.49 - - - 54.910000000000004 - - - 55.910000000000004 - - - 56.02 - - - 55.34 - - - 55.14 - - - 54.96 - - - 54.3 - - - 53.96 - - - 53.910000000000004 - - - 53.980000000000004 - - - 53.980000000000004 - - - 53.980000000000004 - - - 54.050000000000004 - - - 54.050000000000004 - - - 54.36000000000001 - - - 54.81 - - - 55.07000000000001 - - - 55.800000000000004 - - - 56.440000000000005 - - - 56.28 - - - 56.28 - - - 56.28 - - - 56.400000000000006 - - - 56.61000000000001 - - - 56.61000000000001 - - - 56.6 - - - 56.99 - - - 56.89 - - - 56.88 - - - 56.980000000000004 - - - 56.95 - - - 56.64 - - - 56.300000000000004 - - - 55.86000000000001 - - - 55.190000000000005 - - - 54.400000000000006 - - - 53.39000000000001 - - - 52.22 - - - 51.88 - - - 51.78000000000001 - - - 51.78000000000001 - - - 51.78000000000001 - - - 51.730000000000004 - - - 51.730000000000004 - - - 51.61 - - - 51.61 - - - 51.61 - - - 51.06 - - - 50.57 - - - 49.78 - - - 49.160000000000004 - - - 48.720000000000006 - - - 48.480000000000004 - - - 48.690000000000005 - - - 49.31 - - - 50.31000000000001 - - - 51.02 - - - 51.60000000000001 - - - 52.620000000000005 - - - 53.300000000000004 - - - 53.56 - - - 53.57000000000001 - - - 53.57000000000001 - - - 53.51 - - - 53.49 - - - 53.49 - - - 53.46000000000001 - - - 53.46000000000001 - - - 51.84 - - - 49.31 - - - 48.1 - - - 47.92 - - - 48.160000000000004 - - - 48.830000000000005 - - - 49.96 - - - 50.67000000000001 - - - 51.49 - - - 51.96000000000001 - - - 52.45 - - - 52.63 - - - 52.800000000000004 - - - 52.95 - - - 53.19 - - - 53.300000000000004 - - - 53.540000000000006 - - - 53.84 - - - 53.22 - - - 53.08 - - - 52.94 - - - 52.65 - - - 52.190000000000005 - - - 52.10000000000001 - - - 52.0 - - - 52.24 - - - 52.4 - - - 51.88 - - - 50.760000000000005 - - - 50.03 - - - 49.13 - - - 47.900000000000006 - - - 47.42 - - - 47.17 - - - 44.94 - - - 44.61 - - - 44.61 - - - 44.52 - - - 44.45 - - - 44.46000000000001 - - - 44.79 - - - 44.96000000000001 - - - 44.910000000000004 - - - 45.21000000000001 - - - 45.36000000000001 - - - 45.12 - - - 45.06 - - - 44.94 - - - 44.94 - - - 44.97 - - - 45.970000000000006 - - - 47.910000000000004 - - - 47.93000000000001 - - - 48.040000000000006 - - - 49.74 - - - 49.910000000000004 - - - 50.370000000000005 - - - 50.61 - - - 50.75 - - - 51.080000000000005 - - - 51.77 - - - 52.31 - - - 52.29 - - - 52.36 - - - 52.53000000000001 - - - 52.52 - - - 52.42 - - - 52.43000000000001 - - - - From 0b36f524a19606819a55cb435ab8383f0c5b3d36 Mon Sep 17 00:00:00 2001 From: Yann N'DA Date: Mon, 16 Jun 2025 22:03:42 +0200 Subject: [PATCH 08/35] Added Lanching script steps --- Launching.md | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 Launching.md diff --git a/Launching.md b/Launching.md new file mode 100644 index 0000000..bc21a2d --- /dev/null +++ b/Launching.md @@ -0,0 +1,55 @@ +# **Comment lancer le script** +--- +## Cas de script Bash +**Rendre le fichier script exécutable** +```bash +chmod +x my_hash_object.sh #Rend le script exécutable +``` + +**Lancer le fichier avec un argument** +```bash +./my_hash_object.sh mon_fichier.txt +``` + +## Cas de script Python (notre cas) + +```bash +python3 --version # Vérifie que Python 3 est installé + +python3 git_hash_object.py mon_fichier.txt +``` +--- +**ou alors** +## Pour le script Bash +Place-le dans un dossier de ton PATH (par exemple ~/bin/). + +Ou utilise un alias dans ton ```.bashrc :``` + +```bash +alias git-hash-object="$HOME/path/to/my_hash_object.sh" +``` +### Pour le script Python +Rends-le exécutable : + +```bash +chmod +x git_hash_object.py +``` +Ajoute un shebang (première ligne du script) : + +```python +#!/usr/bin/env python3 +``` +Déplace-le dans un dossier du PATH ou utilise un alias : + +```bash +alias git-hash-object="python3 $HOME/path/to/git_hash_object.py" +``` +### Vérification avec Git +Compare le résultat avec la commande réelle de Git : + +```bash +git hash-object test.txt +``` + +[extrait de deepseek](https://chat.deepseek.com/a/chat/s/00c34d42-1c8e-4fcf-8f1a-a551c10f2804) +Ces étapes peuvent varier entre les utilisateurs de windows et de MacOS \ No newline at end of file From c8d6d03c681aa13a11bb142caf825d975aa2a3bc Mon Sep 17 00:00:00 2001 From: AkaTFL <184939597+AkaTFL@users.noreply.github.com> Date: Tue, 17 Jun 2025 11:47:50 +0200 Subject: [PATCH 09/35] ajout write-tree --- Objects/__pycache__/tree.cpython-313.pyc | Bin 0 -> 1101 bytes Objects/tree.py | 13 ++++++++++--- test/fff.txt | 1 + write-tree.py | 10 ++++++++++ 4 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 Objects/__pycache__/tree.cpython-313.pyc create mode 100644 test/fff.txt create mode 100644 write-tree.py diff --git a/Objects/__pycache__/tree.cpython-313.pyc b/Objects/__pycache__/tree.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f1e5421a7bc6aac31b058c9376a4224263e1b82 GIT binary patch literal 1101 zcmZWn%}*0S6o0e3r7cisp^$(Q8IWi@q{O(8WK;w*=~)&x5;ncd-Fbi@69wKk#<0Ncm7Ug zivWC;MoTnbX(UnEfDB~FO<<6KQOGERkWr_VW&|T;qHFuoSSU1IO~i_x_!V-%NCuda zAxxDOn3hoy0~w9Al>>U4(C#wR+*dKD;FtE&gNV}E_=bQ)h@)glFU*|+aMYz%6UbuG z79|B7ZE-v;vyRBLZ=a4}wt_?9*UC!5tx13mNWxNUcu2P$DS+lEWR+>ZZ#w+{d8lpP&n(~p z$IF{qUJ*gptTGduB%Yue-RZsNp~$YBtJ zKgLqO-41NQum(GASxS>g|ze@k#W$;f=*Z``tjF|KUXFu zSsYPxl$*27;r>O`o9`bFJ}Gcz<|^!V_dZ>DwDLZbVDkCu3hTn3S9U=UiV&raQ8g(Q z?UYt)#kwu^PD=0B4ckBIrnF=+m)n+OIyFjJpRABT5Pg)o+>jSwaL%lJotrMDZ^7&3 zF=cY!9>|eBQV-!k2?kQXdPrcP87O0rnOs^kepqUfZ*$tvr6#p2EQvn32Db;{yGjVz PgRVoZgA5!1f|v6LpDE;S literal 0 HcmV?d00001 diff --git a/Objects/tree.py b/Objects/tree.py index 8435519..7762aaa 100644 --- a/Objects/tree.py +++ b/Objects/tree.py @@ -1,7 +1,14 @@ +import hashlib + class Tree: - def setTree(self, sha1, blobsha1): - self.sha1 = sha1 - self.blobsha1 = list(blobsha1) + def setTree(self, blobsha1_list): + # blobsha1_list : liste des chemins de fichiers blob + contenu_total = b"" + for blob_path in blobsha1_list: + with open(blob_path, "rb") as f: + contenu_total += f.read() + self.sha1 = hashlib.sha1(contenu_total).hexdigest() + self.blobsha1 = blobsha1_list def getTreeHash(self): return self.sha1 \ No newline at end of file diff --git a/test/fff.txt b/test/fff.txt new file mode 100644 index 0000000..9d70ce1 --- /dev/null +++ b/test/fff.txt @@ -0,0 +1 @@ +je suis un deuxième \ No newline at end of file diff --git a/write-tree.py b/write-tree.py new file mode 100644 index 0000000..ce78b9f --- /dev/null +++ b/write-tree.py @@ -0,0 +1,10 @@ +from Objects.tree import Tree + +import os +print(os.listdir("./test/")) + +files = os.listdir("./test/") + +tree = Tree() +tree.setTree([os.path.join("./test/", f) for f in files]) +print(tree.sha1) \ No newline at end of file From c30a2e243c07f37b07de92a829b4438ab8d39fa2 Mon Sep 17 00:00:00 2001 From: bnjjs1998 Date: Tue, 17 Jun 2025 13:31:34 +0100 Subject: [PATCH 10/35] mise en place de la fonction qui contient l'index --- main.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/main.py b/main.py index 4965176..610f912 100755 --- a/main.py +++ b/main.py @@ -38,6 +38,9 @@ def init_repo(): f.write("ref: refs/heads/main\n") print("Dépôt initialisé.\nVous êtes dans la branche 'main'.") +def update_index(file_path, blob_hash): + print("hello") + def add_file(file_path): with open(file_path, "rb") as f: content = f.read() @@ -46,8 +49,12 @@ def add_file(file_path): with open(blob_path, "wb") as f: f.write(content) + + update_index(file_path, blob_hash) print(f"Fichier '{file_path}' ajouté (Blob: {blob_hash})") + + def commit_changes(message): # Créer un Tree (simplifié) tree_data = {"files": []} # En vrai, on stocke une structure de dossiers/fichiers From 300199aa411561f76984d40c521b03354b0b4d1a Mon Sep 17 00:00:00 2001 From: bnjjs1998 Date: Tue, 17 Jun 2025 14:41:54 +0100 Subject: [PATCH 11/35] commande add affiche le print mis dans la fonction update_index --- fichier.txt | 1 + main.py | 1 + test/fichier.txt | 1 - 3 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 fichier.txt delete mode 100644 test/fichier.txt diff --git a/fichier.txt b/fichier.txt new file mode 100644 index 0000000..58f8463 --- /dev/null +++ b/fichier.txt @@ -0,0 +1 @@ +Ceci est un fichier de textekpepkroperkeprekeo \ No newline at end of file diff --git a/main.py b/main.py index 610f912..5ac04c2 100755 --- a/main.py +++ b/main.py @@ -41,6 +41,7 @@ def init_repo(): def update_index(file_path, blob_hash): print("hello") + def add_file(file_path): with open(file_path, "rb") as f: content = f.read() diff --git a/test/fichier.txt b/test/fichier.txt deleted file mode 100644 index 8a458f4..0000000 --- a/test/fichier.txt +++ /dev/null @@ -1 +0,0 @@ -Ceci est un fichier de texte \ No newline at end of file From 8660164958437e89f5f89dc59ade426e1a69eb4d Mon Sep 17 00:00:00 2001 From: bnjjs1998 Date: Tue, 17 Jun 2025 17:48:09 +0100 Subject: [PATCH 12/35] =?UTF-8?q?v=C3=A9rification=20de=20l'existence=20du?= =?UTF-8?q?=20fichier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/main.py b/main.py index 5ac04c2..2785d34 100755 --- a/main.py +++ b/main.py @@ -40,7 +40,10 @@ def init_repo(): def update_index(file_path, blob_hash): print("hello") + if not os.path.isfile(file_path): + print("le fichier n'existe pas") + # si le fichier existe, je vais sortir le h du fichier pour le comparer def add_file(file_path): with open(file_path, "rb") as f: From aa760110a3bf2a63c5f70ac3655ce9a150f73806 Mon Sep 17 00:00:00 2001 From: damnthonyy Date: Wed, 18 Jun 2025 00:38:50 +0200 Subject: [PATCH 13/35] Add ls_files script to list files in a Git repository --- ls_files.py | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 ls_files.py diff --git a/ls_files.py b/ls_files.py new file mode 100644 index 0000000..cd0a794 --- /dev/null +++ b/ls_files.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python3 +import os, struct, sys + +def find_git_dir(path): + prev = None + while path != prev: + dot = os.path.join(path, ".git") + if os.path.isdir(dot): + return dot + prev, path = path, os.path.dirname(path) + sys.exit("Erreur : pas de dépôt Git ici.") + +def read_index_header(f): + header = f.read(12) + sig, version, n = struct.unpack(">4sLL", header) + if sig != b"DIRC": + sys.exit("Erreur : index corrompu.") + return version, n + +def read_index_entries(f, n_entries): + entries = [] + for _ in range(n_entries): + head = f.read(62) + # les deux derniers octets de head sont les flags + flags = struct.unpack(">H", head[60:62])[0] + name_len = flags & 0x0FFF + name = f.read(name_len).decode("utf-8", "surrogateescape") + # calcul du padding à 8 octets + total = 62 + name_len + pad = (8 - (total % 8)) or 0 + f.read(pad) + entries.append(name) + return entries + +def ls_files(): + gitdir = find_git_dir(os.getcwd()) + idx = os.path.join(gitdir, "index") + if not os.path.exists(idx): + sys.exit("") # index inexistant → rien à lister + with open(idx, "rb") as f: + version, n = read_index_header(f) + files = read_index_entries(f, n) + for p in files: + print(p) + +if __name__ == "__main__": + ls_files() From 9157d9657ff56b2f18cabb718d94b70f532245d3 Mon Sep 17 00:00:00 2001 From: damnthonyy Date: Wed, 18 Jun 2025 00:41:40 +0200 Subject: [PATCH 14/35] Update terminal.py to support unknown arguments and execute ls_files command --- __pycache__/ls_files.cpython-313.pyc | Bin 0 -> 2773 bytes terminal.py | 20 ++++++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 __pycache__/ls_files.cpython-313.pyc mode change 100644 => 100755 terminal.py diff --git a/__pycache__/ls_files.cpython-313.pyc b/__pycache__/ls_files.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c063a740487da3fd970b4aba879d00468077ccc GIT binary patch literal 2773 zcmai0TW=Fr5I*a@cx}g*B#lcbkR?F@i`*!oluLpLw{S~aZ%v~H$=cW(XG^?x&#nXH zp-o$%t_#!-62-Jgj`r2eNhrmnn239k?ne?#?U?>>@UZYKZ-P^Lqt1*n2QPz- zG(uxk!ltO>nR5WYQSg2}#lYizHCf&D3Vru_ZG>X3eKqfP)m|!KE#}&RVz2VXvw=0_ zSj#$J1=h~fFSBz%HKGmw)oVv`-4BQzim)RyTu(|fa}o%jz*x;;>7bNV3@NEf$;S_~ zkAEk{Tv%V7ii432R&h0riSzMp#V42+~-c zCTuce8Z;e}B$1xpn4w~$H?1VbGnq@h$1{msTGdUXcTzRAL>&C-oigGR+LUVaWUrEj z2~AJZ(>Pp%17L+F*BA#jiz>e0?D2{>aJ{P<2o+NKRADMVRqCG)mjk;jw(9d2_UHE( z2J!=?=4ZaG3%;$D=CF09($aeG&HMZB?!SNJ?vV%mueUVHp>^w`X%dX6Ea>J=%G z!8nu7=6WJL;jpSCiC~yGmoSNt)3ZwA5~k?G6jUI=Ob}rbgj5WP)>6bh4QbReI$?B! zCL59~N!Sl7(nyWP?Mvb-DtI%T(|5)ZV30U}pl~67p*VE?!`YM7@RmF2Tj}{z4=$9$ z{hz%vd#t#<;`UmpFFvV?zJmCb_@r_7k78HF*JK@h!nNQa*htjl3L9E;cD%A92 zmDckD@vW_!(QpAForSDX>2SHq~I@!}SG?9t;;{a8~C;&v8H zoNyF3grAsFQU(!edx=k}I^pa_!g#@;(@3Btrk-Wh6>a9>EihH8H@WZ6u#rX63wAC9JLfMy={s5u4q4nUp{C;KoFAlvq2h_s(Ye$4PoD*L z%)1}L0@6Op{ z&gdM>50*Nf`L-?iw$)m3vFS!b)#JAk#r_*@rK8oB&iRkaEs?y}a#us`^LxsnT^9d> zN8Z+D0R@^ZrYia^}nFO^?STq8+l8 z#$nGN3Xs*f*k41%?Vb>Si0pc)ee&USCYhU32k`*tK$?)T7ua)_VVK`hxQxO}oSWIR l)WkF4rGTGlUfSki8lmpE25Y9ww*JgDTs!leMciiF=)aik0tEm7 literal 0 HcmV?d00001 diff --git a/terminal.py b/terminal.py old mode 100644 new mode 100755 index c6884d1..2c69b2b --- a/terminal.py +++ b/terminal.py @@ -1,11 +1,23 @@ +#!/usr/bin/env python3 import argparse +import sys +from ls_files import ls_files # importe ta fonction ls_files parser = argparse.ArgumentParser() -parser.add_argument("--force", help="Hasher le fichier", action="store_true") -args = parser.parse_args() +parser.add_argument( + "--force", + help="Hasher le fichier (uniquement pour hash-object)", + action="store_true" +) +# on autorise les arguments inconnus pour récupérer ls-files +args, unknown = parser.parse_known_args() -print(f"L'option de hashage a pour valeur {args.force}") +# Si la première "commande" inconnue est ls-files ou ls_files, on l’exécute +if unknown and unknown[0] in ("ls-files", "ls_files"): + ls_files() + sys.exit(0) +# Sinon, on reste sur le comportement existant +print(f"L'option de hashage a pour valeur {args.force}") -#test From 668d1eb386afd7a14c116641869cbc8f05b33ed2 Mon Sep 17 00:00:00 2001 From: damnthonyy Date: Wed, 18 Jun 2025 00:54:45 +0200 Subject: [PATCH 15/35] Remove unnecessary newline in terminal.py --- terminal.py | 1 - 1 file changed, 1 deletion(-) diff --git a/terminal.py b/terminal.py index 2c69b2b..519b053 100755 --- a/terminal.py +++ b/terminal.py @@ -16,7 +16,6 @@ if unknown and unknown[0] in ("ls-files", "ls_files"): ls_files() sys.exit(0) - # Sinon, on reste sur le comportement existant print(f"L'option de hashage a pour valeur {args.force}") From 76caff4fdda879021d172f2e1ae7d5883a7cb13e Mon Sep 17 00:00:00 2001 From: AkaTFL <184939597+AkaTFL@users.noreply.github.com> Date: Wed, 18 Jun 2025 11:21:51 +0200 Subject: [PATCH 16/35] ajout du commit-tree et fix du write-tree --- Objects/__pycache__/commit.cpython-313.pyc | Bin 0 -> 3473 bytes Objects/__pycache__/tree.cpython-313.pyc | Bin 1101 -> 1906 bytes Objects/commit.py | 46 ++++++++++++++++-- Objects/tree.py | 24 +++++++-- commit-tree.py | 14 ++++++ test/fichier.txt | 1 - test/{ => fichiers}/fff.txt | 0 test/fichiers/fichier.txt | 1 + .../707e0a06550b19e1a50c350da6ce59da8f6788e1 | 2 + .../3513413266ebbad20240bf88651e7745bea68d69 | Bin 0 -> 55 bytes .../636bb6f65d3b29763ecdb4fa1f83206dadc2488d | Bin 0 -> 56 bytes write-tree.py | 6 +-- 12 files changed, 80 insertions(+), 14 deletions(-) create mode 100644 Objects/__pycache__/commit.cpython-313.pyc create mode 100644 commit-tree.py delete mode 100644 test/fichier.txt rename test/{ => fichiers}/fff.txt (100%) create mode 100644 test/fichiers/fichier.txt create mode 100644 test/objects/commit/707e0a06550b19e1a50c350da6ce59da8f6788e1 create mode 100644 test/objects/tree/3513413266ebbad20240bf88651e7745bea68d69 create mode 100644 test/objects/tree/636bb6f65d3b29763ecdb4fa1f83206dadc2488d diff --git a/Objects/__pycache__/commit.cpython-313.pyc b/Objects/__pycache__/commit.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1b9c79247b2fbb959eefd6c5d286280affa0afa GIT binary patch literal 3473 zcmbtXZ%iA>6`!@&f7gZpPK=E&7%(Kh<8Kg!a5>sL&|#@SD{rhu0%^P0YuFrKbF=G` za97=_YEMu_!s%UEQ8k8(cu-C-$6@=YQYws!B*bQTZ8C2gIS&pB5dPr zK<&I8sDpO^b@EQ2F5ZRRE0!on?9j}=(#dDLN!I^IdKRBMFS0)}crH*?u z_F%c5JGkZWXKD|l#Q{^E_n6wlXa!w6a~$&@@O{YCaNM7;T=)4}_!z~B(@cv|LxWpq z=e>N>Weeb|?}yXcY~rq+*3pKIFg?DnVcpY{zOJAy)Q`;Dkb)YJ1`C~#hcH_B-CNd9 zlxAKov4RYV=$VC0n}#JROc?j3V_n3OqJ=kYIW0XfvDv0csy38ezAhy-bttLVG-AQa zm?r5dEg_q>l&DGJO^e(86d<77k11>=Y{-V?6sVKm&q-nFhOB~M>f!G7hlRoL+qq;; z2`ky$uOu;NN+hePNJ!08djs}TcQj*z}L>#N4y1FJW6INXnM~G`x zx{;Ds041?xRl=@|+A3kMXJrL;P>aCJu1gAGu_UI5JtgT{-0J$8tgXq4q!PEPiC9xN zWY}rNQkvL}AP^_@Op`Mb@uqP$BdghT7H33_uyldgbRERH2HI_^hUInQ$VjRxuE5$l zmKBXymFxy_X2kcTl#Eqk+rY9WMLmFBT1yib4ZA?yz}*lu!WnjT4rww1C?vCr1|cM# z+I;yYqy(VJSkQfSrR6or7&2+%FvVHw8^EBRsZe}S_(UUbPERf+R0*p~84!?{X0pj# z2CS${v$7V;EibKt-$`Lb)|P%||ja#E1ZLm(K9;= zbrk{yu6SubFu2w9FYa8`6D&B2T;bP$d1wFpc*!%qweXFVKbT%gVu-EtoI&fT58J$rZV_FSR;&zE;EmwjVft^>}y zGrm2(GqpW+FIwRuUvZIxma}=e;Cs~4SL~_=J0A4i@B8D$2SfLViWkbkOL<2%)Kdu! zmO_L73=QXJs{W3&21crNSz#aps!85*R55Mh+tVmB?5rGFFL9mm~<$2%^ z!^JwSf4}l}1iC%8H8yPB>vYEk9DBp=*pwql@4DIOSpTF6!r%@(aB*|xL?1!B%tDmG z^ljf|FntD8x-pC|0VUoQ^Hjy)f)iiuWPOiIi~Aux%pap_bKB0%?VJ0~_CuJX{|65K z5o`oN^Z~@h8zBIg=0 z8T`xNhxEbr2m8*T4k>CgvakEB+t4#XkEn4vIN}rpMa)QoK-_|m$)<8pZ3W^Hg!gme zT5Y9S5YkZJ_4h={3Ie8y!4s6cMafSnnWp4jAmpqdz>`A@tf;}Wv7Cd7E(p8EG16}X zrXTM*q3^8P1>_U-t)#{oGz%ppn-FMKk(4S;)D($CB~ZvkSBuJGA4m}X{&~R%12l59%p#lxunoDkJP>YmPXV%^jp;mpC-n@D9y*J;! zH#6Rs^%1`_jSP7|NA z$z-A7YG|%G*;lFY2y%cq9WbwRSYR2js0&m_bP-3(5iLr@DU8r_wtu0SI!F+snv#V5 zZ>X0N;%q+4wZpZu0Jbm_ZUR}FG^E6XEl&4mSkw_2Y0l5fG@7R$M}J|I3O5D;5}?wL zn~8*hS$?Fs$1%{w4}=Wkb42t=h_NHnne%kjj?PFSC=(ProHfQi$VS7M4CQiELY`Tu zzGgDrT7A8@9<^gLtzlHAEwm2D%!xxgw5DhOjZ66bw)8(4-wN{_j#(-E3U*wWm`Q+{ z&V~)3$HH|L%J4@1t`KoJ(wf9{Nso{6D!kEGNpA@mvc6`;OwVCVXdPCQcJD}6%g_sh z5b`V1ZkFf{CuyHm80T&b0DLT*gcA4PsB#mbB_{XTj)cegyAh8bSCw#ZH{yGx^B>-A z^N{NeJNcWa;JL$Wb=bc`(OFw9IJKJPsa6r$o^{(tD!OC29#V^It2ftHhSX2|f^Vy~ z<9~@vKSUSs+UnZs(3HjzDZm@fEyB;`wc|u|W|2)qjLaets?>}kyWkWNiB(LuQnm6# zbSvijBwj&xidLEOB2vEUjE8r8io& zMfpI0w$mG_fj=v_ z+Va$v+_z%xB;|$i`SHc;Tgi7Q>tpY(%Y6sEl>K&U;MIXj9ly(cuUvLxAGVKmN1j64 z*pTqFyJhTL{OM53*riyZ`KnO_0JDQPmR-w7kcABM9+7^~xJiw}?bJ_)ZaTOuP{sXJ zlUNyfSLqpOcAz;6Q1nS)9XQ^;aBu$Jy7V??@0i91nQ)5QlUj^OhGCmEWEiByFltWG zr)R_4Va?0A@-hpoI%Z=+$XLa@M_X-2)ijxkMpH#*gEYFRS7Ime2r40ALkwN0#~mWwSqTYg#wB** zPgq#`0TLoX#>U!0q+W@Y`%OvA;>@|{`_8#1x1wG7wYPA%2E=#XHD0(Rj%K8i;&cpo z$de&pU_c7;v;p!`mf{`&BhJ_ek(|>weFo>E5So#z1AqyYuaj7iW=U0<2yllabm?zC z9a&a>Ie(#v^hgn)PilfiVoIZLIB_YPH&s_&U9(nPnOSoS+?CSQRCuSHQEYT`E>DH< zN_$qoHazi9xij~!Lagy*_;C0vajSRS>$w{}cdPg8%KL!_qvas{<%4M3U0v(99Tcvk z`hjNUvbkm;6X1&4JslF7NmwnWV)rD|1-ii{Yh#jG*5I67a3jdt|0!YIM&~v>)Yg|v zd!=i?!F)n6DbvJ{g?L%*RbxmEexs(gFqL6<5Aa>QfE}n%pVImfB}&{2@WvtqyH@v` nkYRSUnZLKVy0E!y^|PeVu(BN$@G22P9zpw(gCt%70iNdvt{`O4 diff --git a/Objects/commit.py b/Objects/commit.py index 36c0b89..da870c1 100644 --- a/Objects/commit.py +++ b/Objects/commit.py @@ -1,12 +1,47 @@ +import hashlib import datetime +import os class Commit: - def setCommit(self, sha1, ref, message): - self.sha1 = sha1 + def setCommit(self, tree_sha1, message, parent_sha1=None): + + # Construction du contenu du commit + commit_content = f"tree {tree_sha1}\n" + if parent_sha1: + commit_content += f"parent {parent_sha1}\n" + + commit_bytes = commit_content.encode("utf-8") + + self.sha1 = hashlib.sha1(commit_bytes).hexdigest() + + # Sauvegarde dans test/objects/ + dir_path = "test/objects/commit" + file_path = os.path.join(dir_path, self.sha1) + if os.path.exists(file_path): + with open(file_path, "rb") as f: + content = f.read().decode("utf-8") + for line in content.splitlines(): + if line.startswith("tree "): + self.ref = line[5:] + elif line.startswith("parent "): + self.parent = line[7:] + elif line.startswith("date "): + self.date = datetime.datetime.fromisoformat(line[5:]) + parts = content.split("\n\n", 1) + + if len(parts) > 1: + self.message = parts[1].strip() + print("Un commit identique existe déjà. Aucun nouveau commit créé.") + return + + self.ref = tree_sha1 self.date = datetime.datetime.now() - self.ref = ref self.message = message + os.makedirs(dir_path, exist_ok=True) + with open(file_path, "wb") as f: + f.write(commit_bytes) + def getCommitHash(self): return self.sha1 @@ -17,4 +52,7 @@ def getCommitRef(self): return self.ref def getCommitMessage(self): - return self.message \ No newline at end of file + return self.message + + def getCommitParent(self): + return self.parent \ No newline at end of file diff --git a/Objects/tree.py b/Objects/tree.py index 7762aaa..236f2b4 100644 --- a/Objects/tree.py +++ b/Objects/tree.py @@ -1,14 +1,28 @@ +import os import hashlib class Tree: def setTree(self, blobsha1_list): - # blobsha1_list : liste des chemins de fichiers blob contenu_total = b"" for blob_path in blobsha1_list: with open(blob_path, "rb") as f: contenu_total += f.read() - self.sha1 = hashlib.sha1(contenu_total).hexdigest() + header = f"tree {len(contenu_total)}\0".encode("utf-8") + tree_data = header + contenu_total + + self.sha1 = hashlib.sha1(tree_data).hexdigest() self.blobsha1 = blobsha1_list - - def getTreeHash(self): - return self.sha1 \ No newline at end of file + + # Sauvegarde dans test/objects/ + dir_path = "test/objects/tree/" + file_path = os.path.join(dir_path, self.sha1) + if os.path.exists(file_path): + print("Un commit identique existe déjà. Aucun nouveau commit créé.") + return + + os.makedirs(dir_path, exist_ok=True) + with open(file_path, "wb") as f: + f.write(tree_data) + + def getBlob(self): + return self.blobsha1 \ No newline at end of file diff --git a/commit-tree.py b/commit-tree.py new file mode 100644 index 0000000..b3688c0 --- /dev/null +++ b/commit-tree.py @@ -0,0 +1,14 @@ +# git commit-tree -m "msg" [-p ] + +import argparse +from Objects.commit import Commit + +parser = argparse.ArgumentParser() +parser.add_argument("tree_sha", help="SHA1 du tree à committer") +parser.add_argument("-m", help="message du commit", required=True) +parser.add_argument("-p", help="SHA1 du commit parent (optionnel)", required=False) + +args = parser.parse_args() + +commit = Commit() +commit.setCommit(args.tree_sha, args.m, args.p) \ No newline at end of file diff --git a/test/fichier.txt b/test/fichier.txt deleted file mode 100644 index 8a458f4..0000000 --- a/test/fichier.txt +++ /dev/null @@ -1 +0,0 @@ -Ceci est un fichier de texte \ No newline at end of file diff --git a/test/fff.txt b/test/fichiers/fff.txt similarity index 100% rename from test/fff.txt rename to test/fichiers/fff.txt diff --git a/test/fichiers/fichier.txt b/test/fichiers/fichier.txt new file mode 100644 index 0000000..0ff4ccd --- /dev/null +++ b/test/fichiers/fichier.txt @@ -0,0 +1 @@ +Ceci est un fichier de text \ No newline at end of file diff --git a/test/objects/commit/707e0a06550b19e1a50c350da6ce59da8f6788e1 b/test/objects/commit/707e0a06550b19e1a50c350da6ce59da8f6788e1 new file mode 100644 index 0000000..1de2619 --- /dev/null +++ b/test/objects/commit/707e0a06550b19e1a50c350da6ce59da8f6788e1 @@ -0,0 +1,2 @@ +tree 3513413266ebbad20240bf88651e7745bea68d69 +parent 617696920ea5abbee4567b4cec05b3a6d6f09e5d diff --git a/test/objects/tree/3513413266ebbad20240bf88651e7745bea68d69 b/test/objects/tree/3513413266ebbad20240bf88651e7745bea68d69 new file mode 100644 index 0000000000000000000000000000000000000000..5af060941fb3d5b4ff3073663f79d176999f7f50 GIT binary patch literal 55 zcmXRZN=;QTF=xn1RVXgaELJGZQ%FfIt;jsQA~)4JH91ouwYUT%n3kEGk(pWqlvF55 HttbHiCXEys literal 0 HcmV?d00001 diff --git a/test/objects/tree/636bb6f65d3b29763ecdb4fa1f83206dadc2488d b/test/objects/tree/636bb6f65d3b29763ecdb4fa1f83206dadc2488d new file mode 100644 index 0000000000000000000000000000000000000000..1fc2d2fc41f77b60a638438f2cce754bd21c7657 GIT binary patch literal 56 zcmXRZN=;QTv0%tbRVXgaELJGZQ%FfIt;jsQA~)4JH91ouwYUT%n3kEGk(pWqlvF55 Ittd$a06RSte*gdg literal 0 HcmV?d00001 diff --git a/write-tree.py b/write-tree.py index ce78b9f..b1e662d 100644 --- a/write-tree.py +++ b/write-tree.py @@ -1,10 +1,8 @@ from Objects.tree import Tree import os -print(os.listdir("./test/")) -files = os.listdir("./test/") +files = os.listdir("./test/fichiers/") tree = Tree() -tree.setTree([os.path.join("./test/", f) for f in files]) -print(tree.sha1) \ No newline at end of file +tree.setTree([os.path.join("./test/fichiers/", f) for f in files]) \ No newline at end of file From ffb6e979410608d08cd8332a1dada383e7c19c38 Mon Sep 17 00:00:00 2001 From: AkaTFL <184939597+AkaTFL@users.noreply.github.com> Date: Wed, 18 Jun 2025 11:24:36 +0200 Subject: [PATCH 17/35] refix (ajout date et parent dans commit) --- Objects/__pycache__/commit.cpython-313.pyc | Bin 3473 -> 3677 bytes Objects/commit.py | 2 ++ ... 22199b3b3d116445ec49ae3bd664de93a5119db8} | 2 ++ 3 files changed, 4 insertions(+) rename test/objects/commit/{707e0a06550b19e1a50c350da6ce59da8f6788e1 => 22199b3b3d116445ec49ae3bd664de93a5119db8} (66%) diff --git a/Objects/__pycache__/commit.cpython-313.pyc b/Objects/__pycache__/commit.cpython-313.pyc index e1b9c79247b2fbb959eefd6c5d286280affa0afa..1188b1c0a11cf28063456430eef92162750bb7ae 100644 GIT binary patch delta 1511 zcmah}O-vg{6n?YbU9We&{3l@64$I1Ev4DhNkRhO`X__WJK&u_CiiCu5iklz>ldKmZ zktpGkD4ZfRiPR&9ss*WsO1Vdss#Zcot*snDmU^$mC8F(xL)DqJ$A%zWlUIIoAY5*)G19{OAaljEOyM7(Ow}{is%U?EE zjz~K|R)tQ%mYA44<{Rj#^0FZSdbi{Rj-88k@W@3~70bh@qUI%1M(4=PC7wrJbJVpxRw^Z?0j9{3o{nh$1gHr`Vzkg>--`UZo^bly=|w|=?@?a zQY&T3tOqQY;FAb3&r5VF0E6m`{FXYOB{Ni#sG+$W!X3<^9dPI{wvL=s^-{d%o zlYRLOKBVKm3h!iyc5g&Bw9Ua{~4TH#ff8NN?K3&ViCLP%&Nqu4mUumaOEi zl`2`Ox7O&cb**Gwduv@Uc7Oi!tzu`oq@-W%1b;&2FNsgJv=R7qjN1-1<} zod|CCsp-o>^1C)f{s_sfEwmq7$YtYIU~kWKljN^Z54uR2)ya+&wIq;hQsItJs8N>H z9*wos9b+&~cC-;rj-4PMsvn_Y(yg_jW5oCg;#2KHyB{V@k5*x?vGw`GwTDH;I3D5L z2}dK`mtvU|>W&ZA9u$>Mcbr-iQl$bvpzrMG$VzupkUcF2IcEN4qW_OZlwHRe(d|`2J>2B_d`vtk9NA(mk4uFDB`5&kc^bY_4 delta 1322 zcmah}T}TvB6h3!;c4p_twOq?x|Hh>)7h4m5*59NOY6*59W*88bP|GC)9b;Tc@*#^5 zeG0jS&`Z9RJq1NCy+xD{Js9*5iVr>Y7GgorQ}@p9oz*0|1Lxj3=R41Q@2v9 z|Il>>$og>KoN!k3Powt)fJa~<8&!bCb?}a0^UV}N)>sh07A)T8i?*Z=K*YD5zLF4XJ3))JinevTUOXB0MuM@>TE@6}ZTI}!zQW(d1nOZ^cB zvn4CQARIWdEt^#&M-<=W!j=1|1nr=CoEo$$NG}rhimjLt+`zZokt`6vhDlOWab@D9 zT4H7I<=x_0ZGLAoinZiYj0%R$T>58>;K3MI0meyy)GBPWd5J=4`2b56NBE5az0-iUeRL=zU$OW>^d8 z!=f0FOZpa#MKRzy3|E%B`JbZBco}@s!^WhaEhn?+W*a+|_ZZj#OSdX|Il{yDC-V?u z{7UoCfhWXStulLCEV%i+v4s@;TkH&o<70)qfs=s|6va;ig`i9og&R|O9F=+n-kH9I zO(~9Icux8lenVz@0d@mW*R&Q{Q=heOMp|F4$}f=dHhDo!H}dZW&YvLLhHy09#&0w# z>7=yLrlbcY{8;OZtfOoKxgo-S9l5miGxQrV+;;p*X+}xBqhxDRL_YSrjKg4#pC zZ`$eZUYdYReksBH^8BV8b^D1TAr=ep5_rxYMOwL=!k6{_C?)6iP;r)ub5smbaS=b! z>*F+t+fD`j8F+$D;tU=BMfl0Z#n@gJf7K(`JR}7r1ebnyZXFeL5{j-Fdh)|<$pcf< m26!YWIK$&+`v&=)Z3O diff --git a/Objects/commit.py b/Objects/commit.py index da870c1..ff95ce5 100644 --- a/Objects/commit.py +++ b/Objects/commit.py @@ -7,6 +7,8 @@ def setCommit(self, tree_sha1, message, parent_sha1=None): # Construction du contenu du commit commit_content = f"tree {tree_sha1}\n" + commit_content += f"message {message}\n" + commit_content += f"date {datetime.datetime.now().isoformat()}\n" if parent_sha1: commit_content += f"parent {parent_sha1}\n" diff --git a/test/objects/commit/707e0a06550b19e1a50c350da6ce59da8f6788e1 b/test/objects/commit/22199b3b3d116445ec49ae3bd664de93a5119db8 similarity index 66% rename from test/objects/commit/707e0a06550b19e1a50c350da6ce59da8f6788e1 rename to test/objects/commit/22199b3b3d116445ec49ae3bd664de93a5119db8 index 1de2619..5466ea8 100644 --- a/test/objects/commit/707e0a06550b19e1a50c350da6ce59da8f6788e1 +++ b/test/objects/commit/22199b3b3d116445ec49ae3bd664de93a5119db8 @@ -1,2 +1,4 @@ tree 3513413266ebbad20240bf88651e7745bea68d69 +message bonsoir +date 2025-06-18T11:24:08.931614 parent 617696920ea5abbee4567b4cec05b3a6d6f09e5d From 6d1810a0a872fef55cb6936280f44ec9d5206665 Mon Sep 17 00:00:00 2001 From: bnjjs1998 Date: Wed, 18 Jun 2025 11:33:24 +0100 Subject: [PATCH 18/35] =?UTF-8?q?plus=20qu'=C3=A0=20changer=20le=20commit?= =?UTF-8?q?=20change?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/main.py b/main.py index 2785d34..1d05a3b 100755 --- a/main.py +++ b/main.py @@ -40,10 +40,18 @@ def init_repo(): def update_index(file_path, blob_hash): print("hello") - if not os.path.isfile(file_path): - print("le fichier n'existe pas") - # si le fichier existe, je vais sortir le h du fichier pour le comparer + index_path = ".fyt/index" + if os.path.exists(index_path): + with open(index_path, "r") as f: + index = json.load(f) + else: + index = {} + + index[file_path] = blob_hash + # Sauvegarder l'index + with open(index_path, "w") as f: + json.dump(index, f) def add_file(file_path): with open(file_path, "rb") as f: From a19c0bdb97a8eca4a29781acd46b0fd9b30c07ab Mon Sep 17 00:00:00 2001 From: AkaTFL <184939597+AkaTFL@users.noreply.github.com> Date: Wed, 18 Jun 2025 14:11:41 +0200 Subject: [PATCH 19/35] adaptation terminale.py --- Objects/__pycache__/commit.cpython-313.pyc | Bin 3677 -> 3677 bytes Objects/__pycache__/tree.cpython-313.pyc | Bin 1906 -> 1906 bytes __pycache__/commit_tree.cpython-313.pyc | Bin 0 -> 445 bytes __pycache__/ls_files.cpython-313.pyc | Bin 2773 -> 2780 bytes __pycache__/write_tree.cpython-313.pyc | Bin 0 -> 660 bytes commit-tree.py | 14 ------- commit_tree.py | 5 +++ terminal.py | 37 ++++++++++-------- .../22199b3b3d116445ec49ae3bd664de93a5119db8 | 4 -- .../aede5ac7a0b18f863ad1a3e6b44731dc279d0b96 | 3 ++ .../636bb6f65d3b29763ecdb4fa1f83206dadc2488d | Bin 56 -> 0 bytes write-tree.py | 8 ---- write_tree.py | 8 ++++ 13 files changed, 37 insertions(+), 42 deletions(-) create mode 100644 __pycache__/commit_tree.cpython-313.pyc create mode 100644 __pycache__/write_tree.cpython-313.pyc delete mode 100644 commit-tree.py create mode 100644 commit_tree.py delete mode 100644 test/objects/commit/22199b3b3d116445ec49ae3bd664de93a5119db8 create mode 100644 test/objects/commit/aede5ac7a0b18f863ad1a3e6b44731dc279d0b96 delete mode 100644 test/objects/tree/636bb6f65d3b29763ecdb4fa1f83206dadc2488d delete mode 100644 write-tree.py create mode 100644 write_tree.py diff --git a/Objects/__pycache__/commit.cpython-313.pyc b/Objects/__pycache__/commit.cpython-313.pyc index 1188b1c0a11cf28063456430eef92162750bb7ae..40aa9d8cbca311464ba1bddebe09b8be603626a1 100644 GIT binary patch delta 19 ZcmcaBb61AzGcPX}0}yQM*vJ*k2LL?u1#SQU delta 19 ZcmcaBb61AzGcPX}0}yO(-N+Tp2LL?N1!w>O diff --git a/Objects/__pycache__/tree.cpython-313.pyc b/Objects/__pycache__/tree.cpython-313.pyc index 23677be618ab1c3d29d739656a49d6f7ce2e10ce..fec03311956b51548b733e0ac4ac7b09be66e24f 100644 GIT binary patch delta 19 Zcmeyw_lb||GcPX}0}yQM*vOT^4gfwc1&ROw delta 19 Zcmeyw_lb||GcPX}0}xo&Y~;#d2LL+-1pxp6 diff --git a/__pycache__/commit_tree.cpython-313.pyc b/__pycache__/commit_tree.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..695d8fd5728bcb0e595202e0cd1a48be54f13ca4 GIT binary patch literal 445 zcmYjNze~eF6n=L}Yi+G)H#@~e$Wl-!6e%th6om>61;Ic`{#Q3GbztKEN>X$nAwJFzxS{F=avusn9Bxh_OMxI)Wm=IpTRC(rcHjyb=^wXt;iG>!LYIP3XzF=Iq zk;i4|9#8!^LbY&DLU|ew-4TY7{QahSn$2aVVZz0s@ T68iDSAcTCv?ypJ7K`Q?P&&6em literal 0 HcmV?d00001 diff --git a/__pycache__/ls_files.cpython-313.pyc b/__pycache__/ls_files.cpython-313.pyc index 9c063a740487da3fd970b4aba879d00468077ccc..b0496477440aa93d3ce75f350fa45e8ba55e411f 100644 GIT binary patch delta 71 zcmcaAdPkJ^GcPX}0}$-)2+EkWkyn;U+tk@ACbT%Us5mA!v8W_7#w90>(P4h7f7`zGU`b$-h@4QbEeH0AIy8-_r1q^^JdaQAqU!$-CFCNjz0{s zh6f&_H#r-^;?%M|-akw=`;mDn(ASq&V0()Zf!!>ZMx zW+(hp0A}=*3OW-KSRJvc$^axNL^ao{!x+LOJjMbCAn+tCUDi9{|0ZRIl@`^;EE>i- z3UOs{tB3ghEWj9ex?_Uvojho2ex^0R$16MIy)g9eLRjB*k9qY8J0a@$PEO~$#| zUAclv^E8TVugjJqTV0m;jv8sOHWi9UlR^z)YCX?WH>x+IQ0Q(^XPrwHEp+2vhbB@) zcbQ!3ZA2|9S-jR{GJ3+9q-&-@dHbo#4JkjTn-P7)9qsz?Eth{;+ASSlxO$Si)}Q^E zExfqczw!l-KA(FwcNCr!t8c?M=oLP2_uPa0UjBGGIGp%Ae*Gx?P^^B!3x7TqtHON9 zVd?fv#wRNOU}KBMQk2c`(>1wCpU!;^sfNG{+NsQ~PIt4{rt|!~rsj9Wgm%9jgwS`G O{tDTY5VVN6QU3yuH-_2( literal 0 HcmV?d00001 diff --git a/commit-tree.py b/commit-tree.py deleted file mode 100644 index b3688c0..0000000 --- a/commit-tree.py +++ /dev/null @@ -1,14 +0,0 @@ -# git commit-tree -m "msg" [-p ] - -import argparse -from Objects.commit import Commit - -parser = argparse.ArgumentParser() -parser.add_argument("tree_sha", help="SHA1 du tree à committer") -parser.add_argument("-m", help="message du commit", required=True) -parser.add_argument("-p", help="SHA1 du commit parent (optionnel)", required=False) - -args = parser.parse_args() - -commit = Commit() -commit.setCommit(args.tree_sha, args.m, args.p) \ No newline at end of file diff --git a/commit_tree.py b/commit_tree.py new file mode 100644 index 0000000..a949e6b --- /dev/null +++ b/commit_tree.py @@ -0,0 +1,5 @@ +from Objects.commit import Commit + +def commit_tree(tree_sha, message, parent_sha=None): + commit = Commit() + commit.setCommit(tree_sha, message, parent_sha) \ No newline at end of file diff --git a/terminal.py b/terminal.py index 519b053..8bbc828 100755 --- a/terminal.py +++ b/terminal.py @@ -1,22 +1,27 @@ -#!/usr/bin/env python3 import argparse -import sys -from ls_files import ls_files # importe ta fonction ls_files +from ls_files import ls_files +from write_tree import write_tree +from commit_tree import commit_tree parser = argparse.ArgumentParser() -parser.add_argument( - "--force", - help="Hasher le fichier (uniquement pour hash-object)", - action="store_true" -) -# on autorise les arguments inconnus pour récupérer ls-files -args, unknown = parser.parse_known_args() +subparsers = parser.add_subparsers(dest="command") -# Si la première "commande" inconnue est ls-files ou ls_files, on l’exécute -if unknown and unknown[0] in ("ls-files", "ls_files"): - ls_files() - sys.exit(0) -# Sinon, on reste sur le comportement existant -print(f"L'option de hashage a pour valeur {args.force}") +# Sous-commande ls-files +subparsers.add_parser("ls-files") + +# Sous-commande write-tree +subparsers.add_parser("write-tree") +commit_tree_parser = subparsers.add_parser("commit-tree") +commit_tree_parser.add_argument("tree_sha", help="SHA1 du tree à committer") +commit_tree_parser.add_argument("-m", required=True, help="message du commit") +commit_tree_parser.add_argument("-p", help="SHA1 du commit parent (optionnel)") +args = parser.parse_args() + +if args.command == "ls-files": + ls_files() +elif args.command == "write-tree": + write_tree() +elif args.command == "commit-tree": + commit_tree(args.tree_sha, args.m, args.p) \ No newline at end of file diff --git a/test/objects/commit/22199b3b3d116445ec49ae3bd664de93a5119db8 b/test/objects/commit/22199b3b3d116445ec49ae3bd664de93a5119db8 deleted file mode 100644 index 5466ea8..0000000 --- a/test/objects/commit/22199b3b3d116445ec49ae3bd664de93a5119db8 +++ /dev/null @@ -1,4 +0,0 @@ -tree 3513413266ebbad20240bf88651e7745bea68d69 -message bonsoir -date 2025-06-18T11:24:08.931614 -parent 617696920ea5abbee4567b4cec05b3a6d6f09e5d diff --git a/test/objects/commit/aede5ac7a0b18f863ad1a3e6b44731dc279d0b96 b/test/objects/commit/aede5ac7a0b18f863ad1a3e6b44731dc279d0b96 new file mode 100644 index 0000000..a79a568 --- /dev/null +++ b/test/objects/commit/aede5ac7a0b18f863ad1a3e6b44731dc279d0b96 @@ -0,0 +1,3 @@ +tree 3513413266ebbad20240bf88651e7745bea68d69 +message bonjour +date 2025-06-18T14:11:06.590542 diff --git a/test/objects/tree/636bb6f65d3b29763ecdb4fa1f83206dadc2488d b/test/objects/tree/636bb6f65d3b29763ecdb4fa1f83206dadc2488d deleted file mode 100644 index 1fc2d2fc41f77b60a638438f2cce754bd21c7657..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56 zcmXRZN=;QTv0%tbRVXgaELJGZQ%FfIt;jsQA~)4JH91ouwYUT%n3kEGk(pWqlvF55 Ittd$a06RSte*gdg diff --git a/write-tree.py b/write-tree.py deleted file mode 100644 index b1e662d..0000000 --- a/write-tree.py +++ /dev/null @@ -1,8 +0,0 @@ -from Objects.tree import Tree - -import os - -files = os.listdir("./test/fichiers/") - -tree = Tree() -tree.setTree([os.path.join("./test/fichiers/", f) for f in files]) \ No newline at end of file diff --git a/write_tree.py b/write_tree.py new file mode 100644 index 0000000..e757290 --- /dev/null +++ b/write_tree.py @@ -0,0 +1,8 @@ +from Objects.tree import Tree +import os + +def write_tree(): + files = os.listdir("./test/fichiers/") + + tree = Tree() + tree.setTree([os.path.join("./test/fichiers/", f) for f in files]) \ No newline at end of file From ad63061a9605cdbbadcb2e8e7976283273717d9a Mon Sep 17 00:00:00 2001 From: bnjjs1998 Date: Wed, 18 Jun 2025 17:26:55 +0100 Subject: [PATCH 20/35] =?UTF-8?q?plus=20qu'=C3=A0=20changer=20le=20commit?= =?UTF-8?q?=20change?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/main.py b/main.py index 1d05a3b..99fd48c 100755 --- a/main.py +++ b/main.py @@ -39,7 +39,6 @@ def init_repo(): print("Dépôt initialisé.\nVous êtes dans la branche 'main'.") def update_index(file_path, blob_hash): - print("hello") index_path = ".fyt/index" if os.path.exists(index_path): @@ -48,7 +47,10 @@ def update_index(file_path, blob_hash): else: index = {} - index[file_path] = blob_hash + rel_path = os.path.relpath(file_path, os.getcwd()) + file_stat = os.stat(file_path) + + index[rel_path] = blob_hash # Sauvegarder l'index with open(index_path, "w") as f: json.dump(index, f) @@ -68,8 +70,16 @@ def add_file(file_path): def commit_changes(message): + index_path = ".fyt/index" + if not os.path.exists(index_path): + print("Rien à commit. Utilisez 'add' avant.") + return + + # Charger l'index + with open(index_path, "r") as f: + index = json.load(f) # Créer un Tree (simplifié) - tree_data = {"files": []} # En vrai, on stocke une structure de dossiers/fichiers + tree_data = {"files": list(index.items())} # En vrai, on stocke une structure de dossiers/fichiers tree_json = json.dumps(tree_data).encode() tree_hash = hashlib.sha1(tree_json).hexdigest() From 6f41a9e47d2264a739e41c9ba5e871c5b318f00c Mon Sep 17 00:00:00 2001 From: AkaTFL <184939597+AkaTFL@users.noreply.github.com> Date: Thu, 19 Jun 2025 22:38:05 +0200 Subject: [PATCH 21/35] unification du code --- Objects/__pycache__/commit.cpython-313.pyc | Bin 3677 -> 3677 bytes Objects/__pycache__/o_commit.cpython-313.pyc | Bin 0 -> 3420 bytes Objects/__pycache__/o_tree.cpython-313.pyc | Bin 0 -> 2053 bytes Objects/__pycache__/tree.cpython-313.pyc | Bin 1906 -> 1906 bytes Objects/commit.py | 60 ---------- Objects/{blob.py => o_blob.py} | 0 Objects/o_commit.py | 60 ++++++++++ Objects/o_tree.py | 31 +++++ Objects/tree.py | 28 ----- __pycache__/add.cpython-313.pyc | Bin 0 -> 2064 bytes __pycache__/commit.cpython-313.pyc | Bin 0 -> 2398 bytes __pycache__/commit_tree.cpython-313.pyc | Bin 445 -> 447 bytes __pycache__/init.cpython-313.pyc | Bin 0 -> 743 bytes __pycache__/ls_files.cpython-313.pyc | Bin 2780 -> 1660 bytes __pycache__/write_tree.cpython-313.pyc | Bin 660 -> 398 bytes add.py | 34 ++++++ commit.py | 43 +++++++ commit_tree.py | 2 +- fichier.txt | 1 - init.py | 8 ++ ls_files.py | 47 +++----- main.py | 108 ------------------ terminal.py | 48 ++++++-- test/{fichiers => }/fff.txt | 0 test/{fichiers => }/fichier.txt | 0 .../aede5ac7a0b18f863ad1a3e6b44731dc279d0b96 | 3 - .../3513413266ebbad20240bf88651e7745bea68d69 | Bin 55 -> 0 bytes write_tree.py | 6 +- 28 files changed, 230 insertions(+), 249 deletions(-) create mode 100644 Objects/__pycache__/o_commit.cpython-313.pyc create mode 100644 Objects/__pycache__/o_tree.cpython-313.pyc delete mode 100644 Objects/commit.py rename Objects/{blob.py => o_blob.py} (100%) create mode 100644 Objects/o_commit.py create mode 100644 Objects/o_tree.py delete mode 100644 Objects/tree.py create mode 100644 __pycache__/add.cpython-313.pyc create mode 100644 __pycache__/commit.cpython-313.pyc create mode 100644 __pycache__/init.cpython-313.pyc create mode 100644 add.py create mode 100644 commit.py delete mode 100644 fichier.txt create mode 100644 init.py delete mode 100755 main.py rename test/{fichiers => }/fff.txt (100%) rename test/{fichiers => }/fichier.txt (100%) delete mode 100644 test/objects/commit/aede5ac7a0b18f863ad1a3e6b44731dc279d0b96 delete mode 100644 test/objects/tree/3513413266ebbad20240bf88651e7745bea68d69 diff --git a/Objects/__pycache__/commit.cpython-313.pyc b/Objects/__pycache__/commit.cpython-313.pyc index 40aa9d8cbca311464ba1bddebe09b8be603626a1..3c83f5876aae976794df3c95ca713ae38f573510 100644 GIT binary patch delta 29 jcmcaBb61A@GcPX}0}#AR4%x`f$i}RfR=Js<&5r{BfBXll delta 29 jcmcaBb61A@GcPX}0}yQM2-?Wa$i`ffTD+N`&5r{BfRG2( diff --git a/Objects/__pycache__/o_commit.cpython-313.pyc b/Objects/__pycache__/o_commit.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9a71f0654a75f4337f4f9a910b64cae8455d3d1 GIT binary patch literal 3420 zcmbtWO>7&-6`tktXUQe?yB1}Ul_*tm%~YbDsIu(Hap5?CXxLF)u89bcfCWV^skO*m zWpBP=Ns{MGV{R!8{cbP@q00rxwtmK8m3O5o4k-kX&+0t+WDi>YH6INy{+; z)I;#in>TOXeDA%Pw{s8(_z<+&?Dgfpco6!A4(#S^Fb8LWxr0O`GFK3`dImG**nu5p z&tkS8jUdr6fJAo6VXef@920eZM+b9hOJvc;JUTcJ<2z^(QEOm{!K~;L*#UHe!A{XR zfUrw+0dQozq7nGQfW z$*RtzQ)H74Ycvr+2qf%Dx&~UxixA9%}ZTk+S zdKdcbnZ$t2wR(uZ*S4qnlD@<*T5~oh`fLrzLZ>Z#iLR$jw;7|K$<{Azo2~vO)_L2y z-2HMpB_bt5j3yZ+7UAj?UBf#VKk2Hvz38+ zoQ1uHPy~K+pTETpp)B)qjU2KxqTO@rE(6PQgfPB!t|04rDkn$QJ*z1!t43tqRWz~_ zXQM1}QZ3?XXb@*6Wyr*Bsjc_MvTMdEZRv)bHuO_zv!oFQV|wQ?EzuaN5-R={NK%bh z^ARNjJ18F%<%oP!(G5A0+16vV1e6&A!QJU zrW5CC%2+1O8=9hmEeZu>+N!LAOxJ+swN!?%IoTjAma~`^EfUCLt7BZq&k`>UqeKCkAtAgKK~q9HtjI`dO*J4k#NQY%tr@aT_{IpF zNr6iWmQ3K@tdf^4mdO%NW35h6Mp})$b?ME;q%LE9v5>-sviOdcE*4-DeQ{PX;>D%K zWr$E($|=U;dsZG7H2^|CPO;TB;?-s2l9ksktB*A$^n0K`gcJA)dK!w9kC*xFH};Ol zN*y(>?_Rw8e);ltVsGGdg*#p9_!r+-^AD6g+kE-=58vJ!oUZt%OLI?yWBbAJN^pGp z{c3QkqGuvZS>SVuHqkl+IzCZ)rG#hv!Bi0z53bJa{u4X?VPI$ zQzdVm4{T0vOmAM;xNtAJ&yQC4(R%l>Ev4N1xO;57yFM`ZAo{0h`Qo3)w>-7b$b*^t zGvyDfq1cx5bFMZx_F(1y%J#|X;3SOsdU$j{JW&Zx?1yJ6;h8UH|9<7mE05gO^Y2x| z*FeEr8#?je*8N-C=c+?fF!mqvsOQ8FeiZ20>k%LOuh;xNPkY0+xmw@wZNAON$%-)f z@X9~jmEX)(g*Xia#Nf97Th6!1f68yg%f?sScs%j1j`fv37{kZSI9a$ak!~OXq=Zf)G!;|5GfQCF)to246@nV?71 zIvqUWBuPybWJw}ENh)ZWBGglf_$BFsVk+O5>6D}_RC6P*sIsa_5{^*=la$bKUuWXahhrT`x?GDN|E+BoG!+8c`I?Dh%c*0_GJCXh7j{un>@ggrC5={vrUzS>Kf+1mVxY ze`g&6E~3f3GlfxDg;V%JjzuOjSxX0@q+bg4uB{G~V)|>ICJV*D&o4kipR&o2Z&~O4 zHL(d@=dSZM*Nben35^H{xe#mW+>LX+>^1fiXlWEl$PAdA$t!_WppP+w`?3N1*B4|H z^s`AuUq3~(xqhyp$(VnhZ1ANz2c(d1n@rUAeaWvOg-UxB-ndo@`{zo~6edMqOCIv2 zI!_+1%f58u-oNGI_tOmj58@FYr_NJhzlzhfO%3Xve8aa;_NtUn0qw&-=3CS`^h8hu zB|OMV`=%uoRw90eFfWl*Bze5<<4g5!O5Tj@pOOMPj?N%IzZ^WFJVa=RXD^{)X8go^ zTsz7$Htg9j2_~2S5BmbDTFcS#nMhCmuG4FnIenTicqZUF`R=!6h6uWuwQ`18Ac4G5 z((Rc>&(O-;)U%G=>%iO6>t2A&Q>H`}$;j!ZW88LiNuM@sN0)MIt2ftHdZZ8BtZPc9 z<$k7XZq+u6*H+h7dnUX%)LOM}5%x|-P7vOj(oMqOv@M_|OUsdf;pk$Ya;LB0K(Mx$E7`bVc77Sr&PcR)y63&#Yj7lR`(ZjT2HK#cmsfu2@0syLB%rHf$ zicH?7@0e6yW!*9~&rS~;&WM{y7j?(Tss+PIU#+$~ZK*V3 z&(vKKvUO(yWD=var>4A6%pH`GL8C`HOQGm*uC?&W&j2b}X^pcy%*&Z7bIJT!_p^ zzl<)7tT<1EGuu#%ygacP?^w~cV)6Omx#5M;&Db$o$cgoM$L=X8=-2r9zjg$a7-e>k z!S*lljz8_A(2)BrmoITY9vDglA9pqmwQ!FwMTQzeKet4NPKN$*$wS|&mwX!tiztPX zz+YdTNM^=m#v1@&G=NPVC43Sn5emBV5q(ie+MFur)P&}U>8Hsf^fTur^#yvx9tyPo(Z>YZs)p1?=5aGM zjZ@M{iRXEiN_%KTc( 1: - self.message = parts[1].strip() - print("Un commit identique existe déjà. Aucun nouveau commit créé.") - return - - self.ref = tree_sha1 - self.date = datetime.datetime.now() - self.message = message - - os.makedirs(dir_path, exist_ok=True) - with open(file_path, "wb") as f: - f.write(commit_bytes) - - def getCommitHash(self): - return self.sha1 - - def getCommitDate(self): - return self.date - - def getCommitRef(self): - return self.ref - - def getCommitMessage(self): - return self.message - - def getCommitParent(self): - return self.parent \ No newline at end of file diff --git a/Objects/blob.py b/Objects/o_blob.py similarity index 100% rename from Objects/blob.py rename to Objects/o_blob.py diff --git a/Objects/o_commit.py b/Objects/o_commit.py new file mode 100644 index 0000000..6d66197 --- /dev/null +++ b/Objects/o_commit.py @@ -0,0 +1,60 @@ +import hashlib +import datetime +import os +import json + +class Commit: + def setCommit(self, tree_sha1, message, parent_sha1=None): + # Construction du contenu du commit pour le hash + commit_content = f"tree {tree_sha1}\n" + commit_content += f"message {message}\n" + if parent_sha1: + commit_content += f"parent {parent_sha1}\n" + + commit_bytes = commit_content.encode("utf-8") + self.sha1 = hashlib.sha1(commit_bytes).hexdigest() + + # Préparation des données à sauvegarder au format JSON + commit_data = { + "tree": tree_sha1, + "message": message, + "date": datetime.datetime.now().isoformat() + } + if parent_sha1: + commit_data["parent"] = parent_sha1 + + dir_path = ".fyt/objects/commit" + file_path = os.path.join(dir_path, self.sha1) + if os.path.exists(file_path): + with open(file_path, "r") as f: + content = json.load(f) + self.ref = content.get("tree") + self.parent = content.get("parent") + self.date = datetime.datetime.fromisoformat(content.get("date")) + self.message = content.get("message") + print("Un commit identique existe déjà. Aucun nouveau commit créé.") + return + + self.ref = tree_sha1 + self.parent = parent_sha1 + self.date = datetime.datetime.fromisoformat(commit_data["date"]) + self.message = message + + os.makedirs(dir_path, exist_ok=True) + with open(file_path, "w") as f: + json.dump(commit_data, f) + + def getCommitHash(self): + return self.sha1 + + def getCommitDate(self): + return self.date + + def getCommitRef(self): + return self.ref + + def getCommitMessage(self): + return self.message + + def getCommitParent(self): + return self.parent \ No newline at end of file diff --git a/Objects/o_tree.py b/Objects/o_tree.py new file mode 100644 index 0000000..d44ea54 --- /dev/null +++ b/Objects/o_tree.py @@ -0,0 +1,31 @@ +import os +import json +import hashlib + +class Tree: + def setTree(self): + # Charge l'index pour obtenir les chemins d'origine et les hashes de blob + with open(".fyt/index", "r", encoding="utf-8") as idx_file: + index = json.load(idx_file) + + # Construit la liste des fichiers pour le tree + files = [[path, blob_hash] for path, blob_hash in index.items()] + + tree_data = {"files": files} + tree_json = json.dumps(tree_data).encode("utf-8") + self.sha1 = hashlib.sha1(tree_json).hexdigest() + self.files = files + + # Sauvegarde dans .fyt/objects/tree/ + dir_path = ".fyt/objects/tree/" + file_path = os.path.join(dir_path, self.sha1) + if os.path.exists(file_path): + print("Un tree identique existe déjà. Aucun nouveau tree créé.") + return + + os.makedirs(dir_path, exist_ok=True) + with open(file_path, "wb") as f: + f.write(tree_json) + + def getFiles(self): + return self.files \ No newline at end of file diff --git a/Objects/tree.py b/Objects/tree.py deleted file mode 100644 index 236f2b4..0000000 --- a/Objects/tree.py +++ /dev/null @@ -1,28 +0,0 @@ -import os -import hashlib - -class Tree: - def setTree(self, blobsha1_list): - contenu_total = b"" - for blob_path in blobsha1_list: - with open(blob_path, "rb") as f: - contenu_total += f.read() - header = f"tree {len(contenu_total)}\0".encode("utf-8") - tree_data = header + contenu_total - - self.sha1 = hashlib.sha1(tree_data).hexdigest() - self.blobsha1 = blobsha1_list - - # Sauvegarde dans test/objects/ - dir_path = "test/objects/tree/" - file_path = os.path.join(dir_path, self.sha1) - if os.path.exists(file_path): - print("Un commit identique existe déjà. Aucun nouveau commit créé.") - return - - os.makedirs(dir_path, exist_ok=True) - with open(file_path, "wb") as f: - f.write(tree_data) - - def getBlob(self): - return self.blobsha1 \ No newline at end of file diff --git a/__pycache__/add.cpython-313.pyc b/__pycache__/add.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a31b8afdcd0dfb199e166b2deb9dc6aabc8cd051 GIT binary patch literal 2064 zcmah}O-vhC5PtjT-F0nj^HY+Lz+x1@O$0$Ll^QkakDE4>ib!@Wkc?!l?ZsYVcCFpD z3>*^E3#L+qA&T&=Tzbfl)JVPb9Iic(0!sAoA!@nw7L`g!Q4f7@?YAa0N@un6X6MbD zc{4lT9D2QOfao9nX7&dLfIsjDA-W+P4kF=HeyA@rk+TSUnWXxY}~E{-ivsMMRN^;7#n4x>_;?;+O%wGS`aA`AX0Ok z3X?l)+_CJrC`a^-?Aw}Wh!k^jknHSV%fEwIO)V z2K0i90RLG`X;h^dlvxju&@=Jq3ey8-sJB>Lsau4^2}m2s#lX0)wG{8CM2RmG473b;Z8l02&ytgZXf;OEHxvIMD6$OBnDuV|1p z6gds~tZZg;Y7(+$Rvv+3R+&$$8O5|9t(#DolW!?$)i5EOm#r*hXLVJBT+vW11$qkk zv}`E}RZA=LkjopYW`$f(oKbU1!ZxR7AfM7TOVKPS;u|M$G$`02a@$a1TNC$|WD~p; zzC0Z>6~mmKlMPFq{z6X`=8z9_`YYACUPw-76-!MeGO9H#r_)3E1t_33f#Vuo$PI^H z^C4m-P!qjnwc5Tbc5n7RZ*AM?U+cd+Smuuy;O;r_cW!vrJ=Mt_|M_SB;ivxL9sfva z?71&kx?W>l%j4gUSA@+Eeq#q~{?-kCjo?D5a37x{Qv#U)TqhgnzoULa6NA#|IM&+~Ic`aGxEv>_+3%z~<%vh68)iTdkl8|R zig53oj`$tX5zsw>b5B={nq*_#0NQ;mZwKQi@@{q9I6@FKXU>1;##_-}{y+3*Km+~k z#G>0qejR3%0jXlhZQz0#KE$BQo&ctSe-Q$xsUv9TbPR1n$=NV;WfUt_Oe2U}vIW_6 zVJ;uyjdtt-cO7)wu5HK~c-TR%9!o$D>Oihz8Xq@tkJNE08E3EyTo{|-xoZB1SP8rc zoGX1@RKMuH`JHtNa$#7>_Vzzwl@Hu`< za)*cb5Ld6Sgj2%}Z;ur_$@}0CeFHmnD11Dprwcjds)5i05FUYf8nKrQMN#`e+z0RM VgO7fK6rTODy}ORhdJ`H5KiLEQ3>25* zRy-55yo*JJOS=6aN-I2J19O?A6NBAIqIGc~#`Z9nbSFVdCZ36oMl5JoPIPsm5$uT| zv2-PwQ-m?b^z6&Er^C^~ZVsZ6Tqd_K*IXyhySV1}<=Xoeu6vUFdvo2v@g~>ZJD~U! z|9k8kPuBF7T-|$iAjzX$6PeTLFa~|8=FDrXb{NgnWUzFzsL-N z4E0VQX+NLo+`b-Pwmd@8bU_%)+;Sp@sp&VD@bO6)x+y;@%jtYBXEL$I|s{AqsN(O~ZC(^EV388}kuJFVBS- z$YN*c$?3MO&g+oXR7WrL{?EMyqR{siW29}h^o$+J>Z)c(a;jlMYPrB&Zeo{HFY%YP zz zkeSYF2ya%kvkS%?WbLea2J%_`re@6R$e+upH+0RgP{^`{Vj+iD}GG=}m@`jzy z*0iT=^aby$h{NTH z@<_!$_JFPPv4??mj=$%*>$%U@xdB}G+$#YD2G)BAHpN2?ai}T|HN;?54DL?+uZQh* z7pGneptpZDyb>;@YEq~njaQ}dnsl}}wJ9B59bFkM-L6R^4JlTYVm0Y}ajJtR_<()N z#+qnOmQ&@=D*m$%uGIO7ho2KP-a2;_qq*>!Lo`+VC(G$NA6`@U&W|7(UBaFC{Zv^h z58a=w^aabxTK^hf5zaniquUn|lh66%JKGXk*>gU&vwajLea27hY@@^@&-n0;9YGuS zSO4TV^C&3AY3A=EQoN6OOiA$|^LSjC{KWHw7UBWVlRhCn?0FIt;!#h?W%*E)g@4Qz z{;OKYaEFhb>KST8?*ayg?lxAIpOCPt$oUZ5fX DaOw?M delta 48 zcmdnbyqB5xGcPX}0}xzW6O^%VBX1%jC!c>(R%&udvEJlLMr&@xuPjWAMn$|pB>-9v B4AcMs diff --git a/__pycache__/init.cpython-313.pyc b/__pycache__/init.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9dd990b26efe51ea10f2c7d4ff4323241cbb9167 GIT binary patch literal 743 zcmah{&ubG=5T3U`lI+^Fq3FRv$<|97ED1r1SX2n6S_nkwwq9Hao8%>VCfN<|y-=Hz zc+sBpQt;@p@ho_j`~#u1AZu=V@h0R@@Z@Yvnxk*o@6F6N^UVyq<9OTzJjc#{<0b+4 z5jwM@OpWm}8Yf_bO$xxlR#t$MI!UR&!h~XFnl`y2h$_D05yA;Pp9DkLo2gwz0B)h8 zt=Q^4#rl7yc9p5mBy8P|Y)y3)@ZbRUqBCxO+tDrDEId}Y13t4F>}vdD0PNU2s}5_h z2^&+Yiq$ooFp2dR6jvUoNvM&OQS2?GYezEUmtW9|6#FR>#OO;VWXW&#mL?RZHIZph zw<>zZB(S@a%LnAJcLSMiYffj{F7wRpU2K^j^gDyk(qbNy%xy6-=%>wRepgt7Pm&6& z>UzRzxmKCGUZp{;^{{k3ozerv7eTD;Hffb{5omsgdVzk(nWTZ<;mngbA*l&m2dp6b zXxljulnbZra><;$U+K1~Cx!Eb$=z<*X;8^3r8<*NI7zy56d0jV;F=k9sMHe}JH8FG>qea}fLoLUJgG2WPBH-|&9(K7RA&&6{4~Pc}ESEE9xy z%?Hh|N;g+RH@lN|rLNY<^@jkC4p1i(P?a1Z6=Ego`HD{cK4+!k#yvRFQdJWAg~m^?G{(YgU*Y4YO z0y(s4tE%e)wLzko7Kt3;)7ThNvDz#FT8%-)9_0rDUc%6`@Vxk?t_jYF9 z?96Xwvf}r95zvoTZ0Z(|&~J3(kgL8}c^4M9k&I;KJi@EL3})=T3%g|3R)krZ1EOZ`$#F{G3#r5-=b zJ^sOz&S<8jCAIxgH*sYR!sQfmif|ufHJ$L9kfz6|;FF1d)>J41$ss%#DbRk`wE=-qu79y3vUW={y z{KdXPUvZ!?P!2!yZGYn1UJXaAbJf@hA}FzB@>&&G!5wlq== zAyuzP$t=d%OfJ7a$`cN&N{R@EiStR52zfoHBtOIygqUIrB$!DeOo5P!A>Ue>xMv`j zT2?2FZqS@VjwK2EVMUs$v4nj|VpRoig>(AOI1UUF=MNMw6)u&AuDw5hx)#}XCvz*a zaOT0KN~Gu0cjkvnJF0H4mHzzWn&>NvUx|y&`+gF;s=gMhf01j&L9mf*#1%HQ^z5=f zZI}H41jX9O3&gj+4x^DGLOKgsqtY8_UDmkqMy_Iw_^*lES>t3@W;o=u2brTm(D^tt zuWqBTL6%foZ_Ce<1dAeBPYwewzf1 zJOC)In5t?dm7Kan0U8wuj}<+w;ufkDrtCFfL`bR0Y)U19lFO-jD(c0p^w^^(pb212 zHHh0;FbTp@+z@_pT1gv3q+KR4t?Goc`weeqO=X&}IVELKblT9f*(&~8*5R*i6L*0e z^~1Oa3;-Ai&7Z0HTS`Zs`nOw5H5e++6lO}7ugzK9@1e*Y|1EzxwQ%x5%Y&hX^OexS z@0*{54qJRRyruls%|T0a6s9V{j%UH$PlCG_W)}~hs04>B?$=ODY3!ySq=TW-sq%@N zXA7S^3+!4rWU*DzQxpnK1T}@{M_17ePBw@l&_;I| zaCIB4A^TOm#Tl4RhIO<~V-s9&hRByj;QDU1nf_+@YE)kXv$U%<##D^9^bPd#z#4CM zUdI`kb*jTfYn-CXrnNzv2bku1#woUJ8r$V)=sf(x0e{Y3Lhtd=5#WAZ7=PW7U#m|E zT@0<(LmKTsU8vzdWMR@Jp$@1N35|9RupMZUiE^Vb7inK5h`8|OXp=pxFl{76NULUY zHf7I7Oan&*n3jfVtaVtzWuYwWK51i>@HwpMCQM%eh94cbtd_cB*9_hQ7H}Ii!`pL` zFgb&^zQ94ri$JD>U5pZMDAt+>>3y{YE$Tgg(-^^Wq1TI=qGk1DOvg4c4_LOT}@ zRYH3${soV`Z7Tu_ge|5f`Yq*aahZkP3pbqK==j^9>3_tx4IO149rX@-+(b+yGK!`r z5>e3(*=pmk=MM$QT3qa}q2hK=NIXP#z0^PXSSFjwPpgA?0CXTt$T$q_ImXDWKXdGkodsN$jEq?LH;%a=VulsMnSL+0EJ>NaR2}S literal 660 zcmYjOL2DC16n-;1?IvkrT8kbEm8DvAL&+W_2qFbZtHolK#P!mJ(rzcolw?z8CWt-7 zlTZ&*u=F>0>(P4h7f7`zGU`b$-h@4QbEeH0AIy8-_r1q^^JdaQAqU!$-CFCNjz0{s zh6f&_H#r-^;?%M|-akw=`;mDn(ASq&V0()Zf!!>ZMx zW+(hp0A}=*3OW-KSRJvc$^axNL^ao{!x+LOJjMbCAn+tCUDi9{|0ZRIl@`^;EE>i- z3UOs{tB3ghEWj9ex?_Uvojho2ex^0R$16MIy)g9eLRjB*k9qY8J0a@$PEO~$#| zUAclv^E8TVugjJqTV0m;jv8sOHWi9UlR^z)YCX?WH>x+IQ0Q(^XPrwHEp+2vhbB@) zcbQ!3ZA2|9S-jR{GJ3+9q-&-@dHbo#4JkjTn-P7)9qsz?Eth{;+ASSlxO$Si)}Q^E zExfqczw!l-KA(FwcNCr!t8c?M=oLP2_uPa0UjBGGIGp%Ae*Gx?P^^B!3x7TqtHON9 zVd?fv#wRNOU}KBMQk2c`(>1wCpU!;^sfNG{+NsQ~PIt4{rt|!~rsj9Wgm%9jgwS`G O{tDTY5VVN6QU3yuH-_2( diff --git a/add.py b/add.py new file mode 100644 index 0000000..c314dc1 --- /dev/null +++ b/add.py @@ -0,0 +1,34 @@ +import os +import json +import hashlib + +def add_file(file_path): + with open(file_path, "rb") as f: + content = f.read() + blob_hash = hashlib.sha1(content).hexdigest() + blob_dir = ".fyt/objects/blob" + os.makedirs(blob_dir, exist_ok=True) + blob_path = os.path.join(blob_dir, blob_hash) + + with open(blob_path, "wb") as f: + f.write(content) + + update_index(file_path, blob_hash) + print(f"Fichier '{file_path}' ajouté (Blob: {blob_hash})") + +def update_index(file_path, blob_hash): + + index_path = ".fyt/index" + if os.path.exists(index_path): + with open(index_path, "r") as f: + index = json.load(f) + else: + index = {} + + rel_path = os.path.relpath(file_path, os.getcwd()) + file_stat = os.stat(file_path) + + index[rel_path] = blob_hash + # Sauvegarder l'index + with open(index_path, "w") as f: + json.dump(index, f) \ No newline at end of file diff --git a/commit.py b/commit.py new file mode 100644 index 0000000..cfdedd8 --- /dev/null +++ b/commit.py @@ -0,0 +1,43 @@ +import os +import json +import hashlib +import datetime + +def commit_changes(message): + index_path = ".fyt/index" + if not os.path.exists(index_path): + print("Rien à commit. Utilisez 'add' avant.") + return + + # Charger l'index + with open(index_path, "r") as f: + index = json.load(f) + # Créer un Tree (simplifié) + tree_data = {"files": list(index.items())} # En vrai, on stocke une structure de dossiers/fichiers + tree_json = json.dumps(tree_data).encode() + tree_hash = hashlib.sha1(tree_json).hexdigest() + + os.makedirs(".fyt/objects/tree", exist_ok=True) + + with open(f".fyt/objects/tree/{tree_hash}", "wb") as f: + f.write(tree_json) + + # Créer un Commit + commit_data = { + "tree": tree_hash, + "message": message, + "date": datetime.datetime.now().isoformat(), + } + commit_json = json.dumps(commit_data).encode() + commit_hash = hashlib.sha1(commit_json).hexdigest() + + os.makedirs(".fyt/objects/commit", exist_ok=True) + + with open(f".fyt/objects/commit/{commit_hash}", "wb") as f: + f.write(commit_json) + + # Mettre à jour la référence (branche) + with open(".fyt/refs/heads/main", "w") as f: + f.write(commit_hash) + + print(f"Commit [{commit_hash[:6]}]: {message}") \ No newline at end of file diff --git a/commit_tree.py b/commit_tree.py index a949e6b..3358f6a 100644 --- a/commit_tree.py +++ b/commit_tree.py @@ -1,4 +1,4 @@ -from Objects.commit import Commit +from Objects.o_commit import Commit def commit_tree(tree_sha, message, parent_sha=None): commit = Commit() diff --git a/fichier.txt b/fichier.txt deleted file mode 100644 index 58f8463..0000000 --- a/fichier.txt +++ /dev/null @@ -1 +0,0 @@ -Ceci est un fichier de textekpepkroperkeprekeo \ No newline at end of file diff --git a/init.py b/init.py new file mode 100644 index 0000000..a36204b --- /dev/null +++ b/init.py @@ -0,0 +1,8 @@ +import os + +def init_repo(): + os.makedirs(".fyt/objects", exist_ok=True) + os.makedirs(".fyt/refs/heads", exist_ok=True) + with open(".fyt/HEAD", "w") as f: + f.write("ref: refs/heads/main\n") + print("Dépôt initialisé.\nVous êtes dans la branche 'main'.") \ No newline at end of file diff --git a/ls_files.py b/ls_files.py index cd0a794..46e96ac 100644 --- a/ls_files.py +++ b/ls_files.py @@ -1,47 +1,26 @@ #!/usr/bin/env python3 -import os, struct, sys +import os +import sys +import json -def find_git_dir(path): +def find_fyt_dir(path): prev = None while path != prev: - dot = os.path.join(path, ".git") + dot = os.path.join(path, ".fyt") if os.path.isdir(dot): return dot prev, path = path, os.path.dirname(path) - sys.exit("Erreur : pas de dépôt Git ici.") - -def read_index_header(f): - header = f.read(12) - sig, version, n = struct.unpack(">4sLL", header) - if sig != b"DIRC": - sys.exit("Erreur : index corrompu.") - return version, n - -def read_index_entries(f, n_entries): - entries = [] - for _ in range(n_entries): - head = f.read(62) - # les deux derniers octets de head sont les flags - flags = struct.unpack(">H", head[60:62])[0] - name_len = flags & 0x0FFF - name = f.read(name_len).decode("utf-8", "surrogateescape") - # calcul du padding à 8 octets - total = 62 + name_len - pad = (8 - (total % 8)) or 0 - f.read(pad) - entries.append(name) - return entries + sys.exit("Erreur : pas de dépôt .fyt ici.") def ls_files(): - gitdir = find_git_dir(os.getcwd()) - idx = os.path.join(gitdir, "index") + fytdir = find_fyt_dir(os.getcwd()) + idx = os.path.join(fytdir, "index") if not os.path.exists(idx): sys.exit("") # index inexistant → rien à lister - with open(idx, "rb") as f: - version, n = read_index_header(f) - files = read_index_entries(f, n) - for p in files: - print(p) + with open(idx, "r", encoding="utf-8") as f: + index_data = json.load(f) + for file_path in index_data.keys(): + print(file_path) if __name__ == "__main__": - ls_files() + ls_files() \ No newline at end of file diff --git a/main.py b/main.py deleted file mode 100755 index 99fd48c..0000000 --- a/main.py +++ /dev/null @@ -1,108 +0,0 @@ -#!/usr/bin/env python3 -import argparse -import os -import hashlib -import json -import datetime - -def main(): - parser = argparse.ArgumentParser(description="Un mini-Git (Fyt) en Python.") - subparsers = parser.add_subparsers(dest="command", help="Commandes disponibles") - - # git init - parser_init = subparsers.add_parser("init", help="Initialise un dépôt") - - # git add - parser_add = subparsers.add_parser("add", help="Ajoute un fichier à l'index") - parser_add.add_argument("file", help="Fichier à ajouter") - - # git commit -m "message" - parser_commit = subparsers.add_parser("commit", help="Crée un commit") - parser_commit.add_argument("-m", "--message", required=True, help="Message du commit") - - args = parser.parse_args() - - if args.command == "init": - init_repo() - elif args.command == "add": - add_file(args.file) - elif args.command == "commit": - commit_changes(args.message) - else: - parser.print_help() - -def init_repo(): - os.makedirs(".fyt/objects", exist_ok=True) - os.makedirs(".fyt/refs/heads", exist_ok=True) - with open(".fyt/HEAD", "w") as f: - f.write("ref: refs/heads/main\n") - print("Dépôt initialisé.\nVous êtes dans la branche 'main'.") - -def update_index(file_path, blob_hash): - - index_path = ".fyt/index" - if os.path.exists(index_path): - with open(index_path, "r") as f: - index = json.load(f) - else: - index = {} - - rel_path = os.path.relpath(file_path, os.getcwd()) - file_stat = os.stat(file_path) - - index[rel_path] = blob_hash - # Sauvegarder l'index - with open(index_path, "w") as f: - json.dump(index, f) - -def add_file(file_path): - with open(file_path, "rb") as f: - content = f.read() - blob_hash = hashlib.sha1(content).hexdigest() - blob_path = f".fyt/objects/{blob_hash}" - - with open(blob_path, "wb") as f: - f.write(content) - - update_index(file_path, blob_hash) - print(f"Fichier '{file_path}' ajouté (Blob: {blob_hash})") - - - -def commit_changes(message): - index_path = ".fyt/index" - if not os.path.exists(index_path): - print("Rien à commit. Utilisez 'add' avant.") - return - - # Charger l'index - with open(index_path, "r") as f: - index = json.load(f) - # Créer un Tree (simplifié) - tree_data = {"files": list(index.items())} # En vrai, on stocke une structure de dossiers/fichiers - tree_json = json.dumps(tree_data).encode() - tree_hash = hashlib.sha1(tree_json).hexdigest() - - with open(f".fyt/objects/{tree_hash}", "wb") as f: - f.write(tree_json) - - # Créer un Commit - commit_data = { - "tree": tree_hash, - "message": message, - "date": datetime.datetime.now().isoformat(), - } - commit_json = json.dumps(commit_data).encode() - commit_hash = hashlib.sha1(commit_json).hexdigest() - - with open(f".fyt/objects/{commit_hash}", "wb") as f: - f.write(commit_json) - - # Mettre à jour la référence (branche) - with open(".fyt/refs/heads/main", "w") as f: - f.write(commit_hash) - - print(f"Commit [{commit_hash[:6]}]: {message}") - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/terminal.py b/terminal.py index 8bbc828..7df32bd 100755 --- a/terminal.py +++ b/terminal.py @@ -1,27 +1,55 @@ import argparse + +from add import add_file +from commit import commit_changes +from commit_tree import commit_tree +from init import init_repo from ls_files import ls_files from write_tree import write_tree -from commit_tree import commit_tree + parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(dest="command") -# Sous-commande ls-files -subparsers.add_parser("ls-files") +# git add +parser_add = subparsers.add_parser("add", help="Ajoute un fichier à l'index") +parser_add.add_argument("file", help="Fichier à ajouter") -# Sous-commande write-tree -subparsers.add_parser("write-tree") +# git commit -m "message" +parser_commit = subparsers.add_parser("commit", help="Crée un commit") +parser_commit.add_argument("-m", "--message", required=True, help="Message du commit") -commit_tree_parser = subparsers.add_parser("commit-tree") +# git commit-tree -m "message" [-p ] +commit_tree_parser = subparsers.add_parser("commit-tree", help="Crée un commit à partir d'un tree existant") commit_tree_parser.add_argument("tree_sha", help="SHA1 du tree à committer") commit_tree_parser.add_argument("-m", required=True, help="message du commit") commit_tree_parser.add_argument("-p", help="SHA1 du commit parent (optionnel)") +# git init +subparsers.add_parser("init", help="Initialise un dépôt") + +# git ls-files +subparsers.add_parser("ls-files", help="Liste les fichiers dans l'index") + +# git write-tree +subparsers.add_parser("write-tree", help="Crée un tree à partir de l'index") + args = parser.parse_args() -if args.command == "ls-files": + +if args.command == "add": + add_file(args.file) # Revoir la conception du fichier Blob. + # Il faut passer par l'objet Blob pour ajouter le fichier +elif args.command == "commit": # Validé + commit_changes(args.message) +elif args.command == "commit-tree": # Faire en sorte que, si le hash du tree n'est + # pas correct, on lève une erreur + commit_tree(args.tree_sha, args.m, args.p) +elif args.command == "init": # Validé + init_repo() +elif args.command == "ls-files": # Fichier modifié, V2 validée ls_files() -elif args.command == "write-tree": +elif args.command == "write-tree": # Validé write_tree() -elif args.command == "commit-tree": - commit_tree(args.tree_sha, args.m, args.p) \ No newline at end of file +else: + parser.print_help() \ No newline at end of file diff --git a/test/fichiers/fff.txt b/test/fff.txt similarity index 100% rename from test/fichiers/fff.txt rename to test/fff.txt diff --git a/test/fichiers/fichier.txt b/test/fichier.txt similarity index 100% rename from test/fichiers/fichier.txt rename to test/fichier.txt diff --git a/test/objects/commit/aede5ac7a0b18f863ad1a3e6b44731dc279d0b96 b/test/objects/commit/aede5ac7a0b18f863ad1a3e6b44731dc279d0b96 deleted file mode 100644 index a79a568..0000000 --- a/test/objects/commit/aede5ac7a0b18f863ad1a3e6b44731dc279d0b96 +++ /dev/null @@ -1,3 +0,0 @@ -tree 3513413266ebbad20240bf88651e7745bea68d69 -message bonjour -date 2025-06-18T14:11:06.590542 diff --git a/test/objects/tree/3513413266ebbad20240bf88651e7745bea68d69 b/test/objects/tree/3513413266ebbad20240bf88651e7745bea68d69 deleted file mode 100644 index 5af060941fb3d5b4ff3073663f79d176999f7f50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55 zcmXRZN=;QTF=xn1RVXgaELJGZQ%FfIt;jsQA~)4JH91ouwYUT%n3kEGk(pWqlvF55 HttbHiCXEys diff --git a/write_tree.py b/write_tree.py index e757290..cf054ca 100644 --- a/write_tree.py +++ b/write_tree.py @@ -1,8 +1,6 @@ -from Objects.tree import Tree +from Objects.o_tree import Tree import os def write_tree(): - files = os.listdir("./test/fichiers/") - tree = Tree() - tree.setTree([os.path.join("./test/fichiers/", f) for f in files]) \ No newline at end of file + tree.setTree() \ No newline at end of file From 20322ff399c5843f2abba716d56b392e9fa81e23 Mon Sep 17 00:00:00 2001 From: AkaTFL <184939597+AkaTFL@users.noreply.github.com> Date: Wed, 2 Jul 2025 10:51:49 +0200 Subject: [PATCH 22/35] ajout show-ref --- .fyt/HEAD | 1 + .fyt/index | 1 + .../69bce968f88ac26eaa0ebf28d84639b42a4471d7 | 1 + .../bc9b311544d0687f60b2a17b1d2055e8c631ea73 | 55 ++++++++++++++++++ Objects/__pycache__/o_commit.cpython-313.pyc | Bin 3420 -> 3420 bytes Objects/__pycache__/o_tree.cpython-313.pyc | Bin 2053 -> 2053 bytes functions/__pycache__/add.cpython-313.pyc | Bin 0 -> 2074 bytes functions/__pycache__/commit.cpython-313.pyc | Bin 0 -> 2408 bytes .../__pycache__/commit_tree.cpython-313.pyc | Bin 0 -> 457 bytes functions/__pycache__/init.cpython-313.pyc | Bin 0 -> 753 bytes .../__pycache__/ls_files.cpython-313.pyc | Bin 0 -> 1670 bytes .../__pycache__/show_ref.cpython-313.pyc | Bin 0 -> 878 bytes .../__pycache__/write_tree.cpython-313.pyc | Bin 0 -> 408 bytes add.py => functions/add.py | 0 commit.py => functions/commit.py | 0 commit_tree.py => functions/commit_tree.py | 0 hash.py => functions/hash.py | 0 init.py => functions/init.py | 0 ls_files.py => functions/ls_files.py | 0 functions/show_ref.py | 12 ++++ write_tree.py => functions/write_tree.py | 0 terminal.py | 31 +++++----- 22 files changed, 88 insertions(+), 13 deletions(-) create mode 100644 .fyt/HEAD create mode 100644 .fyt/index create mode 100644 .fyt/objects/blob/69bce968f88ac26eaa0ebf28d84639b42a4471d7 create mode 100644 .fyt/objects/blob/bc9b311544d0687f60b2a17b1d2055e8c631ea73 create mode 100644 functions/__pycache__/add.cpython-313.pyc create mode 100644 functions/__pycache__/commit.cpython-313.pyc create mode 100644 functions/__pycache__/commit_tree.cpython-313.pyc create mode 100644 functions/__pycache__/init.cpython-313.pyc create mode 100644 functions/__pycache__/ls_files.cpython-313.pyc create mode 100644 functions/__pycache__/show_ref.cpython-313.pyc create mode 100644 functions/__pycache__/write_tree.cpython-313.pyc rename add.py => functions/add.py (100%) rename commit.py => functions/commit.py (100%) rename commit_tree.py => functions/commit_tree.py (100%) rename hash.py => functions/hash.py (100%) rename init.py => functions/init.py (100%) rename ls_files.py => functions/ls_files.py (100%) create mode 100644 functions/show_ref.py rename write_tree.py => functions/write_tree.py (100%) diff --git a/.fyt/HEAD b/.fyt/HEAD new file mode 100644 index 0000000..b870d82 --- /dev/null +++ b/.fyt/HEAD @@ -0,0 +1 @@ +ref: refs/heads/main diff --git a/.fyt/index b/.fyt/index new file mode 100644 index 0000000..22ac1a1 --- /dev/null +++ b/.fyt/index @@ -0,0 +1 @@ +{"test\\fichier.txt": "69bce968f88ac26eaa0ebf28d84639b42a4471d7", "launching.md": "bc9b311544d0687f60b2a17b1d2055e8c631ea73"} \ No newline at end of file diff --git a/.fyt/objects/blob/69bce968f88ac26eaa0ebf28d84639b42a4471d7 b/.fyt/objects/blob/69bce968f88ac26eaa0ebf28d84639b42a4471d7 new file mode 100644 index 0000000..0ff4ccd --- /dev/null +++ b/.fyt/objects/blob/69bce968f88ac26eaa0ebf28d84639b42a4471d7 @@ -0,0 +1 @@ +Ceci est un fichier de text \ No newline at end of file diff --git a/.fyt/objects/blob/bc9b311544d0687f60b2a17b1d2055e8c631ea73 b/.fyt/objects/blob/bc9b311544d0687f60b2a17b1d2055e8c631ea73 new file mode 100644 index 0000000..bc21a2d --- /dev/null +++ b/.fyt/objects/blob/bc9b311544d0687f60b2a17b1d2055e8c631ea73 @@ -0,0 +1,55 @@ +# **Comment lancer le script** +--- +## Cas de script Bash +**Rendre le fichier script exécutable** +```bash +chmod +x my_hash_object.sh #Rend le script exécutable +``` + +**Lancer le fichier avec un argument** +```bash +./my_hash_object.sh mon_fichier.txt +``` + +## Cas de script Python (notre cas) + +```bash +python3 --version # Vérifie que Python 3 est installé + +python3 git_hash_object.py mon_fichier.txt +``` +--- +**ou alors** +## Pour le script Bash +Place-le dans un dossier de ton PATH (par exemple ~/bin/). + +Ou utilise un alias dans ton ```.bashrc :``` + +```bash +alias git-hash-object="$HOME/path/to/my_hash_object.sh" +``` +### Pour le script Python +Rends-le exécutable : + +```bash +chmod +x git_hash_object.py +``` +Ajoute un shebang (première ligne du script) : + +```python +#!/usr/bin/env python3 +``` +Déplace-le dans un dossier du PATH ou utilise un alias : + +```bash +alias git-hash-object="python3 $HOME/path/to/git_hash_object.py" +``` +### Vérification avec Git +Compare le résultat avec la commande réelle de Git : + +```bash +git hash-object test.txt +``` + +[extrait de deepseek](https://chat.deepseek.com/a/chat/s/00c34d42-1c8e-4fcf-8f1a-a551c10f2804) +Ces étapes peuvent varier entre les utilisateurs de windows et de MacOS \ No newline at end of file diff --git a/Objects/__pycache__/o_commit.cpython-313.pyc b/Objects/__pycache__/o_commit.cpython-313.pyc index b9a71f0654a75f4337f4f9a910b64cae8455d3d1..817c6052762274921be110e58b09bc0a1985ad5d 100644 GIT binary patch delta 20 acmca3bw`T(GcPX}0}!y?P1(pD$O`~K2nBEe delta 20 acmca3bw`T(GcPX}0}!~Ug>2*w-0tHb3 delta 20 acmZn_Xcgf8%*)Hg00c$FAse}Wu>$}zDg{FT diff --git a/functions/__pycache__/add.cpython-313.pyc b/functions/__pycache__/add.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b063f139be42fe1d064ad76885de71affc236c02 GIT binary patch literal 2074 zcmah}O-vg{6rTO_?z%R%`6)?AU@;1?O$0?Pm5Q45$4whbMI^fxNVa6H?X|tc>{`2P z88{@S7fhuJLlog#x%7}9sgZi=Ib3@n1(axTrKsi7TU06`<bLNlEu zMEWm$Y&u0WPveC}FY*qKenr~5Am;2vka^iqIdD=+>5HTg$?h!U0=q zt+OFJW|cXSJriMUeKY%x))`xhIyned_OImMWn0ZswkH%{x2=u1qM!{#*eHc&?mfn? zh5)jlA6y3b&*G6rRmz~u`hb9*>4#USK9C{aU~#2kA@b9Z)RRkrk<6kwswL;-lxd76 z^IGy7k${}MpcrOCy9vosa*6*!N#zt-7lw+sLPLTyrxnfZd&2N%$bLeAgeZC-trcVy z(z-0AA)AwoTwX~++Q>;`kk82rX(cNgCL}cja`VznIj!ghqzjUngY=xHsE{e?iYY@+ zv5=NbIiaX&c>yv7T~STZ1^JAUmlKvbk%4SVQ%zYlA&(Ajy{_aiBhNm{O>%aKa zKl;Q!y6Yb+Pd@Vn%h&6)Yh~)&sVcYi{%`bf-QT{+uCtq-bx&>9GCDlzm*dyiRkq6R zac3;Y|F{4XsGi-U2kSInnXD?+*p4vvNPN`u%cnc;tNZlF$KB}ueZKeQaa&U`aA$oV z2+`DIPkX3~+NRy1c6PhV9U5R$HeVnUfGcJp{twhyh&u?CjA6Ys!Y3_l9WKYI(dvA= zPo>KM#4wv!BZ|1k?s|kDD#qD6VF#hM1^|R$%I<%aKFuUI$aewa0LT2bF?yYCM~H$G zXI{ewL143t9Vub}=XBWbh>n2b1Wuf;C^17vnIW|MO5P6IPvzb2xN(FaXtB?K8RU&T zQ29R|$bu#h(9=t9ivt>fBXmfVM7NF$ru)zYT^1J@I{rlns)mL@p4TwQbvbVV(v_9X zR4I+XZb~Mk)5ZCM$m*Tg1MWKLwp?4_)iLcsrg0aC95f)^KsP>a;2vopR?yF37q~Fi zgc;WO5lvRh{KmO3S5{Tg$hqb5Gg+Cv1P+8>qfhOYM1sTT;FA%;x0AWKFvB zb>$kuP20eZH~7K@0v#3R&=*)Mt(MkquimaLJ`DaO-WMNS+Vy>afQg~F!PfX)f3Q6H z{O!K-waW1F4UEUR+JJ@gI_FvAzvHVH_qZMlk2`$taToHx?+v~@?mP*&pSwdo>hWlI zNT9ZT?$8BxTX2U)SdnSeSHP*^hPPZ` zL5jupBq36mYo?RuU0kyVa_xN!*F8!0y}9n-c$4ey9T0t@ z|2_7N#cO&?uI@cMlw{$q@-*-RF_47)MCbgXn>PeTLFb0T8=HmaXb=S9Geyk&ewi8s zS>l~O!a+VW`2#(^YI%f(nIboqy=_HRO;&Cd(D6yAiWYoQ31;+sUbV)8NlRT&O{Ew- zBgyiap!BVzSz|U~*siR)pqRyg6R*$RP%@SowG2i1B23tfa!WO>S^Z{Fcw;_llS^}9 z%BGRC?a3>qDa|W3ElZYC?ERm63q-N+EyifuYA9JVno}g%jOHa(vx%i5bJf8fOua^5 z)*|)IrC_+%CUw)M7bPoayB%<*?OHTc&9Z5IQPFJrhN;7TL6>CML-4jswUj*ck_-7o z69#D+U50pbl9^jj=WN={N#|@fr`(d&c?J42dFiGis|E~NGGMIDpcPqaUa=`nU$R-% z)U&#gm#i>npzp8EIke9@polCih<3qd5iheaR%)vbvX&JUx4kV|S}u6tIN5d+xe+D8LPFx`A-?*VE;~Z+Cva^UHVjfwNV9 ztaKeYa?4zKvd)K^{Ai6It+&kmD?Q6S<*)1fnI?a(#-FS66Q%2~X!j4(-%nThQ>*fG zdg2x9tMbE@$;wF8KlX@ju(8L1HHN+Kx#xMnHkbia_`)U!0t0Kk0~`F2CO=f;hnjq- z#)tMM{?|kIx=YjB9O&&|i7ZFTsk#tu3gb0lye^zCO>YQCS4Njd%XjL+NK=T_gjij; zSeovj2|c2p(=i9l=}M~dS=E33(X|FU`S^2;#@k?yBQ%$`8Awyrf4Y)su#r`1|NID~ z(Z$`3KS))C%Fu(^YG0@#uJ*68Rqp%?dSd4?Wb!3@a(737D|^Ytc6W}$q%YXX-5r>C zpgS+B+Sl$pb4 zW%sc&Kls3JgZ}hGodw)o4mR!CSGj?v(v2>$C(`)tMD#WT_j* bW{)gbDhB3AyJty9;BA)0)UN zs9P0XV;tDt$`?Yi-@Ss&rZuB;ZI^jwa0^=&`n^v7v$UAUBy(F#^m|$JsUHZd|4C9| zRb5Y5E!Qe@*Q+$BwHlSKW;1%I_##ZS-6pLvE<(-kP%qT?Ig>QhJDhnECnPn2>wp#B zd9dm13d)7kcDZCu!LI~u>Pg`|VsbkuI}IvXWv|YpQwzL`WWFbyXr^rEAT%OlkJFCN zlc*MbaPb)7B@DIL>*A~8`}w2G$69vc4N@ydg=1}fXe8e>KioVq(jV8qC5(6RxA8%0 z?Ie*oQ^B-;X~w`ToN8NVI(nx@`meZznqL<4%j(xG8X5&plh}37zn|(9yYu@`k z??$6xKnnb!FW&b7JmrE%D7&;fi`(~*ge18PbZ;k=xU!G>lD?Bbg`|L7O#74K#8rTd z1dtYoVXW;!fjr3*)&Ccl=d+}J%r_C2fNOUEPk9uJTqP4r=%Wa*z%^V-c-eRdxF`IF zg!X3&vm9&dTE6Gl2amD$jkU8o+rG@8x0LT?NIfr`&@tY?^H%m=h2F04m$`N47KzCJ z?S>(_p9j_sRAGKq9L=pbl_6Aqhf0*XDW_q@itrQK*vD5FF&RpesdeLyqtd=*Obgp7$9kXQF>4L50%z|N$mRDFLXIi?3 zX=xajcA(n;F8eyNHQ16n*JiiE9bd*<9VhDfTE1SW6&e@s^ff!qR)v-vt&i8n>yx#~ zM)za+)C2j{R(D_Z(pGQm_Jxh{TjLwkx2Er2Y`%D|s&9ut?)*CbcNqNA=X0OT{Te;@ zP&~hjQ6S5iM?AQTwVzz9Ewnq0-Do2QyTS2zgbr}*b<;X*!Mz@##Iaa7giLZM;&Jx! z5r-(Ih!@>Mrrw8{@1rNd%X@_Wi=%}Xyz3N63P~~Pe@pNIPDz({p6Kzu4)$S0zZcmO zaO&~rO_%~72#Nj!UGK}A`)-)StSoUM=G~-3&zAyMP5{Wj@jV1_*nbsvCFfIM5N{Ni zKR+o9LXN0`dBm`#8_NtBp{xFilY9M5l`zS$vL)TL@@mut808IQfxO{lmvk4|loyx< z5bL&MQ{EZMhmVP+vSHzP*d^qJQbuRuM+Q!Xzf4WbQT;4{z~w_DnEEm!ITm)~YkJ1X zun@<%#s|#i(}UBZC^X95O5Om_Arw1t*`Fa>gH|+ldw4_rLH+TyX7tS3yRC4fK2jU0 z$7}KR8;zxAcw}wHL;X~3s`1ie`Sb(%bW4)!(ihTt*H@8NC|b>~zj3Gkw~%`G{Z?=6 z=CyCHH9r0>T@61IApGi|y@NNkZ?s3fXR4u=6s?+%q=6j)`bM7l@%CXz{m15T`9jwLa3%h)p=tMk@)xyV`gXCTR|>`yeFe`5 wE<28FTOfoyh0qfSKLL4143Y~wT@s0H_kb9wt~Q0(?_%WBOWOj7CtYv<0%FcG6#xJL literal 0 HcmV?d00001 diff --git a/functions/__pycache__/show_ref.cpython-313.pyc b/functions/__pycache__/show_ref.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5cc070739818a16e395882086f6baba800c0aabd GIT binary patch literal 878 zcmZ8f%}*0i5TCc(ZFgH*Fn}b8VNo&G0AiGYAQ;d@qLD*44Tm;qYP;Jmp}Wm{y9kX3 zj&P#U80$r^_U2#ULH+?Wevn5GCZ44)4^$|SxcJ*kT*|f6TOx>D#Mc~0RIDWyq)y@qANj-s zkdXc}+G-Leu-c<*#{%*l0I5*h08Q}YDik24`2Hklq88AkJE8y2BTFtyA5~>8e9* zcWt+>k8wgPlIs|wQ*pv&jM;h9DpZ7NH7;|(W;{^NIz=AT*G=XyE|sZiIXqyOb&Cg9 zn2mhZ&gQvfI(mu4B_3||&9thBfqricE>hj#;bN8*Gi%vZS7+YIRFC+*`_t(p(Vot(;@p7E80D{Vao+W91Dl`v&bn&;UN> zAlrofa~C%sH6qcS$?eIVx$U{y^&gSp&ynGV9NmkJe3eJ{SF; z%x}v0Ulzf}ANv+U;-^q}p*Iv4spp~IFWs814oy^nb|d5R-IASmSM@oH2L?PRur6eW TA|d1eA_t%}12VZv&!h7nl5x4; literal 0 HcmV?d00001 diff --git a/functions/__pycache__/write_tree.cpython-313.pyc b/functions/__pycache__/write_tree.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86ed371f42b2bfadef0d9bb9b38da72551e16bca GIT binary patch literal 408 zcmZ8b!AiqG5S`tGwkbr^g9i_qgO@c{_b}-H0k~D+u1<7Ct=SJ}l&D?_otp`4pMpU*H z*XD}3rm-qx=#>YDyKJbqR4l!cTCk%$E>fOp#g2tODIzxETEwG7Xm(v>u@-rz*u4~* zkBm!j_fU5KTG>HU8$+#Pn!< Date: Wed, 2 Jul 2025 11:58:22 +0200 Subject: [PATCH 23/35] Add cat-file functionality to retrieve object details and content --- functions/__pycache__/add.cpython-313.pyc | Bin 2074 -> 2074 bytes .../__pycache__/cat_file.cpython-313.pyc | Bin 0 -> 1886 bytes functions/__pycache__/commit.cpython-313.pyc | Bin 2408 -> 2408 bytes .../__pycache__/commit_tree.cpython-313.pyc | Bin 457 -> 457 bytes functions/__pycache__/init.cpython-313.pyc | Bin 753 -> 753 bytes .../__pycache__/ls_files.cpython-313.pyc | Bin 1670 -> 1670 bytes .../__pycache__/show_ref.cpython-313.pyc | Bin 878 -> 878 bytes .../__pycache__/write_tree.cpython-313.pyc | Bin 408 -> 408 bytes functions/cat_file.py | 44 ++++++++++++++++++ terminal.py | 9 ++++ 10 files changed, 53 insertions(+) create mode 100644 functions/__pycache__/cat_file.cpython-313.pyc create mode 100644 functions/cat_file.py diff --git a/functions/__pycache__/add.cpython-313.pyc b/functions/__pycache__/add.cpython-313.pyc index b063f139be42fe1d064ad76885de71affc236c02..db1564adbbfccf0e36ca4fe4f185dc29c026d080 100644 GIT binary patch delta 19 ZcmbOwFiU{zGcPX}0}!15wvkJK0{}E21r7iJ delta 19 ZcmbOwFiU{zGcPX}0}!y?-N+@t0RS%T1S|jm diff --git a/functions/__pycache__/cat_file.cpython-313.pyc b/functions/__pycache__/cat_file.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..edb441fdfdb0ea52064b0c208f2388856942ed9e GIT binary patch literal 1886 zcmah}O>7fK6rTOD*FSN7upRQB%@0W&O01S9ffQ1qVgdz{l8sfQxQf=h<9NZ@wf3hW zRx5D~C*Tm_6AH9a(p!%`Q$^~LDxpmW--?j9rA-ADz4T3z%?66pS$XHZZ@%xnH*d$Y z9f^bxj0Y^v>wbiOr;a<=J!88Gj3p!?iMfc(-I*~NiETnAJIf@v7nC@zaC>|@(Wunl zZi4p`N`m$ZqjM6g^Jy-M#+dW125^|Np3k|Ekme zL1q{2+gns2+T{xfNgPy$TvR>-2%q+S1T47~&z!9BFxQfTZXP|*hNf#> zeDaWMd2=U92lm-Puhs*qn8$W4Pz9xs#7g0loU0b;>4C?sUPNBcRmkk^ScTnsnWTsp z0s6&;5h!`LJ1SIvfLonrtC3W5{6N-OG>baWbiG@ffaGcfF+7#GLlL#3@u?g-&9$Q( z^OmaaO_fwda~)^B>OgCH+V}QPlnUoA$I{p$JmX*OMo-j^C%97GKyJZK8rf@Dv8`mb zU}WEdY!l;B^bM9`%*|=`xhcX^KH({a_;*nvIQn(nnAZtwW=lTD&K*1Pg8pj~Eb(i) ziglY*Vcl{}JR@6*rjAb3|%Z5jw#By zoTlWlDHgD(7`lyhM>HJj*$YK1s#q-a(#_ZdCI1AS#ZpAnblWtXFXe0j4W7cCNK$a6tPZt6U!>`t5`8q3`EP&iLYSDD)3Ziu4s{9>V|@M zN=t+YW0OG9#I~(rlL&d)%Fk#j3GeoGM%7G^H-yXd+T2A~L?p_afZ^jxHQ_pK^H=~W^&)1{fl~`lBXX)~0ytzET z9`D(ATOmZekGg$J6VG5uY{a^s*Bq|I!Cao&i1)9`TWl~swAtCU((|C_o4%FggXH(U z>zyNIVT|>zdH3p$4^Io?)+?{<;trFsz3U& z0mb6?uU2Z~kL$A=waRZ*b$^^jvG$jvsH(0Kh}`ktnZKizzkXbO>`7o?iv#rUzv_^f z*hUOwY3W$*y+6Lif&I_3=57GvLzRZs<?3A1sebW diff --git a/functions/__pycache__/commit_tree.cpython-313.pyc b/functions/__pycache__/commit_tree.cpython-313.pyc index b2523c35789a9c8ef27ad61939e77f96104b8867..09679596a86f2f58e1dda59de1490a7ce73b6d29 100644 GIT binary patch delta 19 ZcmX@fe3F^#GcPX}0}!15wvlT;BLF&C1^NI0 delta 19 ZcmX@fe3F^#GcPX}0}!y?-N?0{5dbwN1sDJT diff --git a/functions/__pycache__/init.cpython-313.pyc b/functions/__pycache__/init.cpython-313.pyc index f0ed0de494816a561a2f9fe2fb6cf6c8d7cff46d..2486a8112df442be4539c72862f23688dc026782 100644 GIT binary patch delta 19 Zcmey!`jM6EGcPX}0}!15wvp>O697Pt26q4e delta 19 Zcmey!`jM6EGcPX}0}!y?-N^Nv2>?4=1(g5* diff --git a/functions/__pycache__/ls_files.cpython-313.pyc b/functions/__pycache__/ls_files.cpython-313.pyc index efb5c28be91468b2d5edff5df939fe5a645fd57a..dca792247c92e3df9041d46db57d4bb9e0d35267 100644 GIT binary patch delta 19 ZcmZqUZR6$o%*)Hg00ig1ZRDz90{}6=1xf$_ delta 19 ZcmZqUZR6$o%*)Hg00eAzH*(dm0RSwG1ZV&N diff --git a/functions/__pycache__/show_ref.cpython-313.pyc b/functions/__pycache__/show_ref.cpython-313.pyc index 5cc070739818a16e395882086f6baba800c0aabd..c33abd831078ac7f3177582b61062debd1d37647 100644 GIT binary patch delta 19 ZcmaFI_KuC~GcPX}0}!15wvj7^82~>&1@Qm? delta 19 ZcmaFI_KuC~GcPX}0}xbw*vOT_3;;bN1(pB+ diff --git a/functions/__pycache__/write_tree.cpython-313.pyc b/functions/__pycache__/write_tree.cpython-313.pyc index 86ed371f42b2bfadef0d9bb9b38da72551e16bca..d4f98672113c8bd56d8942eb7e8f0dd2834d616b 100644 GIT binary patch delta 19 ZcmbQiJcF6*GcPX}0}!15wvnrk5dbq21!n*N delta 19 ZcmbQiJcF6*GcPX}0}!y?-N@C)2mmeM1cd+q diff --git a/functions/cat_file.py b/functions/cat_file.py new file mode 100644 index 0000000..4882182 --- /dev/null +++ b/functions/cat_file.py @@ -0,0 +1,44 @@ +import os +import json + +def cat_file(t, prettier, hash_id): + # Recherche dans les dossiers d'objets possibles + object_dirs = [ + ".fyt/objects/blob", + ".fyt/objects/tree", + ".fyt/objects/commit" + ] + found = False + for obj_dir in object_dirs: + file_path = os.path.join(obj_dir, hash_id) + if os.path.exists(file_path): + found = True + # Affiche le type si demandé + if t: + if "blob" in obj_dir: + print("blob") + elif "tree" in obj_dir: + print("tree") + elif "commit" in obj_dir: + print("commit") + else: + print("unknown") + # Affiche le contenu si demandé + if prettier: + with open(file_path, "rb") as f: + try: + content = f.read().decode("utf-8") + # Si c'est du JSON, affiche joliment + try: + data = json.loads(content) + print(json.dumps(data, indent=2, ensure_ascii=False)) + except Exception: + print(content) + except Exception: + print(f"[binaire] {hash_id}") + # Affiche le hash si demandé + if not t and not prettier: + print("Il faut choisir une option pour afficher le contenu ou le type de l'objet.") + break + if not found: + print(f"Objet {hash_id} introuvable.") \ No newline at end of file diff --git a/terminal.py b/terminal.py index a07bde9..d533689 100755 --- a/terminal.py +++ b/terminal.py @@ -2,6 +2,7 @@ from functions.add import add_file from functions.commit import commit_changes +from functions.cat_file import cat_file from functions.commit_tree import commit_tree from functions.init import init_repo from functions.ls_files import ls_files @@ -16,6 +17,12 @@ parser_add = subparsers.add_parser("add", help="Ajoute un fichier à l'index") parser_add.add_argument("file", help="Fichier à ajouter") +# git cat-file -t -p +cat_file_parser = subparsers.add_parser("cat-file", help="Crée un tree à partir de l'index") +cat_file_parser.add_argument("-t", action="store_true", help="Affiche le type de l'objet") +cat_file_parser.add_argument("-p", action="store_true", help="Affiche le contenu de l'objet") +cat_file_parser.add_argument("hash", help="Affiche l'ID de l'objet") + # git commit -m "message" parser_commit = subparsers.add_parser("commit", help="Crée un commit") parser_commit.add_argument("-m", "--message", required=True, help="Message du commit") @@ -46,6 +53,8 @@ # Il faut passer par l'objet Blob pour ajouter le fichier elif args.command == "commit": commit_changes(args.message) +elif args.command == "cat-file": + cat_file(args.t, args.p, args.hash) elif args.command == "commit-tree": # Faire en sorte que, si le hash du tree n'est commit_tree(args.tree_sha, args.m, args.p) # pas correct, on lève une erreur elif args.command == "init": From 6287b77a5bbb2d190ce4eba40c642eaa870ef2be Mon Sep 17 00:00:00 2001 From: AkaTFL <184939597+AkaTFL@users.noreply.github.com> Date: Wed, 2 Jul 2025 17:31:32 +0200 Subject: [PATCH 24/35] ajout rev-parse --- .../9c4b60dfe9f0b12263841644845dc8fc2d32bc5a | 1 + .../2340a8db5d75bd52c074df36bd760aa1531b81be | 1 + .fyt/refs/heads/main | 1 + .../__pycache__/cat_file.cpython-313.pyc | Bin 1886 -> 1886 bytes .../__pycache__/rev_parse.cpython-313.pyc | Bin 0 -> 3588 bytes functions/rev_parse.py | 74 ++++++++++++++++++ terminal.py | 7 ++ 7 files changed, 84 insertions(+) create mode 100644 .fyt/objects/commit/9c4b60dfe9f0b12263841644845dc8fc2d32bc5a create mode 100644 .fyt/objects/tree/2340a8db5d75bd52c074df36bd760aa1531b81be create mode 100644 .fyt/refs/heads/main create mode 100644 functions/__pycache__/rev_parse.cpython-313.pyc create mode 100644 functions/rev_parse.py diff --git a/.fyt/objects/commit/9c4b60dfe9f0b12263841644845dc8fc2d32bc5a b/.fyt/objects/commit/9c4b60dfe9f0b12263841644845dc8fc2d32bc5a new file mode 100644 index 0000000..ff3a3ba --- /dev/null +++ b/.fyt/objects/commit/9c4b60dfe9f0b12263841644845dc8fc2d32bc5a @@ -0,0 +1 @@ +{"tree": "2340a8db5d75bd52c074df36bd760aa1531b81be", "message": "bonjour", "date": "2025-07-02T16:21:34.769908"} \ No newline at end of file diff --git a/.fyt/objects/tree/2340a8db5d75bd52c074df36bd760aa1531b81be b/.fyt/objects/tree/2340a8db5d75bd52c074df36bd760aa1531b81be new file mode 100644 index 0000000..0004334 --- /dev/null +++ b/.fyt/objects/tree/2340a8db5d75bd52c074df36bd760aa1531b81be @@ -0,0 +1 @@ +{"files": [["test\\fichier.txt", "69bce968f88ac26eaa0ebf28d84639b42a4471d7"], ["launching.md", "bc9b311544d0687f60b2a17b1d2055e8c631ea73"]]} \ No newline at end of file diff --git a/.fyt/refs/heads/main b/.fyt/refs/heads/main new file mode 100644 index 0000000..a63861f --- /dev/null +++ b/.fyt/refs/heads/main @@ -0,0 +1 @@ +9c4b60dfe9f0b12263841644845dc8fc2d32bc5a \ No newline at end of file diff --git a/functions/__pycache__/cat_file.cpython-313.pyc b/functions/__pycache__/cat_file.cpython-313.pyc index edb441fdfdb0ea52064b0c208f2388856942ed9e..063d181e66e98fb9872dea6bf23046b2ab63c730 100644 GIT binary patch delta 18 Ycmcb|caM+rGcPX}0}!m+$QjBG05qrsy#N3J delta 18 Ycmcb|caM+rGcPX}0}w3S$QjBG05oR=umAu6 diff --git a/functions/__pycache__/rev_parse.cpython-313.pyc b/functions/__pycache__/rev_parse.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1f65b0a76e9caa25383fbc979e54d03c37996df GIT binary patch literal 3588 zcmbVPZ)_Up8GnxhA8`DK1_K6TJ86vVgk|xc)OG%NNoISES;qBRuV%6^KJ3fzLGF$^ zwX`bTD%Dv&lr5PG=~Vc#$(|;y-*xZm&I7&mcD0ozh9Nu$1z-j!M7KuF;0gA>cErryG!>6r^JsMXe529)N&gxDM z{b(LhI!^ud>p<^~`p&L;IuvUS+KC!kb~OH5gwoI#sn|_K)2C>CIw%PL5_kpJ*(4cq{!{^<0y2yA>7`ut8jD^ z?&RopPA1>orqdleQU(Q;YN`1KC$-5p17(y`qR7bJ{SV!naEtBIrA#z3q2s&Hmzgtv zg9?}x`%2`|f9&csGlf$Y%K8#6-*VHPN^IeS3fG`e6-+_nEKlERG+Hx%*+hW))OHB&Y!0TSK>gjXr@B zOf0^4)Dpjr3->VifVDBIp1=|Fu*sq-9$P+a9l?clK= zjp3n@lXyFdW6zOMg3HVNnN*Y)7)g`jSx%JHOVPxSCH18w z%Si;!Bx<0*q!Q5>BM}JzpJREcC7J^KISEh5RxSxi7!ygb)$(REk!FN|UBV%u5*C*X z3*f^Hcq>BGk``9MBDesyj@&NE4EP{O zmQ+#@*x3X#vlta)3!q5Aw!8;GTy&9<^tF6$t7>Yzq?3y@vk(;)B%-b+$oIE@?<1W# zI~<_}h8H4>kU2JTE*VQNLKH$|j1|YzvylZxWMeb)tQd)>xtPc%IU%x>(xa)jc=^{t zZBPRv{2O}XD%vFUEAgNGIxA#niR>&4R>+W#H?BkA-v%lgT zE;)zG&XJYzO|!FN?kt%*3quuiZ^_)d;pr-j7QT}m$!M$gw(L~d{$kPa;^ziyrf=QQ zzG1LEYC+bvs}og1_ukSwOYgn?&f6KbLikIBzv}bn=Wopy*!#Y3T??(8%g_&6y%}}Y z_pi-*Okm?z{RjnhksFjghLul|6Lx zg5+?+v|{fn*}Dp7EB5ZPy?euPu;S<~IeJ&m-*7wcEy7n9hKr(HmyYt%%Lp)i=K6Z z7mBmt^5xrdZ6EnoCN|8r413SqUbVcCVb?AGzgrGGCXl=PkroB}|BzTq{GKb@-uN9? zaNW^W&b(SW^JXvsLQN3x@3 zqZhV{j?p_^cU~yk#?}qv;Kk=^UC{v9D-0C%fqUwnCu1t;&HKi#ub%Wk?jYx1JsE}= z?iu_4^MwuBr!gT2{r|`I5Q+a~ush@>{@UXV1@X_^?(ZY@XD3=7O;pv4uhl}SxnBQ6U-@o5T^2-F35im9^n{ 1: + print(f"Plusieurs objets correspondent au préfixe : {ref}") + return + + # 4. index (blobs) + index_path = ".fyt/index" + if os.path.exists(index_path): + with open(index_path, "r", encoding="utf-8") as f: + index = json.load(f) + if ref in index: + print(index[ref]) + return + for blob_hash in index.values(): + if ref == blob_hash: + print(blob_hash) + return + matches = [blob_hash for blob_hash in index.values() if blob_hash.startswith(ref)] + if len(matches) == 1: + print(matches[0]) + return + elif len(matches) > 1: + print(f"Plusieurs objets correspondent au préfixe : {ref}") + return + + print(f"Référence inconnue : {ref}") \ No newline at end of file diff --git a/terminal.py b/terminal.py index d533689..415653e 100755 --- a/terminal.py +++ b/terminal.py @@ -6,6 +6,7 @@ from functions.commit_tree import commit_tree from functions.init import init_repo from functions.ls_files import ls_files +from functions.rev_parse import rev_parse from functions.show_ref import show_ref from functions.write_tree import write_tree @@ -39,6 +40,10 @@ # git ls-files subparsers.add_parser("ls-files", help="Liste les fichiers dans l'index") +# git rev-parse +parser_rev_parse = subparsers.add_parser("rev-parse", help="Convertit une référence Git en SHA1") +parser_rev_parse.add_argument("ref", help="Référence Git à convertir en SHA1") + #git show-ref subparsers.add_parser("show-ref", help="Affiche les références du dépôt") @@ -61,6 +66,8 @@ init_repo() elif args.command == "ls-files": ls_files() +elif args.command == "rev-parse": + rev_parse(args.ref) elif args.command == "show-ref": show_ref() elif args.command == "write-tree": From f966b416b390096b50b9ea15ec3049eb5912bbfc Mon Sep 17 00:00:00 2001 From: AkaTFL <184939597+AkaTFL@users.noreply.github.com> Date: Wed, 2 Jul 2025 18:35:10 +0200 Subject: [PATCH 25/35] ajout reset --- .fyt/HEAD | 1 - .fyt/index | 1 - functions/__pycache__/reset.cpython-313.pyc | Bin 0 -> 1910 bytes .../__pycache__/rev_parse.cpython-313.pyc | Bin 3588 -> 3588 bytes functions/reset.py | 28 ++++++++++++++++++ terminal.py | 9 ++++++ test/fff.txt | 1 - test/fichier.txt | 1 - 8 files changed, 37 insertions(+), 4 deletions(-) delete mode 100644 .fyt/HEAD create mode 100644 functions/__pycache__/reset.cpython-313.pyc create mode 100644 functions/reset.py delete mode 100644 test/fff.txt delete mode 100644 test/fichier.txt diff --git a/.fyt/HEAD b/.fyt/HEAD deleted file mode 100644 index b870d82..0000000 --- a/.fyt/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/main diff --git a/.fyt/index b/.fyt/index index 22ac1a1..e69de29 100644 --- a/.fyt/index +++ b/.fyt/index @@ -1 +0,0 @@ -{"test\\fichier.txt": "69bce968f88ac26eaa0ebf28d84639b42a4471d7", "launching.md": "bc9b311544d0687f60b2a17b1d2055e8c631ea73"} \ No newline at end of file diff --git a/functions/__pycache__/reset.cpython-313.pyc b/functions/__pycache__/reset.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca16e022be0451cd0d61b7f357ad1c5ebeb52b85 GIT binary patch literal 1910 zcmd5-&2Jk;6o2bo+q-t`f)X`N)TR@+G86nl8GWIx`X1#0e z%%*AJz>)Tn2&p1HpjKRn{|vBtZ$(_Ht;GdYi4#R>6^RpX{IQ9v5(Fon<(W56@8kD= z^LBST7K;GNg-__B5(M}~9y$_eE87QAxdj=>C?A3Y88s6agsY09EGS9sH|dlvsBK@l zh43%W+d8hdAPXm@6(yelxZF~4o$uuLEdU9uaZYI&2wX-)Ey)CStqYJ<{EWG-jI#0z zGH<+Kz~gQWKM%I}uaHGMS&MM9}p-ykTFf#|>;@wxKtWY+D=L-N+pb|%vV01?yzX-nQ&Hr2PdP5TwglX z#n(&cD64ny5V-UnKooFKxAr}Awa05=@4Oki(F-sPqy7vR5ko0J;3(!JkpBH$^(d5- zeLTKtc_bt0RU=ipF3!wMU7U26vB~*bm03)%yvcZ8Fxw*3B4xWs$q2VgVkAZ8C?^HG zTxNn3Zd(E!OuAgFa#GGSPRtQz73m70f|!&zwQ7Yr!e$O7m_s=E? z)kqUXGtyJ8xl8*aDYF$?lu$agxR8~6;I(QS%ijW^7~$7Xtp)`e&a7$@g^Q2xel#rR zovzyd*k?B~o^rET;G$b_+r%O-dtF+r^GdB+U?o|3{{6ReS;WV4<-8+U zZqhEeWoikYn`UCh{WP~o1uI-xU?Nv?t%4jco^vRtB2~HW1)G}Fk16Gwng?;Jzkr{^ z(S{ybGj1B|r?>Q>h8}wga9}#{9Ke_fJTc;pXl!l##`xOAjfsuZKSfVGh@NQl#MfqT z&aN+Q^&}dxSJy}Hs#~$+o64h}S9Vm0zxJyhyC46ou7Cc-i2axF;bY(Rf7`#=|8V$? z2R%o=oZJXLK6GSVYaAZBGktsd&fM*}&AuNGzqM{W>K(W{Q13m}=sWoJ>{qiJ>|x)@ z?Jx`s{h>nQ&1VrX;`ifbT`xZiHC0;IOFPF9VLf*I&z*Q%;fIip@5hy?gjyR^rp~JO z5|OFb!}rccK2X9*HJwf;1CIPGHMy(8Hmcyr52UA`$7k0y>4Y#h literal 0 HcmV?d00001 diff --git a/functions/__pycache__/rev_parse.cpython-313.pyc b/functions/__pycache__/rev_parse.cpython-313.pyc index b1f65b0a76e9caa25383fbc979e54d03c37996df..10b9b862f7c52d77d70f032c7a099bbe8b1e8de0 100644 GIT binary patch delta 18 YcmZpXX_4Xl%*)Hg00hT2a{lH804zQP=>Px# delta 18 YcmZpXX_4Xl%*)Hg00jFsa{lH804x>+;Q#;t diff --git a/functions/reset.py b/functions/reset.py new file mode 100644 index 0000000..24e39b2 --- /dev/null +++ b/functions/reset.py @@ -0,0 +1,28 @@ +import os + +def reset(soft=None, mixed=None, hard=None): + if soft: + os.remove(".fyt/HEAD") + print("Réinitialisation en mode 'soft'. Les commits sont enlevés mais l'index et le répertoire de travail sont conservés.") + # Logique pour la réinitialisation soft + elif mixed: + if os.path.exists(".fyt/HEAD"): + os.remove(".fyt/HEAD") + with open(".fyt/index", "w") as f: + pass + print("Réinitialisation en mode 'mixed'. L'index est réinitialisé mais le répertoire de travail est conservé.") + # Logique pour la réinitialisation mixed + elif hard: + if os.path.exists(".fyt/HEAD"): + os.remove(".fyt/HEAD") + with open(".fyt/index", "w") as f: + pass + for root, dirs, files in os.walk("test/"): + for file in files: + file_path = os.path.join(root, file) + if ".fyt" not in file_path: + os.remove(file_path) + print("Réinitialisation en mode 'hard'. L'index et le répertoire de travail sont réinitialisés.") + # Logique pour la réinitialisation hard + else: + print("Aucun mode de réinitialisation spécifié. Veuillez utiliser -soft, -mixed ou -hard.") \ No newline at end of file diff --git a/terminal.py b/terminal.py index 415653e..92b2660 100755 --- a/terminal.py +++ b/terminal.py @@ -6,6 +6,7 @@ from functions.commit_tree import commit_tree from functions.init import init_repo from functions.ls_files import ls_files +from functions.reset import reset from functions.rev_parse import rev_parse from functions.show_ref import show_ref from functions.write_tree import write_tree @@ -40,6 +41,12 @@ # git ls-files subparsers.add_parser("ls-files", help="Liste les fichiers dans l'index") +# git reset -soft -mixed -hard +parser_reset = subparsers.add_parser("reset", help="Réinitialise l'index et le répertoire de travail") +parser_reset.add_argument("-soft", action="store_true", help="Enlève les commits mais garde l'index et le répertoire de travail") +parser_reset.add_argument("-mixed", action="store_true", help="Réinitialise l\'index mais pas le répertoire de travail") +parser_reset.add_argument("-hard", action="store_true", help="Réinitialise l'index et le répertoire de travail") + # git rev-parse parser_rev_parse = subparsers.add_parser("rev-parse", help="Convertit une référence Git en SHA1") parser_rev_parse.add_argument("ref", help="Référence Git à convertir en SHA1") @@ -66,6 +73,8 @@ init_repo() elif args.command == "ls-files": ls_files() +elif args.command == "reset": + reset(args.soft, args.mixed, args.hard) elif args.command == "rev-parse": rev_parse(args.ref) elif args.command == "show-ref": diff --git a/test/fff.txt b/test/fff.txt deleted file mode 100644 index 9d70ce1..0000000 --- a/test/fff.txt +++ /dev/null @@ -1 +0,0 @@ -je suis un deuxième \ No newline at end of file diff --git a/test/fichier.txt b/test/fichier.txt deleted file mode 100644 index 0ff4ccd..0000000 --- a/test/fichier.txt +++ /dev/null @@ -1 +0,0 @@ -Ceci est un fichier de text \ No newline at end of file From 365cf27db323694c606885c526d0a493e1dd076e Mon Sep 17 00:00:00 2001 From: bnjjs1998 Date: Tue, 8 Jul 2025 16:24:09 +0200 Subject: [PATCH 26/35] =?UTF-8?q?premi=C3=A8re=20partie=20du=20git=20statu?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- add.py | 37 ++++++++++++++++++++++++++++++++++++- commit.py | 4 +++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/add.py b/add.py index c314dc1..7d9f845 100644 --- a/add.py +++ b/add.py @@ -31,4 +31,39 @@ def update_index(file_path, blob_hash): index[rel_path] = blob_hash # Sauvegarder l'index with open(index_path, "w") as f: - json.dump(index, f) \ No newline at end of file + json.dump(index, f) + + +def status_all(): + index_path = ".fyt/index" + + if os.path.exists(index_path): + with open(index_path, "r") as f: + index = json.load(f) + else: + index = {} + + tracked_files = set(index.keys()) + working_dir_files = set() + + for root, dirs, files in os.walk("."): + if root.startswith("./.fyt"): + continue + for file in files: + path = os.path.join(root, file) + rel_path = os.path.relpath(path, os.getcwd()) + working_dir_files.add(rel_path) + + with open(path, "rb") as f: + content = f.read() + current_hash = hashlib.sha1(content).hexdigest() + + if rel_path not in index: + print(f"{rel_path}: nouveau fichier non suivi") + elif index[rel_path] != current_hash: + print(f"{rel_path}: modifié") + else: + print(f"{rel_path}: inchangé") + + for tracked in tracked_files - working_dir_files: + print(f"{tracked}: supprimé") diff --git a/commit.py b/commit.py index cfdedd8..72ecdb0 100644 --- a/commit.py +++ b/commit.py @@ -40,4 +40,6 @@ def commit_changes(message): with open(".fyt/refs/heads/main", "w") as f: f.write(commit_hash) - print(f"Commit [{commit_hash[:6]}]: {message}") \ No newline at end of file + print(f"Commit [{commit_hash[:6]}]: {message}") + + # git status \ No newline at end of file From 61a1b91e21bbf6caea69b146b37bff3e31513ea2 Mon Sep 17 00:00:00 2001 From: AkaTFL Date: Wed, 9 Jul 2025 11:20:06 +0200 Subject: [PATCH 27/35] ajustement --- .fyt/HEAD | 1 + Objects/__pycache__/o_commit.cpython-313.pyc | Bin 3420 -> 3420 bytes Objects/__pycache__/o_tree.cpython-313.pyc | Bin 2053 -> 2053 bytes __pycache__/add.cpython-313.pyc | Bin 2064 -> 4628 bytes __pycache__/commit.cpython-313.pyc | Bin 2398 -> 2398 bytes __pycache__/commit_tree.cpython-313.pyc | Bin 447 -> 447 bytes __pycache__/init.cpython-313.pyc | Bin 743 -> 743 bytes __pycache__/ls_files.cpython-313.pyc | Bin 1660 -> 1660 bytes __pycache__/write_tree.cpython-313.pyc | Bin 398 -> 398 bytes add.py | 15 ++++++++++++--- terminal.py | 7 ++++++- 11 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 .fyt/HEAD diff --git a/.fyt/HEAD b/.fyt/HEAD new file mode 100644 index 0000000..b870d82 --- /dev/null +++ b/.fyt/HEAD @@ -0,0 +1 @@ +ref: refs/heads/main diff --git a/Objects/__pycache__/o_commit.cpython-313.pyc b/Objects/__pycache__/o_commit.cpython-313.pyc index b9a71f0654a75f4337f4f9a910b64cae8455d3d1..817c6052762274921be110e58b09bc0a1985ad5d 100644 GIT binary patch delta 20 acmca3bw`T(GcPX}0}!y?P1(pD$O`~K2nBEe delta 20 acmca3bw`T(GcPX}0}!~Ug>2*w-0tHb3 delta 20 acmZn_Xcgf8%*)Hg00c$FAse}Wu>$}zDg{FT diff --git a/__pycache__/add.cpython-313.pyc b/__pycache__/add.cpython-313.pyc index a31b8afdcd0dfb199e166b2deb9dc6aabc8cd051..8bd393e355606c2bd3505a2f44a1020f858efdfc 100644 GIT binary patch delta 2424 zcmah~UrbY17(chYrKPujX-k3H(gFfSMO4u6Z|VktC^+o3Lc*4&_O{Rgm+ssaqKPSw z-P7p0g{lv9PtzsKFnie&vuTXUGGBUA#>IwYTf(E;6qk^gJ?xxb?u9wXZhFuCzVH0L z?|gqx7fqiw7+&f1T7aGhr`SoLO&h9+)^w9sOOrJKswN1p>i(7ARmAIW-Y)x)aECBb zdNhboqW9H`3V_c5O|T$SrgA0gK*tV*CB`K%@R2ep6F#*}%7h7rYu!`}L_n7zTO45vzFi{H02&>GzAZ_y+(96mo2W)%;InHtD$C?^sasn=SX3)5@+f0GK8K{N+CTE=rbKRH4KS`wuipzKLhf9f(z7Z0UT-IMZ?hB-DN)a|l%Lu+_3{}>Ird6qkn%Zp9g!$nv#&!ZQO`<{{d?ajZ_C8k zl-wb@lC~KCzN52WgFTYf^?sGFR<e!b+Zd+$i;=yFLDkCb2G^N1?xEt}JT(?$ac zfD}=3#mCo>$&*&ys6n#oYf3+NB#mQ*Zqz(M6Uu>C!us_FKxK^%@EyRps0(%SsY~m&d$am?o5aWr>Kv^U}!4L1R~MtFjq9s&%&uFI}u=_a7RR9 zjUtHzTu~*WG%!3}GE^j(B8g>UP`Hy|B?#j4LJ0`NY&a1o1F_6HY~QK&QCfs-3vpTnb&3ANvl1pTGrmu-q97T zhZlx7svLJzdD6D&tX&?xJ(_z@aGvBf)hTkZe-o*mNuOCdn?9RsFIY~eH0zXQajrl) zb5(+;o%gh_Tzzouhsbx4`vJkz&wKix>8uDMP%fTwW#9X(=*P^xK;1(OC{TNc(FcvhWnvI>_=61p=Bg`H(6^ba z`Rk+ij;?S*OLykPL*n84{5jv!iCYX`L8r)%E~nHR*6LK>y3z7+@}p#y6O8q|u|607 z;^yZ!SFQ?8$sWF`=b5Pr=LHAXlkUlp1UWbw@VMwnZk}w`%s}F0a=(mK$$1-f3P`Z!1AX-KL{%x#xDzU3J0HCOEoyM_0ko zlN$QfXfGHWHcYl`RaTp?>&;ibm0UBOT{l;zYjZ;dbKA~Vt|ec2Y|YfVDI#-6@|CTE z>G)qBV5@m)0j^UoP6MlF)zXfl)94rNi{)8I-f(zL)3~Js){gA~0vPJo^mTu4xq;;h zv28*w{cQHU=FlG-c%-pkXj4A1R$o+GYR2gqau;$q3k?*zrUKFjbk$`ok>1prj-6h;65 diff --git a/__pycache__/commit.cpython-313.pyc b/__pycache__/commit.cpython-313.pyc index f2637a2c747b579e5dc440feb0b053ee96c6cb61..dae819b2c7e883b9f0692caf29e6c9c19cde493e 100644 GIT binary patch delta 22 ccmca7bWe!)GcPX}0}y;Q$jh+X$Q#HB08ZHkRsaA1 delta 22 ccmca7bWe!)GcPX}0}ym2hh%7N Date: Thu, 10 Jul 2025 12:33:41 +0200 Subject: [PATCH 28/35] fix --- Launching.md | 59 +++++++---------------------------------- functions/add.py | 17 ++++++++---- projet-test/dsjhf.py | 0 projet-test/fichier.txt | 0 terminal.py | 1 + 5 files changed, 22 insertions(+), 55 deletions(-) create mode 100644 projet-test/dsjhf.py create mode 100644 projet-test/fichier.txt diff --git a/Launching.md b/Launching.md index bc21a2d..85f30c0 100644 --- a/Launching.md +++ b/Launching.md @@ -1,55 +1,14 @@ -# **Comment lancer le script** ---- -## Cas de script Bash -**Rendre le fichier script exécutable** -```bash -chmod +x my_hash_object.sh #Rend le script exécutable -``` +## Prérequis -**Lancer le fichier avec un argument** -```bash -./my_hash_object.sh mon_fichier.txt -``` +- Assurez-vous d'avoir Python 3 installé : + ```bash + python --version + ``` -## Cas de script Python (notre cas) +## Lancement du script +Pour exécuter le script, utilisez la commande suivante : ```bash -python3 --version # Vérifie que Python 3 est installé - -python3 git_hash_object.py mon_fichier.txt +python terminal.py [arguments] ``` ---- -**ou alors** -## Pour le script Bash -Place-le dans un dossier de ton PATH (par exemple ~/bin/). - -Ou utilise un alias dans ton ```.bashrc :``` - -```bash -alias git-hash-object="$HOME/path/to/my_hash_object.sh" -``` -### Pour le script Python -Rends-le exécutable : - -```bash -chmod +x git_hash_object.py -``` -Ajoute un shebang (première ligne du script) : - -```python -#!/usr/bin/env python3 -``` -Déplace-le dans un dossier du PATH ou utilise un alias : - -```bash -alias git-hash-object="python3 $HOME/path/to/git_hash_object.py" -``` -### Vérification avec Git -Compare le résultat avec la commande réelle de Git : - -```bash -git hash-object test.txt -``` - -[extrait de deepseek](https://chat.deepseek.com/a/chat/s/00c34d42-1c8e-4fcf-8f1a-a551c10f2804) -Ces étapes peuvent varier entre les utilisateurs de windows et de MacOS \ No newline at end of file +Remplacez `[arguments]` par les paramètres nécessaires selon l'utilisation du script. diff --git a/functions/add.py b/functions/add.py index 6cc78b2..10af4b4 100644 --- a/functions/add.py +++ b/functions/add.py @@ -17,11 +17,14 @@ def add_file(file_path): print(f"Fichier '{file_path}' ajouté (Blob: {blob_hash})") def update_index(file_path, blob_hash): - index_path = ".fyt/index" if os.path.exists(index_path): with open(index_path, "r") as f: - index = json.load(f) + content = f.read().strip() + if content: + index = json.loads(content) + else: + index = {} else: index = {} @@ -36,11 +39,15 @@ def update_index(file_path, blob_hash): def status_all(): index_path = ".fyt/index" - project_root = os.getcwd() + project_root = os.path.join(os.getcwd(), "projet-test") if os.path.exists(index_path): with open(index_path, "r") as f: - index = json.load(f) + content = f.read().strip() + if content: + index = json.loads(content) + else: + index = {} else: index = {} @@ -60,7 +67,7 @@ def status_all(): if file.startswith('.') or file.endswith('.pyc'): continue path = os.path.join(root, file) - rel_path = os.path.relpath(path, project_root) + rel_path = os.path.relpath(path, os.getcwd()) # rel_path par rapport à la racine du projet global working_dir_files.add(rel_path) with open(path, "rb") as f: diff --git a/projet-test/dsjhf.py b/projet-test/dsjhf.py new file mode 100644 index 0000000..e69de29 diff --git a/projet-test/fichier.txt b/projet-test/fichier.txt new file mode 100644 index 0000000..e69de29 diff --git a/terminal.py b/terminal.py index c7ae0e6..bf78a8f 100755 --- a/terminal.py +++ b/terminal.py @@ -40,6 +40,7 @@ # git ls-files subparsers.add_parser("ls-files", help="Liste les fichiers dans l'index") + # git reset -soft -mixed -hard parser_reset = subparsers.add_parser("reset", help="Réinitialise l'index et le répertoire de travail") parser_reset.add_argument("-soft", action="store_true", help="Enlève les commits mais garde l'index et le répertoire de travail") From 05e7d8eed82586dfb03208a3dc982a7d0245b73b Mon Sep 17 00:00:00 2001 From: AkaTFL Date: Thu, 10 Jul 2025 21:27:53 +0200 Subject: [PATCH 29/35] ajout de ls_tree --- functions/__pycache__/add.cpython-313.pyc | Bin 2074 -> 5014 bytes .../__pycache__/cat_file.cpython-313.pyc | Bin 1886 -> 1886 bytes functions/__pycache__/commit.cpython-313.pyc | Bin 2408 -> 2408 bytes .../__pycache__/commit_tree.cpython-313.pyc | Bin 457 -> 457 bytes functions/__pycache__/init.cpython-313.pyc | Bin 753 -> 753 bytes .../__pycache__/ls_files.cpython-313.pyc | Bin 1670 -> 1872 bytes functions/__pycache__/ls_tree.cpython-313.pyc | Bin 0 -> 2428 bytes functions/__pycache__/reset.cpython-313.pyc | Bin 1910 -> 1910 bytes .../__pycache__/rev_parse.cpython-313.pyc | Bin 3588 -> 3588 bytes .../__pycache__/show_ref.cpython-313.pyc | Bin 878 -> 878 bytes .../__pycache__/write_tree.cpython-313.pyc | Bin 408 -> 408 bytes functions/ls_files.py | 7 +++- functions/ls_tree.py | 37 ++++++++++++++++++ terminal.py | 7 ++++ 14 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 functions/__pycache__/ls_tree.cpython-313.pyc create mode 100644 functions/ls_tree.py diff --git a/functions/__pycache__/add.cpython-313.pyc b/functions/__pycache__/add.cpython-313.pyc index db1564adbbfccf0e36ca4fe4f185dc29c026d080..abf56dcadec675a65812768019f7a5dccad597ae 100644 GIT binary patch literal 5014 zcmcInO>7&-6`ox#x%?GLQGXUKnWSS`lw;XW>=;qxD2?PuZY0?uv$g^$ASnJwD@#ju zc4^v16Dz%h4p5j%5QuROW`BU#Ns74WB}EG~t%?8zau7>7R5n79qPq0v*Z~9>1==@D z?vkNpJC}~c*_qk*H?!}3^WI&X&5WS^cR4Zpf(4;}k%`*q%HVD<4BkaS6r^56xcsCr zrOate2kCZ%bwM5UOpt+IKSTNT|0c}i5vn4CJXrYY;CJ^6SbY~wYVSCZe59g{MgqlA z0YX>Tj#TCX4VvLk^g3Qx2XsuEgzi z=u}ByU#q$rG;pW^1zAo9z41xCdKw-ygS_Z*)LkKr!YRdJXSDE(rrU+$)I%ta zl_~tDahb-`7oENF3(|qa^js_=i3g_V6VosIDcKl1&x=whaaN|&(-%!I@R3z zM;q zv5-Pe#bq{<5TuwO$tGfPh-j0I$`Hg>7749Le9NOWxo@yf*exA0@7i>G+rh z`Qp!B%o_8D|IT!8I2xDPC3e}mWX(+|M4Pp8jixK?Wj4#M8QT=W-x-kJnccC*bZs!E z%!w?Yom}-Cy6L~^{`5zy=4Wp)16!@2|CXuq-d00pAQI2|xpR=w{l(fi*sNP&%!7^W zO0#)zHycq=14s}#F(u-kfK@;cN}wmny3zu*ld^(NWb~|8?R^QO02iQdN*v&Y)>w- zX7lC4>n*Lz@um1Xv&+JgP;BYS4FAL4veCBln)#|Zf3(=PZ%O}6TYFZ&WkC(QS8cxA z4an)r=r`@oE9uMWE0-=`%3b)__lf^Q|3~|Z_NM?A2oSu@=1fJ0Z}G%8ExQ(vXS&}w zNzh;}w_8D(4Wspn=`B-s&zjM#puwuCbE^a7-?I7cZSAZL_umZ+9@VY1whkF}D@V;k zdiJkI^H2*Lf&FQX9EK9^aR_`R+-u$V2Zno%8*h7=tBzj{dV#9p*-pzgmwq)Ew16j| zqJaaXB(=dnb98`sU0qXc2@q$jYw9}!NSY1;Dh`z}ux(&-IxS2Y1wNQpdknyO!urmu3S@4g2bZFK@*3J^!B{4O+1kHFVW!7q7UFg@bT-S}byeY1v0x z8Z{+S$~+0D4-zFdhh=RLDRPOJON&=5&zI@e&VN^ci0}m z?bd{A1Fn|mp}3)GY2XZj-I@Sxz%{6Q^3>viEofFb;c|Qg9tgVnn4N@gT5bXOD)kLY z6fNol{`$Az=anVFKC$@>g-{qUWOAQM$2CA&Z+Wt&Kp4A=(8M^&r8qnBiZG-Yb@bL+ z`eAAeQk^;qTO9?&DDkFYdJN8&j3!R+hY|?<6{HJ}8g2*J(@@Jj26rLhcvxC6Opni% zuYHj&`)nLNr1ZE^NfGShn1IJcOA;sMV$yyI3Ij~w;vz#b2k0RQmo1@C@@) zGJCRIp~zG(yoPnm5PEl?M@Xd3#lk61yi%hG3Be<#_;Y-U)OvlMg+!E(^D8$}U z{-yq3(;t|AY5JAr`m06PGmE2}|DRl{sWqp+W`587zO~r2XK`$!&HcW9m1*AW*mdp9 z)ie32QpXbo(-8v)myN7^WAIK zeVfkaY&18t=Je)YT5oq>>w2&2{q8I&U>kj#Zr`>3tNqv6qWfUU-B)n;72W-r(QoXn zMf+nLj^*9 zqFYYyJ&}0spSuP|ExOO!cZ_xzK0nHke!u|z-+G;+KK2WXd9%p2f#uO2JPgxO7`bQPkJS^fj`4jT-JSR_ZzG S&dx?^=iQ$D)LuLUB>w|>L4b(> delta 427 zcmbQHK1+b_GcPX}0}!15mXa}_c_N<#qsByaO_p>to&1kgo{?kn99B7|2jN(mTPhq z@d7m$@dJrlY^fEQ#U;f>AQ#+X$tupzyTy`|pO|usy(l%OAh9Il7F&91NpgA0EtcYv z#FASqDW$mun(Rd)AQQwvnz+D5$Ai=siB48zS5RXI3M)WBkrYUs5R4E8GK!Z1i3WxT zlQY@~-kK{rWD#z$Jf`Q|?zW z$iB_u&iu@W^u?VOm=E)FIm@yiR^W2hW7lMbcuE1NqzDx9MbaQbXtIy66qgQ=$q2;7 Tl9LOB#koGq@H5I3X#)iS>5*uD diff --git a/functions/__pycache__/cat_file.cpython-313.pyc b/functions/__pycache__/cat_file.cpython-313.pyc index 063d181e66e98fb9872dea6bf23046b2ab63c730..4d11034072ccd3fb9f153a17930df24ed50345c2 100644 GIT binary patch delta 20 acmcb|caM+zGcPX}0}vQa%-_fz%nkrPJ_SMm delta 20 acmcb|caM+zGcPX}0}!lZO5MmE%nkrP9R(%; diff --git a/functions/__pycache__/commit.cpython-313.pyc b/functions/__pycache__/commit.cpython-313.pyc index cea1cfe2fb7e6840a1eef9062fcbffeeec6b8862..261f41d1aaaff25a74a9e4e028d2069367e8bb25 100644 GIT binary patch delta 22 ccmaDM^g@XDGcPX}0}vQa%+Ijf$Q#WG08G3F5&!@I delta 22 ccmaDM^g@XDGcPX}0}!15mXe{hkvEzX093&S_5c6? diff --git a/functions/__pycache__/commit_tree.cpython-313.pyc b/functions/__pycache__/commit_tree.cpython-313.pyc index 09679596a86f2f58e1dda59de1490a7ce73b6d29..5245d65191d9f41563440d91767289acc134827e 100644 GIT binary patch delta 20 acmX@fe3F^_GcPX}0}vQa%-_hpj}ZVmWCdpc delta 20 acmX@fe3F^_GcPX}0}!15ma>t1A0q%j-3DI( diff --git a/functions/__pycache__/init.cpython-313.pyc b/functions/__pycache__/init.cpython-313.pyc index 2486a8112df442be4539c72862f23688dc026782..674ec478e58bea77eb3dd06e559297a7c9628f54 100644 GIT binary patch delta 20 acmey!`jM6UGcPX}0}vQa%-_iUj0pfh?FHlj delta 20 acmey!`jM6UGcPX}0}!15ma>ui8500UW(M2< diff --git a/functions/__pycache__/ls_files.cpython-313.pyc b/functions/__pycache__/ls_files.cpython-313.pyc index dca792247c92e3df9041d46db57d4bb9e0d35267..273ac4fbbcc311c4ddecfd969b2103e7d50988cf 100644 GIT binary patch delta 525 zcmZqUy}-x!nU|M~0SE$w3NlKWH}bt=ViIB6{ELZ)u|AY3NEjrA3QVEgAW>9t5DzAo z#~jM60hLY^XJCjHgQ*RYfUyv?5<@7nDIvohEzO_~RT0bvlT=^`218RO zh?D|DI7^W1WH%N?URIz6CkT9%p8hR6H{)n7MB!d7TjXVD$dWl#hR0!m{NR;wV)_7 zujCd>c4}p@CfhBxw91l{%%WS&nJE>w7}IXCC+Fvtq~?`O)@7AYVFTKy00u?8K;|uu zoZ|Sj%$(HXA{8K)ABc?~ delta 387 zcmcb>*T&2DnU|M~0SL~2OUXFPw2|)>6Vp1z&A*s<7#*U8KoTGjBm$w4NhO9*CR0X; zNFH-A0|=TjLHG&`;mkqelh?2)^0Gur!gPhQOuofpuFU3li#0PZCAH!f!!5?5D%R4H zG+hf###&)mlv#ncD1bl_FOYSMBd0h%Ei)&zxJVJmG2ceuZgO4aNgnI?Z~{wA@PZsK}`KSD^T_-r{=F> z9-#h1EaJ{=%!k>yoJH7gam2^xCT8Zv$7`|`u>d8DI6;I2h~NVeij&{5sW7Te7G_tJ f;b4^fAi}`H(@}MqS@I?ePpj7lW(F3iB9Nm1dr)8Q diff --git a/functions/__pycache__/ls_tree.cpython-313.pyc b/functions/__pycache__/ls_tree.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..85b0f5ed247e6360fc31ac4a713380fd92b7b15b GIT binary patch literal 2428 zcmah~T}<0n6uyq_IR8MhQhr)+(~6RnQfQ&HY*0-t9jq(T;(F_pNSTS9;3_zg?LeDJ z6WUA3rU}qgLAy%ik!pM3VGnzp*7Y40Sec3XvZubGg4C%`JJ-a40#YyH`kr&Y^Lx)Z z+46c_2-d|wW^{u>=wD1&3utp~eFdKfh(jE41F1V-LM2SvrrJ1L15!zjgq@1g9MyXp zA)ywbC>2Ce6!z>W*}HQz4P-a5!(&mBND?9YOH2;O%UtsgdqBefRvmD$2MTeU=$!!l zV+ch|2;RcB%CT|?V-x!p4-s^iv5M^-^2|PAAbFeRb8Goh0ByYO6yo3Ijq?y~l?-I8 zs6g9I9GUqhSmLnk1rb;A19FE#gf2xF2#YWDyj-Ietasp32WT9w8PQcUX_ zeh-#qjsB~>QC^c&EjlKsx*WZhj%UXtMc1Mq%lcq;BswbTay*ul^=Kli#C18XXwj4w z(^W}o&)hRS30V&o)#SBxm+$+wlCOF?nNLoq@~Qc*LT%C4 zIz^V;-szrv&vakDZ$9wceSF1zd_7P*^~w5?`p4%NdLH&HTzPn9v8&kFF(qy~k-O@L zwrv-p9rp*n9bEQytWlj?U zk+AQ9mXG1XN`c@A&c>tevIQv4U8{%ba39orusFpAD5XmKg>j1aEhr_DM?S<+7f8#0 z7DZ|-7;ocf&dxEHNgGl~o(u=9o87M!fB48Q&pKIm3dK`a%ZPxB9JLUfW7lpI9xd=^ zwJ0v`CKRc&uwjU2{|X|WvNS04K@E{+OX3SU!dhp`g5{IYf)MB8=??%P0E(wM7p}$t z8iYZXg}2Bg_xSAQ8OWK3xBJkAiggy<1W(-vd%XwijhqBU=Hh9~)3ZQZXN*6ABFD-g z#2}#_I&7~FCr`aC(R@gz5~z=CMhW5sYC~3BB2;n0#-e7>$D-l;JBW~P*kIBlcci!u zZI1gf=c|kjOtLvID=WI1&W;NsDXHBc)Eu4F6K5}l2*V*M@w6x_$(-vJ#*WLP)Se4n zPpe~sjwg<(K~~0v6x_fdil-G_QnKubn$_7}mq91wl%(Z6ogEz)ySmtsRC!oV{95c(zd1gKHpBKJdvj65NR(~`(WX-_-eE)ptx%QFG_E9XWl= zzP4YqrOQ8mv*PPpbM*hWU4yFYw~!62d1{vZ{l6bw@ei(ghOjSzvM)Zkee=2ss5R%g zH`@D@1FCo7u z#OxFaE+q9h-f-^CN5Dw@^B0R5l%OWZpCGjg-ZqX+6g?YN$Y`alOzaY z1GzSka|5|wQ4DeZmH$2B%4Qp)JX5(MS^p2^p1L|cm>-<^EPrE-s@o(H)nF?AA8V}M ATL1t6 literal 0 HcmV?d00001 diff --git a/functions/__pycache__/reset.cpython-313.pyc b/functions/__pycache__/reset.cpython-313.pyc index ca16e022be0451cd0d61b7f357ad1c5ebeb52b85..0f1b2702473a76618d699e381ea0b51721d0a3d6 100644 GIT binary patch delta 20 acmeyy_l=MHGcPX}0}vQa%-_hJ%?sMnHc~^69!fQ diff --git a/functions/__pycache__/write_tree.cpython-313.pyc b/functions/__pycache__/write_tree.cpython-313.pyc index d4f98672113c8bd56d8942eb7e8f0dd2834d616b..0736cce82eadb893bab4bb36934b3b4a94702079 100644 GIT binary patch delta 20 acmbQiJcF70GcPX}0}vQa%-_h}%Lo86yadz$ delta 20 acmbQiJcF70GcPX}0}!15ma>t%mk|ItH3iH7 diff --git a/functions/ls_files.py b/functions/ls_files.py index 46e96ac..cbdbb8d 100644 --- a/functions/ls_files.py +++ b/functions/ls_files.py @@ -18,7 +18,12 @@ def ls_files(): if not os.path.exists(idx): sys.exit("") # index inexistant → rien à lister with open(idx, "r", encoding="utf-8") as f: - index_data = json.load(f) + content = f.read().strip() + if content: + index_data = json.loads(content) + else: + index_data = {} + print( "l'index est vide, rien à lister") for file_path in index_data.keys(): print(file_path) diff --git a/functions/ls_tree.py b/functions/ls_tree.py new file mode 100644 index 0000000..70560b4 --- /dev/null +++ b/functions/ls_tree.py @@ -0,0 +1,37 @@ +import sys +import os +import json + +def find_fyt_dir(path): + prev = None + while path != prev: + dot = os.path.join(path, ".fyt") + if os.path.isdir(dot): + return dot + prev, path = path, os.path.dirname(path) + sys.exit("Erreur : pas de dépôt .fyt ici.") + +def ls_tree(tree_sha): + fytdir = find_fyt_dir(os.getcwd()) + tree_path = os.path.join(fytdir, "objects", "tree", tree_sha) + if not os.path.exists(tree_path): + sys.exit(f"Erreur : tree {tree_sha} introuvable.") + with open(tree_path, "r", encoding="utf-8") as f: + content = f.read().strip() + if not content: + print("Tree vide.") + return + try: + tree_data = json.loads(content) + except Exception: + print("Format de tree invalide : contenu brut :\n" + content) + return + # Format attendu : {"files": [["chemin", "sha"], ...]} + if isinstance(tree_data, dict) and "files" in tree_data: + for file_path, sha in tree_data["files"]: + print(f"100644 blob {sha}\t{file_path}") + else: + print("Format de tree inattendu :\n" + str(tree_data)) + +if __name__ == "__main__": + ls_tree(sys.argv[1]) \ No newline at end of file diff --git a/terminal.py b/terminal.py index bf78a8f..924494e 100755 --- a/terminal.py +++ b/terminal.py @@ -6,6 +6,7 @@ from functions.commit_tree import commit_tree from functions.init import init_repo from functions.ls_files import ls_files +from functions.ls_tree import ls_tree from functions.reset import reset from functions.rev_parse import rev_parse from functions.show_ref import show_ref @@ -41,6 +42,10 @@ # git ls-files subparsers.add_parser("ls-files", help="Liste les fichiers dans l'index") +# git ls-tree +tree_parser = subparsers.add_parser("ls-tree", help="Liste les fichiers dans un tree") +tree_parser.add_argument("tree_sha", help="SHA1 du tree à lister") + # git reset -soft -mixed -hard parser_reset = subparsers.add_parser("reset", help="Réinitialise l'index et le répertoire de travail") parser_reset.add_argument("-soft", action="store_true", help="Enlève les commits mais garde l'index et le répertoire de travail") @@ -75,6 +80,8 @@ init_repo() elif args.command == "ls-files": ls_files() +elif args.command == "ls-tree": + ls_tree(args.tree_sha) elif args.command == "reset": reset(args.soft, args.mixed, args.hard) elif args.command == "rev-parse": From 93efb6abcac45646ae059c62dcad5c1bb8dc7b63 Mon Sep 17 00:00:00 2001 From: AkaTFL Date: Thu, 10 Jul 2025 21:34:52 +0200 Subject: [PATCH 30/35] simplification du code --- .../__pycache__/ls_files.cpython-313.pyc | Bin 1872 -> 1872 bytes functions/__pycache__/ls_tree.cpython-313.pyc | Bin 2428 -> 2225 bytes functions/ls_tree.py | 8 ++------ 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/functions/__pycache__/ls_files.cpython-313.pyc b/functions/__pycache__/ls_files.cpython-313.pyc index 273ac4fbbcc311c4ddecfd969b2103e7d50988cf..287805870e2e408a052934479c0df94c8ee80cc7 100644 GIT binary patch delta 19 Zcmcb>cY%-VGcPX}0}xCX-N@y}4gfYP1d;#% delta 19 Zcmcb>cY%-VGcPX}0}uoVZRB!e2LLp21V{h? diff --git a/functions/__pycache__/ls_tree.cpython-313.pyc b/functions/__pycache__/ls_tree.cpython-313.pyc index 85b0f5ed247e6360fc31ac4a713380fd92b7b15b..6ba34a3ee21bb7c8a11de064bf3cab9551df485a 100644 GIT binary patch delta 263 zcmew(v{8`vGcPX}0}$*JEy$4F$jipe*tc1PxtDSBVip~_U%$MWwizhCMqy6gt7*6PL^hsX6FiJ=VJ)wo@~pi%FGk3I60M7MM;N2 z1FAQLk%1wNNr6EgXrKavU!pCuJVP3zChz3$tbvn@*~}OPC$C})o6OB#!L0?o#9m>wf z5X>{#l2w(NH(GgeBCAS$vYQD3~3Cu%<>Fr zjEW383>r|wQh++rm_X_kfY7fUqC%6;?-qN0QdVkmN%1X~lA_eqs>wT89ki=7-SUfa z6H63QQWZd=3YmFji8+}-o|Qs!eqKpxUa3M-QE7>S71!h+tY(Ztll9rcxHw%al2Z#x zGV}8$x3E=mYXhz31L9(3#>pJ)T~Z&oSU836NXX3Rn#Hxi{IZ00r{{NG1}=jyVv|?0 z`z8MPBFG>h`I&(UsE9}Kf{@(-@ryzpS9m;c@Cbbu2CBQjssDiwDEsR>Kah8oQ~y`7 z7SQ-ZTt=>P%!k>;Tr8N5SV*`^vmO;-1d1G$Vg#|JnL%thE?1q&VjSv>+LP@#v=|L1 SXL2aAiZI%L(3#xNp#%V*Y;C9j diff --git a/functions/ls_tree.py b/functions/ls_tree.py index 70560b4..8d70963 100644 --- a/functions/ls_tree.py +++ b/functions/ls_tree.py @@ -21,12 +21,8 @@ def ls_tree(tree_sha): if not content: print("Tree vide.") return - try: - tree_data = json.loads(content) - except Exception: - print("Format de tree invalide : contenu brut :\n" + content) - return - # Format attendu : {"files": [["chemin", "sha"], ...]} + + tree_data = json.loads(content) if isinstance(tree_data, dict) and "files" in tree_data: for file_path, sha in tree_data["files"]: print(f"100644 blob {sha}\t{file_path}") From eebdc2e04a4d138326aa0412348371df57551051 Mon Sep 17 00:00:00 2001 From: AkaTFL Date: Mon, 14 Jul 2025 14:47:30 +0200 Subject: [PATCH 31/35] ajout log --- Objects/__pycache__/o_commit.cpython-313.pyc | Bin 3420 -> 3420 bytes Objects/__pycache__/o_tree.cpython-313.pyc | Bin 2053 -> 2053 bytes functions/__pycache__/add.cpython-313.pyc | Bin 5014 -> 5014 bytes .../__pycache__/cat_file.cpython-313.pyc | Bin 1886 -> 1886 bytes functions/__pycache__/commit.cpython-313.pyc | Bin 2408 -> 2408 bytes .../__pycache__/commit_tree.cpython-313.pyc | Bin 457 -> 457 bytes functions/__pycache__/init.cpython-313.pyc | Bin 753 -> 753 bytes functions/__pycache__/log.cpython-313.pyc | Bin 0 -> 1421 bytes .../__pycache__/ls_files.cpython-313.pyc | Bin 1872 -> 1872 bytes functions/__pycache__/ls_tree.cpython-313.pyc | Bin 2225 -> 2225 bytes functions/__pycache__/reset.cpython-313.pyc | Bin 1910 -> 1910 bytes .../__pycache__/rev_parse.cpython-313.pyc | Bin 3588 -> 3588 bytes .../__pycache__/show_ref.cpython-313.pyc | Bin 878 -> 878 bytes .../__pycache__/write_tree.cpython-313.pyc | Bin 408 -> 408 bytes functions/log.py | 24 ++++++++++ github_workflow.md | 42 ------------------ terminal.py | 6 +++ 17 files changed, 30 insertions(+), 42 deletions(-) create mode 100644 functions/__pycache__/log.cpython-313.pyc create mode 100644 functions/log.py delete mode 100644 github_workflow.md diff --git a/Objects/__pycache__/o_commit.cpython-313.pyc b/Objects/__pycache__/o_commit.cpython-313.pyc index 817c6052762274921be110e58b09bc0a1985ad5d..e13a11f884eb878a1aafa6253cafc8421a7da8d7 100644 GIT binary patch delta 20 acmca3bw`T(GcPX}0}${ZFWJZ)$O`~K69sbs delta 20 acmca3bw`T(GcPX}0}!y?P1(pD$O`~K2nBEe diff --git a/Objects/__pycache__/o_tree.cpython-313.pyc b/Objects/__pycache__/o_tree.cpython-313.pyc index 28e69e3ae389a65e857f8766c34d94b452632f7c..20319b02594a5c2a0e257bde7553b4dc641e3e0a 100644 GIT binary patch delta 20 acmZn_Xcgf8%*)Hg00jKUOEz--4FyyH delta 20 acmZn_Xcgf8%*)Hg00eAzQ#Nw{Vg~>-0tHb3 diff --git a/functions/__pycache__/add.cpython-313.pyc b/functions/__pycache__/add.cpython-313.pyc index abf56dcadec675a65812768019f7a5dccad597ae..a3d6157e148bb9c7a114112034902015aa3d5dc9 100644 GIT binary patch delta 20 acmbQHK24qbGcPX}0}${ZFWJc5EerrR{RKe) delta 20 acmbQHK24qbGcPX}0}%Y5p1+a1TNnU6R0aG1 diff --git a/functions/__pycache__/cat_file.cpython-313.pyc b/functions/__pycache__/cat_file.cpython-313.pyc index 4d11034072ccd3fb9f153a17930df24ed50345c2..4c75273a10f1e7195f45346aa76dcc05ef7da314 100644 GIT binary patch delta 20 acmcb|caM+zGcPX}0}${ZFWJZ)%nkrPtp!^E delta 20 acmcb|caM+zGcPX}0}vQa%-_fz%nkrPJ_SMm diff --git a/functions/__pycache__/commit.cpython-313.pyc b/functions/__pycache__/commit.cpython-313.pyc index 261f41d1aaaff25a74a9e4e028d2069367e8bb25..e6f0612a77928311e26147b9f3df2394ec073ac2 100644 GIT binary patch delta 20 acmaDM^g@XHGcPX}0}${ZFWJZ)%LxEL&jo`3 delta 20 acmaDM^g@XHGcPX}0}vQa%-_fz%LxELU7%Q6n?Y2{#h?x6sLa_5^t*FVj8)JHj0QKQo$*aDk9;P#UYj|*Ip+J>sf1N zwk0`K<%F#s+#IU-*lX@wIi+V*D}h8qZ$wDFRrnCp6SKC*ZfMnx<#})3`{uoGzTMeg zGMNA|{{4-u-&O$r3Kw#Sb$|3y!aM>SY;+R{*vfezXbol6=V5xK(gzKvsIaQ|_a2Jf zk6?9_E68f22tXn7%3|o+XbuhBPll1|djP93iL@1&w_puc^-)~4wYgyr1uzt$V94Cq z&JEo{avYPM%wZ%>Dt@w>1>d2<`w}&_c0@9fOv|SLil{I##z@bON~|3V4~@|~l$n$} z$JRzgBspQ_9sA#)Y;mNV6rYb7cG! zi;=fIfiaJ7rU48H`OLs9jChMTq^4Mq78wgxo_?XGp@!aq_;P^A>MNUCuC~E~knQ!L z5@4&kyVKbHg;_T?n8k=6+}Yi+s%1k4#)Hau6LzV}_s^$_K`*rC}d*Vo13R?YPst_m957&IM3w0=A`2vHs# zI^p%S`hzcgwNNTjhtN`8G;>RNzY^3P%xLLrmn{dkOY07EE4S8MR;mTK!dxHIlIO4G z8XH^{mV6*;g;$;aEvEbM%t*H9Tl4M3)?z1fV9a!lnP>6jQ*&uQe&aB19_h*E51p&~ zdiwEahvwNfZs9$1`oO%{H81X&nWlQILc)3xg}Cway`SzqtR2Lry0NK4bE56G+>ZJH zcfReK>85&=I<(ch@)@G%G4Kb|?+``TgZ%yw=o zx0kxmjP+agqA+>B85Q_ut?jkE2l$Wp)IX{S9;XGP-}Us%<8woYo)t&^HJ#6>yPr*@2#Lft(W)kAGhGtAXb%5^)J2d{Jol^?9Kpg#HA* Mr=3RAcY%-lGcPX}0}${ZFWJcL$_@ZLeFZT9 delta 20 acmcb>cY%-lGcPX}0}xCXE!fEI$_@ZK^#ua} diff --git a/functions/__pycache__/ls_tree.cpython-313.pyc b/functions/__pycache__/ls_tree.cpython-313.pyc index 6ba34a3ee21bb7c8a11de064bf3cab9551df485a..b0464265c0c84bd58c6eaf1c1803cd9adcdc09f4 100644 GIT binary patch delta 20 acmdlexKWV%GcPX}0}${ZFWJbwi~|5U5(QfT delta 20 acmdlexKWV%GcPX}0}$*JE!fDti~|5Un*~$= diff --git a/functions/__pycache__/reset.cpython-313.pyc b/functions/__pycache__/reset.cpython-313.pyc index 0f1b2702473a76618d699e381ea0b51721d0a3d6..dcafd6951da073eac2622c62c8f41ac4f9224b45 100644 GIT binary patch delta 20 acmeyy_l=MHGcPX}0}${ZFWJbQ%? Date: Wed, 16 Jul 2025 15:13:26 +0200 Subject: [PATCH 32/35] add checkout et fix fonctions --- .fyt/HEAD | 2 +- .fyt/index | 1 + .../8a34efceef0ac0a1d28f6ecd6b787faa858fc371 | 14 ++++ .../d167f8150b32689b88347ca2b4ad552757bbaa1d | 1 + .../d52abe7ef4782155953505139bb08ccf597be44e | 1 + .../ae91d2597f41e32b3246644d0da6002b7459efc1 | 1 + .fyt/refs/heads/main | 2 +- .fyt/refs/heads/test | 1 + .../__pycache__/checkout.cpython-313.pyc | Bin 0 -> 4725 bytes functions/__pycache__/commit.cpython-313.pyc | Bin 2408 -> 3030 bytes functions/__pycache__/log.cpython-313.pyc | Bin 1421 -> 1421 bytes functions/checkout.py | 75 ++++++++++++++++++ functions/commit.py | 14 +++- terminal.py | 8 ++ 14 files changed, 115 insertions(+), 5 deletions(-) create mode 100644 .fyt/objects/blob/8a34efceef0ac0a1d28f6ecd6b787faa858fc371 create mode 100644 .fyt/objects/commit/d167f8150b32689b88347ca2b4ad552757bbaa1d create mode 100644 .fyt/objects/commit/d52abe7ef4782155953505139bb08ccf597be44e create mode 100644 .fyt/objects/tree/ae91d2597f41e32b3246644d0da6002b7459efc1 create mode 100644 .fyt/refs/heads/test create mode 100644 functions/__pycache__/checkout.cpython-313.pyc create mode 100644 functions/checkout.py diff --git a/.fyt/HEAD b/.fyt/HEAD index b870d82..b93d09e 100644 --- a/.fyt/HEAD +++ b/.fyt/HEAD @@ -1 +1 @@ -ref: refs/heads/main +ref: refs/heads/test \ No newline at end of file diff --git a/.fyt/index b/.fyt/index index e69de29..3f6f397 100644 --- a/.fyt/index +++ b/.fyt/index @@ -0,0 +1 @@ +{"Launching.md": "8a34efceef0ac0a1d28f6ecd6b787faa858fc371"} \ No newline at end of file diff --git a/.fyt/objects/blob/8a34efceef0ac0a1d28f6ecd6b787faa858fc371 b/.fyt/objects/blob/8a34efceef0ac0a1d28f6ecd6b787faa858fc371 new file mode 100644 index 0000000..85f30c0 --- /dev/null +++ b/.fyt/objects/blob/8a34efceef0ac0a1d28f6ecd6b787faa858fc371 @@ -0,0 +1,14 @@ +## Prérequis + +- Assurez-vous d'avoir Python 3 installé : + ```bash + python --version + ``` + +## Lancement du script + +Pour exécuter le script, utilisez la commande suivante : +```bash +python terminal.py [arguments] +``` +Remplacez `[arguments]` par les paramètres nécessaires selon l'utilisation du script. diff --git a/.fyt/objects/commit/d167f8150b32689b88347ca2b4ad552757bbaa1d b/.fyt/objects/commit/d167f8150b32689b88347ca2b4ad552757bbaa1d new file mode 100644 index 0000000..3f12680 --- /dev/null +++ b/.fyt/objects/commit/d167f8150b32689b88347ca2b4ad552757bbaa1d @@ -0,0 +1 @@ +{"tree": "ae91d2597f41e32b3246644d0da6002b7459efc1", "message": "bonjour", "date": "2025-07-16T15:00:53.235825"} \ No newline at end of file diff --git a/.fyt/objects/commit/d52abe7ef4782155953505139bb08ccf597be44e b/.fyt/objects/commit/d52abe7ef4782155953505139bb08ccf597be44e new file mode 100644 index 0000000..008c27e --- /dev/null +++ b/.fyt/objects/commit/d52abe7ef4782155953505139bb08ccf597be44e @@ -0,0 +1 @@ +{"tree": "ae91d2597f41e32b3246644d0da6002b7459efc1", "message": "bonjour", "date": "2025-07-16T15:11:14.809683"} \ No newline at end of file diff --git a/.fyt/objects/tree/ae91d2597f41e32b3246644d0da6002b7459efc1 b/.fyt/objects/tree/ae91d2597f41e32b3246644d0da6002b7459efc1 new file mode 100644 index 0000000..1df9ce7 --- /dev/null +++ b/.fyt/objects/tree/ae91d2597f41e32b3246644d0da6002b7459efc1 @@ -0,0 +1 @@ +{"files": [["Launching.md", "8a34efceef0ac0a1d28f6ecd6b787faa858fc371"]]} \ No newline at end of file diff --git a/.fyt/refs/heads/main b/.fyt/refs/heads/main index a63861f..0e9fa5b 100644 --- a/.fyt/refs/heads/main +++ b/.fyt/refs/heads/main @@ -1 +1 @@ -9c4b60dfe9f0b12263841644845dc8fc2d32bc5a \ No newline at end of file +d167f8150b32689b88347ca2b4ad552757bbaa1d \ No newline at end of file diff --git a/.fyt/refs/heads/test b/.fyt/refs/heads/test new file mode 100644 index 0000000..33b14af --- /dev/null +++ b/.fyt/refs/heads/test @@ -0,0 +1 @@ +d52abe7ef4782155953505139bb08ccf597be44e \ No newline at end of file diff --git a/functions/__pycache__/checkout.cpython-313.pyc b/functions/__pycache__/checkout.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d9633c76c4dfc27d3fa380628f40ed9a5cbdff73 GIT binary patch literal 4725 zcmb_eT}&I<6~5!KnemMO#uz7Y0v-(h3%?0v$)+J}!X~6m0>#5DRl_bdW(c!^F`2PL zq17tt6YLAnc7>xzjiY@CJe7w&Flq!*skgE31m@&qn zz^-~N&)lEyoO{l9&bf16o6Q7(t@hXB!@nT`_=hsknr^4_+5@vYe-!>-UxWL625u>HY6}&jv^m30r{KjP%}8z-*qI$P z0dNb`AdF61r@?K&B7%+u8nOckw?V8ik3|`M^Ul6HAfPN7f<70w=ADU?`JiEfMgpzy4pi$h&*gs$nrL zm-2b{VPPe(*uH%Dwv~Vv`@I`E20cpT4rj6}!0H72o9bn8je`R+;_ZwcSXm6!i#IE0 z8Ek^_khmUjlCeh39xWz=wmm1AoyB2RmNuapPC3zby=IMjV|MF!&K6jyF0Hrw_5e1o zM<9x0)JufQcd=SetL{?Jfm|B^AP&#UvELoy>A_q%m@?LsuV(WhIu2sXtg(=1%dv+o zCu@Ri9b?JjO1}AHh|^pGN3IyMc)xIXPsNbT@uE}cEfphJiWx76qxlH1>GYrDp z#t`($4drOifp-3@6?KClp)(RD5z0W)?4%+HU2aU6<4I!BLy`O#sR z&i@>S=+ND~0YDBFbazhb>xU*{apmB<6pzFOdT@DhZ27k_`szfCj)~Fuz2(LFNuvU4 zxOU~z`!XU<>P2qoyo}H5Ah?MY%iKrq;ZJuSKT3Ypvo+{(^nU? z!C*KRmW_(0oB*x_Lp8yu_EfNScMl;3t&vHA8}E-qbAudEH3kMfH-|%(Rr@66V@U6B za$EcPK33vHsc#h0$@je{@)FZssXGY zn~-sBAhy6Ql<%eVCA^E=2b-jMre(Ti=Hm3lgl~ zT{R2s8CT;Hm3B2vUElCjKk+~IKdF6OyKrymrx{Os%H-al%2LkYLQ|G%SUR)r^*y=u z_}1qiE}cz#-&ylsNP912yceI|O?xk;Y#z9my)i{Kyea{nx|FG6v$Sl!Wv*rZ!rX;q z$wJ8z_Ovup+B$`AK#K#3_N?n#bm_lo|*^~Cqs_jzE} zs`%(v_{y(UxE~EY7~lm<%RQrfR!V&L3oL-Cx^|Z{oxZ z`6>CU%c{v;b6v^rWgPWS9V_@nC24|*o~+rEy*ap!}8|Gz-i6516~#gf8p7-4*B`J@)QK^iQs`kPiLA zFTP_8fqvffn`n+OpP&9PcW^;aox55XH!3FrO(Sgs%Y=PK;t;m{=nps*9`)!VcyS z?Z5=7gya3yUr@lb_4vT`USL?u>q0VGKbaLy_@4n9Kr^oYl6>@(gK=nqrfmut>VgU)X z0d*v%++r;*DatIk#Z_FASX5G6o>`J{izO>RGY=?Hkds-W$ul{IEm`aqGtl^396%zz zAh9H)mg2Ln@Y*F0CKqkoSVoRpYn(QHr^&QzWjIVIYFEG5p$KRjUnbw`rpVygp znNO~R`8zWMm%;;fuJ*ddx(R95*<~-X%ia+doo+tSe7emnD#;E=EPWn|!zzs4!|>$?yGm)SK=(_i0Z7`Uviaa#WR&H;4SRZe*j zgHQ1)uL78%a+O#4SFtl$v!9mY^44HKt<7cTZON|5TEq`Du1Ew#NP!4> q5CICpl?%?9K#1M%k^mW?Hq%#3`KpRw3UM6-ibfj}^S zC}%K3umB4KA49O<jwo&|AOobRcs=9huN)za(iiwt79?Nc)LM~vgM+i5y_07Bvh=I%O8mH;6?=lQrR#!PKe|_fws=3Ok^{ZGPXyATvcLV0b zszM%2%*UjKJVcm}GYWaAG9NeKa<^wc!Nlbu$bLeE%R`C%gesSZF}o&f5id|zkr0TG u01>hv0_41v44;7{Ly;zsxW&z3lbfGXnv-f*q&s;%w>*a`qe+ntPzC@y9$s_+ diff --git a/functions/__pycache__/log.cpython-313.pyc b/functions/__pycache__/log.cpython-313.pyc index 6d6c1089d52f2fdcbbf96cab79cd883a410a4b43..2d90304d3ca46e36f2b6b53d216c6d137b4a1a3c 100644 GIT binary patch delta 19 ZcmeC>?&aqC%*)Hg00hy0HgYwy0st@T1nd9+ delta 19 ZcmeC>?&aqC%*)Hg00ckIZRBcZ1pqR$1zP|B diff --git a/functions/checkout.py b/functions/checkout.py new file mode 100644 index 0000000..ce123f8 --- /dev/null +++ b/functions/checkout.py @@ -0,0 +1,75 @@ +import os +import json +import sys + +def checkout(b, branch_or_sha): + # Vérifier le dépôt + if not os.path.exists('.fyt'): + print("Aucun dépôt Fyt trouvé.") + return + + ref = branch_or_sha + # Création d'une nouvelle branche si -b + if b: + # HEAD doit pointer sur le commit courant + with open('.fyt/HEAD', 'r') as f: + current_ref = f.read().strip() + if current_ref.startswith('ref:'): + current_ref = current_ref.split(' ')[1] + current_commit_file = os.path.join('.fyt', current_ref) + with open(current_commit_file, 'r') as f: + current_commit_sha = f.readlines()[-1].split()[0] + else: + current_commit_sha = current_ref + # Créer la branche + ref_path = os.path.join('.fyt', 'refs', 'heads', ref) + with open(ref_path, 'w') as f: + f.write(current_commit_sha) + print(f"Branche '{ref}' créée sur {current_commit_sha}.") + # HEAD sur la nouvelle branche + with open('.fyt/HEAD', 'w') as f: + f.write(f"ref: refs/heads/{ref}") + commit_sha = current_commit_sha + else: + # Changement de branche ou commit + ref_path = os.path.join('.fyt', 'refs', 'heads', ref) + if os.path.exists(ref_path): + with open(ref_path, 'r') as f: + commit_sha = f.read().strip() + with open('.fyt/HEAD', 'w') as f: + f.write(f"ref: refs/heads/{ref}") + else: + commit_sha = ref + with open('.fyt/HEAD', 'w') as f: + f.write(commit_sha) + + # Charger le commit + commit_path = os.path.join('.fyt', 'commits', commit_sha) + if not os.path.exists(commit_path): + print(f"Commit {commit_sha} introuvable.") + return + with open(commit_path, 'r') as f: + commit_data = json.load(f) + + # Restaurer les fichiers du commit avec gestion des conflits + for file_path, blob_sha in commit_data.items(): + blob_path = os.path.join('.fyt', 'objects', 'blob', blob_sha) + if not os.path.exists(blob_path): + print(f"Blob {blob_sha} manquant pour {file_path}.") + continue + # Vérifier les conflits + if os.path.exists(file_path): + with open(file_path, 'rb') as f: + current_content = f.read() + with open(blob_path, 'rb') as f: + new_content = f.read() + if current_content != new_content: + print(f"Conflit: {file_path} modifié localement. Non écrasé.") + continue + # Créer les dossiers si besoin + os.makedirs(os.path.dirname(file_path), exist_ok=True) + with open(blob_path, 'rb') as blob_file: + content = blob_file.read() + with open(file_path, 'wb') as out_file: + out_file.write(content) + print(f"Checkout terminé sur {branch_or_sha}.") diff --git a/functions/commit.py b/functions/commit.py index 72ecdb0..e973393 100644 --- a/functions/commit.py +++ b/functions/commit.py @@ -36,9 +36,17 @@ def commit_changes(message): with open(f".fyt/objects/commit/{commit_hash}", "wb") as f: f.write(commit_json) - # Mettre à jour la référence (branche) - with open(".fyt/refs/heads/main", "w") as f: - f.write(commit_hash) + # Mettre à jour la référence (branche courante) + with open(".fyt/HEAD", "r") as f: + ref = f.read().strip() + if ref.startswith("ref:"): + ref_path = os.path.join(".fyt", ref.split(" ", 1)[1]) + with open(ref_path, "w") as f: + f.write(commit_hash) + else: + # HEAD détaché, écriture directe + with open(".fyt/HEAD", "w") as f: + f.write(commit_hash) print(f"Commit [{commit_hash[:6]}]: {message}") diff --git a/terminal.py b/terminal.py index a0b9f20..cbdb994 100755 --- a/terminal.py +++ b/terminal.py @@ -3,6 +3,7 @@ from functions.add import add_file, status_all from functions.commit import commit_changes from functions.cat_file import cat_file +from functions.checkout import checkout from functions.commit_tree import commit_tree from functions.init import init_repo from functions.log import log @@ -27,6 +28,11 @@ cat_file_parser.add_argument("-p", action="store_true", help="Affiche le contenu de l'objet") cat_file_parser.add_argument("hash", help="Affiche l'ID de l'objet") +# git checkout -b +checkout_parser = subparsers.add_parser("checkout", help="Change de branche") +checkout_parser.add_argument("-b", action="store_true", help="Crée une nouvelle branche") +checkout_parser.add_argument("branch", help="Branche à laquelle se déplacer") + # git commit -m "message" parser_commit = subparsers.add_parser("commit", help="Crée un commit") parser_commit.add_argument("-m", "--message", required=True, help="Message du commit") @@ -78,6 +84,8 @@ commit_changes(args.message) elif args.command == "cat-file": cat_file(args.t, args.p, args.hash) +elif args.command == "checkout": + checkout(args.b, args.branch) elif args.command == "commit-tree": commit_tree(args.tree_sha, args.m, args.p) elif args.command == "init": From 4c8954cd0ef22095150e5f3f2224b80bbf29bfcd Mon Sep 17 00:00:00 2001 From: Yann N'DA Date: Mon, 21 Jul 2025 10:01:39 +0200 Subject: [PATCH 33/35] add ".gitignore" --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..afe4e93 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*/__pycache__/ +*/*.pyc \ No newline at end of file From ee530ce751fa35e7e8f1abafa43dbe5e0161f1fb Mon Sep 17 00:00:00 2001 From: bnjjs1998 Date: Mon, 21 Jul 2025 10:46:26 +0200 Subject: [PATCH 34/35] rm --- functions/rm.py | 33 +++++++++++++++++++++++++++++++++ terminal.py | 14 +++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 functions/rm.py diff --git a/functions/rm.py b/functions/rm.py new file mode 100644 index 0000000..1655e64 --- /dev/null +++ b/functions/rm.py @@ -0,0 +1,33 @@ +import os +import json + +def remove_from_index(file_path, index_dir=".git"): + index_path = os.path.join(index_dir, "index") + + if not os.path.exists(index_path): + return + + try: + with open(index_path, "r") as f: + index = json.load(f) + except json.JSONDecodeError: + index = {} + + rel_path = os.path.relpath(file_path, os.getcwd()) + + if rel_path in index: + del index[rel_path] + with open(index_path, "w") as f: + json.dump(index, f, indent=2) + +def fyt_rm(file_path, index_dir=".git"): + if os.path.exists(file_path): + os.remove(file_path) + print(f"{file_path} supprimé du disque.") + else: + print(f"Fichier introuvable : {file_path}") + return + + # Supprime le fichier de l'index + remove_from_index(file_path, index_dir) + print(f"{file_path} supprimé de l'index.") diff --git a/terminal.py b/terminal.py index cbdb994..d32da16 100755 --- a/terminal.py +++ b/terminal.py @@ -11,6 +11,7 @@ from functions.ls_tree import ls_tree from functions.reset import reset from functions.rev_parse import rev_parse +from functions.rm import fyt_rm from functions.show_ref import show_ref from functions.write_tree import write_tree @@ -75,6 +76,11 @@ # git write-tree subparsers.add_parser("write-tree", help="Crée un tree à partir de l'index") +# git remove +parser_remove = subparsers.add_parser("remove", help="Supprime un fichier du répertoire de travail") +parser_remove.add_argument("file", help="Fichier à supprimer") + + args = parser.parse_args() @@ -105,6 +111,12 @@ elif args.command == "show-ref": show_ref() elif args.command == "write-tree": - write_tree() + write_tree()Z +elif args.command == "rm": + if args.file: + fyt_rm(args.file) + else: + print("Erreur : vous devez fournir un nom de fichier.") + else: parser.print_help() \ No newline at end of file From 80f093e42047667dafdc293987e06a52f2cb7130 Mon Sep 17 00:00:00 2001 From: bnjjs1998 Date: Mon, 21 Jul 2025 10:46:51 +0200 Subject: [PATCH 35/35] rm --- terminal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/terminal.py b/terminal.py index d32da16..cba6c31 100755 --- a/terminal.py +++ b/terminal.py @@ -111,7 +111,7 @@ elif args.command == "show-ref": show_ref() elif args.command == "write-tree": - write_tree()Z + write_tree() elif args.command == "rm": if args.file: fyt_rm(args.file)