Content-Length: 5669 | pFad | http://github.com/gitpython-developers/GitPython/pull/1799.patch
thub.com
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.
--- a PPN by Garber Painting Akron. With Image Size Reduction included!Fetched URL: http://github.com/gitpython-developers/GitPython/pull/1799.patch
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy