)]}'
{
  "log": [
    {
      "commit": "84079e8b8531309e06ba7276b1c28bdca9210ad6",
      "tree": "85a169b2910545533b8449711ad285431ee509a9",
      "parents": [
        "d5639f45b8468fba684b076b9403ccd5f2290056"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Apr 01 15:28:16 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 15:28:16 2026 -0700"
      },
      "message": "Bump dart-lang/setup-dart from 1.7.1 to 1.7.2 (#1092)\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "d5639f45b8468fba684b076b9403ccd5f2290056",
      "tree": "274c4aaec7ae3474b3e64c1f2943e3b8657024df",
      "parents": [
        "9e30258e0aa6a6430ee36c84b75308a9702fde42"
      ],
      "author": {
        "name": "Panmari",
        "email": "smmuzi@gmail.com",
        "time": "Tue Dec 23 15:13:50 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 23 14:13:50 2025 +0000"
      },
      "message": "Update protoc_plugin/README.md links and references (#1087)\n\n"
    },
    {
      "commit": "9e30258e0aa6a6430ee36c84b75308a9702fde42",
      "tree": "0c6c06f98551181f00a522b6f0565d0749731560",
      "parents": [
        "cafeac4208a1139e370099591edc8b014dfcc204"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Wed Nov 26 08:35:29 2025 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 26 08:35:29 2025 +0000"
      },
      "message": "Check key and value validity in PbMap (#1076)\n\nCurrently `PbMap` does not check ranges of values added as keys or values.\n\nThis allows serializing and deserializing a message with a map and getting a\ndifferent map back, because `PbMap` allows adding values that are out of range\n(e.g. an integer larger than 32-bit range as a `sfixed32` value) but when\nserializing it truncates the value.\n\nUpdate `PbMap` to use the same validation functions as `PbList` when adding\nelements. Both keys and values are checked.\n\nFixes #1065."
    },
    {
      "commit": "cafeac4208a1139e370099591edc8b014dfcc204",
      "tree": "69fe2cfc4f6069b3c7cce8b046409b48b9b4bd07",
      "parents": [
        "7fcd48b24b92671f59b36a7b3ce23208f5600b7c"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Mon Nov 24 11:51:43 2025 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 24 11:51:43 2025 +0000"
      },
      "message": "Hide PbList and PbMap constructors (#1072)\n\n`PbList` and `PbMap` can\u0027t be constructed by the users properly, because the\nconstructor arguments are private:\n\n- `PbList` element check function\n- `PbMap` key and value field type arguments\n\nInternally we had just one `PbMap` constructor call (with random field type\narguments) which we replaced with `{}`, and a few `PbList` constructor calls\n(without a check function) which we replaced with `[]`.\n\nTo prevent confusion and incorrect uses of these types, hide the constructors.\n\nSome of the `PbList` element validation tests are removed: they would need to\nbe moved to `protoc_plugin/test` as we no longer have access to `PbList`\nconstructors (but we can get `PbList`s from messages), but the tests are also\nduplicates of the tests in `protoc_plugin/test/validate_fail_test.dart`. So\nremoved them instead."
    },
    {
      "commit": "7fcd48b24b92671f59b36a7b3ce23208f5600b7c",
      "tree": "08aa3e8128622091381e5ae822219646a83d5fa8",
      "parents": [
        "3ed04a91ff4de8493226e8fd0d89678c2986edf6"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Tue Nov 18 13:09:27 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 18 12:09:27 2025 +0000"
      },
      "message": "Sync some of the internal changes (#1084)\n\n- Remove redundant `break`s in `switch` statements.\n\n- Move type annotations from variables to lists:\n  `final T x \u003d [...]` to `final x \u003d \u003cT\u003e[...]`\n\n- Copy a dart2js optimization when accessing `GeneratedMessage._fieldSet`\n\n- Sort exports in `internal.dart`."
    },
    {
      "commit": "3ed04a91ff4de8493226e8fd0d89678c2986edf6",
      "tree": "010b8f01e880d6079ad55f7e9b40cf67e41237c9",
      "parents": [
        "a1dceed95d7e9250bea950a2ed10173f43ab83f6"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Mon Nov 17 14:45:37 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 17 13:45:37 2025 +0000"
      },
      "message": "Add well-known type support (#1081)\n\n- Add generated Dart for the well-known protos to the package.\n\n- Special case `google/protobuf/...` imports in the plugin to generate imports\n  to the libraries in the protobuf package.\n\n  Note: `protoc` already special cases these imports, you don\u0027t have to specify\n  paths to them with `-I...`.\n\n  With this change you also don\u0027t have to manually compile them to Dart\n  classes.\n\nFixes #1073.\nFixes #817.\nFixes #780.\nFixes #483."
    },
    {
      "commit": "a1dceed95d7e9250bea950a2ed10173f43ab83f6",
      "tree": "63c75e5b302f6479575974f9f5caf4cf47ffc489",
      "parents": [
        "46c36977f213c961148a9455a5894f2e8c7ba722"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Mon Nov 17 12:30:45 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 17 11:30:45 2025 +0000"
      },
      "message": "protoc_plugin refactors (#1082)\n\n- Move static method `FileGenerator._getDeclaredMixins` to the end of the file\n  as a top-level function.\n\n  This is a utility method but it came first in the class and it\u0027s quite large\n  (~90 lines). Move it to the end so that it will allow top-down reading of the\n  class and won\u0027t obstruct more important details like fields.\n\n- Refactor import prefix generation: currently if I\u0027m importing `container` in\n  `file`, I need to do `container.importPrefix(context: file)`. This is\n  confusing and it took me a while to figure out what it\u0027s doing: It\u0027s a method\n  on the container type but it modifies the file. Files can import, not\n  containers. So files should have import prefixes, not containers.\n\n  Move the method to `FileGenerator`. The code above now looks like\n  `file.importPrefix(container)`.\n\n  Also document the fact that just generating the import prefix for an imported\n  thing does not make it imported automatically. This is quite error prone, if\n  I call `file.importPrefix(container)` and use the prefix in e.g.\n  `EnumGenerator`, I need to make sure to update `FileGenerator` to actually\n  generate the import.\n\n  It would be good to refactor this so that just using an prefix is enough to\n  import it. But for now this part is not done.\n\n- Minor changes: use spread syntax instead of `[]..addAll(...)` and similar.\n  Add one line space between some of the fields."
    },
    {
      "commit": "46c36977f213c961148a9455a5894f2e8c7ba722",
      "tree": "e120baa689225ed40e32338771a4057c86048fe6",
      "parents": [
        "b98d4e2bc8d5e8bbe96cfdd56f423641b818b914"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Tue Nov 11 11:31:36 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 11 10:31:36 2025 +0000"
      },
      "message": "Update test protos copied from C++ protobuf (#1079)\n\n"
    },
    {
      "commit": "b98d4e2bc8d5e8bbe96cfdd56f423641b818b914",
      "tree": "57e1aa4ba4901e365f48b782df7eea74f0ac65e1",
      "parents": [
        "1ebb09ccb5f937017e27f0953391ba856bbb8f49"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Tue Nov 11 11:31:18 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 11 10:31:18 2025 +0000"
      },
      "message": "Implement proto text format generator (#1080)\n\nThis syncs cl/816776257, not my code.\n\nOnly text format generation is implemented. We don\u0027t parse the text format yet.\n\n(Related issue: #125)"
    },
    {
      "commit": "1ebb09ccb5f937017e27f0953391ba856bbb8f49",
      "tree": "2306cb4a712fbfd6f7652f09ccaced774594a100",
      "parents": [
        "24f9cf080273f5ecb00db6ca1be16d5cc8762429"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Thu Nov 06 14:51:24 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 06 13:51:24 2025 +0000"
      },
      "message": "Release protobuf-5.1.0 (#1078)\n\n"
    },
    {
      "commit": "24f9cf080273f5ecb00db6ca1be16d5cc8762429",
      "tree": "f027a4849ec8bfb43eb44ff0f800b441e84649f2",
      "parents": [
        "4dfedafd160e203b9b5a91737fc0de962dc40b24"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Thu Nov 06 14:20:08 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 06 13:20:08 2025 +0000"
      },
      "message": "Fix message comparison throwing type error when comparing maps in some cases (#1077)\n\n"
    },
    {
      "commit": "4dfedafd160e203b9b5a91737fc0de962dc40b24",
      "tree": "52acb2ca244ed0e1122312da58f439a3a3aa7c02",
      "parents": [
        "bed508e273592a9191b685f1634b0638cd657298"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Mon Nov 03 11:15:38 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 03 10:15:38 2025 +0000"
      },
      "message": "Don\u0027t iterate iterable arguments twice in PbList (#1070)\n\nUpdate `PbList` methods that update the list with an `Iterable` argument to\navoid iterating the iterable twice: once for checking the element validity and\nonce again for actually adding the values.\n\nMethods updated:\n\n- addAll\n- insertAll\n- replaceRange\n- setAll\n- setRange\n\nException handling behavior before this PR was undefined (same as the standard\nlibrary `List`), and it\u0027s slightly changed with this PR:\n\n- addAll: previously if the iterator throws the list was left unchanged, now\n  the elements until the exception will be added.\n\n- Other methods: exception behaviors are now the same as the standard library\n  `List` methods.\n\n  It\u0027s hard to tell whether the previous behavior was the same or different\n  with the standard library `List` methods, as the exception behavior of those\n  are undefined.\n\nTo avoid allocating new iterators when a check function is not available, we\nhave conditionals in each of these methods and call the standard library `List`\nmethods directly when there isn\u0027t a check function.\n\nTo avoid increasing number of cases needed to be tested, we don\u0027t special case\niterable types like `PbList` and `List` in these methods. When the check\nfunction is available we simply `map` them with the check function. Otherwise\ncall the same method on `wrappedList` directly.\n\nFixes #730."
    },
    {
      "commit": "bed508e273592a9191b685f1634b0638cd657298",
      "tree": "ad6915f248788c793531f506fbf04c11d465becc",
      "parents": [
        "4b488e014f94b643e95d137823eca10e8a5674fe"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Thu Oct 30 11:21:12 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 30 10:21:12 2025 +0000"
      },
      "message": "Don\u0027t generate `createRepeated` members (#1074)\n\n`createRepeated` members are not that useful, because `PbList` doesn\u0027t provide\nmuch over the standard library `List`, and `MyMessage.createRepeated()` can be\nreplaced with `\u003cMyMessage\u003e[]`.\n\nTo reduce generated code sizes and dependencies to `PbList`, remove the\n`createRepeated` members."
    },
    {
      "commit": "4b488e014f94b643e95d137823eca10e8a5674fe",
      "tree": "72fc5979cea4c84b7af062800cdf6bfaaa7a6789",
      "parents": [
        "7db07843c86de526edbe3c4d668c0962ef0b203b"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Tue Oct 28 11:24:34 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 28 10:24:34 2025 +0000"
      },
      "message": "Make annotations.dart and exceptions.dart libraries (#1071)\n\n"
    },
    {
      "commit": "7db07843c86de526edbe3c4d668c0962ef0b203b",
      "tree": "02e521b0fcc4568cb5449070a8706aeb2c01bffa",
      "parents": [
        "a77f9a6b94f77e47eb72f0906883b48ef1914702"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Fri Oct 24 10:16:50 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 24 09:16:50 2025 +0100"
      },
      "message": "Avoid redundant nullability checks when updating repeated fields (#1069)\n\nSince sound null safety we no longer need to manually check for nulls when\nsetting fields, as we don\u0027t use nullable types for field values.\n\nFixes #978."
    },
    {
      "commit": "a77f9a6b94f77e47eb72f0906883b48ef1914702",
      "tree": "3242f616677433225e5745b3f81789cfd1c7def4",
      "parents": [
        "27730dbb6edd7e621141353b0e19eab6d6cada3a"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Thu Oct 23 10:31:53 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 23 10:31:53 2025 +0100"
      },
      "message": "More field validation tests (#1068)\n\nFor {extension,non-extension} {singular,repeated} fields, check range and type\nchecks.\n\nAll fields with range checks are tested. For type and nullability checks we\nonly use a message and a `bool` field, as there are too many types of fields\nand most of them use the same validation function.\n\nFields with range checks are not tested for type and nullability checks. To\ncheck whether a value is within range we have to use as a non-null `int` or\n`double`, so if the value being checked doesn\u0027t have the right type the range\ncheck function will throw anyway.\n\nThis reveals two inconsistencies in the library:\n\n- When type of a non-repeated extension value is not right we throw an argument\n  error instead of a type error.\n\n- `setExtension` takes an `Object` (not nullable) as an argument but\n  `addExtension` takes `Object?` (nullable).\n\nI tested accordingly instead of trying to fix the inconsistencies as fixing\nthem will break downstream."
    },
    {
      "commit": "27730dbb6edd7e621141353b0e19eab6d6cada3a",
      "tree": "a85d5336b41db831fe3133a47de4f20c995dc0b8",
      "parents": [
        "9b4c46fe2b20137681ffe8a70321229be6442f78"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Tue Oct 21 14:54:06 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 21 13:54:06 2025 +0100"
      },
      "message": "Move PbMap to its own library (#1066)\n\nContinuation to #1063.\n\napitool reports no changes with this PR.\n\nMap decoding code moved from `pb_map.dart` to `coded_buffer.dart` to avoid\naccessing `CodedBufferReader` internals in `PbMap`. It\u0027s also more consistent\nto have all decoding code in `coded_buffer.dart`. We don\u0027t have repeated field\ndecoding code in `pb_list.dart`, and `pb_list.dart` and `pb_map.dart` don\u0027t\nhave decoders for other formats.\n\nStatic members `_keyFieldNumber` and `_valueFieldNumber` are removed as they\nwere duplicates of top-level members `mapKeyFieldNumber` and\n`mapValueFieldNumber`.\n\n`deepCopy` is exported as an internal extension to avoid expanding the public\nAPI without consideration."
    },
    {
      "commit": "9b4c46fe2b20137681ffe8a70321229be6442f78",
      "tree": "b51de412c16c1814a46f8e050753fcaf01af9f1e",
      "parents": [
        "5a44489a1e8197846168dc61616b3eaee18feed9"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Tue Oct 21 11:32:09 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 21 10:32:09 2025 +0100"
      },
      "message": "More clearExtension tests: (#1064)\n\nMutation testing discovered that removing the `_ensureWritable` line in\n`FieldSet.clearExtension` doesn\u0027t cause any test failures. Add a test that\nfails when the line is removed."
    },
    {
      "commit": "5a44489a1e8197846168dc61616b3eaee18feed9",
      "tree": "67f4bc56d0c89d4350ebd806fc51f78669e4c4bc",
      "parents": [
        "78cf7432a6b1a0771042a1931047cf7c15d931c6"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Tue Oct 21 11:20:41 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 21 10:20:41 2025 +0100"
      },
      "message": "Move PbList to its own library (#1063)\n\nA while ago we started converting parts to libraries to allow conditional\ncompilation.\n\nThis continues to move more parts to libraries, with `PbList`.\n\nLibraries allow specifying public and internally public interfaces of the types\nand makes it easier to define and maintain internal invariants.\n\nTo avoid large (difficult to sync) diffs, I\u0027m moving one part at a time.\n\napitool reports no changes with this PR."
    },
    {
      "commit": "78cf7432a6b1a0771042a1931047cf7c15d931c6",
      "tree": "d6cf421f795702c5a3fc3ad271cee0cac0288d59",
      "parents": [
        "14bbd0bd7ff9b7e322ff4e85bd243f6905170b92"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Mon Oct 20 11:45:59 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 20 10:45:59 2025 +0100"
      },
      "message": "Fix a few extension field bugs (#1062)\n\nWhen an extension field set isn\u0027t initialized before freezing the message:\n\n- `addExtension` allows adding and modifying extensions.\n- `getExtension` returns non-frozen defaults that can be modified. \n\nFix this by initializing the extension field set as frozen when the parent\nmessage is frozen.\n\nSecondly, extension field set returns differently typed lists when it\u0027s frozen\nand not frozen. Fix this by always creating the list via the field\u0027s\n`FieldInfo`.\n\nAlso refactor the code a little bit: `GeneratedMessage` by-passes a layer of\nabstraction and accesses unknown field sets directly. Instead make it call\n`FieldSet` always.\n\nNew `FieldSet` methods are added as public (without an underscore in the name)\nto make it clear that they\u0027re a public interface (can be called from\n`GeneratedMessage`).\n\n(Ideally `FieldSet` should be a separate library, but that requires a lot of\nrefactoring to split the parts into libraries.)\n\nAlso remove duplicate \"is repeated\" and \"ensure writable\" checks when modifying\nextension fields.\n\n---\n\ncl/819146715"
    },
    {
      "commit": "14bbd0bd7ff9b7e322ff4e85bd243f6905170b92",
      "tree": "906939a98ad1077bd1a990efeb294c4982ff2020",
      "parents": [
        "fb89979f8e83690989fd76eef4d5692aec4941d6"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Tue Sep 30 10:20:08 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 30 10:20:08 2025 +0100"
      },
      "message": "Sync a few small CLs: (#1060)\n\n- cl/660721933: moves some proto3 parsing functions to utils to allow reusing\n  internally in a library when parsing an internal format.\n\n- cl/646759129: Update `CodedBufferReader` default depth limit to 100, to be\n  consistent with the C++ and Java implementations.\n\n- cl/704280814: Update `CodedBufferReader` default size limit to max 32-bit\n  signed integer to be consistent with the C++, Java, Objective-C\n  implementations.\n\n- Also a minor change, not a CL: Type casts in `coded_buffer_writer.dart` was\n  updated in this repo probably accidentally, as we never want to type cast\n  with `as` in this repo. Revert it to the internal version which uses implicit\n  casts.\n\nWith this, about half of the protobuf files become identical with the internal\nversion."
    },
    {
      "commit": "fb89979f8e83690989fd76eef4d5692aec4941d6",
      "tree": "8ff420c97efe9b5f4f7024373fa04d4097ca098b",
      "parents": [
        "ccf56f3c8604f9b1142d759d45707c1861a7ddb0"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Mon Sep 29 19:28:50 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 29 20:28:50 2025 +0200"
      },
      "message": "Update CHANGELOGs for release (#1059)\n\n"
    },
    {
      "commit": "ccf56f3c8604f9b1142d759d45707c1861a7ddb0",
      "tree": "dfd7208fb71c912ece28601d17684cbac895bdf8",
      "parents": [
        "b9b59e1d9fbf0b12dcf98845108481a14554fceb"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Mon Sep 29 11:45:47 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 29 11:45:47 2025 +0100"
      },
      "message": "Fix unknown JSON handling (#1058)\n\n- Fix hash code and equality handling with unknown JSON data. (cl/613592094)\n\n- Fix converting unknown JSON data to Dart when deserializing, and to JS when\n  serializing. (cl/812691555)\n\n- Make unknown JSON data type `Object?` instead of `dynamic` to prevent\n  accidentally making dynamic calls. (cl/812691555)\n\n- Also fix a sync error in b7613581d847e1e36e76f0e36db3a412d8fea5b1 where the\n  `_unknownJsonData \u003d null` line was added to  `_ensureUnknownFields` instead\n  of `_clear`."
    },
    {
      "commit": "b9b59e1d9fbf0b12dcf98845108481a14554fceb",
      "tree": "b68c6ca5c910a585837d42d27d0fbb29ce7cf7a9",
      "parents": [
        "f167191f5e8fa80c1cd172475b3288410958615d"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Mon Sep 29 10:55:40 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 29 11:55:40 2025 +0200"
      },
      "message": "Fix clearing oneof fields (#1057)\n\ncl/700738551"
    },
    {
      "commit": "f167191f5e8fa80c1cd172475b3288410958615d",
      "tree": "55e9642e0ddfce3b3c4f552d4800bfd7a406f2f6",
      "parents": [
        "07eed6e8cc0535189112ae8373aa8f16f4a5c3ca"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Mon Sep 29 10:19:39 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 29 10:19:39 2025 +0100"
      },
      "message": "Remove redundant `break` statements in switch cases (#1056)\n\n"
    },
    {
      "commit": "07eed6e8cc0535189112ae8373aa8f16f4a5c3ca",
      "tree": "0f7dc3e2ac01c8cedba23dd962e9f2528660aa9e",
      "parents": [
        "0447bd20dbf879d839fbd9e24c1731a71cfb39bb"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Thu Sep 25 10:32:41 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 25 10:32:41 2025 +0100"
      },
      "message": "Generalize argument type of `PbList.from` from `List\u003cT\u003e` to `Iterable\u003cT\u003e` (#1054)\n\nThis is more consistent with `List.from` and also more efficient as we can\navoid redundant `List` allocations when we have an `Iterable` instead of a\n`List`. This commonly happens when we create a `PbList` from a chain of `map`,\n`where` etc. calls.\n\nAlso update the the factory body to use `List.of` instead of `List.from` as we\nknow the `Iterable`\u0027s element type. (`List.from` takes `Iterable\u003cdynamic\u003e`,\n`List.of` takes `Iterable\u003cT\u003e`)\n\ncl/810421932"
    },
    {
      "commit": "0447bd20dbf879d839fbd9e24c1731a71cfb39bb",
      "tree": "3c8e792a38b13692f8d648690fda291ce9dc8c32",
      "parents": [
        "660bbc87d6067c49eac039b7f502125d7ca658b3"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Wed Sep 24 18:54:19 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 24 19:54:19 2025 +0200"
      },
      "message": "Run plugin with asserts when building test protos (#1055)\n\nCurrently we run the tests with assertions but that doesn\u0027t cover some of the\ncode paths.\n\nWhen building the test protos we don\u0027t run the plugin with assertions.\n\nAdd a new executable `protoc-gen-dart-debug` that is the same as\n`protoc-gen-dart`, but passes `--enable-asserts` to Dart. Use it when building\ntest protos.\n\nThis triggers an assertion which was reported in #608. The assertion is clearly\nwrong (we call the function for repeated fields a few lines above the\nassertion) and no one knows or remembers why it\u0027s there. Remove the assertion.\n\nCloses #608."
    },
    {
      "commit": "660bbc87d6067c49eac039b7f502125d7ca658b3",
      "tree": "c24a1676e424df4ede0d6d6565d009246ce77150",
      "parents": [
        "82fc34f71df84cdaa22b5a0e10c5c3a46821b2e9"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Wed Sep 24 09:54:56 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 24 09:54:56 2025 +0100"
      },
      "message": "Edition support (#1052)\n\nThis is mainly cl/611142449, cl/802300883, and a few other small cleanup CLs.\n\n(This is not my code, just a sync of internal changes.)\n\nCloses #945."
    },
    {
      "commit": "82fc34f71df84cdaa22b5a0e10c5c3a46821b2e9",
      "tree": "7cb1a054d6e7066baff0ddd013f75b49c4c84a6b",
      "parents": [
        "456e2ee704af27225e25ba092164f66dcbf63000"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Tue Sep 23 14:28:12 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 23 14:28:12 2025 +0100"
      },
      "message": "Improve golden file checking (#1053)\n\nCurrently when I have a typo in the golden file path, `expectGolden` creates a\nnew file, which makes the test pass.\n\nLocally I can notice the new file if I run `git status`, but if I\u0027m not careful\nand rely on CI, because the tests pass, I can merge the PR.\n\nUpdate `expectGolden` to only create (or update if already exists) a golden\nfile when the env variable `PROTOC_UPDATE_GOLDENS` is set.\n\nWithout the env variable it expects the file to exist, with the right contents.\nSo typos now cause test failures as expected."
    },
    {
      "commit": "456e2ee704af27225e25ba092164f66dcbf63000",
      "tree": "8a15876e97a4e351bc3ca8358c337464e9a9b144",
      "parents": [
        "c21502957def72916685c955a3fde1eb66ab5585"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Tue Sep 16 12:30:12 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 16 11:30:12 2025 +0100"
      },
      "message": "Generate unittest_features proto (#1051)\n\nNew proto used in editions tests in #1052."
    },
    {
      "commit": "c21502957def72916685c955a3fde1eb66ab5585",
      "tree": "719485af5e37bca53ca4b599dd41287ff55919ff",
      "parents": [
        "971bcae358e8c6d0246382b0b15b787e6ac0a428"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Tue Sep 16 12:29:46 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 16 11:29:46 2025 +0100"
      },
      "message": "Update pre-generated protos (#1050)\n\nRun `dart tool/update_protos.dart` to get the latest .proto files and `make\nupdate-pregenerated` to update generated files."
    },
    {
      "commit": "971bcae358e8c6d0246382b0b15b787e6ac0a428",
      "tree": "7c3e82b1c3c84d66577c2ef6bb9a10f1e1298936",
      "parents": [
        "8750ed78bb26522cd3eb9931f998e0e9218a8f46"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Mon Sep 08 11:20:06 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 08 10:20:06 2025 +0100"
      },
      "message": "Use a map to cache the `valueOf` functions for enums (#1047)\n\n(This is cl/658131451 ported to open source, not my CL)\n\nCL description: (slightly edited)\n\nThis is a generated-code size optimization.\n\nThe main change is to generate the valueOf functions for protobuf enums\nprogramatically, rather than (1) use the per-enum `FooPbEnum.valueOf` static\nfunction tear-foo which (2) uses a per-enum static variable that is lazily\ninitialized to map from int value to the protobuf enum value.\n\nWith ~1000 protobuf enums, this allows most of the `valueOf` static function\ntear-off closures to tree-shaken, together with their functions and the code\nfor the initializer of the map.\n\nThe secondary change is to use more specialized \u0027add\u0027 methods to `BuilderInfo`,\nallowing many fields to be \u0027defined\u0027 with a call with fewer arguments.\n\nTogether, these changes reduce the size of the main unit of an app by about\n1.3%, and would have a similar effect on native targets.\n\nThis change requires\nhttps://github.com/dart-lang/sdk/commit/175dc05db3cd626874c17ceb03336065a03375bb,\nwhich was released with Dart 3.6.0."
    },
    {
      "commit": "8750ed78bb26522cd3eb9931f998e0e9218a8f46",
      "tree": "1512c0b18cd8852c7e4abb0f1c5dece0f37bbeb0",
      "parents": [
        "0a139358f56d2b3444e1fe4016bfb6166bfc5622"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Fri Sep 05 09:41:44 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 05 09:41:44 2025 +0100"
      },
      "message": "Sync internal Kythe support improvements (#1048)\n\n(This syncs cl/667563113 to open source. Not my CL.)\n\nSupport `oneof` fields in Kythe for proto+dart.\n\nAlso refactors code a bit: extracts logic for building proto field/message/etc\npaths to a separate class."
    },
    {
      "commit": "0a139358f56d2b3444e1fe4016bfb6166bfc5622",
      "tree": "11cecf840337ab4124621f8162d4e572cd09a75b",
      "parents": [
        "765ba8a280164e1985ba6564064eb8a4b5a2e1a7"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 02 08:34:00 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 02 08:34:00 2025 -0700"
      },
      "message": "Bump actions/checkout from 4.2.2 to 5.0.0 (#1046)\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "765ba8a280164e1985ba6564064eb8a4b5a2e1a7",
      "tree": "d67b5df81d2240eadb2f79711936eff3e31e252e",
      "parents": [
        "703bf7c997098d0ef87d8faf29e9b696af4ff4ec"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Thu Aug 28 09:08:35 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 28 09:08:35 2025 +0100"
      },
      "message": "Fix non-proto3 JSON format double decoding (#1043)\n\nWhen the field type is a proto `float` or `double` we always use a Dart\n`double` for the value. Trying to set the field an `int` causes an assertion\nfailure in `FieldSet`.\n\nThis code is also a bit inconsistent in itself: when the jspblite2 value is a\nstring it decodes as `double`, but when it\u0027s a number it tries to convert to an\n`int`. So if the value is a string `\"1\"` it stores as `double` but if it\u0027s the\nnumber `1` it tries to convert to double.\n\nThis isn\u0027t an issue with dart2js as with dart2js `int` and `double` are the\nsame thing, but it causes assertion failures when this library is used with\ndart2wasm which distinguishes `int`s and `double`s.\n\nFix by always storing proto `float`s and `double`s as Dart `double`s.\n\nNote: this code is currently not used in dart2wasm, instead dart2wasm uses the\nVM\u0027s library. However if I start using this library instead (for benchmarking,\nto potentially switch to this library) then it breaks. So currently this change\nis not a user-visible change because dart2wasm doesn\u0027t use this library.\n\ncl/799924250"
    },
    {
      "commit": "703bf7c997098d0ef87d8faf29e9b696af4ff4ec",
      "tree": "cffa495bf5e05928a1d5206e8e4356b3b04cf704",
      "parents": [
        "9939965140ab86cbb36ef8546efdfca3a4bd6409"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Wed Aug 27 12:28:12 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 27 12:28:12 2025 +0100"
      },
      "message": "Compile dart2wasm benchmarks with --no-strip-wasm (#1044)\n\nKeep the symbols to get useful perf outputs."
    },
    {
      "commit": "9939965140ab86cbb36ef8546efdfca3a4bd6409",
      "tree": "ebc792dd63652937b6cc7039c0fef1a0c8e7255b",
      "parents": [
        "da354a2f086d9f2e848b1f5602f2c451e3bb7c75"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Tue Aug 26 10:49:33 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 26 10:49:33 2025 +0100"
      },
      "message": "Fix JS interop annotations (#1042)\n\nIn a declaration like\n\n    @JS(\u0027JSON\u0027)\n    extension type _JSON._(JSObject _) implements JSObject {\n      @JS(\u0027JSON.stringify\u0027)\n      external static JSString _stringify(JSObject value);\n    }\n\nWhen I call `_JSON._stringify(...)`, dart2js calls `JSON.stringify`, but dart2wasm calls `JSON.JSON.stringify`, which is wrong.\n\nReading [1] it looks like the annotation `JSON.stringify` should just be `stringify`. If I do that the code works with both dart2wasm and dart2js.\n\n(I\u0027ve reported dart2wasm\u0027s handling of the annotations above and we\u0027ll work on a fix for it on dart2wasm.)\n\nThis change is not tested on the CI because when compiling with dart2wasm we use the JS decoder library used by the VM, which doesn\u0027t use JS interop. I tested this manually with the patch:\n\n    diff --git a/protobuf/lib/src/protobuf/json/json.dart b/protobuf/lib/src/protobuf/json/json.dart\n    index 05d1ac1..70b6a7c 100644\n    --- a/protobuf/lib/src/protobuf/json/json.dart\n    +++ b/protobuf/lib/src/protobuf/json/json.dart\n    @@ -13,7 +13,7 @@ import \u0027../utils.dart\u0027;\n     // Use json_vm.dart with VM and dart2wasm, json_web.dart with dart2js.\n     // json_web.dart uses JS interop for parsing, and JS interop is too slow on\n     // Wasm. VM\u0027s patch performs better in Wasm.\n    -export \u0027json_vm.dart\u0027 if (dart.library.html) \u0027json_web.dart\u0027;\n    +export \u0027json_vm.dart\u0027 if (dart.library.js_interop) \u0027json_web.dart\u0027;\n\n     Map\u003cString, dynamic\u003e writeToJsonMap(FieldSet fs) {\n       dynamic convertToMap(dynamic fieldValue, int fieldType) {\n\n[1]: https://dart.dev/interop/js-interop/usage#js"
    },
    {
      "commit": "da354a2f086d9f2e848b1f5602f2c451e3bb7c75",
      "tree": "09ee5086ed2272be4f468acc06889aa310288729",
      "parents": [
        "41eba192646236b64dcc0652c0f852e28a73032c"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Fri Aug 22 12:24:50 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 22 12:24:50 2025 +0100"
      },
      "message": "Update benchmark builder to use -O2 with dart2wasm, add output dir to gitignore (#1041)\n\n"
    },
    {
      "commit": "41eba192646236b64dcc0652c0f852e28a73032c",
      "tree": "424516f98c9b838549672428a2e74cde9ef71027",
      "parents": [
        "3ccc8ab5f47b9308a8fdff7f67abdd93c399aab8"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Fri Aug 22 11:44:59 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 22 11:44:59 2025 +0100"
      },
      "message": "Add sinks to benchmarks to prevent smart tools eliminating benchmarked code (#1040)\n\nIn `binary_decode_packed` benchmarks we used \"sink\" variables to write the\ndecoded values, and printed these sinks at the end to make sure they\u0027re not\ndropped.\n\nDo the same in the rest of the benchmarks to make sure no code is eliminated by\na sufficiently smart compiler or VM.\n\nJust as a sanity check I compared the numbers before and after this change,\nwhen compiled to Wasm with `-O2`. The numbers do not change in a consistent\n(reproducible) and significant way. It\u0027s still good to be safe and use the\nbenchmark results to avoid dropping code."
    },
    {
      "commit": "3ccc8ab5f47b9308a8fdff7f67abdd93c399aab8",
      "tree": "ff6dd9201704d31f6512ae07e5c09e2a7b5166cc",
      "parents": [
        "6bce9d7239a37aed69d59b2fe7e0e454771ada90"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Aug 19 10:37:46 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 19 10:37:46 2025 -0700"
      },
      "message": "Bump actions/checkout from 3.5.3 to 4.2.2 (#1036)\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "6bce9d7239a37aed69d59b2fe7e0e454771ada90",
      "tree": "4be20163e09d456d2e4cb936f55a02308911bbfe",
      "parents": [
        "19e5a255bca995ca4acc1b585eaf366cc3bffe2e"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Tue Aug 19 13:21:38 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 19 13:21:38 2025 +0100"
      },
      "message": "Fix unknown enum handling (#853)\n\nThis fixes handling of unknown enum values in repeated and map fields and in\ntop-level fields.\n\nCurrent behavior:\n\n- Unknown enums in map and repeated fields throw an exception.\n- Unknown enums in top-level fields reset the field value to the default one.\n\nWith this PR we just \"ignore\" the values:\n\n- Unknown enums in map and repeated fields are skipped.\n- Unknown enums in top-level fields do not reset the field\u0027s value to the\n  default.\n\nFixes #849."
    },
    {
      "commit": "19e5a255bca995ca4acc1b585eaf366cc3bffe2e",
      "tree": "4df8ac537192206ac1bb4f9196a68df642acc148",
      "parents": [
        "6e9c9f4637bc0db8a855c7b26e8f87a2279307cc"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Fri Aug 15 08:09:48 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 15 09:09:48 2025 +0200"
      },
      "message": "Implement deepCopy as copying, instead of merge (#742)\n\nCurrently `deepCopy` and `clone` create an empty message, and then merge the\ncloned message into the empty message.\n\nThis is slow as merge needs to validate each element added to the message.\n\nIn this PR we instead directly copy the field set, and deeply copy map, list,\nand message fields.\n\ndeepCopy benchmark results:\n\n|                  | Before  | After   | Diff   |\n|------------------|---------|---------|--------|\n| AOT              | 238 us  | 151 us  | -36%   |\n| dart2js -O4      | 242 us  | 140 us  | -42%   |\n| dart2wasm -O2    | 230 us  | 123 us  | -46%   |\n| JIT              | 189 us  | 104 us  | -44%   |\n\nThis CL is tested internally in cl/794080754.\n\nFixes #60."
    },
    {
      "commit": "6e9c9f4637bc0db8a855c7b26e8f87a2279307cc",
      "tree": "5e1bac38172db21c7e536ab8b22f2a6ef70416f0",
      "parents": [
        "086dfab712e00db76251dd64f6ba988496dcae3d"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Tue Aug 12 09:16:27 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 12 09:16:27 2025 +0100"
      },
      "message": "Improve clone and deepCopy tests (#1039)\n\n"
    },
    {
      "commit": "086dfab712e00db76251dd64f6ba988496dcae3d",
      "tree": "649628deba61336f9a85f1a3518edc4f8924ffa2",
      "parents": [
        "277b45a59e1569a19f24deec7f29c2a119aa225c"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Tue Aug 12 09:10:26 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 12 09:10:26 2025 +0100"
      },
      "message": "Make proto3_json.dart aware of well known types (#1037)\n\nThis syncs cl/629836458.\n\nFrom the CL:\n\nThis removes the requirement for proto3_json.dart to invoke outside code\n(either via BuilderInfo or inheritance). This also improves tree shaking\nof the proto3json helpers, since the proto3json callbacks attached to\nBuilderInfo no longer retain those helpers."
    },
    {
      "commit": "277b45a59e1569a19f24deec7f29c2a119aa225c",
      "tree": "a88f0e3ed1980a693f814eca33279013fcaeb056",
      "parents": [
        "0b73b0d64c15e34d35f6e5f9036aac52e4a64033"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Tue Aug 12 09:01:41 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 12 09:01:41 2025 +0100"
      },
      "message": "Release protobuf 4.2.0 (#1038)\n\n"
    },
    {
      "commit": "0b73b0d64c15e34d35f6e5f9036aac52e4a64033",
      "tree": "17b8eb717a81f752e6355401de5fac13de493454",
      "parents": [
        "a664760a37a8b6dd75cc7cd19af9dc52c3f69c06"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@google.com",
        "time": "Wed Jul 30 13:17:27 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 30 13:17:27 2025 -0700"
      },
      "message": "workspace, formatting, and proto version updates (#1033)\n\n"
    },
    {
      "commit": "a664760a37a8b6dd75cc7cd19af9dc52c3f69c06",
      "tree": "285d222a80e399960a67924e586797133e8bb382",
      "parents": [
        "44ecd7424fa0a9e023ecac0d894f50926ed111cf"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@google.com",
        "time": "Wed Jul 30 12:49:49 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 30 12:49:49 2025 -0700"
      },
      "message": "various CI workflow updates (#1035)\n\n"
    },
    {
      "commit": "44ecd7424fa0a9e023ecac0d894f50926ed111cf",
      "tree": "58465a160171accbe695c54e8cd62c5aef34d273",
      "parents": [
        "f7f65d44a78bde0d1f2ae4040bdd79d6429adb3f"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Mon Jul 28 21:39:47 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 28 21:39:47 2025 +0200"
      },
      "message": "Sync JSON web decoders (#1028)\n\nThis syncs the web JSON decoder used internally.\n\nThe new decoder uses `js_interop` instead of the Dart standard library to\nimprove performance when compiled to JS.\n\n## Benchmarks\n\nmaster, JS:\n\n    protobuf_from_json_string(RunTimeRaw): 1423.134328358209 us.\n\nPR, JS:\n\n    protobuf_from_json_string(RunTimeRaw): 971 us. \n\nWasm and VM benchmarks don\u0027t change as they keep using the old implementation.\n\nThe new implementation is slower with Wasm as it does more JS interop, so we\nkeep using the old one."
    },
    {
      "commit": "f7f65d44a78bde0d1f2ae4040bdd79d6429adb3f",
      "tree": "80cc99f083ce43c974716f47e6d158a627ee2ebf",
      "parents": [
        "048fdc5489d9468719595fca2cc651fa26fa3dde"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Mon Jul 28 18:19:30 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 28 18:19:30 2025 +0200"
      },
      "message": "CI: Also run plugin tests on Chrome, with dart2js and dart2wasm (#1031)\n\n"
    },
    {
      "commit": "048fdc5489d9468719595fca2cc651fa26fa3dde",
      "tree": "2ae9bcf764d674cac67ff7c2c92b983c2b0e3c01",
      "parents": [
        "33b782f8d9e647b9ca93c7917e9ee64817811eb4"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Mon Jul 28 14:31:32 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 28 13:31:32 2025 +0100"
      },
      "message": "CI: Run all of the checks on every change (#1032)\n\n"
    },
    {
      "commit": "33b782f8d9e647b9ca93c7917e9ee64817811eb4",
      "tree": "8539b9bff040a47416a1ff5fcf9724f73aa335ae",
      "parents": [
        "4c842a7ef50a5b215e53b55c64fb644addbe9108"
      ],
      "author": {
        "name": "Moritz",
        "email": "moritz@suemmermann.de",
        "time": "Mon Jul 28 10:57:36 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 28 09:57:36 2025 +0100"
      },
      "message": "Remove monorepo (#1030)\n\nCommitter\u0027s note: mono_repo works fine for simple cases, but it\u0027s not\nsufficiently documented when you try to do things slightly differently.\n\nBecause of this, and also because other Dart ecosystem packages (like\nthose in dart-lang/core) also use GitHub workflows, we switch to\nworkflows."
    },
    {
      "commit": "4c842a7ef50a5b215e53b55c64fb644addbe9108",
      "tree": "088adf6c51ba4806298eef72e1ddf96ca96b34a4",
      "parents": [
        "7f7d776a1812594b0d2b56bac41439f50006e225"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Wed Jul 23 12:15:32 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 23 11:15:32 2025 +0100"
      },
      "message": "Make PbFieldType members public (#1027)\n\nTo be able to have JSON decoders as libraries that are conditionally imported\nbased on the compilation target, this makes `PbFieldType` members public."
    },
    {
      "commit": "7f7d776a1812594b0d2b56bac41439f50006e225",
      "tree": "792205e29e793f27665d91e3a71f24f11fa8d520",
      "parents": [
        "4916e6f7d34443869c27d997749d4362870fd7ce"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Wed Jul 23 12:05:37 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 23 11:05:37 2025 +0100"
      },
      "message": "Split protobuf package into libraries (#1026)\n\nThis is the first part of the PRs that sync internal JSON decoding chages.\n\nTo be able to conditionally import different JSON decoders, this splits the\nmonolithic protobuf package into libraries.\n\nThese parts are now internal libraries:\n\n- consts.dart\n- json_parsing_context.dart\n- permissive_compare.dart\n- type_registry.dart\n- utils.dart\n\nThese changes are not useful on their own, they\u0027re to prepare the library for\nthe rest of the PRs and to keep the PRs small and easier to review."
    },
    {
      "commit": "4916e6f7d34443869c27d997749d4362870fd7ce",
      "tree": "3570d2b3d6b7f2bac5cbe335c09bfec9b481215c",
      "parents": [
        "a9822d881d27a27b454621bc698997fce5abf370"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Mon Jul 21 21:11:52 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 21 21:11:52 2025 +0200"
      },
      "message": "CI: Test PRs and commits to all branches, instead of just master (#1029)\n\n"
    },
    {
      "commit": "a9822d881d27a27b454621bc698997fce5abf370",
      "tree": "69fcacd854d1d8cae9f41f8d925603894054d3f1",
      "parents": [
        "38f154920a19a9f956ec6577b265433466e003d2"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@google.com",
        "time": "Wed Jul 16 15:52:36 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 16 15:52:36 2025 -0700"
      },
      "message": "prep for publishing protobuf 4.1.1, protoc_plugin 22.5.0 (#1025)\n\n"
    },
    {
      "commit": "38f154920a19a9f956ec6577b265433466e003d2",
      "tree": "f8b6839184122bf29f435629fba10eb0c68f9032",
      "parents": [
        "04bd6ace9326616a41a6a6bef93355f73fa28faf"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@google.com",
        "time": "Tue Jul 15 11:11:12 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 15 11:11:12 2025 -0700"
      },
      "message": "update the generator to emit formatted files (#1020)\n\n"
    },
    {
      "commit": "04bd6ace9326616a41a6a6bef93355f73fa28faf",
      "tree": "b6fe923083f739d997e77a42af2a295e7a0b87b3",
      "parents": [
        "bce362dec347ae3cca085bd28db2aa2649f754e5"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Fri Jul 11 10:35:33 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 11 09:35:33 2025 +0100"
      },
      "message": "Update SDK version to 3.7, reformat with 3.7 formatter (#1024)\n\nInternally we\u0027re at SDK 3.7. Because it\u0027s difficult to make changes *without*\nformatting in g3, contributors create CLs with accidental formatting fixes.\n\nIn cl/781448639 we format the internal code, and this PR updates to the same\nSDK version with g3 and formats the code, making the internal and external\nversions of the code meet at the same SDK version and formatting settings.\n\nManual changes in this PR:\n\n- Update pubspec.yaml files:\n  - Bump minor versions\n  - Bump SDK versions\n\n- Update CHANGELOGs\n\n- Update dart_style used in protoc_plugin golden tests\n\n- Regenerate mono_repo setup with `mono_repo generate`\n\nRest of the changes are generated by `dart format`."
    },
    {
      "commit": "bce362dec347ae3cca085bd28db2aa2649f754e5",
      "tree": "c2725b3fe32999a7c8c6adcd9da4856fbf6ba942",
      "parents": [
        "269e00477ac79ca39312ac11e946b4ef8c6768ec"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@google.com",
        "time": "Tue Jun 24 13:11:11 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 24 13:11:11 2025 -0700"
      },
      "message": "prep to publish 22.4.0 (#1023)\n\n"
    },
    {
      "commit": "269e00477ac79ca39312ac11e946b4ef8c6768ec",
      "tree": "c4fd4dbba1109f2d9d7557fe7caa811a864e3201",
      "parents": [
        "48ba64958a8863ef74fa54e69929cca33ef9801a"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@google.com",
        "time": "Tue Jun 24 10:10:20 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 24 10:10:20 2025 -0700"
      },
      "message": "improve the readability of generated gRPC client files (#1021)\n\n"
    },
    {
      "commit": "48ba64958a8863ef74fa54e69929cca33ef9801a",
      "tree": "8775f3abc41b5870bc5bfebfb8ab7f51060693b6",
      "parents": [
        "0bfff0ca150959c92dac525474d73bde946f3391"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@google.com",
        "time": "Tue Jun 24 10:03:05 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 24 10:03:05 2025 -0700"
      },
      "message": "update the header for generated files (#1022)\n\n"
    },
    {
      "commit": "0bfff0ca150959c92dac525474d73bde946f3391",
      "tree": "b74bb0e19224774db076a36965abfa1564a38f2e",
      "parents": [
        "32d53dad4565fc6ccd69196b8fd213454f3e8ed5"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@google.com",
        "time": "Tue Jun 10 08:42:14 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 10 08:42:14 2025 -0700"
      },
      "message": "update to the latest analysis lints (#1017)\n\n"
    },
    {
      "commit": "32d53dad4565fc6ccd69196b8fd213454f3e8ed5",
      "tree": "f684901613dff226750fe1a7f575a884de0e4141",
      "parents": [
        "c69077d83ce5a66d21127019f45b81bcd1e777c4"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@google.com",
        "time": "Thu Jun 05 10:14:45 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 05 10:14:45 2025 -0700"
      },
      "message": "Refactor the test goldens so they have standard file name extensions (#1014)\n\n"
    },
    {
      "commit": "c69077d83ce5a66d21127019f45b81bcd1e777c4",
      "tree": "ca83426d9d68a29fe206304ed17584e1d474ad07",
      "parents": [
        "08e74104ca6d82bed0010b6d61b329e4cd356736"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@google.com",
        "time": "Fri May 30 12:17:19 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 30 12:17:19 2025 -0700"
      },
      "message": "revert the change to not generate empty enum files (#1016)\n\n"
    },
    {
      "commit": "08e74104ca6d82bed0010b6d61b329e4cd356736",
      "tree": "3fab84ca0d0daaf7881d1184e1415607ec85dc43",
      "parents": [
        "efdabd74677571f064d6a8dd09c8c039c0c3e1fd"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@google.com",
        "time": "Thu May 29 11:34:48 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 29 11:34:48 2025 -0700"
      },
      "message": "ignore unused_imports for json files (#1013)\n\n"
    },
    {
      "commit": "efdabd74677571f064d6a8dd09c8c039c0c3e1fd",
      "tree": "12f32fa948ee5c34e5cfe05ad3de936ecf6eb315",
      "parents": [
        "60dfaede6939067cd42907e7500587d6c83eed43"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@google.com",
        "time": "Thu May 29 09:08:25 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 29 09:08:25 2025 -0700"
      },
      "message": "update how we calculate import prefixes (#1012)\n\n"
    },
    {
      "commit": "60dfaede6939067cd42907e7500587d6c83eed43",
      "tree": "e8c664508ff32ed4284bddcba7a22abec70bd176",
      "parents": [
        "86dfa6ba6cec26875862ce0695766b9e301b5f8e"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@google.com",
        "time": "Wed May 28 10:09:20 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 28 10:09:20 2025 -0700"
      },
      "message": "rev package:protoc_plugin to 22.3.0 (#1011)\n\n"
    },
    {
      "commit": "86dfa6ba6cec26875862ce0695766b9e301b5f8e",
      "tree": "203bbf201e47d5b735fdc1bf3798f9e57b071a3a",
      "parents": [
        "d940c8de905439e292770ccf6c546477ae566462"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@google.com",
        "time": "Tue May 27 15:13:39 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 27 15:13:39 2025 -0700"
      },
      "message": "move generated test code from out/ to test/gen/ (#1009)\n\n"
    },
    {
      "commit": "d940c8de905439e292770ccf6c546477ae566462",
      "tree": "4169e84ab5c0600bfec68b87a94b49c0d726871b",
      "parents": [
        "ce055595d9bc0a2bd75a8bd500fb23a395e8133c"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@google.com",
        "time": "Fri May 23 11:43:58 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 23 11:43:58 2025 -0700"
      },
      "message": "Update the generated code to improve readability and to better follow common Dart patterns. (#1003)\n\n"
    },
    {
      "commit": "ce055595d9bc0a2bd75a8bd500fb23a395e8133c",
      "tree": "f8d040621a9170fa4de77da4e75f887a6db24e58",
      "parents": [
        "976ebb83969045ad285d56474ff12b33900d6371"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@google.com",
        "time": "Thu May 22 08:09:07 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 22 08:09:07 2025 -0700"
      },
      "message": "no longer generate empty enum or server files (#1006)\n\n"
    },
    {
      "commit": "976ebb83969045ad285d56474ff12b33900d6371",
      "tree": "5fdbdaad0f807afd0c8afe87c98af17d4cc1a5d7",
      "parents": [
        "c8954ea6712b5e988f01ef66836f097e641f61b6"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@google.com",
        "time": "Thu May 22 07:27:17 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 22 07:27:17 2025 -0700"
      },
      "message": "add a script to update the vendored protos (#1004)\n\n"
    },
    {
      "commit": "c8954ea6712b5e988f01ef66836f097e641f61b6",
      "tree": "534a99f5276f3954fa08bf2706b8b265ed8f83bd",
      "parents": [
        "deda2883eb3c8437a89bdae524b732fffef6150c"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@google.com",
        "time": "Mon May 19 20:28:30 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 19 20:28:30 2025 -0700"
      },
      "message": "Refactor the vendored protos (#1000)\n\n"
    },
    {
      "commit": "deda2883eb3c8437a89bdae524b732fffef6150c",
      "tree": "92df5b356f9b02bd8714b3cf1c2eaa422b494a7a",
      "parents": [
        "5ed46119c05f8580a7a395f5c2640c65d674c796"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@google.com",
        "time": "Mon May 19 10:37:25 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 19 10:37:25 2025 -0700"
      },
      "message": "address a merge issue with the protoc_plugin changelog (#1002)\n\n"
    },
    {
      "commit": "5ed46119c05f8580a7a395f5c2640c65d674c796",
      "tree": "4289c81a5dd849a55a4496105172c00fda1eb1fd",
      "parents": [
        "4960b92e249ab8554cef06f67d6a998a512afda3"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@google.com",
        "time": "Mon May 19 09:26:13 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 19 09:26:13 2025 -0700"
      },
      "message": "shorten the deprecation messages for clone() and copyWith() (#999)\n\n"
    },
    {
      "commit": "4960b92e249ab8554cef06f67d6a998a512afda3",
      "tree": "9a65d8550842fae67a26ed0e89b892d4d5e0736e",
      "parents": [
        "b7753f6fc29402679e05e9a510074002f0826d48"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Mon May 19 18:22:38 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 19 17:22:38 2025 +0100"
      },
      "message": "Switch to pub workspace (#1001)\n\n"
    },
    {
      "commit": "b7753f6fc29402679e05e9a510074002f0826d48",
      "tree": "22fef6ae29bb90db84a323c98ae631917bf4b701",
      "parents": [
        "b5d20ffaf12134acac31b85769bb6c7aea687d0e"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@google.com",
        "time": "Fri May 16 10:17:55 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 16 10:17:55 2025 -0700"
      },
      "message": "rev package:protobuf version (#994)\n\n"
    },
    {
      "commit": "b5d20ffaf12134acac31b85769bb6c7aea687d0e",
      "tree": "ad0adcff00c4885af8d64803ecdb43d73c3d0cdf",
      "parents": [
        "9bd149b40e3bd762d902f86a67889651bcb9486c"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Fri May 16 19:17:03 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 16 10:17:03 2025 -0700"
      },
      "message": "Update protobuf changelog with #981 (#995)\n\n"
    },
    {
      "commit": "9bd149b40e3bd762d902f86a67889651bcb9486c",
      "tree": "d1cb9cf4696b767e074c605d01c6b9d1b0e60387",
      "parents": [
        "065d881e8db836e3b6325d44ed800fe0502d5fc0"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@google.com",
        "time": "Thu May 15 12:25:10 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 15 12:25:10 2025 -0700"
      },
      "message": "read from and generate grpc service metadata (#991)\n\n"
    },
    {
      "commit": "065d881e8db836e3b6325d44ed800fe0502d5fc0",
      "tree": "c4af2c5970494228e78a599baac0fe6a12af8e0d",
      "parents": [
        "e2bd4169e602ab594838475f4d8797cb3240237e"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@google.com",
        "time": "Thu May 15 10:06:15 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 15 10:06:15 2025 -0700"
      },
      "message": "generate dartdocs for grpc services (#993)\n\ngenerate dartdocs for grpc services; fix https://github.com/google/protobuf.dart/issues/973"
    },
    {
      "commit": "e2bd4169e602ab594838475f4d8797cb3240237e",
      "tree": "0b082e086d7ef1cecefbb2fdd304f354326e21f8",
      "parents": [
        "a6c8e56996c63ce7b0f83c7743a393ecb41c77c6"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@gmail.com",
        "time": "Thu May 15 08:43:32 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 15 08:43:32 2025 -0700"
      },
      "message": "remove the api_benchmark/ package (#992)\n\n- remove the api_benchmark/ package\n\nThis PR removes `api_benchmark/`. I believe we get all our our perf\nvalidation from `benchmarks/`; cc @osa1 and @mraleph for whether that\u0027s\ntrue, and, any thoughts on removing or retaining `api_benchmark`."
    },
    {
      "commit": "a6c8e56996c63ce7b0f83c7743a393ecb41c77c6",
      "tree": "e74ca526e93580f7e96cfa2f3c4919a355dc3402",
      "parents": [
        "376c9ce480536ad84572e087e35f31ff931627bc"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Thu May 15 11:33:46 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 15 10:33:46 2025 +0100"
      },
      "message": "Improve enum decoding -- alternative (#981)\n\nWhen decoding an enum value, we call a callback in the enum field\u0027s `FieldInfo`. The callback then indexes a map mapping enum numbers to Dart values.\n\nWhen these conditions hold:\n\n- The known enum numbers are all positive. (so that we can use a list and index it with the number)\n\n- The known enum numbers are more than 70% of the large known enum number. (so that the list won\u0027t have a lot of `null` entries, wasting heap space)\n\nWe now generate a list instead of a map to map enum numbers to Dart values.\n\nSimilar to the map, the list is runtime allocated. No new code generated per message or enum type.\n\nAOT benchmarks:\n\n- Before: `protobuf_PackedEnumDecoding(RunTimeRaw): 47585.14 us.`\n- After: `protobuf_PackedEnumDecoding(RunTimeRaw): 38974.566666666666 us.`\n- Diff: -18%\n\nWasm benchmarks:\n\n- Before: `protobuf_PackedEnumDecoding(RunTimeRaw): 52225.0 us.`\n- After: `protobuf_PackedEnumDecoding(RunTimeRaw): 34283.33333333333 us.`\n- Diff: -34%\n\n**Alternatives considered:**\n\n- #980 uses a map always, but eliminates the `valueOf` closure.\n- #985 uses a list always, and does binary search in the list when the list is \"shallow\".\n- #987 is the same as #985, but instead of calling the `valueOf` closure it stores an extra field in `FieldInfo`s for whether to binary search or directly index.\n\nThese are all slower than the current PR."
    },
    {
      "commit": "376c9ce480536ad84572e087e35f31ff931627bc",
      "tree": "b43103f19a70e7606242b34f0e670118bd815195",
      "parents": [
        "d5906e74486cdce5c04c141f51d7e3792a57e3af"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@gmail.com",
        "time": "Tue May 13 14:31:52 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 13 14:31:52 2025 -0700"
      },
      "message": "Update README.md (#990)\n\n- fix a broken markdown badge link"
    },
    {
      "commit": "d5906e74486cdce5c04c141f51d7e3792a57e3af",
      "tree": "5f9581bf8a85519b69a6f9493384d9954b5cab0b",
      "parents": [
        "072f99de6c14181a81e564f2989dff9359644702"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@gmail.com",
        "time": "Tue May 13 13:02:18 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 13 13:02:18 2025 -0700"
      },
      "message": "rev to 22.1.0 in prep for publishing (#989)\n\n- bump to a new minor version (we\u0027d added some new API methods)\n- rev to a stable (non `-wip`) version in prep for publishing"
    },
    {
      "commit": "072f99de6c14181a81e564f2989dff9359644702",
      "tree": "b7a59550686290002ced04d9c70c869137a1e160",
      "parents": [
        "7d2e615086c973b0186802ca0b1db575d34d50ac"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@gmail.com",
        "time": "Tue May 13 12:50:03 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 13 12:50:03 2025 -0700"
      },
      "message": "use super params in generated grpc service classes (#988)\n\n- update the GRPC service generator to emit constructors that use super parameters"
    },
    {
      "commit": "7d2e615086c973b0186802ca0b1db575d34d50ac",
      "tree": "8696b42153a92579ccabc2efd45f391262860f59",
      "parents": [
        "e4fca1614bae58b563e3a552c64b7ee154bf1d87"
      ],
      "author": {
        "name": "Agam Agarwal",
        "email": "agammaster@gmail.com",
        "time": "Mon May 12 18:04:17 2025 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 12 13:34:17 2025 +0100"
      },
      "message": "Add fromDart() and toDart() methods to convert between $core.Duration and proto Duration (#986)\n\n"
    },
    {
      "commit": "e4fca1614bae58b563e3a552c64b7ee154bf1d87",
      "tree": "6891a9cd4caa48eb86a5fdb40c28cb9307e75380",
      "parents": [
        "006d3aa9cbf27a8f8925e2eb96bef7754792124a"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Mon May 12 10:34:20 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 12 09:34:20 2025 +0100"
      },
      "message": "Add sparse enum decoding benchmarks (#984)\n\nWith upcoming change we\u0027ll improve decoding performance of enums, but\nthere will be a difference between \"sparse\" and \"dense\" enum decoding\nperformance, even though they\u0027ll both be faster.\n\nTo be able to measure the difference add a \"sparse\" enum type and a\nbenchmark for decoding it.\n\n\"Sparse\" means the enum has large gaps between known enum values, or\nnegative enum values.\n\nWhen decoding this kind of enums, the mapping from the wire `varint` to\nthe Dart value for the enum needs to be done by binary search, map\nlookup, or similar.\n\nFor \"dense\" enums, we can have a list of enum values and index the list\ndirectly with the `varint` value, after a range check.\n\nThese changes will be done in the follow-up PR(s)."
    },
    {
      "commit": "006d3aa9cbf27a8f8925e2eb96bef7754792124a",
      "tree": "a2c3d870e587542c9425da649e89547595c9669d",
      "parents": [
        "4abee0185b7e2648c0744212919cb3d7ba328fff"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Fri May 09 13:29:42 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 09 12:29:42 2025 +0100"
      },
      "message": "Update protoc_plugin pre-generated protos (#982)\n\n"
    },
    {
      "commit": "4abee0185b7e2648c0744212919cb3d7ba328fff",
      "tree": "b0cb106f8d0cc6aede2b749a395609405f1e62e0",
      "parents": [
        "60e23f1edaf4feefc9b30a25a87e825b31f501ec"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Fri May 09 13:26:10 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 09 12:26:10 2025 +0100"
      },
      "message": "Sort input proto files before processing (#983)\n\nThis makes the plugin generate identical files when command line\nargument orders change.\n\nFixes #952."
    },
    {
      "commit": "60e23f1edaf4feefc9b30a25a87e825b31f501ec",
      "tree": "c08b2a05f962d5c3935b0af2adc2df0c1bb5c6cd",
      "parents": [
        "de6bcc2a2c80c3f652ed6bf47e717c6d36e0e658"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Wed May 07 16:59:06 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 07 15:59:06 2025 +0100"
      },
      "message": "Fix factory argument types for map fields (#976)\n\nFixes #975."
    },
    {
      "commit": "de6bcc2a2c80c3f652ed6bf47e717c6d36e0e658",
      "tree": "5a2fd5f3aa0b5a1008d93533329ae11121ecae2c",
      "parents": [
        "9daf5ca744e1ac773a07ee13e185b2ada6909b96"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Wed May 07 13:09:03 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 07 12:09:03 2025 +0100"
      },
      "message": "Fix packed enum decoding benchmark (#979)\n\nWhile investigating why decoding packed enums is so much slower in AOT compared\nto decoding packed int32 (both are varints on the wire) I noticed that the enum\ndecoding benchmark should actually be slower, because currently TFA is able to\nspecialize the enum int value to Dart enum value mapping to a direct call, in\nthis function:\n\n```dart\nProtobufEnum? _decodeEnum(\n    int tagNumber, ExtensionRegistry? registry, int rawValue) {\n  final f \u003d valueOfFunc(tagNumber);\n  if (f !\u003d null) {\n    return f(rawValue);  // \u003c------------------- HERE\n  }\n  ...\n}\n```\n\nWasm code for this function, before this PR:\n\n```wat\n(func $BuilderInfo._decodeEnum (;641;) (param $var0 (ref $BuilderInfo_214)) (param $var1 i64) (param $var2 i64) (result (ref null $Enum))\n  (local $var3 (ref null $FieldInfo_223))\n  local.get $var0\n  struct.get $BuilderInfo_214 $field4\n  i32.const 71\n  local.get $var1\n  struct.new $BoxedInt\n  call $_DefaultMap\u0026_HashFieldBase\u0026MapMixin\u0026_HashBase\u0026_OperatorEqualsAndHashCode\u0026_LinkedHashMapMixin.[]\n  ref.cast null $FieldInfo_223\n  local.tee $var3\n  ref.is_null\n  if (result (ref null $#Closure-0-1_815))\n    ref.null none\n  else\n    local.get $var3\n    struct.get $FieldInfo_223 $field9\n  end\n  ref.is_null\n  i32.eqz\n  if\n    local.get $var2\n    call $Enum.valueOf\n    return\n  end\n  ref.null none\n)\n```\n\nNote that this calls `$Enum.valueOf` even though this function is generic on the enum type.\n\nWith this PR we add another enum to the proto file and decode it in setup, so\nthat TFA is unable to specialize `_deocdeEnum` to one specific enum type.\n\nNew code:\n\n```wat\n(func $BuilderInfo._decodeEnum (;643;) (param $var0 (ref $BuilderInfo_214)) (param $var1 i64) (param $var2 i64) (result (ref null $ProtobufEnum))\n  (local $var3 (ref null $FieldInfo_229))\n  (local $var4 (ref null $#Closure-0-1))\n  (local $var5 (ref $#Closure-0-1))\n  local.get $var0\n  struct.get $BuilderInfo_214 $field4\n  i32.const 71\n  local.get $var1\n  struct.new $BoxedInt\n  call $_DefaultMap\u0026_HashFieldBase\u0026MapMixin\u0026_HashBase\u0026_OperatorEqualsAndHashCode\u0026_LinkedHashMapMixin.[]\n  ref.cast null $FieldInfo_229\n  local.tee $var3\n  ref.is_null\n  if (result (ref null $#Closure-0-1))\n    ref.null none\n  else\n    local.get $var3\n    struct.get $FieldInfo_229 $field9\n  end\n  local.tee $var4\n  ref.is_null\n  i32.eqz\n  if\n    local.get $var4\n    ref.as_non_null\n    local.tee $var5\n    struct.get $#Closure-0-1 $field2\n    i32.const 71\n    local.get $var2\n    struct.new $BoxedInt\n    local.get $var5\n    struct.get $#Closure-0-1 $field3\n    struct.get $#Vtable-0-1 $field1\n    call_ref $type39\n    ref.cast null $ProtobufEnum\n    return\n  end\n  ref.null none\n)\n```\n\nWasm benchmark results:\n\n```\n// Before\nprotobuf_PackedEnumDecoding(RunTimeRaw): 41120.0 us.\n\n// After\nprotobuf_PackedEnumDecoding(RunTimeRaw): 52750.0 us.\n```\n\nVM benchmark results:\n\n```\n// Before\nprotobuf_PackedEnumDecoding(RunTimeRaw): 45051.520000000004 us.\n\n// After\nprotobuf_PackedEnumDecoding(RunTimeRaw): 54661.125 us.\n```"
    },
    {
      "commit": "9daf5ca744e1ac773a07ee13e185b2ada6909b96",
      "tree": "55badecc88b49c236b3fd87ddebb00e662d578c3",
      "parents": [
        "1aaa332af75c61ff32739821f7ec52186ff18d4c"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Tue May 06 18:07:40 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 06 17:07:40 2025 +0100"
      },
      "message": "Improve packed field decoding (#959)\n\n- Inline `_readPacked` manually and `_withLimit` with a pragma to eliminate\n  closure allocation and calls in packed decoding loops.\n\n  - `_readPacked` is manually inlined as VM\u0027s inliner doesn\u0027t properly fold\n    constants after the inlinings, see\n    https://github.com/dart-lang/sdk/issues/60068.\n\n- Introduce `PbList._addUnchecked` to add to the list without checking the\n  value for validity and list for mutability.\n\n- When decoding a packed field, check the list mutability once, instead of for\n  every element.\n\n- When decoding a packed scalar field, don\u0027t check for value validity.\n\n  For scalar fields we need to make sure the field value is not null, which is\n  already guaranteed in the call sites as e.g. `input.readDouble` doesn\u0027t\n  return nullable.\n\n- Sprinkle a bunch of `prefer-inline`s to make sure VM will inline one liners.\n\nVM benchmarks before:\n\n```\nprotobuf_PackedInt32Decoding(RunTimeRaw): 25598.8125 us.\nprotobuf_PackedInt64Decoding(RunTimeRaw): 67932.43333333333 us.\nprotobuf_PackedUint32Decoding(RunTimeRaw): 24668.844444444443 us.\nprotobuf_PackedUint64Decoding(RunTimeRaw): 64615.066666666666 us.\nprotobuf_PackedSint32Decoding(RunTimeRaw): 26037.275 us.\nprotobuf_PackedSint64Decoding(RunTimeRaw): 100819.65 us.\nprotobuf_PackedBoolDecoding(RunTimeRaw): 34733.4 us.\nprotobuf_PackedEnumDecoding(RunTimeRaw): 48379.659999999996 us.\n```\n\nVM benchmarks after:\n\n```\nprotobuf_PackedInt32Decoding(RunTimeRaw): 19653.9 us.\nprotobuf_PackedInt64Decoding(RunTimeRaw): 48627.9 us.\nprotobuf_PackedUint32Decoding(RunTimeRaw): 19279.29090909091 us.\nprotobuf_PackedUint64Decoding(RunTimeRaw): 50681.8 us.\nprotobuf_PackedSint32Decoding(RunTimeRaw): 20271.854545454546 us.\nprotobuf_PackedSint64Decoding(RunTimeRaw): 83777.8 us.\nprotobuf_PackedBoolDecoding(RunTimeRaw): 24850.555555555555 us.\nprotobuf_PackedEnumDecoding(RunTimeRaw): 45205.659999999996 us.\n```\n\nWasm benchmarks before (`-O2`):\n\n```\nprotobuf_PackedInt32Decoding(RunTimeRaw): 64220.0 us.\nprotobuf_PackedInt64Decoding(RunTimeRaw): 81033.33333333334 us.\nprotobuf_PackedUint32Decoding(RunTimeRaw): 60800.0 us.\nprotobuf_PackedUint64Decoding(RunTimeRaw): 82700.0 us.\nprotobuf_PackedSint32Decoding(RunTimeRaw): 72433.33333333334 us.\nprotobuf_PackedSint64Decoding(RunTimeRaw): 142150.0 us.\nprotobuf_PackedBoolDecoding(RunTimeRaw): 27775.0 us.\nprotobuf_PackedEnumDecoding(RunTimeRaw): 43980.0 us.\n```\n\nWasm benchmarks after:\n\n```\nprotobuf_PackedInt32Decoding(RunTimeRaw): 56050.0 us.\nprotobuf_PackedInt64Decoding(RunTimeRaw): 74633.33333333334 us.\nprotobuf_PackedUint32Decoding(RunTimeRaw): 56525.0 us.\nprotobuf_PackedUint64Decoding(RunTimeRaw): 69400.0 us.\nprotobuf_PackedSint32Decoding(RunTimeRaw): 51925.0 us.\nprotobuf_PackedSint64Decoding(RunTimeRaw): 116250.0 us.\nprotobuf_PackedBoolDecoding(RunTimeRaw): 18427.272727272728 us.\nprotobuf_PackedEnumDecoding(RunTimeRaw): 41600.0 us.\n```"
    },
    {
      "commit": "1aaa332af75c61ff32739821f7ec52186ff18d4c",
      "tree": "757521dd480c1e912d37aea5abd3400cf6b12151",
      "parents": [
        "cf4f3a8d68f713b32eb03261ab3a72bb6910147b"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Apr 01 11:51:47 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 01 11:51:47 2025 -0700"
      },
      "message": "Bump actions/cache from 4.2.2 to 4.2.3 (#972)\n\nBumps [actions/cache](https://github.com/actions/cache) from 4.2.2 to\n4.2.3.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca\nhref\u003d\"https://github.com/actions/cache/releases\"\u003eactions/cache\u0027s\nreleases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev4.2.3\u003c/h2\u003e\n\u003ch2\u003eWhat\u0027s Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate to use \u003ccode\u003e@​actions/cache\u003c/code\u003e 4.0.3 package \u0026amp;\nprepare for new release by \u003ca\nhref\u003d\"https://github.com/salmanmkc\"\u003e\u003ccode\u003e@​salmanmkc\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/pull/1577\"\u003eactions/cache#1577\u003c/a\u003e\n(SAS tokens for cache entries are now masked in debug logs)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/salmanmkc\"\u003e\u003ccode\u003e@​salmanmkc\u003c/code\u003e\u003c/a\u003e\nmade their first contribution in \u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/pull/1577\"\u003eactions/cache#1577\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca\nhref\u003d\"https://github.com/actions/cache/compare/v4.2.2...v4.2.3\"\u003ehttps://github.com/actions/cache/compare/v4.2.2...v4.2.3\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca\nhref\u003d\"https://github.com/actions/cache/blob/main/RELEASES.md\"\u003eactions/cache\u0027s\nchangelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eReleases\u003c/h1\u003e\n\u003ch3\u003e4.2.3\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eBump \u003ccode\u003e@actions/cache\u003c/code\u003e to v4.0.3 (obfuscates SAS token in\ndebug logs for cache entries)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e4.2.2\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eBump \u003ccode\u003e@actions/cache\u003c/code\u003e to v4.0.2\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e4.2.1\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eBump \u003ccode\u003e@actions/cache\u003c/code\u003e to v4.0.1\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e4.2.0\u003c/h3\u003e\n\u003cp\u003eTLDR; The cache backend service has been rewritten from the ground up\nfor improved performance and reliability. \u003ca\nhref\u003d\"https://github.com/actions/cache\"\u003eactions/cache\u003c/a\u003e now integrates\nwith the new cache service (v2) APIs.\u003c/p\u003e\n\u003cp\u003eThe new service will gradually roll out as of \u003cstrong\u003eFebruary 1st,\n2025\u003c/strong\u003e. The legacy service will also be sunset on the same date.\nChanges in these release are \u003cstrong\u003efully backward\ncompatible\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWe are deprecating some versions of this action\u003c/strong\u003e. We\nrecommend upgrading to version \u003ccode\u003ev4\u003c/code\u003e or \u003ccode\u003ev3\u003c/code\u003e as\nsoon as possible before \u003cstrong\u003eFebruary 1st, 2025.\u003c/strong\u003e (Upgrade\ninstructions below).\u003c/p\u003e\n\u003cp\u003eIf you are using pinned SHAs, please use the SHAs of versions\n\u003ccode\u003ev4.2.0\u003c/code\u003e or \u003ccode\u003ev3.4.0\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIf you do not upgrade, all workflow runs using any of the deprecated\n\u003ca href\u003d\"https://github.com/actions/cache\"\u003eactions/cache\u003c/a\u003e will\nfail.\u003c/p\u003e\n\u003cp\u003eUpgrading to the recommended versions will not break your\nworkflows.\u003c/p\u003e\n\u003ch3\u003e4.1.2\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd GitHub Enterprise Cloud instances hostname filters to inform API\nendpoint choices - \u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/pull/1474\"\u003e#1474\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSecurity fix: Bump braces from 3.0.2 to 3.0.3 - \u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/pull/1475\"\u003e#1475\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e4.1.1\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRestore original behavior of \u003ccode\u003ecache-hit\u003c/code\u003e output - \u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/pull/1467\"\u003e#1467\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e4.1.0\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eEnsure \u003ccode\u003ecache-hit\u003c/code\u003e output is set when a cache is missed -\n\u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/pull/1404\"\u003e#1404\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDeprecate \u003ccode\u003esave-always\u003c/code\u003e input - \u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/pull/1452\"\u003e#1452\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e4.0.2\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFixed restore \u003ccode\u003efail-on-cache-miss\u003c/code\u003e not working.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e4.0.1\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUpdated \u003ccode\u003eisGhes\u003c/code\u003e check\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/cache/commit/5a3ec84eff668545956fd18022155c47e93e2684\"\u003e\u003ccode\u003e5a3ec84\u003c/code\u003e\u003c/a\u003e\nMerge pull request \u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/issues/1577\"\u003e#1577\u003c/a\u003e\nfrom salmanmkc/salmanmkc/4-test\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/cache/commit/7de21022a7b6824c106a9847befcbd8154b45b6a\"\u003e\u003ccode\u003e7de2102\u003c/code\u003e\u003c/a\u003e\nUpdate releases.md\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/cache/commit/76d40dd347779762a1c829bbeeda5da4d81ca8c1\"\u003e\u003ccode\u003e76d40dd\u003c/code\u003e\u003c/a\u003e\nUpdate to use the latest version of the cache package to obfuscate the\nSAS\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/cache/commit/76dd5eb692f606c28d4b7a4ea7cfdffc926ba06a\"\u003e\u003ccode\u003e76dd5eb\u003c/code\u003e\u003c/a\u003e\nupdate cache with main\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/cache/commit/8c80c27c5e4498d5675b05fb1eff96a56c593b06\"\u003e\u003ccode\u003e8c80c27\u003c/code\u003e\u003c/a\u003e\nnew package\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/cache/commit/45cfd0e7fffd1869ea4d5bfb54a464d825c1f742\"\u003e\u003ccode\u003e45cfd0e\u003c/code\u003e\u003c/a\u003e\nupdates\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/cache/commit/edd449b9cf39c2a20dc7c3d505ff6dc193c48a02\"\u003e\u003ccode\u003eedd449b\u003c/code\u003e\u003c/a\u003e\nupdated cache with latest changes\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/cache/commit/0576707e373f92196b81695442ed3f80c347f9c7\"\u003e\u003ccode\u003e0576707\u003c/code\u003e\u003c/a\u003e\nlatest test before pr\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/cache/commit/3105dc9754dd9cd935ffcf45c091ed2cadbf42b9\"\u003e\u003ccode\u003e3105dc9\u003c/code\u003e\u003c/a\u003e\nupdate\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/cache/commit/9450d42d15022999ad2fa60a8b91f01fc92a0563\"\u003e\u003ccode\u003e9450d42\u003c/code\u003e\u003c/a\u003e\nmask\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca\nhref\u003d\"https://github.com/actions/cache/compare/d4323d4df104b026a6aa633fdb11d772146be0bf...5a3ec84eff668545956fd18022155c47e93e2684\"\u003ecompare\nview\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility\nscore](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name\u003dactions/cache\u0026package-manager\u003dgithub_actions\u0026previous-version\u003d4.2.2\u0026new-version\u003d4.2.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don\u0027t\nalter it yourself. You can also trigger a rebase manually by commenting\n`@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits\nthat have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after\nyour CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge\nand block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating\nit. You can achieve the same result by closing it manually\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all\nof the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop\nDependabot creating any more for this major version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop\nDependabot creating any more for this minor version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop\nDependabot creating any more for this dependency (unless you reopen the\nPR or upgrade to it yourself)\n\n\n\u003c/details\u003e\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "cf4f3a8d68f713b32eb03261ab3a72bb6910147b",
      "tree": "6052f530988e3374d7a9a5bc57ffe14c50d02b92",
      "parents": [
        "3bffe4bcb519b777c55178f109ff5797bd268eab"
      ],
      "author": {
        "name": "Slava Egorov",
        "email": "vegorov@google.com",
        "time": "Fri Mar 28 15:00:06 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 28 15:00:06 2025 +0100"
      },
      "message": "Patch release for protoc_plugin: bump constraint to use protobuf 4.0.0 (#971)\n\n"
    },
    {
      "commit": "3bffe4bcb519b777c55178f109ff5797bd268eab",
      "tree": "16405002a62a9f4165aaab8c280764b5af5a950a",
      "parents": [
        "0bab78d9538e49d50023bab36159b15ff3c369eb"
      ],
      "author": {
        "name": "Slava Egorov",
        "email": "vegorov@google.com",
        "time": "Fri Mar 28 10:30:07 2025 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 28 10:30:07 2025 +0100"
      },
      "message": "Prepare to publish protobuf 4.0.0 and protoc_plugin 22.0.0 (#969)\n\n"
    },
    {
      "commit": "0bab78d9538e49d50023bab36159b15ff3c369eb",
      "tree": "08b39fa09fb0f49c5ba80d4ec79c87b6fc4a5fec",
      "parents": [
        "7838e4485a4bbcfd5c9f0be1d0c95d38bf720c1b"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@gmail.com",
        "time": "Fri Mar 14 08:21:56 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 14 08:21:56 2025 -0700"
      },
      "message": "rename -dev pubspec versions to -wip (#968)\n\n- rename `-dev` pubspec versions to `-wip`\n\nThis will make the publish workflow slightly happier; it knows to\nspecial case `-wip` as meaning \u0027not intended for publication\u0027."
    },
    {
      "commit": "7838e4485a4bbcfd5c9f0be1d0c95d38bf720c1b",
      "tree": "d5f36d4e68dccdc1f93fdc710475797a83998c16",
      "parents": [
        "125fe9c39171eca8b7530397071641b2af8ee764"
      ],
      "author": {
        "name": "Ömer Sinan Ağacan",
        "email": "omersa@google.com",
        "time": "Fri Mar 07 08:37:51 2025 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 07 08:37:51 2025 +0000"
      },
      "message": "Prefix grpc method \u0027call\u0027 and \u0027request\u0027 arguments with \u0027$\u0027 to avoid shadowing user methods with the same name (#964)\n\nFixes #159\nFixes #963\n\nTested:\n\n- Protos in `googleapis`, `helloworld`, and `metadata` examples in [`grpc`][1]\n  are re-generated using this patch and the projects are analyzed with `dart\n  analyze` using the protobuf library in this patch.\n\n- Global presubmits in cl/731182528.\n\n[1]: https://github.com/grpc/grpc-dart/tree/master/example"
    },
    {
      "commit": "125fe9c39171eca8b7530397071641b2af8ee764",
      "tree": "a449a487079f2112b9b0a7843708ad7a8c232cab",
      "parents": [
        "fb77c7c71612dd5667af3e245d6ddbbd26f03c07"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Mar 02 12:18:09 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Mar 02 12:18:09 2025 -0800"
      },
      "message": "Bump dart-lang/setup-dart from 1.7.0 to 1.7.1 (#965)\n\nBumps [dart-lang/setup-dart](https://github.com/dart-lang/setup-dart)\nfrom 1.7.0 to 1.7.1.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca\nhref\u003d\"https://github.com/dart-lang/setup-dart/releases\"\u003edart-lang/setup-dart\u0027s\nreleases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.7.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eRoll \u003ccode\u003eundici\u003c/code\u003e dependency to address \u003ca\nhref\u003d\"https://github.com/nodejs/undici/security/advisories/GHSA-c76h-2ccp-4975\"\u003eCVE-2025-22150\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eUpdate to the latest npm dependencies.\u003c/li\u003e\n\u003cli\u003eRecompile the action using the new Dart / JavaScript interop.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca\nhref\u003d\"https://github.com/dart-lang/setup-dart/blob/main/CHANGELOG.md\"\u003edart-lang/setup-dart\u0027s\nchangelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.7.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eRoll \u003ccode\u003eundici\u003c/code\u003e dependency to address \u003ca\nhref\u003d\"https://github.com/nodejs/undici/security/advisories/GHSA-c76h-2ccp-4975\"\u003eCVE-2025-22150\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eUpdate to the latest npm dependencies.\u003c/li\u003e\n\u003cli\u003eRecompile the action using the new Dart / JavaScript interop.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.7.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eInstall flutter sdk in publishing step, allowing Flutter packages to\nbe\npublished (\u003ca\nhref\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/68\"\u003e#68\u003c/a\u003e[])\u003c/p\u003e\n\u003cp\u003e\u003ca\nhref\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/68\"\u003e#68\u003c/a\u003e:\n\u003ca\nhref\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/68\"\u003edart-lang/setup-dart#68\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.6.5\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFix zip path handling on Windows 11 (\u003ca\nhref\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/118\"\u003e#118\u003c/a\u003e[])\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca\nhref\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/118\"\u003e#118\u003c/a\u003e:\n\u003ca\nhref\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/118\"\u003edart-lang/setup-dart#118\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev1.6.4\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eRebuild JS code.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.6.3\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eRoll \u003ccode\u003eundici\u003c/code\u003e dependency to address \u003ca\nhref\u003d\"https://github.com/nodejs/undici/security/advisories/GHSA-m4v8-wqvr-p9f7\"\u003eCVE-2024-30260\u003c/a\u003e\nand \u003ca\nhref\u003d\"https://github.com/nodejs/undici/security/advisories/GHSA-9qxr-qj54-h672\"\u003eCVE-2024-30261\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.6.2\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eSwitch to running the workflow on \u003ccode\u003enode20`` from\n\u003c/code\u003enode16`. See also\n\u003ca\nhref\u003d\"https://github.blog/changelog/2023-09-22-github-actions-transitioning-from-node-16-to-node-20/\"\u003eTransitioning\nfrom Node 16 to Node 20\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.6.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpdated the google storage url for \u003ccode\u003emain\u003c/code\u003e channel\nreleases.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.6.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eEnable provisioning of the latest Dart SDK patch release by\nspecifying just\nthe major and minor version (e.g. \u003ccode\u003e3.2\u003c/code\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.5.1\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/dart-lang/setup-dart/commit/e51d8e571e22473a2ddebf0ef8a2123f0ab2c02c\"\u003e\u003ccode\u003ee51d8e5\u003c/code\u003e\u003c/a\u003e\nprep for releasing 1.7.1 (\u003ca\nhref\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/150\"\u003e#150\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/dart-lang/setup-dart/commit/1faf8e64e5464d6b727016aa2467794f7dc410fb\"\u003e\u003ccode\u003e1faf8e6\u003c/code\u003e\u003c/a\u003e\nupdates to move away from dart:js_util (\u003ca\nhref\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/148\"\u003e#148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/dart-lang/setup-dart/commit/614cb8d798824d682e7086a5d8b14e588723bc5c\"\u003e\u003ccode\u003e614cb8d\u003c/code\u003e\u003c/a\u003e\nBump flutter-actions/setup-flutter in the github-actions group (\u003ca\nhref\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/146\"\u003e#146\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/dart-lang/setup-dart/commit/55f49ad7b2b8b71f3043f80dc4cd4e0eca4aa90b\"\u003e\u003ccode\u003e55f49ad\u003c/code\u003e\u003c/a\u003e\nBump undici from 5.28.4 to 5.28.5 (\u003ca\nhref\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/149\"\u003e#149\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/dart-lang/setup-dart/commit/2c0db8f5ec902ee2420de88e6ece2f275d1f26f1\"\u003e\u003ccode\u003e2c0db8f\u003c/code\u003e\u003c/a\u003e\nBump \u003ccode\u003e@​actions/tool-cache\u003c/code\u003e from 2.0.1 to 2.0.2 (\u003ca\nhref\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/147\"\u003e#147\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/dart-lang/setup-dart/commit/6123db65aca0aa1e30809215875310f1ca706148\"\u003e\u003ccode\u003e6123db6\u003c/code\u003e\u003c/a\u003e\nBump dart-lang/setup-dart in the github-actions group (\u003ca\nhref\u003d\"https://redirect.github.com/dart-lang/setup-dart/issues/145\"\u003e#145\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca\nhref\u003d\"https://github.com/dart-lang/setup-dart/compare/e630b99d28a3b71860378cafdc2a067c71107f94...e51d8e571e22473a2ddebf0ef8a2123f0ab2c02c\"\u003ecompare\nview\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility\nscore](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name\u003ddart-lang/setup-dart\u0026package-manager\u003dgithub_actions\u0026previous-version\u003d1.7.0\u0026new-version\u003d1.7.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don\u0027t\nalter it yourself. You can also trigger a rebase manually by commenting\n`@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits\nthat have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after\nyour CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge\nand block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating\nit. You can achieve the same result by closing it manually\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all\nof the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop\nDependabot creating any more for this major version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop\nDependabot creating any more for this minor version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop\nDependabot creating any more for this dependency (unless you reopen the\nPR or upgrade to it yourself)\n\n\n\u003c/details\u003e\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "fb77c7c71612dd5667af3e245d6ddbbd26f03c07",
      "tree": "009cf4ece3cbdf21fa23a98966921c7d0f29e74d",
      "parents": [
        "610943a3bed70c1c2079af5fca02462df10d223f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Mar 02 12:17:48 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Mar 02 12:17:48 2025 -0800"
      },
      "message": "Bump actions/cache from 4.2.0 to 4.2.2 (#966)\n\nBumps [actions/cache](https://github.com/actions/cache) from 4.2.0 to\n4.2.2.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca\nhref\u003d\"https://github.com/actions/cache/releases\"\u003eactions/cache\u0027s\nreleases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev4.2.2\u003c/h2\u003e\n\u003ch2\u003eWhat\u0027s Changed\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[!IMPORTANT]\nAs a reminder, there were important backend changes to release v4.2.0,\nsee \u003ca href\u003d\"https://github.com/actions/cache/releases/tag/v4.2.0\"\u003ethose\nrelease notes\u003c/a\u003e and \u003ca\nhref\u003d\"https://github.com/actions/cache/discussions/1510\"\u003ethe\nannouncement\u003c/a\u003e for more details.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cul\u003e\n\u003cli\u003eBump \u003ccode\u003e@​actions/cache\u003c/code\u003e to v4.0.2 by \u003ca\nhref\u003d\"https://github.com/robherley\"\u003e\u003ccode\u003e@​robherley\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/pull/1560\"\u003eactions/cache#1560\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca\nhref\u003d\"https://github.com/actions/cache/compare/v4.2.1...v4.2.2\"\u003ehttps://github.com/actions/cache/compare/v4.2.1...v4.2.2\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev4.2.1\u003c/h2\u003e\n\u003ch2\u003eWhat\u0027s Changed\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[!IMPORTANT]\nAs a reminder, there were important backend changes to release v4.2.0,\nsee \u003ca href\u003d\"https://github.com/actions/cache/releases/tag/v4.2.0\"\u003ethose\nrelease notes\u003c/a\u003e and \u003ca\nhref\u003d\"https://github.com/actions/cache/discussions/1510\"\u003ethe\nannouncement\u003c/a\u003e for more details.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cul\u003e\n\u003cli\u003edocs: GitHub is spelled incorrectly in caching-strategies.md by \u003ca\nhref\u003d\"https://github.com/janco-absa\"\u003e\u003ccode\u003e@​janco-absa\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/pull/1526\"\u003eactions/cache#1526\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edocs: Make the \u0026quot;always save prime numbers\u0026quot; example more\nclear by \u003ca href\u003d\"https://github.com/Tobbe\"\u003e\u003ccode\u003e@​Tobbe\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/pull/1525\"\u003eactions/cache#1525\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate force deletion docs due a recent deprecation by \u003ca\nhref\u003d\"https://github.com/sebbalex\"\u003e\u003ccode\u003e@​sebbalex\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/pull/1500\"\u003eactions/cache#1500\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump \u003ccode\u003e@​actions/cache\u003c/code\u003e to v4.0.1 by \u003ca\nhref\u003d\"https://github.com/robherley\"\u003e\u003ccode\u003e@​robherley\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/pull/1554\"\u003eactions/cache#1554\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/janco-absa\"\u003e\u003ccode\u003e@​janco-absa\u003c/code\u003e\u003c/a\u003e made\ntheir first contribution in \u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/pull/1526\"\u003eactions/cache#1526\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/Tobbe\"\u003e\u003ccode\u003e@​Tobbe\u003c/code\u003e\u003c/a\u003e made\ntheir first contribution in \u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/pull/1525\"\u003eactions/cache#1525\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/sebbalex\"\u003e\u003ccode\u003e@​sebbalex\u003c/code\u003e\u003c/a\u003e\nmade their first contribution in \u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/pull/1500\"\u003eactions/cache#1500\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca\nhref\u003d\"https://github.com/actions/cache/compare/v4.2.0...v4.2.1\"\u003ehttps://github.com/actions/cache/compare/v4.2.0...v4.2.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca\nhref\u003d\"https://github.com/actions/cache/blob/main/RELEASES.md\"\u003eactions/cache\u0027s\nchangelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eReleases\u003c/h1\u003e\n\u003ch3\u003e4.2.2\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eBump \u003ccode\u003e@actions/cache\u003c/code\u003e to v4.0.2\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e4.2.1\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eBump \u003ccode\u003e@actions/cache\u003c/code\u003e to v4.0.1\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e4.2.0\u003c/h3\u003e\n\u003cp\u003eTLDR; The cache backend service has been rewritten from the ground up\nfor improved performance and reliability. \u003ca\nhref\u003d\"https://github.com/actions/cache\"\u003eactions/cache\u003c/a\u003e now integrates\nwith the new cache service (v2) APIs.\u003c/p\u003e\n\u003cp\u003eThe new service will gradually roll out as of \u003cstrong\u003eFebruary 1st,\n2025\u003c/strong\u003e. The legacy service will also be sunset on the same date.\nChanges in these release are \u003cstrong\u003efully backward\ncompatible\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWe are deprecating some versions of this action\u003c/strong\u003e. We\nrecommend upgrading to version \u003ccode\u003ev4\u003c/code\u003e or \u003ccode\u003ev3\u003c/code\u003e as\nsoon as possible before \u003cstrong\u003eFebruary 1st, 2025.\u003c/strong\u003e (Upgrade\ninstructions below).\u003c/p\u003e\n\u003cp\u003eIf you are using pinned SHAs, please use the SHAs of versions\n\u003ccode\u003ev4.2.0\u003c/code\u003e or \u003ccode\u003ev3.4.0\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIf you do not upgrade, all workflow runs using any of the deprecated\n\u003ca href\u003d\"https://github.com/actions/cache\"\u003eactions/cache\u003c/a\u003e will\nfail.\u003c/p\u003e\n\u003cp\u003eUpgrading to the recommended versions will not break your\nworkflows.\u003c/p\u003e\n\u003ch3\u003e4.1.2\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd GitHub Enterprise Cloud instances hostname filters to inform API\nendpoint choices - \u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/pull/1474\"\u003e#1474\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSecurity fix: Bump braces from 3.0.2 to 3.0.3 - \u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/pull/1475\"\u003e#1475\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e4.1.1\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRestore original behavior of \u003ccode\u003ecache-hit\u003c/code\u003e output - \u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/pull/1467\"\u003e#1467\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e4.1.0\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eEnsure \u003ccode\u003ecache-hit\u003c/code\u003e output is set when a cache is missed -\n\u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/pull/1404\"\u003e#1404\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDeprecate \u003ccode\u003esave-always\u003c/code\u003e input - \u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/pull/1452\"\u003e#1452\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e4.0.2\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFixed restore \u003ccode\u003efail-on-cache-miss\u003c/code\u003e not working.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e4.0.1\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUpdated \u003ccode\u003eisGhes\u003c/code\u003e check\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e4.0.0\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUpdated minimum runner version support from node 12 -\u0026gt; node\n20\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/cache/commit/d4323d4df104b026a6aa633fdb11d772146be0bf\"\u003e\u003ccode\u003ed4323d4\u003c/code\u003e\u003c/a\u003e\nMerge pull request \u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/issues/1560\"\u003e#1560\u003c/a\u003e\nfrom actions/robherley/v4.2.2\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/cache/commit/da26677639ccfb4615f1acc52d1fc3dc89152490\"\u003e\u003ccode\u003eda26677\u003c/code\u003e\u003c/a\u003e\nbump \u003ccode\u003e@​actions/cache\u003c/code\u003e to v4.0.2, prep for v4.2.2\nrelease\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/cache/commit/7921ae235bdcb376cc8f22558dc5f8ddc3c3c2f9\"\u003e\u003ccode\u003e7921ae2\u003c/code\u003e\u003c/a\u003e\nMerge pull request \u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/issues/1557\"\u003e#1557\u003c/a\u003e\nfrom actions/robherley/ia-workflow-released\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/cache/commit/393773170624981bfaa3aac1cb736e3004eac1de\"\u003e\u003ccode\u003e3937731\u003c/code\u003e\u003c/a\u003e\nUpdate publish-immutable-actions.yml\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/cache/commit/0c907a75c2c80ebcb7f088228285e798b750cf8f\"\u003e\u003ccode\u003e0c907a7\u003c/code\u003e\u003c/a\u003e\nMerge pull request \u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/issues/1554\"\u003e#1554\u003c/a\u003e\nfrom actions/robherley/v4.2.1\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/cache/commit/710893c2369beb60748049b671f18c43a3656fce\"\u003e\u003ccode\u003e710893c\u003c/code\u003e\u003c/a\u003e\nbump \u003ccode\u003e@​actions/cache\u003c/code\u003e to v4.0.1\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/cache/commit/9fa7e61ec7e1f44ac75218e7aaea81da8856fd11\"\u003e\u003ccode\u003e9fa7e61\u003c/code\u003e\u003c/a\u003e\nUpdate force deletion docs due a recent deprecation (\u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/issues/1500\"\u003e#1500\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/cache/commit/36f1e144e1c8edb0a652766b484448563d8baf46\"\u003e\u003ccode\u003e36f1e14\u003c/code\u003e\u003c/a\u003e\ndocs: Make the \u0026quot;always save prime numbers\u0026quot; example more clear\n(\u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/issues/1525\"\u003e#1525\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/cache/commit/53aa38c736a561b9c17b62df3fe885a17b78ee6d\"\u003e\u003ccode\u003e53aa38c\u003c/code\u003e\u003c/a\u003e\nCorrect GitHub Spelling in caching-strategies.md (\u003ca\nhref\u003d\"https://redirect.github.com/actions/cache/issues/1526\"\u003e#1526\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca\nhref\u003d\"https://github.com/actions/cache/compare/1bd1e32a3bdc45362d1e726936510720a7c30a57...d4323d4df104b026a6aa633fdb11d772146be0bf\"\u003ecompare\nview\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility\nscore](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name\u003dactions/cache\u0026package-manager\u003dgithub_actions\u0026previous-version\u003d4.2.0\u0026new-version\u003d4.2.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don\u0027t\nalter it yourself. You can also trigger a rebase manually by commenting\n`@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits\nthat have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after\nyour CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge\nand block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating\nit. You can achieve the same result by closing it manually\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all\nof the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop\nDependabot creating any more for this major version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop\nDependabot creating any more for this minor version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop\nDependabot creating any more for this dependency (unless you reopen the\nPR or upgrade to it yourself)\n\n\n\u003c/details\u003e\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "610943a3bed70c1c2079af5fca02462df10d223f",
      "tree": "331ef11d603acedb950ba52869e8cca7b751ef5d",
      "parents": [
        "35a1bd6f6d8a410673e324055b5af9e3722d2376"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@gmail.com",
        "time": "Wed Feb 12 08:04:25 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 12 08:04:25 2025 -0800"
      },
      "message": "update the publish workflow; add a post_summaries one (#961)\n\n- update the publish workflow to write its comment to a workflow file\r\n- add a post_summaries workflow - pull from the file and comment on the\r\ncurrent PR\r\n\r\nThis config will allow PRs from forks to still get feedback in the PR\r\nfrom the publish workflow."
    },
    {
      "commit": "35a1bd6f6d8a410673e324055b5af9e3722d2376",
      "tree": "1e8cacdb7e37b938e8cec5ec94ae6a06f52877e6",
      "parents": [
        "d3f9ad1f2f298f6e22cbfc959bc910a122c1712c"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@gmail.com",
        "time": "Wed Feb 12 08:04:12 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 12 08:04:12 2025 -0800"
      },
      "message": "update the repo analysis config (#962)\n\nupdate the repo analysis config:\r\n- analyze `api_benchmark/` (w/o --fatal-infos)\r\n- ignore deprecated members for files in api_benchmark/ (to ignore use\r\nof dart:html and related apis)"
    },
    {
      "commit": "d3f9ad1f2f298f6e22cbfc959bc910a122c1712c",
      "tree": "85520a5518536f860f7533c512e261ba364abfe5",
      "parents": [
        "950b6a778bc60634b546aad4563cb0deb5648d79"
      ],
      "author": {
        "name": "Devon Carew",
        "email": "devoncarew@gmail.com",
        "time": "Wed Feb 12 08:01:25 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 12 08:01:25 2025 -0800"
      },
      "message": "updates to the gitignore files (#960)\n\n- various updates to the gitignore files (this should address a pub\r\npublish warning - the git ignore were accidentally capturing one of the\r\ngenerated json files)\r\n"
    }
  ],
  "next": "950b6a778bc60634b546aad4563cb0deb5648d79"
}
