package gitobject import ( "crypto/sha1" //nolint:gosec // used for git object hashes "encoding/hex" "testing" "time" "github.com/stretchr/testify/require" ) func TestParseGitObject(t *testing.T) { rawCommit := `tree c60378fad086260463884449208b0545cef5703d parent 2777c1b86e59a951188b81e310d3dc8b05b6ac9c parent 916074cfc59ff9d4a29e0e1e74c3dd745b5e0d23 author Tõnis Tiigi 1758656883 -0700 committer GitHub 1758656883 -0700 gpgsig -----BEGIN PGP SIGNATURE----- wsFcBAABCAAQBQJo0vlzCRC1aQ7uu5UhlAAAmL0QACwN0cWbwqWeoI14uhYSFqV2 iRaUm2+vAoJcDkx4eRiKWyZxnCt1NApBpHZ3/R46nQyYf5syPAWtSfe/I9cBO6ed qiQldlYqaEDzKqLc5AKqmf+jP6PxvfOY7qX1Qnwe9IVNqVmrCak3GJchedQStxIz yHfx/4EFRf46LkpmmRgnou5P9Z6/em5zr70G8nOEGE0evSdgHF5hVkNzmfLBbRbI RkhvHYZJGdn+bphAFM487+ySbzEwz0sFxXiUn+sLkKUU/Y62jqto7WXrToXOoeCc h1DDrfSMzOJThQ+glgfyugXtBobXbuV62qLcnWfBoazWX6vc82UMlTH+lDd0rvQJ 4Rx6jzeivwtIkMzOKDpJfEIaqXTLXEj5utI95t7vO9v6V/UctjLIr4K86o02VF7v 6H60+3nKYt7kVeI0x6Hc3R9fWtohYAc8a/2xzyGxluqJokdaKOx5eTOrkAN/wdiv es/nyYwMW07fxAns0BoH3aHgwFrMWmGLovhwLOAdBgVYAuW2I5KNa6FavBUBaGWD /Cb2f8ZcaGVcvnwFEFkjcp9k+xCB2SGOJszbdehz86f/+rhQHJKvyIXvlWTYCswq K6/YilEke++bcpfoOV2PgOEmV4rWescIcxlremnYqtahR81BQYkrZYnihxIaVZc/ Mq9vT7yP08mV6474Ihno =sixl -----END PGP SIGNATURE----- Merge pull request #6237 from jsternberg/hack-compose hack: update hack/compose with newer otel collector` shaCommit := `c8fad61a079f8272be5559fe473171a8f6333679` obj, err := Parse([]byte(rawCommit)) require.NoError(t, err) sum, err := obj.Checksum(sha1.New) require.NoError(t, err) require.Equal(t, shaCommit, hex.EncodeToString(sum)) err = obj.VerifyChecksum(shaCommit) require.NoError(t, err) err = obj.VerifyChecksum("0000000000000000000000000000000000000000") require.Error(t, err) const expectedSig = `-----BEGIN PGP SIGNATURE----- wsFcBAABCAAQBQJo0vlzCRC1aQ7uu5UhlAAAmL0QACwN0cWbwqWeoI14uhYSFqV2 iRaUm2+vAoJcDkx4eRiKWyZxnCt1NApBpHZ3/R46nQyYf5syPAWtSfe/I9cBO6ed qiQldlYqaEDzKqLc5AKqmf+jP6PxvfOY7qX1Qnwe9IVNqVmrCak3GJchedQStxIz yHfx/4EFRf46LkpmmRgnou5P9Z6/em5zr70G8nOEGE0evSdgHF5hVkNzmfLBbRbI RkhvHYZJGdn+bphAFM487+ySbzEwz0sFxXiUn+sLkKUU/Y62jqto7WXrToXOoeCc h1DDrfSMzOJThQ+glgfyugXtBobXbuV62qLcnWfBoazWX6vc82UMlTH+lDd0rvQJ 4Rx6jzeivwtIkMzOKDpJfEIaqXTLXEj5utI95t7vO9v6V/UctjLIr4K86o02VF7v 6H60+3nKYt7kVeI0x6Hc3R9fWtohYAc8a/2xzyGxluqJokdaKOx5eTOrkAN/wdiv es/nyYwMW07fxAns0BoH3aHgwFrMWmGLovhwLOAdBgVYAuW2I5KNa6FavBUBaGWD /Cb2f8ZcaGVcvnwFEFkjcp9k+xCB2SGOJszbdehz86f/+rhQHJKvyIXvlWTYCswq K6/YilEke++bcpfoOV2PgOEmV4rWescIcxlremnYqtahR81BQYkrZYnihxIaVZc/ Mq9vT7yP08mV6474Ihno =sixl -----END PGP SIGNATURE----- ` require.Equal(t, expectedSig, obj.Signature) const expectedSignedData = `tree c60378fad086260463884449208b0545cef5703d parent 2777c1b86e59a951188b81e310d3dc8b05b6ac9c parent 916074cfc59ff9d4a29e0e1e74c3dd745b5e0d23 author Tõnis Tiigi 1758656883 -0700 committer GitHub 1758656883 -0700 Merge pull request #6237 from jsternberg/hack-compose hack: update hack/compose with newer otel collector` require.Equal(t, expectedSignedData, obj.SignedData) require.Equal(t, []string{"c60378fad086260463884449208b0545cef5703d"}, obj.Headers["tree"]) require.Equal(t, "commit", obj.Type) require.Equal(t, `Merge pull request #6237 from jsternberg/hack-compose hack: update hack/compose with newer otel collector`, obj.Message) commit, err := obj.ToCommit() require.NoError(t, err) require.Equal(t, "Tõnis Tiigi", commit.Author.Name) require.Equal(t, "tonistiigi@gmail.com", commit.Author.Email) require.Equal(t, int64(1758656883), commit.Author.When.Unix()) _, offset := commit.Author.When.Zone() require.Equal(t, -7*3600, offset) require.Equal(t, 2, len(commit.Parents)) require.Equal(t, "2777c1b86e59a951188b81e310d3dc8b05b6ac9c", commit.Parents[0]) require.Equal(t, "916074cfc59ff9d4a29e0e1e74c3dd745b5e0d23", commit.Parents[1]) require.Equal(t, "GitHub", commit.Committer.Name) require.Equal(t, "noreply@github.com", commit.Committer.Email) require.Equal(t, int64(1758656883), commit.Committer.When.Unix()) _, offset = commit.Committer.When.Zone() require.Equal(t, -7*3600, offset) _, err = obj.ToTag() require.Error(t, err) shaTag := `813f42e05f8d94edb13c70a51dc6f8457c08a672` raw := `object c8fad61a079f8272be5559fe473171a8f6333679 type commit tag v0.25.0-rc1 tagger Tonis Tiigi 1758658255 -0700 v0.25.0-rc1 -----BEGIN PGP SIGNATURE----- iQGzBAABCAAdFiEEVxbwWSJT3TMaEhiGr6neX4q3rzkFAmjS/s8ACgkQr6neX4q3 rzlE+Av/b2FbO2AoBf0CQrRK/ggRcz1lla4xEyV+VrU3M/oEo1kKfpyQE4qXPSZC ybn7busZbmwrGpwXbMYk6ADg2lANhR4sjwWPw4b4hh3n0iSlD37eu63UEUeoIHCh +Low+l5gkojExY8OfG8t34FZMdLzuA70lVclZHYEh+ucDb9kg6GlJCPQ3i1CizPj iCkRr2veuTNDykSdS9aqI3NJ5EXJT7A9CFZ7dGTilH+6o4PJLSIp0xl8AWecLju2 0VYQtfo3W0UftxRLldU+KTc2UqUI3A5I/KyryYd8pJnTkh9xnO8TvF9O/wkvNUem pzY8yP5t3/wYbnjrCYhpEauXc/JCxh6dh/mTvcs2GoyLBYRSAtOei10UutdNDf5t xBB+AG8ocd4ro+kxXhabvSWG3kmLXkaBXVG31LLcIGEfVNP9hnzV0DXbLCzVBD7+ SxdXrB7XhARUFFIKtobmBmLfAww18R6DGD0pNE+uSLplUy2D5HJA2R4UnJb+0DIR yVkI8y/p =12Xx -----END PGP SIGNATURE----- ` obj, err = Parse([]byte(raw)) require.NoError(t, err) require.Equal(t, "tag", obj.Type) require.Equal(t, []string{"v0.25.0-rc1"}, obj.Headers["tag"]) require.Equal(t, "v0.25.0-rc1", obj.Message) const expectedTagSig = `-----BEGIN PGP SIGNATURE----- iQGzBAABCAAdFiEEVxbwWSJT3TMaEhiGr6neX4q3rzkFAmjS/s8ACgkQr6neX4q3 rzlE+Av/b2FbO2AoBf0CQrRK/ggRcz1lla4xEyV+VrU3M/oEo1kKfpyQE4qXPSZC ybn7busZbmwrGpwXbMYk6ADg2lANhR4sjwWPw4b4hh3n0iSlD37eu63UEUeoIHCh +Low+l5gkojExY8OfG8t34FZMdLzuA70lVclZHYEh+ucDb9kg6GlJCPQ3i1CizPj iCkRr2veuTNDykSdS9aqI3NJ5EXJT7A9CFZ7dGTilH+6o4PJLSIp0xl8AWecLju2 0VYQtfo3W0UftxRLldU+KTc2UqUI3A5I/KyryYd8pJnTkh9xnO8TvF9O/wkvNUem pzY8yP5t3/wYbnjrCYhpEauXc/JCxh6dh/mTvcs2GoyLBYRSAtOei10UutdNDf5t xBB+AG8ocd4ro+kxXhabvSWG3kmLXkaBXVG31LLcIGEfVNP9hnzV0DXbLCzVBD7+ SxdXrB7XhARUFFIKtobmBmLfAww18R6DGD0pNE+uSLplUy2D5HJA2R4UnJb+0DIR yVkI8y/p =12Xx -----END PGP SIGNATURE----- ` require.Equal(t, expectedTagSig, obj.Signature) const expectedTagSignedData = `object c8fad61a079f8272be5559fe473171a8f6333679 type commit tag v0.25.0-rc1 tagger Tonis Tiigi 1758658255 -0700 v0.25.0-rc1 ` require.Equal(t, expectedTagSignedData, obj.SignedData) sum, err = obj.Checksum(sha1.New) require.NoError(t, err) require.Equal(t, shaTag, hex.EncodeToString(sum)) err = obj.VerifyChecksum(shaTag) require.NoError(t, err) tag, err := obj.ToTag() require.NoError(t, err) require.Equal(t, "v0.25.0-rc1", tag.Tag) require.Equal(t, "c8fad61a079f8272be5559fe473171a8f6333679", tag.Object) require.Equal(t, "commit", tag.Type) require.Equal(t, "Tonis Tiigi", tag.Tagger.Name) require.Equal(t, "tonistiigi@gmail.com", tag.Tagger.Email) require.Equal(t, int64(1758658255), tag.Tagger.When.Unix()) _, offset = tag.Tagger.When.Zone() require.Equal(t, -7*3600, offset) } func TestParseActor(t *testing.T) { tests := []struct { name string input string wantName string wantMail string wantTime *time.Time }{ { name: "normal", input: "User One 1759247759 -0500", wantName: "User One", wantMail: "user1@example.com", wantTime: func() *time.Time { loc := time.FixedZone("", -5*3600) t := time.Unix(1759247759, 0).In(loc) return &t }(), }, { name: "no timestamp", input: "User Two ", wantName: "User Two", wantMail: "user2@example.com", wantTime: nil, }, { name: "invalid timestamp", input: "User Three notatime +0000", wantName: "User Three", wantMail: "user3@example.com", wantTime: nil, }, { name: "invalid tz format", input: "User Four 1759247759 500", wantName: "User Four", wantMail: "user4@example.com", wantTime: nil, }, { name: "missing angle brackets", input: "User Five user5@example.com 1759247759 +0000", wantName: "User Five user5@example.com 1759247759 +0000", wantMail: "", wantTime: nil, }, { name: "extra spaces", input: " User Six 1600000000 +0200 ", wantName: "User Six", wantMail: "user6@example.com", wantTime: func() *time.Time { loc := time.FixedZone("", 2*3600) t := time.Unix(1600000000, 0).In(loc) return &t }(), }, { name: "name contains angle bracket", input: "Strange 1600000000 +0000", wantName: "Strange