{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":174927719,"defaultBranch":"master","name":"go-gitdiff","ownerLogin":"bluekeyes","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2019-03-11T04:50:36.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/1745813?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1723402630.0","currentOid":""},"activityList":{"items":[{"before":"a97066f85f709832dc2e9312c9030cb448bba701","after":null,"ref":"refs/heads/to-string","pushedAt":"2024-08-11T18:57:10.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"}},{"before":"9e0997ef65150db9392595ab9f2a1df593d48d22","after":"8584cd59afe0fd5af926a98ea3ef650fa4b1f952","ref":"refs/heads/master","pushedAt":"2024-08-11T18:57:08.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"Add String() methods to parsed types (#48)\n\nThis enables clients to move back and forth between parsed objects and\r\ntext patches. The generated patches are semantically equal to the parsed\r\nobject and should re-parse to the same object, but may not be\r\nbyte-for-byte identical to the original input.\r\n\r\nIn my testing, formatted text patches are usually identical to the\r\ninput, but there may be cases where this is not true. Binary patches\r\nalways differ. This is because Go's 'compress/flate' package ends\r\nstreams with an empty block instead of adding the end-of-stream flag to\r\nthe last non-empty block, like Git's C implementation. Since the streams\r\nwill always be different for this reason, I chose to also enable default\r\ncompression (the test patches I generated with Git used no compression.)\r\n\r\nThe main tests for this feature involve parsing, formatting, and then\r\nre-parsing a patch to make sure we get equal objects.\r\n\r\nFormatting is handled by a new internal formatter type, which allows\r\nwriting all data to the same stream. This isn't exposed publicly right\r\nnow, but will be useful if there's a need for more flexible formatting\r\nfunctions in the future, like formatting to a user-provided io.Writer.","shortMessageHtmlLink":"Add String() methods to parsed types (#48)"}},{"before":"97fc93a03d86305280475ea550678a520e118a6f","after":"a97066f85f709832dc2e9312c9030cb448bba701","ref":"refs/heads/to-string","pushedAt":"2024-08-11T18:40:51.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"Merge branch 'origin/master' into to-string","shortMessageHtmlLink":"Merge branch 'origin/master' into to-string"}},{"before":"3c5e9ce44098c558540c85717a6479b8eafc2768","after":null,"ref":"refs/heads/go-1.21","pushedAt":"2024-08-11T18:39:25.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"}},{"before":"0a4e55f9a190b500835e10d187ca4f88a96917e2","after":"9e0997ef65150db9392595ab9f2a1df593d48d22","ref":"refs/heads/master","pushedAt":"2024-08-11T18:39:23.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"Update Go and golangci-lint versions (#49)\n\nThe minimum Go version for the package is now Go 1.21. This is because a\r\nfuture change will use the 'slices' package in test code. Note that non-test\r\ncode in the package should still be compatible with older versions of Go.\r\n\r\nAs part of this, also update the golangci-lint version to one that works\r\nwith Go 1.21, which required replacing some deprecated linters.","shortMessageHtmlLink":"Update Go and golangci-lint versions (#49)"}},{"before":null,"after":"3c5e9ce44098c558540c85717a6479b8eafc2768","ref":"refs/heads/go-1.21","pushedAt":"2024-08-11T18:35:53.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"Update Go and golangci-lint versions\n\nThe minimum Go version for the package is now Go 1.21. This is because a\nfuture change will use the 'slices' package in test code.\n\nAs part of this, also update the golangci-lint version to one that works\nwith Go 1.21, which required replacing some deprecated linters.","shortMessageHtmlLink":"Update Go and golangci-lint versions"}},{"before":"06e6e886b24e6cfc99986c3e19e9281a1782dffe","after":"97fc93a03d86305280475ea550678a520e118a6f","ref":"refs/heads/to-string","pushedAt":"2024-08-11T18:17:11.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"Use slightly older golangci-lint\n\nAvoid dealing with removed deprecated plugins for now.","shortMessageHtmlLink":"Use slightly older golangci-lint"}},{"before":"745988a4d5182a1a612400a08d989f07b32751b2","after":"06e6e886b24e6cfc99986c3e19e9281a1782dffe","ref":"refs/heads/to-string","pushedAt":"2024-08-11T18:15:02.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"Update golangci-line in GitHub Actions","shortMessageHtmlLink":"Update golangci-line in GitHub Actions"}},{"before":"6765cc68befbf68edf5a11dedcca38320316d545","after":"745988a4d5182a1a612400a08d989f07b32751b2","ref":"refs/heads/to-string","pushedAt":"2024-08-11T18:12:02.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"Update minimum Go version to 1.21\n\nRequired by use of the slices package in test code","shortMessageHtmlLink":"Update minimum Go version to 1.21"}},{"before":"9d2fdae7948bfe6fa6235c318a7492cfc4fa97ee","after":"6765cc68befbf68edf5a11dedcca38320316d545","ref":"refs/heads/to-string","pushedAt":"2024-08-11T18:07:44.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"Add comment to BinaryFragment.String","shortMessageHtmlLink":"Add comment to BinaryFragment.String"}},{"before":"7aac9c232ef49a5d2505bd4a8b521812e324e6d1","after":"9d2fdae7948bfe6fa6235c318a7492cfc4fa97ee","ref":"refs/heads/to-string","pushedAt":"2024-08-11T18:02:55.000Z","pushType":"push","commitsCount":5,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"Add errcheck excludes for fomatter","shortMessageHtmlLink":"Add errcheck excludes for fomatter"}},{"before":"ac2e2c5504bc8b050c4f7db6122af3fe3fcbc362","after":"7aac9c232ef49a5d2505bd4a8b521812e324e6d1","ref":"refs/heads/to-string","pushedAt":"2024-08-10T23:48:21.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"Add String() to BinaryFragment\n\nImplement base85 encoding and improve how binary patches are displayed.\nThis fails the tests due to differences between the Git and Go\nimplementation of zlib. I need to decide how to resolve this.","shortMessageHtmlLink":"Add String() to BinaryFragment"}},{"before":"9d11cc282ac3f3c960c934208535d64d0c8aabfa","after":"ac2e2c5504bc8b050c4f7db6122af3fe3fcbc362","ref":"refs/heads/to-string","pushedAt":"2024-08-10T06:01:03.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"Fix mode on index lines, add more test cases","shortMessageHtmlLink":"Fix mode on index lines, add more test cases"}},{"before":"35d61a025969734d776583afaf8f04dbeacf2949","after":"9d11cc282ac3f3c960c934208535d64d0c8aabfa","ref":"refs/heads/to-string","pushedAt":"2024-08-10T04:03:53.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"Add basic tests for patch formatting\n\nFor now, assert that we produce exactly the same output as the original\nparsed input. I think these tests would ideally assert that the\nre-parsed value is the same, but it's kind of annoying to compare File\nobjects without adding an external dependency.","shortMessageHtmlLink":"Add basic tests for patch formatting"}},{"before":"debe110ec2217d6af2b6d820431da5d252e38422","after":"35d61a025969734d776583afaf8f04dbeacf2949","ref":"refs/heads/to-string","pushedAt":"2024-08-10T04:01:49.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"Add basic tests for patch formatting\n\nFor now, assert that we produce exactly the same output as the original\nparsed input. I think these tests would ideally assert that the\nre-parsed value is the same, but it's kind of annoying to compare File\nobjects without adding an external dependency.","shortMessageHtmlLink":"Add basic tests for patch formatting"}},{"before":"1c4d46bebfe671614d6328b586afdc77776e71fc","after":"debe110ec2217d6af2b6d820431da5d252e38422","ref":"refs/heads/to-string","pushedAt":"2024-08-09T04:28:10.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"Add String() methods to parsed types\n\nThis enables clients to move back and forth between parsed objects and\ntext patches. The generated patches are semantically equal to the parsed\nobject and should parse to the same object, but may not be byte-for-byte\nidentical to the original input.","shortMessageHtmlLink":"Add String() methods to parsed types"}},{"before":"a840e84762ae7705a0f4e7682aa08c92108d8cdc","after":"1c4d46bebfe671614d6328b586afdc77776e71fc","ref":"refs/heads/to-string","pushedAt":"2024-08-08T05:54:01.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"Add more headers and proper quoting","shortMessageHtmlLink":"Add more headers and proper quoting"}},{"before":null,"after":"a840e84762ae7705a0f4e7682aa08c92108d8cdc","ref":"refs/heads/to-string","pushedAt":"2024-07-27T18:04:17.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"wip: add String() methods for parsed types","shortMessageHtmlLink":"wip: add String() methods for parsed types"}},{"before":"0f5c7cfcffa37e5ae0a8b3d8c7ea7ab73b1bf045","after":null,"ref":"refs/heads/bkeyes/no-files","pushedAt":"2024-07-15T03:44:17.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"}},{"before":"a00d2ccaf7332549eaa3af918b614ac73ee8c8e3","after":"0a4e55f9a190b500835e10d187ca4f88a96917e2","ref":"refs/heads/master","pushedAt":"2024-07-15T03:44:16.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"Return preamble when a patch has no files (#46)\n\nWhile empty patches with only a header were parsable, the parser\r\ndiscarded the preamble content. This meant callers had to handle this\r\ncase specially. Now, if we reach the end of the input without finding a\r\nfile, Parse() returns the full content of the patch as the preamble.","shortMessageHtmlLink":"Return preamble when a patch has no files (#46)"}},{"before":null,"after":"0f5c7cfcffa37e5ae0a8b3d8c7ea7ab73b1bf045","ref":"refs/heads/bkeyes/no-files","pushedAt":"2024-07-15T03:36:55.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"Return preamble when a patch has no files\n\nWhile empty patches with only a header were parsable, the parser\ndiscarded the preamble content. This meant callers had to handle this\ncase specially. Now, if we reach the end of the input without finding a\nfile, Parse() returns the full content of the patch as the preamble.","shortMessageHtmlLink":"Return preamble when a patch has no files"}},{"before":"885b73fbed1ba800b041d94fdcbe7c1768d12074","after":null,"ref":"refs/heads/git-identities","pushedAt":"2024-05-06T03:16:20.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"}},{"before":"3f2ea5c16e0a9d685e1b91b6b8bfc0fbf4cb5d6a","after":"a00d2ccaf7332549eaa3af918b614ac73ee8c8e3","ref":"refs/heads/master","pushedAt":"2024-05-06T03:16:19.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"Follow git logic when parsing patch identities (#44)\n\nWhen GitHub creates patches for Dependabot PRs, it generates a \"From:\"\r\nline that is not valid according to RFC 5322: the address spec contains\r\nunquoted special characters (the \"[bot]\" in \"dependabot[bot]\"). While\r\nthe 'net/mail' parser makes some exceptions to the spec, this is not one\r\nof them, so parsing these patch headers fails.\r\n\r\nGit's 'mailinfo' command avoids this by only implementing the unquoting\r\npart of RFC 5322 and then applying a heuristic to separate the string in\r\nto name and email values that seem reasonable.\r\n\r\nThis commit does two things:\r\n\r\n1. Reimplements ParsePatchIdentity to follow Git's logic, so that it can\r\n accept a wider range of inputs, including quoted strings. Strings\r\n accepted by the previous implementation parse in the same way with\r\n one exception: inputs that contain whitespace inside the angle\r\n brackets for an email address now use the email address as the name\r\n and drop any separate name component.\r\n\r\n2. When parsing mail-formatted patches, use ParsePatchIdentity to parse\r\n the \"From:\" line instead of the 'net/mail' function.","shortMessageHtmlLink":"Follow git logic when parsing patch identities (#44)"}},{"before":"8a7b2f63a31103f60e7650aff74998df5bc5cb9f","after":"885b73fbed1ba800b041d94fdcbe7c1768d12074","ref":"refs/heads/git-identities","pushedAt":"2024-05-06T03:15:01.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"Fix quoted-pair handling, test more edge cases","shortMessageHtmlLink":"Fix quoted-pair handling, test more edge cases"}},{"before":null,"after":"8a7b2f63a31103f60e7650aff74998df5bc5cb9f","ref":"refs/heads/git-identities","pushedAt":"2024-05-06T03:02:32.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"Follow git logic when parsing patch identities\n\nWhen GitHub creates patches for Dependabot PRs, it generates a \"From:\"\nline that is not valid according to RFC 5322: the address spec contains\nunquoted special characters (the \"[bot]\" in \"dependabot[bot]\"). While\nthe 'net/mail' parser makes some exceptions to the spec, this is not one\nof them, so parsing these patch headers fails.\n\nGit's 'mailinfo' command avoids this by only implementing the unquoting\npart of RFC 5322 and then applying a heuristic to separate the string in\nto name and email values that seem reasonable.\n\nThis commit does two things:\n\n1. Reimplements ParsePatchIdentity to follow Git's logic, so that it can\n accept a wider range of inputs, including quoted strings. Strings\n accepted by the previous implementation parse in the same way with\n one exception: inputs that contain whitespace inside the angle\n brackets for an email address now use the email address as the name\n and drop any separate name component.\n\n2. When parsing mail-formatted patches, use ParsePatchIdentity to parse\n the \"From:\" line instead of the 'net/mail' function.","shortMessageHtmlLink":"Follow git logic when parsing patch identities"}},{"before":"d43a4918822a4384d2a885d66ffdf52456e8de33","after":null,"ref":"refs/heads/bkeyes/empty-email","pushedAt":"2024-03-07T05:32:39.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"}},{"before":"13e8639a0b49cb49741b05f11ac52c530d2d38f0","after":"3f2ea5c16e0a9d685e1b91b6b8bfc0fbf4cb5d6a","ref":"refs/heads/master","pushedAt":"2024-03-07T05:32:39.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"Accept empty emails in ParsePatchIdentity (#42)\n\nGit is actually more lenient here than I thought. As long as the\r\nidentity contains the \"<>\" delimiters, Git will allow an empty email, so\r\nwe should accept the same thing. I also discovered that an identity with\r\nonly an email set will use the email as the name, so I've implemented\r\nthat behavior as well.","shortMessageHtmlLink":"Accept empty emails in ParsePatchIdentity (#42)"}},{"before":null,"after":"d43a4918822a4384d2a885d66ffdf52456e8de33","ref":"refs/heads/bkeyes/empty-email","pushedAt":"2024-03-07T05:31:14.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"Accept empty emails in ParsePatchIdentity\n\nGit is actually more lenient here than I thought. As long as the\nidentity contains the \"<>\" delimiters, Git will allow an empty email, so\nwe should accept the same thing. I also discovered that an identity with\nonly an email set will use the email as the name, so I've implemented\nthat behavior as well.","shortMessageHtmlLink":"Accept empty emails in ParsePatchIdentity"}},{"before":"13e8639a0b49cb49741b05f11ac52c530d2d38f0","after":null,"ref":"refs/heads/single-patch-docs","pushedAt":"2024-02-25T20:40:27.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"}},{"before":null,"after":"13e8639a0b49cb49741b05f11ac52c530d2d38f0","ref":"refs/heads/single-patch-docs","pushedAt":"2024-02-25T20:39:57.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"bluekeyes","name":"Billy Keyes","path":"/bluekeyes","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1745813?s=80&v=4"},"commit":{"message":"Clarify that Parse expects a single patch","shortMessageHtmlLink":"Clarify that Parse expects a single patch"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEl4NWqgA","startCursor":null,"endCursor":null}},"title":"Activity ยท bluekeyes/go-gitdiff"}