From 08a819c13501fa5e91e5e74d77907a18092ee25b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A5than?= Date: Mon, 15 Jan 2024 14:48:12 +0800 Subject: [PATCH 1/3] fix: add treeNotSorted test --- test/test_tree.py | 58 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/test/test_tree.py b/test/test_tree.py index 7713413a6..695cb803e 100644 --- a/test/test_tree.py +++ b/test/test_tree.py @@ -8,7 +8,9 @@ from git.objects import Tree, Blob from test.lib import TestBase +import os import os.path as osp +import subprocess class TestTree(TestBase): @@ -40,6 +42,62 @@ def test_serializable(self): testtree._deserialize(stream) # END for each item in tree + def test_tree_modifier_ordering(self): + def setup_git_repository_and_get_ordered_files(): + os.mkdir("tmp") + os.chdir("tmp") + subprocess.run(["git", "init", "-q"], check=True) + os.mkdir("file") + for filename in [ + "bin", + "bin.d", + "file.to", + "file.toml", + "file.toml.bin", + "file0", + "file/a", + ]: + open(filename, "a").close() + + subprocess.run(["git", "add", "."], check=True) + subprocess.run(["git", "commit", "-m", "c1"], check=True) + tree_hash = subprocess.check_output(["git", "rev-parse", "HEAD^{tree}"]).decode().strip() + cat_file_output = subprocess.check_output(["git", "cat-file", "-p", tree_hash]).decode() + return [line.split()[-1] for line in cat_file_output.split("\n") if line] + + hexsha = "6c1faef799095f3990e9970bc2cb10aa0221cf9c" + roottree = self.rorepo.tree(hexsha) + blob_mode = Tree.blob_id << 12 + tree_mode = Tree.tree_id << 12 + + files_in_desired_order = [ + (blob_mode, "bin"), + (blob_mode, "bin.d"), + (blob_mode, "file.to"), + (blob_mode, "file.toml"), + (blob_mode, "file.toml.bin"), + (blob_mode, "file0"), + (tree_mode, "file"), + ] + mod = roottree.cache + for file_mode, file_name in files_in_desired_order: + mod.add(hexsha, file_mode, file_name) + # end for each file + + def file_names_in_order(): + return [t[1] for t in files_in_desired_order] + + def names_in_mod_cache(): + a = [t[2] for t in mod._cache] + here = file_names_in_order() + return [e for e in a if e in here] + + git_file_names_in_order = setup_git_repository_and_get_ordered_files() + os.chdir("..") + + mod.set_done() + assert names_in_mod_cache() == git_file_names_in_order, "set_done() performs git-sorting" + def test_traverse(self): root = self.rorepo.tree("0.1.6") num_recursive = 0 From 365d44f50a3d72d7ebfa063b142d2abd4082cfaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A5than?= Date: Mon, 15 Jan 2024 14:50:43 +0800 Subject: [PATCH 2/3] fix: treeNotSorted issue --- git/objects/tree.py | 50 +-------------------------------------------- 1 file changed, 1 insertion(+), 49 deletions(-) diff --git a/git/objects/tree.py b/git/objects/tree.py index a08adf48b..450973280 100644 --- a/git/objects/tree.py +++ b/git/objects/tree.py @@ -53,54 +53,6 @@ __all__ = ("TreeModifier", "Tree") -def git_cmp(t1: TreeCacheTup, t2: TreeCacheTup) -> int: - a, b = t1[2], t2[2] - # assert isinstance(a, str) and isinstance(b, str) - len_a, len_b = len(a), len(b) - min_len = min(len_a, len_b) - min_cmp = cmp(a[:min_len], b[:min_len]) - - if min_cmp: - return min_cmp - - return len_a - len_b - - -def merge_sort(a: List[TreeCacheTup], cmp: Callable[[TreeCacheTup, TreeCacheTup], int]) -> None: - if len(a) < 2: - return - - mid = len(a) // 2 - lefthalf = a[:mid] - righthalf = a[mid:] - - merge_sort(lefthalf, cmp) - merge_sort(righthalf, cmp) - - i = 0 - j = 0 - k = 0 - - while i < len(lefthalf) and j < len(righthalf): - if cmp(lefthalf[i], righthalf[j]) <= 0: - a[k] = lefthalf[i] - i = i + 1 - else: - a[k] = righthalf[j] - j = j + 1 - k = k + 1 - - while i < len(lefthalf): - a[k] = lefthalf[i] - i = i + 1 - k = k + 1 - - while j < len(righthalf): - a[k] = righthalf[j] - j = j + 1 - k = k + 1 - - class TreeModifier: """A utility class providing methods to alter the underlying cache in a list-like fashion. @@ -131,7 +83,7 @@ def set_done(self) -> "TreeModifier": :return self: """ - merge_sort(self._cache, git_cmp) + self._cache.sort(key=lambda x: (x[2] + "/") if x[1] == Tree.tree_id << 12 else x[2]) return self # } END interface From bda5a178f2a1cd16716fe7f289eaf8296e8e6f83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A5than?= Date: Tue, 16 Jan 2024 16:13:50 +0800 Subject: [PATCH 3/3] chore: update AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 3b97c9473..9311b3962 100644 --- a/AUTHORS +++ b/AUTHORS @@ -53,5 +53,6 @@ Contributors are: -Santos Gallegos -Wenhan Zhu -Eliah Kagan +-Ethan Lin Portions derived from other open source works and are clearly marked. pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy