)]}'
{
  "commit": "f8dfd63322a1b107bb3b386fef293a075388e7da",
  "tree": "362ac37627b208f03ca934c833f8dadb950cdd86",
  "parents": [
    "a105c7ef15e9db295016b56cc0b9d9ab25c8274a"
  ],
  "author": {
    "name": "Protobuf Team Bot",
    "email": "protobuf-github-bot@google.com",
    "time": "Mon Jul 27 06:52:28 2026 -0700"
  },
  "committer": {
    "name": "Copybara-Service",
    "email": "copybara-worker@google.com",
    "time": "Mon Jul 27 06:54:18 2026 -0700"
  },
  "message": "Add conformance tests for Timestamp parsing\n\nIn general, runtimes also expose Timestamp parsing by utils but it is conformance-testable via JSON.\n\nTimestamp format is RFC3339 which looks like `1970-01-01T00:00:00Z` (for UTC timestamps) or `1970-01-02T01:00:00+02:00` (with timezone).\n\nThere\u0027s actually two different reasons why a Timestamp format might be invalid.\n\nRFC3339 spec has some bright line rules as follows:\n\n- All of the segments must be the expected fixed width (eg: month is always 2 digits, 1970-01-01 and not 1970-1-1).\n- Year must be [0001 .. 9999]\n- Month must be [01 .. 12]\n- Day must be valid for the relevant month, including that Feb 29 is only legal in leap years.\n- The literal `T` comes next (spec ambiguous if `t` is also allowed, not tested in this change)\n- Hour must be [00..23]\n- Minute must be [00..59]\n- Second must be [00..59]\n- Subseconds are unconstrained precision\n- Timezone must be Z for UTC or else formatted with HH:MM where HH is [00..23] and MM is [00..59].\n\nProtobuf has a few extra effective constraints compared to RFC3339 though, which are _mostly_ academic:\n\n- We disallow subsecond resolution has more than 9 decimal digits\n- Some RFC3339 timestamps which are not-UTC-timezone in year 1 or year 9999 are not valid in Protobuf [*reason explained below]\n\nNote that GoProto uses a std RFC3339 parser and does implement these bonus restrictions rules on top.\n\n* The reason is that `0001-01-01T00:00:00+00:01` is a legal RFC3339 timestamp, but is BCE in UTC timezone. This is an oddity: we otherwise say parsers should accept RFC3339 timestamps with any timezone, but must serialize as UTC. This timestamp is not legally representable in RFC3339 in UTC, and the google.protobuf.Timestamp field secs is documented that `-62135596800` is the minimum legal value, but this timestamp is earlier than that. Because this situation only occurs at the years 1 and 9999 its not plausibly a concern on real user data, its only an oddity that you must either reject this legal RFC3339 timestamp at parse time, or else accept it but produce an in-memory google.protobuf.Timestamp which is officially \u0027invalid\u0027 and cannot be printed back out.\n\nPiperOrigin-RevId: 954603113\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "0398495ba429b90f4b99755d0b8727354ccf4c93",
      "old_mode": 33188,
      "old_path": "conformance/binary_json_conformance_suite.cc",
      "new_id": "d35b659ed336d428cdaf85b4d2c8aa3052bbaeed",
      "new_mode": 33188,
      "new_path": "conformance/binary_json_conformance_suite.cc"
    },
    {
      "type": "modify",
      "old_id": "f2d114909c9f4ce2ac5651ca1e4a4bd93558cb76",
      "old_mode": 33188,
      "old_path": "conformance/failure_list_cpp.txt",
      "new_id": "8eee23e006f56af6a9cb0f769752a22dfa5ce6f8",
      "new_mode": 33188,
      "new_path": "conformance/failure_list_cpp.txt"
    },
    {
      "type": "modify",
      "old_id": "ded745c875fc7ddca3b22442441d56e62830a166",
      "old_mode": 33188,
      "old_path": "conformance/failure_list_java.txt",
      "new_id": "325f3948ddc4a801501c2fd862597ba9ca838dec",
      "new_mode": 33188,
      "new_path": "conformance/failure_list_java.txt"
    },
    {
      "type": "modify",
      "old_id": "ae082a2e4bf8bb7b88461fbff722b416e06c831d",
      "old_mode": 33188,
      "old_path": "conformance/failure_list_jruby.txt",
      "new_id": "3f09c369966019f47c0767639875ed93baced322",
      "new_mode": 33188,
      "new_path": "conformance/failure_list_jruby.txt"
    },
    {
      "type": "modify",
      "old_id": "05fe4feccc822c62f693860c2fab97800faa0c10",
      "old_mode": 33188,
      "old_path": "conformance/failure_list_jruby_ffi.txt",
      "new_id": "cd374f2325a28a89384a5aed336f81b2531ff33d",
      "new_mode": 33188,
      "new_path": "conformance/failure_list_jruby_ffi.txt"
    },
    {
      "type": "modify",
      "old_id": "6e54a830fee054e47d3b36db7860fd702fab60bf",
      "old_mode": 33188,
      "old_path": "conformance/failure_list_php.txt",
      "new_id": "c21c5bbd0284a4c564e3379f6ba6fbc3ed3a3a3f",
      "new_mode": 33188,
      "new_path": "conformance/failure_list_php.txt"
    },
    {
      "type": "modify",
      "old_id": "3eecf1237aba27c41ee0887dcdfb1e14a2c0421d",
      "old_mode": 33188,
      "old_path": "conformance/failure_list_php_c.txt",
      "new_id": "78281f5bd5c1f121400c763da53e4e7115f224f5",
      "new_mode": 33188,
      "new_path": "conformance/failure_list_php_c.txt"
    },
    {
      "type": "modify",
      "old_id": "ee19466d772c8c19e0289d60e5e57db6751f54cd",
      "old_mode": 33188,
      "old_path": "conformance/failure_list_python.txt",
      "new_id": "09c3b36f407a02d18651f17350ff143e6caab3d0",
      "new_mode": 33188,
      "new_path": "conformance/failure_list_python.txt"
    },
    {
      "type": "modify",
      "old_id": "aa42541219896cefd3f066b5b4033609b29e8d0e",
      "old_mode": 33188,
      "old_path": "conformance/failure_list_python_cpp.txt",
      "new_id": "dc0e0340df3acf41d386920363d18df05701f3b6",
      "new_mode": 33188,
      "new_path": "conformance/failure_list_python_cpp.txt"
    },
    {
      "type": "modify",
      "old_id": "96376fc6480a1bc59c981bfad002b123f214536f",
      "old_mode": 33188,
      "old_path": "conformance/failure_list_python_upb.txt",
      "new_id": "22d445dcc619e10fed86a8d81244d9824db9f151",
      "new_mode": 33188,
      "new_path": "conformance/failure_list_python_upb.txt"
    },
    {
      "type": "modify",
      "old_id": "1e716803de6b93849e59b133d3cbd666e4485bd5",
      "old_mode": 33188,
      "old_path": "conformance/failure_list_ruby.txt",
      "new_id": "dbd57a4b5b03b0cb26759e1ec4b3282dd2978048",
      "new_mode": 33188,
      "new_path": "conformance/failure_list_ruby.txt"
    },
    {
      "type": "modify",
      "old_id": "05fe4feccc822c62f693860c2fab97800faa0c10",
      "old_mode": 33188,
      "old_path": "upb/conformance/conformance_upb_failures.txt",
      "new_id": "cc17691499ec1caec9fd672bb69be97c08319dcd",
      "new_mode": 33188,
      "new_path": "upb/conformance/conformance_upb_failures.txt"
    }
  ]
}
