|
14 | 14 |
|
15 | 15 | from gitdb import IStream |
16 | 16 |
|
17 | | -from git import Actor, Commit, Repo, _backend |
| 17 | +from git import Actor, Commit, Repo, TagObject, _backend |
18 | 18 | from git.compat import safe_decode, safe_encode |
19 | 19 | from git.exc import UnsafeOptionError |
20 | 20 | from git.objects.util import tzoffset, utc |
@@ -646,6 +646,57 @@ def test_deserialization_headers_end_at_empty_line(self): |
646 | 646 | key = ("commit.decode", "CLI: " + reason) |
647 | 647 | self.assertEqual(_backend.statistics().get(key, 0), before.get(key, 0) + 1) |
648 | 648 |
|
| 649 | + def test_deserialization_reads_date_after_email(self): |
| 650 | + """Only the date right after the email counts, as in Git's split_ident_line.""" |
| 651 | + with fixture_repo("commit.sh", "trailing-date") as repo: |
| 652 | + root = Path(repo.working_dir).parent |
| 653 | + oid = (root / "object-id").read_text().strip() |
| 654 | + tag_oid = (root / "tag-id").read_text().strip() |
| 655 | + expected = repo.git.show("--no-patch", "--format=%ad%n%cd", "--date=raw", oid, "--") |
| 656 | + self.assertEqual(expected, "1112591163 +0200\n1112591163 +0200") |
| 657 | + self.assertTrue(repo.git.cat_file("-p", tag_oid).split("\n")[3].endswith(" +0200 1700000000 -0500")) |
| 658 | + self.assertEqual(repo.git.for_each_ref("--format=%(taggerdate:raw)", "refs/tags/v1"), "1112591163 +0200") |
| 659 | + raw = repo.git.cat_file("commit", oid, stdout_as_string=False, strip_newline_in_stdout=False) |
| 660 | + before = _backend.statistics() |
| 661 | + for cmt in (Commit(repo, bytes.fromhex(oid))._deserialize(BytesIO(raw)), Commit(repo, bytes.fromhex(oid))): |
| 662 | + self.assertEqual((cmt.authored_date, cmt.author_tz_offset), (1112591163, -7200)) |
| 663 | + self.assertEqual((cmt.committed_date, cmt.committer_tz_offset), (1112591163, -7200)) |
| 664 | + self.assertEqual((cmt.author.email, cmt.committer.email), ("a@example.com", "c@example.com")) |
| 665 | + tag = TagObject(repo, bytes.fromhex(tag_oid)) |
| 666 | + self.assertEqual( |
| 667 | + (tag.tagged_date, tag.tagger_tz_offset, tag.tagger.email), (1112591163, -7200, "t@example.com") |
| 668 | + ) |
| 669 | + if _backend.name == "gix": |
| 670 | + for kind in ("commit", "tag"): |
| 671 | + key = (kind + ".decode", "CLI: signature trailing fields (GIX-34)") |
| 672 | + self.assertEqual(_backend.statistics().get(key, 0), before.get(key, 0) + 1) |
| 673 | + |
| 674 | + def test_deserialization_negative_zero_offset_stays_native(self): |
| 675 | + with fixture_repo("commit.sh", "zero-offset") as repo: |
| 676 | + root = Path(repo.working_dir).parent |
| 677 | + oid = (root / "object-id").read_text().strip() |
| 678 | + tag_oid = (root / "tag-id").read_text().strip() |
| 679 | + repo.git.fsck("--strict", oid, tag_oid) |
| 680 | + self.assertTrue(repo.git.cat_file("-p", tag_oid).split("\n")[3].endswith(" -0000")) |
| 681 | + self.assertEqual( |
| 682 | + repo.git.show("--no-patch", "--format=%ad%n%cd", "--date=raw", oid, "--"), |
| 683 | + "1112591163 +0000\n1112591163 +0000", |
| 684 | + ) |
| 685 | + self.assertEqual(repo.git.for_each_ref("--format=%(taggerdate:raw)", "refs/tags/v1"), "1112591163 +0000") |
| 686 | + before = _backend.statistics() |
| 687 | + cmt = Commit(repo, bytes.fromhex(oid)) |
| 688 | + self.assertEqual((cmt.authored_date, cmt.author_tz_offset), (1112591163, 0)) |
| 689 | + self.assertEqual((cmt.committed_date, cmt.committer_tz_offset), (1112591163, 0)) |
| 690 | + tag = TagObject(repo, bytes.fromhex(tag_oid)) |
| 691 | + self.assertEqual((tag.tagged_date, tag.tagger_tz_offset), (1112591163, 0)) |
| 692 | + if _backend.name == "gix": |
| 693 | + after = _backend.statistics() |
| 694 | + for kind in ("commit", "tag"): |
| 695 | + key = (kind + ".decode", "native") |
| 696 | + self.assertEqual(after.get(key, 0), before.get(key, 0) + 1) |
| 697 | + key = ("Git.execute", "CLI process") |
| 698 | + self.assertEqual(after.get(key, 0), before.get(key, 0)) |
| 699 | + |
649 | 700 | def test_identity_cannot_alter_headers(self): |
650 | 701 | """A name or email must not add header lines or present another identity.""" |
651 | 702 | with fixture_repo("commit.sh", "tree", write=True) as rw_repo: |
|
0 commit comments