)]}'
{
  "log": [
    {
      "commit": "c3cdacf1beae8a309a904f27d65850f0b4c3e3d6",
      "tree": "e8f14b0a24cbf3710e61be36071f6e756435b13d",
      "parents": [
        "0b6822804eb4fdeefc6143fbe72478c7309be7b7"
      ],
      "author": {
        "name": "copilot-swe-agent[bot]",
        "email": "198982749+Copilot@users.noreply.github.com",
        "time": "Mon Feb 09 21:30:16 2026 +0000"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Fri Feb 20 00:15:44 2026 +0100"
      },
      "message": "cpp: add template_streamop generation with runtime/compiler test coverage\n\nAdd template_streamop support in the C++ generator so generated operator\u003c\u003c and printTo can target generic stream-like output types.\nKeep default behavior unchanged when the option is not set (std::ostream signatures remain).\nAdd compiler/runtime coverage for template generation, friend declaration correctness, enums, and collection printing.\n\ndefault:\n```cpp\nstd::ostream\u0026 operator\u003c\u003c(std::ostream\u0026 out, const SimpleStruct\u0026 obj);\n\nclass SimpleStruct {\npublic:\n  void printTo(std::ostream\u0026 out) const;\n};\n```\n\nwith `template_streamop`:\n```cpp\ntemplate \u003ctypename OStream_\u003e\nOStream_\u0026 operator\u003c\u003c(OStream_\u0026 out, const SimpleStruct\u0026 obj);\n\nclass SimpleStruct {\npublic:\n  template \u003ctypename OStream_\u003e\n  void printTo(OStream_\u0026 out) const;\n};\n```\n"
    },
    {
      "commit": "1e09a046e080765567b7125b01fd966c2596ee3f",
      "tree": "0caeb9c86a5416470a35a5a84ffc3d756d5bb38c",
      "parents": [
        "67bfb29af0837eefd32447c186d22aa45b2f1869"
      ],
      "author": {
        "name": "Copilot",
        "email": "198982749+Copilot@users.noreply.github.com",
        "time": "Thu Jan 29 10:36:28 2026 -0800"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Sun Feb 08 22:09:37 2026 +0100"
      },
      "message": "Add moveable_types\u003dforward_setter option for perfect forwarding setters\n\nAdds `forward_setter` value to `moveable_types` option, generating perfect forwarding setters for complex types while preserving traditional setters for primitives. Also fixes missing `operator\u003c` implementation that caused link errors when structs are used as map keys.\n\n**Forward Setter Generation** (`compiler/cpp/src/thrift/generate/t_cpp_generator.cc`):\n- Parse `moveable_types\u003dforward_setter` option\n- Complex types (strings, containers, structs) → template setters with `std::forward\u003cT_\u003e`\n- Primitive types → traditional const-ref setters\n- Template implementations in `.tcc` file (auto-included in header)\n- Legacy `moveable_types` behavior unchanged\n\n**Compiler Unit Tests** (`compiler/cpp/tests/cpp/`):\n- New `test_forward_setter.thrift` fixture\n- Dedicated `t_cpp_generator_forward_setter_tests.cc` (91 assertions, 9 test cases)\n- Verify `.tcc` generation and template implementations\n\n**Integration Tests** (`test/cpp/src/`):\n- `ForwardSetterTest.cpp` - validates lvalue/rvalue/temporary/literal setters with move semantics\n- `PrivateOptionalTest.cpp` - SFINAE + static_assert verify optional fields are private\n- `EnumClassTest.cpp` - type_traits + static_assert verify true enum class semantics\n\n**CMakeLists.txt** (`test/cpp/`):\n- Separate gen-cpp-{forward,private,enumclass} directories\n\n**Makefile.am** (`test/cpp/`):\n- Library targets for each option variant\n- Proper `BUILT_SOURCES` dependencies\n- Include path ordering: option-specific directory before standard `gen-cpp`\n\n```cpp\n// Generated with --gen cpp:moveable_types\u003dforward_setter\n\nstruct TestStruct {\n  int32_t primitive_field;\n  std::string complex_field;\n\n  void __set_primitive_field(const int32_t val);  // Traditional\n\n  template \u003ctypename T_\u003e\n  void __set_complex_field(T_\u0026\u0026 val);  // Perfect forwarding\n};\n\n// In .tcc file:\ntemplate \u003ctypename T_\u003e\nvoid TestStruct::__set_complex_field(T_\u0026\u0026 val) {\n  this-\u003ecomplex_field \u003d ::std::forward\u003cT_\u003e(val);\n  __isset.complex_field \u003d true;\n}\n```\n\n- [ ] Did you create an [Apache Jira](https://issues.apache.org/jira/projects/THRIFT/issues/) ticket?  ([Request account here](https://selfserve.apache.org/jira-account.html), not required for trivial changes)\n- [ ] If a ticket exists: Does your pull request title follow the pattern \"THRIFT-NNNN: describe my issue\"?\n- [x] Did you squash your changes to a single commit?  (not required, but preferred)\n- [x] Did you do your best to avoid breaking changes?  If one was needed, did you label the Jira ticket with \"Breaking-Change\"?\n\n---------\n\nCo-authored-by: copilot-swe-agent[bot] \u003c198982749+Copilot@users.noreply.github.com\u003e\nCo-authored-by: zsy056 \u003c1074382+zsy056@users.noreply.github.com\u003e\n"
    },
    {
      "commit": "ab178fbf24e88bba05ae2b8f1f9876d783e934f6",
      "tree": "cbf971b39aece232fc9bde5468873bdc109e87af",
      "parents": [
        "55e86e396e63969e3ee735b202b1c1de59c22c88"
      ],
      "author": {
        "name": "Copilot",
        "email": "198982749+Copilot@users.noreply.github.com",
        "time": "Tue Jan 27 09:46:59 2026 -0800"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Wed Jan 28 01:29:06 2026 +0100"
      },
      "message": "Support C++ 11 enum class generation via pure_enums\u003denum_class\n\nAdds C++ 11 `enum class` generation to the C++ code generator. When `pure_enums\u003denum_class` is specified, generates strongly-typed enums with proper scoping and type safety.\n\n## Code Generator Changes\n\n**Modified `t_cpp_generator.cc`:**\n- Added `gen_enum_class_` flag parsed from `pure_enums\u003denum_class` option\n- Modified `generate_enum()` to emit `enum class` when both `gen_pure_enums_` and `gen_enum_class_` are set\n- Fixed enum value scoping: use `static_cast\u003cint\u003e(Color::RED)` for array initialization\n- Fixed map operations: cast enum class to int in `find()` calls (no implicit conversion)\n\n**Test infrastructure:**\n- Created `t_cpp_generator_enum_class_tests.cc` with three test cases validating default, `pure_enums`, and `pure_enums\u003denum_class` behavior\n- Extracted common utilities to `t_cpp_generator_test_utils.h` (shared with `private_optional` tests)\n- Added expected output files: `expected_Color_{default,pure_enums,enum_class}.txt`\n\n**Build system:**\n- Added CMake compile-checks for generated code (both `private_optional` and `enum_class`)\n- Unified compile-check blocks with shared Boost detection\n- Ensures generated code compiles as part of standard test build\n\n## Usage\n\n```thrift\nenum Color {\n  RED \u003d 1,\n  GREEN \u003d 2,\n  BLUE \u003d 3\n}\n```\n\n```bash\nthrift --gen cpp:pure_enums\u003denum_class example.thrift\n```\n\nGenerates:\n```cpp\nenum class Color {\n  RED \u003d 1,\n  GREEN \u003d 2,\n  BLUE \u003d 3\n};\n```\n\nBackward compatible - existing behavior unchanged when option absent.\n\n---\n\n- [ ] Did you create an [Apache Jira](https://issues.apache.org/jira/projects/THRIFT/issues/) ticket?  ([Request account here](https://selfserve.apache.org/jira-account.html), not required for trivial changes)\n- [ ] If a ticket exists: Does your pull request title follow the pattern \"THRIFT-NNNN: describe my issue\"?\n- [x] Did you squash your changes to a single commit?  (not required, but preferred)\n- [x] Did you do your best to avoid breaking changes?  If one was needed, did you label the Jira ticket with \"Breaking-Change\"?\n- [ ] If your change does not involve any code, include `[skip ci]` anywhere in the commit message to free up build resources.\n\n---------\n\nCo-authored-by: copilot-swe-agent[bot] \u003c198982749+Copilot@users.noreply.github.com\u003e\nCo-authored-by: zsy056 \u003c1074382+zsy056@users.noreply.github.com\u003e"
    },
    {
      "commit": "c3ced62289cff9c0c9cd537d902f00fae894b22e",
      "tree": "62fa324a7517ef1c2fdaa2dfdb1362bac9020bdc",
      "parents": [
        "4413220324d7694f8db128cd989822ff728df030"
      ],
      "author": {
        "name": "copilot-swe-agent[bot]",
        "email": "198982749+Copilot@users.noreply.github.com",
        "time": "Tue Nov 18 18:09:06 2025 +0000"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Thu Jan 22 01:40:07 2026 +0100"
      },
      "message": " ## cpp: add `private_optional` support (and wire up tests/CI)\n\nAdd a new `cpp:private_optional` generator option for C++ that emits optional fields as private members and provides const getters, enabling stricter encapsulation while preserving access for generated helpers.\n\nTo keep the feature stable and exercised in automation, add fixture-based compiler tests and the minimal build/CI wiring required for those tests to build and run in the workflow (including MSVC).\n\n ### Example generated code (behavior change only, from `TestStruct`)\n\n #### Default (no `cpp:private_optional`): optional fields stay public\n```cpp\npublic:\n  int32_t required_field;\n  int32_t optional_field;\n  std::string optional_string;\n```\n\nWith cpp:private_optional: optional fields become private + const getters\n\n```cpp\npublic:\n  int32_t required_field;\n\n  const int32_t\u0026 __get_optional_field() const { return optional_field; }\n  const std::string\u0026 __get_optional_string() const { return optional_string; }\n\nprivate:\n  int32_t optional_field;\n  std::string optional_string;\n\n  friend void swap(TestStruct \u0026a, TestStruct \u0026b) noexcept;\n  friend std::ostream\u0026 operator\u003c\u003c(std::ostream\u0026 out, const TestStruct\u0026 obj);\n\n```\n"
    },
    {
      "commit": "5b53b554a3ac6faff70081d541680fbcec55fbb7",
      "tree": "5fbbb7a3494f6775c51034ddfda1661c9c90bef1",
      "parents": [
        "3364b4ac563872b40c91d7843f6d0971d84979ec"
      ],
      "author": {
        "name": "Hongxu Jia",
        "email": "hongxu.jia@windriver.com",
        "time": "Thu Nov 20 11:43:45 2025 +0800"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Mon Dec 01 22:13:30 2025 +0100"
      },
      "message": "support reproducible builds\n\nIn order to support reproducible builds [1], while using bison to generate\nsource code, add COMPILE_FLAGS --file-prefix-map [2] to remove build path\nprefix and source path prefix in the generated header file.\n\n[1] https://reproducible-builds.org/\n[2] https://cgit.git.savannah.gnu.org/cgit/bison.git/commit/?id\u003ddd878d18519689c7bbcd72de4c9f9e53085a3cbf\n\nSigned-off-by: Hongxu Jia \u003chongxu.jia@windriver.com\u003e\n"
    },
    {
      "commit": "5b096a00027582983f1ae141a4bbf4eed806c310",
      "tree": "fd6cb88d32d3f11e099074e1dafe78153a68bd7f",
      "parents": [
        "4f89bfdeeb900e2d64bf5c5f726b78d8591593cc"
      ],
      "author": {
        "name": "Maarten Pronk",
        "email": "git@evetion.nl",
        "time": "Sun Sep 11 17:36:39 2022 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Nov 20 22:44:28 2025 +0100"
      },
      "message": "Lowercased all MinGW headers.\nPatch: Maarten Pronk\n\nThis closes #2649\n"
    },
    {
      "commit": "b3fc4b224258e4bf154bf774746f0d2554edb90c",
      "tree": "14049300eb6fd8a4d56d63a9f91ddf993799afda",
      "parents": [
        "5e6d1b747a4de9ba0ff7b2b8746bce5fb2b0dfc5"
      ],
      "author": {
        "name": "Vyas Ramasubramani",
        "email": "vyas.ramasubramani@gmail.com",
        "time": "Sun Apr 20 13:57:06 2025 -0700"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Sun Apr 27 22:18:35 2025 +0200"
      },
      "message": "Update minimum required CMake version for CMake 4.0 compatibility\n"
    },
    {
      "commit": "4a280d56cca90296228ca29c7c582fa423d74e1f",
      "tree": "24d3efa12d96f2948ecbbf1b372c0faf7a369eb7",
      "parents": [
        "68139d117fdf4d287a78819a5bb4b0f9cab8160c"
      ],
      "author": {
        "name": "CJCombrink",
        "email": "carel.combrink@gmail.com",
        "time": "Thu Mar 14 19:57:41 2024 +0100"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Mon Apr 15 22:37:44 2024 +0200"
      },
      "message": "THRIFT-5766 Replace std::endl with \"\\n\"\nPatch: Carel Combrink\n\nThis closes #2943\n"
    },
    {
      "commit": "b17672ac38cbc9347e1331798f4e6bc91502fdd2",
      "tree": "e2a8c262c37f59ddb3d3c95c3db91bd0a7f0d8ac",
      "parents": [
        "d5927a96019154fa590c38f3a7ca70275af11b3c"
      ],
      "author": {
        "name": "Yawar Amin",
        "email": "yawar.amin@gmail.com",
        "time": "Sat Sep 10 11:55:02 2022 -0400"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Sun Sep 11 22:19:29 2022 +0200"
      },
      "message": "THRIFT-5208: fix OCaml struct and exn raising/handling codegen\nClient: ocaml\nPatch: Yawar Amin\n"
    },
    {
      "commit": "d5927a96019154fa590c38f3a7ca70275af11b3c",
      "tree": "4c0a412c9d0bd333e24f21cc6d13bedadc487268",
      "parents": [
        "944b8e68a099392d80153ebcf26f32ff7f1d893a"
      ],
      "author": {
        "name": "Simon Wang",
        "email": "jellalleonhardt4869@gmail.com",
        "time": "Mon Sep 13 19:50:45 2021 +0800"
      },
      "committer": {
        "name": "Yuxuan \u0027fishy\u0027 Wang",
        "email": "yuxuan.wang@reddit.com",
        "time": "Sun Sep 11 08:25:32 2022 -0700"
      },
      "message": "THRIFT-5423: IDL parameter validation for Go\n\nCloses https://github.com/apache/thrift/pull/2469.\n"
    },
    {
      "commit": "04057ac28a72ad4001def05a7bc8e13cc640b5ca",
      "tree": "44435ef2391b86828f97736cfdecc4e374782404",
      "parents": [
        "39fa1854a75e96235e2f50a45546b874da29e756"
      ],
      "author": {
        "name": "Max-Gerd Retzlaff",
        "email": "m.retzlaff@gmx.net",
        "time": "Tue Aug 23 17:38:34 2022 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Tue Aug 30 23:58:57 2022 +0200"
      },
      "message": "Revert \"THRIFT-5501 Remove Common Lisp support\"\n\nThis reverts commit d88d4f93b3390989bd47a43f3941ca7d576750f6.\n"
    },
    {
      "commit": "d88d4f93b3390989bd47a43f3941ca7d576750f6",
      "tree": "15192fecdaefc7c811fda1783368ffe1ce036d3e",
      "parents": [
        "66ac7b46fab85f175aec601cb48ea05408a1c186"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Sat Mar 05 18:15:38 2022 +0100"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Sun Mar 06 14:58:37 2022 +0100"
      },
      "message": "THRIFT-5501 Remove Common Lisp support\nClient: cl\nPatch: Jens Geyer\n"
    },
    {
      "commit": "66d897667c451ef6560d89b979b7001c57a3eda6",
      "tree": "4420429109c582375fc68aa125a2b6f6b8019dd3",
      "parents": [
        "cd2fae091b9bafd0977ef290f722532c36a64d2e"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Sat Mar 20 18:07:17 2021 +0100"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Mon Mar 22 09:42:38 2021 +0100"
      },
      "message": "THRIFT-5347 Remove deprecated Haskell bindings\nClient: hs\nPatch: Jens Geyer\n\nThis closes #2352\n"
    },
    {
      "commit": "cb094b80f2b5a6752063124a50c05f070e95c7a7",
      "tree": "1497c3192cf7ab81cb71495192125053aa4568db",
      "parents": [
        "b51a62b9686bad1db949735025ca6823c3c8462b"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Sat Feb 13 15:05:40 2021 +0100"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Sun Feb 14 11:18:01 2021 +0100"
      },
      "message": "THRIFT-5229 remove AS3 support\nClient: AS3\nPatch: Jens Geyer\n\nThis closes #2329\n"
    },
    {
      "commit": "b5fe1dbc0cac81ab99ec5d71de70f4389b234888",
      "tree": "cc76956269678159418ed2106abd530736a1ad5a",
      "parents": [
        "876aee506b937d64b1fb035ff65e5e52def04c04"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Feb 11 22:49:49 2021 +0100"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Thu Feb 11 22:49:49 2021 +0100"
      },
      "message": "Reverted wrongly pushed commits.\n- This reverts commit 876aee506b937d64b1fb035ff65e5e52def04c04.\n- This reverts commit b89316d54bb0253493b48446cb510755fb3196d2.\n"
    },
    {
      "commit": "b89316d54bb0253493b48446cb510755fb3196d2",
      "tree": "1f52ff971d44c2c8bb0aad0b9ba627a953e0c899",
      "parents": [
        "897652e5f08147efad9db66b86c3036b3d3826db"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Fri Feb 28 19:22:34 2020 +0100"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Wed Feb 10 20:27:08 2021 +0100"
      },
      "message": "Revert \"THRIFT-4982 Remove deprecated C# bindings from the code base\"\n\nOnly compiler, test, lib and tutorial code.\n"
    },
    {
      "commit": "56700e469d5d0659994a3963ad5a111740cf8277",
      "tree": "db903818e332aa6887f2efd2797163ffa4268d67",
      "parents": [
        "4903d18fca988871bcedce3b420fef2cd9682ca1"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Sat Feb 22 16:51:51 2020 +0100"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Fri Feb 28 19:18:34 2020 +0100"
      },
      "message": "THRIFT-4982 Remove deprecated C# bindings from the code base\nClient: csharp\nPatch: Jens Geyer\n\nThis closes #2027\n"
    },
    {
      "commit": "3f3567a1143194712747fff9dd02b2162e2d14dd",
      "tree": "36564d5680c36fca18a7d8c9aac296e1f70187ef",
      "parents": [
        "7199741f440ef7de15e13755ea2371157c8cd298"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Sat Oct 19 18:27:35 2019 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Sun Oct 20 16:21:29 2019 +0200"
      },
      "message": "THRIFT-4981 Remove deprecated netcore bindings from the code base\nClient: netcore\nPatch: Jens Geyer\n\nThis closes #1901\n"
    },
    {
      "commit": "7199741f440ef7de15e13755ea2371157c8cd298",
      "tree": "760ba3ff7a69d96dd6b05214e18c2d0ddc51ec06",
      "parents": [
        "616df98f00a594f133466aa7f94930c1bf85b24a"
      ],
      "author": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Sat Oct 19 21:22:59 2019 +0200"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "jensg@apache.org",
        "time": "Sun Oct 20 16:20:57 2019 +0200"
      },
      "message": "THRIFT-4938 Issues with version.h treatment\nClient: Compiler\nPatch: Jens Geyer\n\nThis closes #1902\n"
    },
    {
      "commit": "234fb47229dad47842e97a599614dbbd81b7c4a2",
      "tree": "e1c75e2200041c4ef67b0ed2d1a5ac877012412f",
      "parents": [
        "f3ec277e7e2c147342831ecec590bc2f71b07761"
      ],
      "author": {
        "name": "James E. King III",
        "email": "jking@apache.org",
        "time": "Sun Jan 13 23:19:18 2019 -0500"
      },
      "committer": {
        "name": "James E. King III",
        "email": "jking@apache.org",
        "time": "Mon Jan 14 08:13:52 2019 -0500"
      },
      "message": "THRIFT-4719: remove cocoa\n"
    },
    {
      "commit": "54993296c413ad0ba295148af5a905d11d671ce9",
      "tree": "2ccca00ee3e96741906c58c0358c8b30026dc244",
      "parents": [
        "9a32f8af3a02c994fc7f0f281b30caaeda20768d"
      ],
      "author": {
        "name": "Volodymyr Gotra",
        "email": "volodymyr.gotra@evolute.com",
        "time": "Mon Dec 18 02:08:09 2017 +0200"
      },
      "committer": {
        "name": "James E. King III",
        "email": "jking@apache.org",
        "time": "Sun Jan 14 08:39:32 2018 -0500"
      },
      "message": "THRIFT-4434: .NET Core cleanup and the beginnings of compiler unit tests\nClient: netcore\n\nThis closes #1449\n"
    }
  ]
}
