Skip to content

Commit d0e6af6

Browse files
Merge branch 'sync/main-to-internal-main-2026-05-27' into 'internal_main'
sync: merge plotjuggler/main into internal_main (2026-05-27) See merge request client-projets/p.2026-plotjuggler/plotjuggler_core!183
2 parents c896545 + 7830182 commit d0e6af6

257 files changed

Lines changed: 2799 additions & 343 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/cla.yml

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
name: CLA Assistant
2+
3+
# CLA Assistant Lite (contributor-assistant/github-action).
4+
#
5+
# On every pull request, the bot checks whether each contributor has signed the
6+
# CLA in CLA.md. Unsigned contributors are asked to sign by posting a comment on
7+
# their PR with the exact phrase:
8+
#
9+
# I have read the CLA Document and I hereby sign the CLA
10+
#
11+
# Signatures are appended to a JSON file (path-to-signatures) committed to the
12+
# `branch` configured below. Posting `recheck` re-runs the check.
13+
#
14+
# ── One-time setup ────────────────────────────────────────────────────────────
15+
# 1. The `branch` used to store signatures MUST exist and MUST NOT be branch-
16+
# protected (the bot pushes directly to it). Create it once:
17+
# git branch cla-signatures && git push -u origin cla-signatures
18+
# 2. If you store signatures in the same repo on an UNPROTECTED branch, the
19+
# built-in GITHUB_TOKEN is enough. PERSONAL_ACCESS_TOKEN is only required
20+
# when storing signatures in a *remote* repo, or when the storage branch is
21+
# protected. If needed, add a repo-scoped PAT as the secret
22+
# PERSONAL_ACCESS_TOKEN in Settings → Secrets and variables → Actions.
23+
# 3. Edit `allowlist` below to include maintainers and bots (they skip the CLA).
24+
25+
on:
26+
issue_comment:
27+
types: [created]
28+
pull_request_target:
29+
types: [opened, synchronize, closed]
30+
31+
permissions:
32+
actions: write
33+
contents: write
34+
pull-requests: write
35+
statuses: write
36+
37+
jobs:
38+
cla-assistant:
39+
runs-on: ubuntu-latest
40+
steps:
41+
- name: CLA Assistant
42+
if: >-
43+
(github.event.comment.body == 'recheck'
44+
|| github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA')
45+
|| github.event_name == 'pull_request_target'
46+
uses: contributor-assistant/github-action@v2.6.1
47+
env:
48+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
49+
# PERSONAL_ACCESS_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} # only for remote/protected storage
50+
with:
51+
path-to-document: 'https://github.com/PlotJuggler/plotjuggler_core/blob/development/CLA.md'
52+
path-to-signatures: 'signatures/version1/cla.json'
53+
branch: 'cla-signatures'
54+
allowlist: facontidavide,bot*,*[bot]
55+
custom-notsigned-prcomment: >-
56+
Thank you for your contribution. Before we can merge it, please sign the
57+
[Contributor License Agreement](https://github.com/PlotJuggler/plotjuggler_core/blob/development/CLA.md)
58+
by posting a comment on this pull request with exactly the text below:
59+
custom-pr-sign-comment: 'I have read the CLA Document and I hereby sign the CLA'
60+
custom-allsigned-prcomment: 'All contributors have signed the CLA. Thank you!'

CLA.md

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
<!--
2+
TEMPLATE — REVIEW BEFORE ENABLING THE CLA WORKFLOW.
3+
This Contributor License Agreement was drafted as a starting point and is not
4+
legal advice. Have it reviewed by a lawyer before relying on it, especially the
5+
relicensing grant in Section 2, which is what preserves the option to offer
6+
pj_datastore under commercial terms. Once contributors begin signing, changing
7+
the terms requires re-collecting signatures, so settle the wording first.
8+
-->
9+
10+
# PlotJuggler Core — Individual Contributor License Agreement
11+
12+
Thank you for contributing to PlotJuggler Core (the "Project"). This Contributor
13+
License Agreement ("Agreement") sets out the terms under which You provide
14+
Contributions to the Project. It protects You, the Project, and downstream users
15+
by making the intellectual-property terms of Your Contributions explicit.
16+
17+
By signing this Agreement (see "How to sign" below) You accept and agree to these
18+
terms for Your past, present, and future Contributions to the Project.
19+
20+
## 1. Definitions
21+
22+
- **"You"** (or **"Your"**) means the individual who submits a Contribution, or
23+
the legal entity on whose behalf the Contribution is submitted.
24+
- **"Project Owner"** means Davide Faconti, the maintainer and copyright holder
25+
of PlotJuggler Core, and any successor maintainer or assignee.
26+
- **"Contribution"** means any original work of authorship, including any
27+
modification of or addition to existing work, that You intentionally submit to
28+
the Project (e.g. via pull request, patch, or issue attachment) for inclusion
29+
in or documentation of the Project.
30+
31+
## 2. Copyright License
32+
33+
You grant the Project Owner and recipients of software distributed by the Project
34+
a **perpetual, worldwide, non-exclusive, royalty-free, irrevocable** copyright
35+
license to reproduce, prepare derivative works of, publicly display, publicly
36+
perform, **sublicense, relicense, and distribute** Your Contributions and such
37+
derivative works.
38+
39+
You expressly agree that the Project Owner may **license and distribute Your
40+
Contributions under any license terms, including open-source, proprietary, and
41+
commercial terms** (for example, dual-licensing the storage engine). This right
42+
to relicense survives even if the Project's default license changes. You retain
43+
all right, title, and interest in Your Contributions not expressly granted here,
44+
including the right to use them for any other purpose.
45+
46+
## 3. Patent License
47+
48+
You grant the Project Owner and recipients of software distributed by the Project
49+
a perpetual, worldwide, non-exclusive, royalty-free, irrevocable (except as
50+
stated below) patent license to make, have made, use, offer to sell, sell,
51+
import, and otherwise transfer Your Contributions, where such license applies
52+
only to those patent claims licensable by You that are necessarily infringed by
53+
Your Contribution alone or by combination of Your Contribution with the Project.
54+
55+
If any entity institutes patent litigation alleging that Your Contribution, or
56+
the Project to which You contributed, constitutes direct or contributory patent
57+
infringement, then any patent licenses granted to that entity under this
58+
Agreement for that Contribution terminate as of the date such litigation is
59+
filed.
60+
61+
## 4. Moral Rights
62+
63+
To the fullest extent permitted by applicable law, You waive, and agree not to
64+
assert, any moral rights in Your Contributions against the Project Owner or
65+
downstream recipients.
66+
67+
## 5. Your Representations
68+
69+
You represent that:
70+
71+
1. Each Contribution is either Your original creation, or You have sufficient
72+
rights to submit it under the terms of this Agreement.
73+
2. The grants above do not violate any agreement You have with a third party. If
74+
Your employer has rights to intellectual property You create, You represent
75+
that You have received permission to make the Contributions on behalf of that
76+
employer, or that the employer has waived such rights for Your Contributions.
77+
3. You are not aware of any third-party rights that would make the grants in this
78+
Agreement inaccurate, and You will notify the Project Owner if You later become
79+
aware of any such rights.
80+
81+
## 6. No Warranty / No Obligation
82+
83+
Unless required by applicable law or agreed to in writing, You provide Your
84+
Contributions "AS IS", without warranties or conditions of any kind. The Project
85+
Owner is under no obligation to accept, use, or distribute any Contribution.
86+
87+
## How to sign
88+
89+
To sign this Agreement, post a comment on your pull request containing exactly:
90+
91+
> I have read the CLA Document and I hereby sign the CLA
92+
93+
The automated CLA Assistant records your signature against your GitHub username.
94+
If you are contributing on behalf of a company, ensure you are authorized to do
95+
so before signing.

CLAUDE.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,24 @@ Before committing, always run:
8989

9090
Code formatting and linting are enforced via pre-commit hooks (clang-format v17).
9191

92+
## Release Versioning
93+
94+
In **every PR**, proactively raise whether it warrants a new Conan release, and
95+
propose the version bump rather than waiting to be asked. Pre-1.0 versioning
96+
convention (`0.MINOR.PATCH`):
97+
98+
- **MINOR** bump (`0.X.0`) — any API or ABI **break**: removing/reordering ABI
99+
vtable slots, changing existing struct layouts or function signatures, or any
100+
source-incompatible SDK change.
101+
- **PATCH** bump (`0.x.Y`) — **backward-compatible** changes: tail-appended ABI
102+
slots (gated by `struct_size`), additive SDK helpers, bug fixes, docs.
103+
104+
The version is declared in two places that **must stay in sync**: `version` in
105+
`conanfile.py` and `PJ_PACKAGE_VERSION` in the root `CMakeLists.txt` (also update
106+
the example tag in the `conanfile.py` docstring). Tagging and pushing the release
107+
is a separate, explicitly-authorized step — never tag or push a release without
108+
the user's go-ahead.
109+
92110
## Instructions Glossary
93111

94112
- **"Read all documentation"** means: find and read every `.md` file in the entire project tree (all subdirectories). Use `find . -name "*.md"` or equivalent. This includes docs in `docs/`, `pj_datastore/docs/`, `pj_plugins/docs/`, and any other location.

CMakeLists.txt

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,21 @@ if(PJ_BUILD_TESTS)
6767
find_package(GTest REQUIRED)
6868
endif()
6969

70+
find_package(fmt REQUIRED)
71+
72+
if(TARGET fmt::fmt-header-only)
73+
set(PJ_FMT_TARGET fmt::fmt-header-only)
74+
elseif(TARGET fmt::fmt)
75+
set(PJ_FMT_TARGET fmt::fmt)
76+
else()
77+
message(FATAL_ERROR "fmt is required, but no fmt::fmt or fmt::fmt-header-only target was found.")
78+
endif()
79+
80+
add_library(pj_internal_fmt INTERFACE)
81+
target_compile_definitions(pj_internal_fmt INTERFACE FMT_HEADER_ONLY=1)
82+
target_link_libraries(pj_internal_fmt INTERFACE ${PJ_FMT_TARGET})
83+
7084
if(PJ_BUILD_DATASTORE)
71-
find_package(fmt REQUIRED)
7285
find_package(tsl-robin-map REQUIRED)
7386
if(PJ_BUILD_TESTS)
7487
find_package(benchmark CONFIG REQUIRED)
@@ -183,7 +196,7 @@ endif()
183196
if(PJ_INSTALL_SDK)
184197
include(CMakePackageConfigHelpers)
185198

186-
set(PJ_PACKAGE_VERSION "0.2.1")
199+
set(PJ_PACKAGE_VERSION "0.4.0")
187200
set(PJ_PACKAGE_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/plotjuggler_core)
188201

189202
install(EXPORT plotjuggler_coreTargets

LICENSE

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,26 @@
1-
MIT License
1+
PlotJuggler Core is licensed per-module. Every source file carries an
2+
SPDX-License-Identifier header that is authoritative for that file.
23

3-
Copyright (c) 2026 Davide Faconti
4+
Module License Full text
5+
------------ ----------- ---------------
6+
pj_base Apache-2.0 LICENSE-APACHE
7+
pj_plugins Apache-2.0 LICENSE-APACHE
8+
examples Apache-2.0 LICENSE-APACHE
9+
pj_datastore MPL-2.0 LICENSE-MPL
10+
11+
Rationale:
412

5-
Permission is hereby granted, free of charge, to any person obtaining a copy
6-
of this software and associated documentation files (the "Software"), to deal
7-
in the Software without restriction, including without limitation the rights
8-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9-
copies of the Software, and to permit persons to whom the Software is
10-
furnished to do so, subject to the following conditions:
13+
- The plugin-facing surface (pj_base, pj_plugins) is Apache-2.0 so that
14+
third parties may build proprietary plugins and applications on top of
15+
the SDK without restriction. Apache-2.0 also grants an explicit patent
16+
license to downstream users.
1117

12-
The above copyright notice and this permission notice shall be included in all
13-
copies or substantial portions of the Software.
18+
- The storage engine (pj_datastore) is MPL-2.0. MPL-2.0 is file-level
19+
(weak) copyleft: modifications to the engine's own source files must be
20+
published, but the engine may be combined with proprietary code and
21+
linked into proprietary applications.
1422

15-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21-
SOFTWARE.
23+
Plugins load through a stable C ABI and never statically link pj_datastore,
24+
so the MPL-2.0 engine imposes no obligations on plugin authors.
25+
26+
Copyright (c) 2026 Davide Faconti

0 commit comments

Comments
 (0)