Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
74fed2b
Initial commit
dpylypen Feb 24, 2026
2fe184f
chore: scaffold C++ dev container
yevhenkuznetsov Apr 21, 2026
6851e1f
fix: make devcontainer initialize script cross-platform
yevhenkuznetsov Apr 21, 2026
ef74c78
fix: create nested WORKSPACE_FOLDER path in Dockerfile
yevhenkuznetsov Apr 21, 2026
5f8e4e7
chore: recommend Dev Containers extension via .vscode/extensions.json
yevhenkuznetsov Apr 21, 2026
f8e41b0
chore: add macOS host prep script for Docker via Colima
yevhenkuznetsov Apr 21, 2026
93f889a
chore: add Linux and Windows host prep scripts
yevhenkuznetsov Apr 21, 2026
49d7702
lesson1
yevhenkuznetsov Apr 21, 2026
ff09b43
docs: replace preps/ shell scripts with platform notes
yevhenkuznetsov Apr 21, 2026
44e8acb
revert: remove block2-lesson1/ subdirectory
yevhenkuznetsov Apr 21, 2026
df13fe5
feat: add lesson starter CMake project at repo root
yevhenkuznetsov Apr 21, 2026
4e62365
docs(preps): rework clone flow and add Windows troubleshooting
yevhenkuznetsov Apr 22, 2026
d92dca4
fix(devcontainer): create ~/.ssh in initialize to prevent mount failure
yevhenkuznetsov Apr 22, 2026
8859f96
fix(devcontainer): free UID 1000 by removing default ubuntu user
yevhenkuznetsov Apr 22, 2026
f5dd838
feat(homework-04): add wheel odometry starter (CMake, main stub, samp…
yevhenkuznetsov Apr 23, 2026
8302d4a
Merge block-2-lesson-2 into main
yevhenkuznetsov Apr 23, 2026
50a58c3
feat(devcontainer): add ssh and git packages
yevhenkuznetsov Apr 23, 2026
672ebcb
Merge pull request #3 from yevhenkuznetsov/feature/devcontainer-add-p…
yevhenkuznetsov Apr 23, 2026
26b4e16
chore(devcontainer): pin ubuntu base image by digest
yevhenkuznetsov Apr 24, 2026
5f6fb29
build(cmake): include homework_04 from root
yevhenkuznetsov Apr 24, 2026
c840527
ci(build): add workflow using devcontainers/ci
yevhenkuznetsov Apr 24, 2026
4de1dcd
ci(build): disable image push in devcontainers/ci
yevhenkuznetsov Apr 24, 2026
5629146
ci(build): limit push trigger to main to avoid duplicate PR runs
yevhenkuznetsov Apr 24, 2026
08661c1
Merge pull request #4 from robot-dreams-code/ci/devcontainer-github-a…
yevhenkuznetsov Apr 24, 2026
0f42450
chore(devcontainer): drop hardcoded UID 1000, rely on updateRemoteUse…
yevhenkuznetsov Apr 24, 2026
666102d
Merge pull request #5 from robot-dreams-code/chore/devcontainer-simpl…
yevhenkuznetsov Apr 24, 2026
2b28f49
build(cmake): drop root main.cpp and app target
yevhenkuznetsov Apr 24, 2026
bf3f0b6
docs(readme): rewrite root README
yevhenkuznetsov Apr 24, 2026
72cbca1
docs(readme): document template workflow and upstream updates
yevhenkuznetsov Apr 24, 2026
4824e85
docs(changelog): add CHANGELOG.md with recent merged PRs
yevhenkuznetsov Apr 24, 2026
2bdaf06
docs(readme): tell Windows students to clone inside WSL
yevhenkuznetsov Apr 24, 2026
c8ff677
docs(readme): recommend Docker Engine over Docker Desktop
yevhenkuznetsov Apr 24, 2026
5366eca
docs(readme): note how to give lecturer access for review
yevhenkuznetsov Apr 24, 2026
8b2e71b
Merge pull request #6 from robot-dreams-code/chore/root-cleanup
yevhenkuznetsov Apr 24, 2026
7249afd
docs(readme): add farnblack as second lecturer contact
yevhenkuznetsov Apr 24, 2026
4340d4e
Merge pull request #7 from robot-dreams-code/docs/add-second-lecturer…
yevhenkuznetsov Apr 24, 2026
0231823
docs(readme): drop git-sync recipes, route updates through Slack
yevhenkuznetsov Apr 26, 2026
fc44fe5
Merge pull request #8 from robot-dreams-code/docs/fix-upstream-update…
yevhenkuznetsov Apr 26, 2026
ac61115
docs(preps): align setup docs with template flow
yevhenkuznetsov Apr 30, 2026
58851e7
chore(clangd): wire clangd to CMake compile database
yevhenkuznetsov Apr 30, 2026
760f005
chore(clang-tools): add clang-tidy course config
yevhenkuznetsov Apr 30, 2026
274ca56
chore(devcontainer): add debug tools for diagnostics
yevhenkuznetsov Apr 30, 2026
ce36e67
docs(config): document student-facing setup files
yevhenkuznetsov Apr 30, 2026
54eaef8
docs(homework): keep C++ comments in English
yevhenkuznetsov Apr 30, 2026
e183e71
Merge pull request #9 from robot-dreams-code/chore/setup-course-tooling
yevhenkuznetsov Apr 30, 2026
8dbff8a
chore(vscode): add build and clean tasks
yevhenkuznetsov Apr 30, 2026
00ffa67
Merge pull request #10 from robot-dreams-code/chore/add-vscode-build-…
yevhenkuznetsov Apr 30, 2026
43a14f2
docs(changelog): record tooling updates
yevhenkuznetsov Apr 30, 2026
ff56262
feat(block-2-lesson-2-4): add local and remote GDB demo
yevhenkuznetsov Apr 30, 2026
3669355
feat(block-2-lesson-2-4): add homework 05 telemetry starter
yevhenkuznetsov Apr 30, 2026
1dfb382
chore(block-2-lesson-2-4): add debug presets and launch tooling
yevhenkuznetsov Apr 30, 2026
501d0c9
docs(block-2-lesson-2-4): document debug demo and homework starter
yevhenkuznetsov Apr 30, 2026
b901eee
fix(block-2-lesson-2-4): align debug_probe demo naming
yevhenkuznetsov Apr 30, 2026
2f9f8d5
chore(block-2-lesson-2-4): enable core dump debugging in devcontainer
yevhenkuznetsov Apr 30, 2026
117412f
Merge pull request #11 from robot-dreams-code/feat/homework-05-debug-…
yevhenkuznetsov Apr 30, 2026
c9ef455
fix(block-2-lesson-2-4): add clang sanitizer runtime to devcontainer
yevhenkuznetsov Apr 30, 2026
92611ef
fix(block-2-lesson-2-4): adjust devcontainer diagnostics setup
yevhenkuznetsov Apr 30, 2026
4afc60b
Merge pull request #13 from robot-dreams-code/fix/block-2-lesson-2-4-…
yevhenkuznetsov Apr 30, 2026
93f819e
docs(block-2-lesson-2-4): document course update sync flow
yevhenkuznetsov Apr 30, 2026
57e751d
chore: relax clang-tidy rules for lesson 2.6
yevhenkuznetsov May 8, 2026
d1fe01b
Merge pull request #14 from robot-dreams-code/block-2-lesson-2-6-ligh…
yevhenkuznetsov May 9, 2026
d8846f5
docs(block-2-lesson-2-6): add code quality howto
yevhenkuznetsov May 17, 2026
ec8df26
Merge pull request #19 from robot-dreams-code/docs/block-2-lesson-2-6…
yevhenkuznetsov May 17, 2026
430d8bc
Merge remote-tracking branch 'course/main' into sync/main-course-3
mandelbroo May 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -96,4 +96,4 @@
}
}
}
}
}
2 changes: 1 addition & 1 deletion .vscode/extensions.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@
"recommendations": [
"ms-vscode-remote.remote-containers"
]
}
}
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,15 @@
Усі помітні зміни в цьому репо фіксуються тут.
Формат - [Keep a Changelog](https://keepachangelog.com/uk/1.1.0/), дати в ISO 8601.

## 2026-05-17

### Added

- Block 2 / Lesson 2.6: додано `docs/code-quality.md` з базовими командами
для запуску `clang-format`, `cmake-format`, `clang-tidy`, налаштуванням
VS Code auto-format, optional VS Code task для `clang-tidy` і правилами
точкового використання `NOLINT` без wrapper scripts.

## 2026-05-08

### Changed
Expand Down
24 changes: 16 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,13 @@ PR-и на вашій копії йдуть у ваш main.
ARM64 артефакти з'являться в `build/aarch64-debug/`. Цей preset
використовує toolchain `cmake/toolchains/aarch64-linux-gnu.cmake`.

## Якість коду

Базові команди для форматування C++, форматування CMake і запуску
`clang-tidy` описано в [docs/code-quality.md](docs/code-quality.md).
Команди розраховані на запуск всередині devcontainer terminal після
`cmake --preset debug`.

## Доступ для перевірки

Додати обох лекторів як collaborators свого репо, щоб вони могли бачити
Expand Down Expand Up @@ -132,14 +139,15 @@ Template. Копія через "Use this template" - це новий репо

```
.
├── .devcontainer/ # Docker image + конфіг dev-контейнера
├── .github/workflows/ # GitHub Actions: CI build через devcontainer
├── CHANGELOG.md # лог помітних змін по PR-ах
├── CMakeLists.txt # корневий CMakeLists, підтягує homework_XX через add_subdirectory
├── cmake/toolchains/ # CMake toolchain-файли для cross-compilation
├── demos/ # demo-код для занять
├── homework_XX/ # окрема домашка, кожна зі своїм CMakeLists.txt
└── preps/ # інструкції зі сетапу за платформами
|-- .devcontainer/ # Docker image + конфіг dev-контейнера
|-- .github/workflows/ # GitHub Actions: CI build через devcontainer
|-- CHANGELOG.md # лог помітних змін по PR-ах
|-- CMakeLists.txt # корневий CMakeLists, підтягує homework_XX через add_subdirectory
|-- cmake/toolchains/ # CMake toolchain-файли для cross-compilation
|-- docs/ # HowTo та короткі інструкції для роботи з repo
|-- demos/ # demo-код для занять
|-- homework_XX/ # окрема домашка, кожна зі своїм CMakeLists.txt
`-- preps/ # інструкції зі сетапу за платформами
```

## Як додати нову домашку
Expand Down
250 changes: 250 additions & 0 deletions docs/code-quality.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,250 @@
# HowTo: форматування і lint для C++ коду

Команди нижче запускати у terminal всередині devcontainer-а. На host-системі
може не бути `clang-format`, `cmake-format`, `clang-tidy` або потрібної версії
CMake.

## Де лежать налаштування

| Файл | Навіщо потрібен |
| --- | --- |
| `.devcontainer/.clang-format` | Стиль автоформатування C++ source/header файлів. |
| `.devcontainer/.cmake-format.json` | Стиль автоформатування `CMakeLists.txt`. |
| `.devcontainer/.clang-tidy` | Набір static analysis checks для C++ коду. |
| `.devcontainer/devcontainer.json` | VS Code extensions, default formatter-и і clangd settings всередині контейнера. |
| `.vscode/tasks.json` | VS Code tasks для повторюваних команд з terminal. |
| `CMakeLists.txt` | Генерує `compile_commands.json` для clangd і clang-tidy. |
| `CMakePresets.json` | Дає стабільні команди `cmake --preset debug` і `cmake --build --preset debug`. |

Dockerfile копіює formatter/linter конфіги в корінь devcontainer-а (`/`).
Тому tools знаходять їх незалежно від конкретної папки проєкту всередині
контейнера.

## VS Code форматування

У devcontainer вже налаштовано formatter-и:

- C++ файли (`*.cpp`, `*.cc`, `*.cxx`, `*.hpp`, `*.h`) форматуються через
clangd, який використовує `clang-format`;
- CMake файли форматуються через extension `cheshirekow.cmake-format`;
- `cmake-format` запускається з конфігом `/.cmake-format.json`.

Форматування поточного файлу вручну:

```text
Command Palette -> Format Document
```

Для автоформатування під час save додати `editor.formatOnSave` у вже наявні
`[cpp]` і `[cmake]` blocks у `.devcontainer/devcontainer.json`:

```jsonc
"editor.formatOnSave": true
```

Не створювати другий `[cpp]` або `[cmake]` key поруч: у JSON має лишатися
один block для кожної мови. У цьому repo `editor.defaultFormatter` для `[cpp]`
і `[cmake]` вже є. Для ввімкнення auto-format достатньо додати тільки
`editor.formatOnSave`.

Після зміни `.devcontainer/devcontainer.json` застосувати налаштування через:

```text
Command Palette -> Dev Containers: Rebuild Container
```

`clang-tidy` не варто запускати на кожен save. Він повільніший за formatter,
потребує `compile_commands.json` і краще працює як окрема перевірка перед PR.

## VS Code tasks

Поточний `.vscode/tasks.json` навмисно мінімальний: build через debug preset і
clean build directory.

Для форматування окрема task не потрібна: VS Code вже знає formatter для C++ і
CMake файлів через devcontainer settings. Використовувати `Format Document`
або `editor.formatOnSave`.

Task для `clang-tidy` активного C++ source-файлу:

```jsonc
{
// CMake configure оновлює compile_commands.json перед clang-tidy.
"label": "Quality: clang-tidy active file",
"type": "shell",
"command": "cmake --preset debug && clang-tidy \"${file}\" -p build/debug",
"problemMatcher": [
"$gcc"
],
"presentation": {
"reveal": "always",
"panel": "dedicated",
"clear": true
}
}
```

Запуск task:

```text
Command Palette -> Tasks: Run Task -> Quality: clang-tidy active file
```

## Мінімальний цикл перед PR

```bash
cmake --preset debug
cmake --build --preset debug
ctest --test-dir build/debug --output-on-failure
```

Після цього запускати форматування і lint:

```bash
find homework_04 -type f \( -name '*.cpp' -o -name '*.cc' -o -name '*.cxx' -o -name '*.hpp' -o -name '*.h' \) -print0 \
| xargs -0 -r clang-format -i

find homework_04 \( -name 'CMakeLists.txt' -o -name '*.cmake' \) -print0 \
| xargs -0 -r cmake-format -i --config-file=/.cmake-format.json

find homework_04 -type f \( -name '*.cpp' -o -name '*.cc' -o -name '*.cxx' \) -print0 \
| xargs -0 -r clang-tidy -p build/debug
```

Остання команда запускає `clang-tidy` по всіх C++ source-файлах у вибраній
папці домашки. Header-файли (`*.hpp`, `*.h`) не передаються окремо: clang-tidy
перевіряє їх тоді, коли вони підключені з source-файлів, які є в
`compile_commands.json`.

Для іншої домашки замінити `homework_04` на потрібну папку, наприклад
`homework_05` або `homework_06`.

Форматер змінює файли. Зміни після форматування видно у VS Code Source Control.
Якщо файл не змінився, форматеру не було що переписувати. `clang-tidy` за
замовчуванням тільки друкує diagnostics і не переписує код.

## Запуск для одного файлу

Форматування одного C++ файлу:

```bash
clang-format -i homework_04/src/main.cpp
```

Форматування одного `CMakeLists.txt`:

```bash
cmake-format -i --config-file=/.cmake-format.json homework_04/CMakeLists.txt
```

Lint одного C++ source-файлу:

```bash
clang-tidy homework_04/src/main.cpp -p build/debug
```

`-p build/debug` вказує clang-tidy, де лежить `compile_commands.json`.
Без цього clang-tidy часто не бачить ті самі include paths, defines і compiler
flags, що й реальна CMake-збірка.

## Мінімальне підключення нової папки ДЗ

Для порожньої домашки достатньо мати:

```text
homework_06/CMakeLists.txt
homework_06/src/main.cpp
```

Мінімальний `homework_06/CMakeLists.txt`:

```cmake
add_executable(homework_06 src/main.cpp)

target_compile_options(
homework_06 PRIVATE $<$<CXX_COMPILER_ID:GNU,Clang>:-Wall -Wextra -Wpedantic>)
```

У кореневому `CMakeLists.txt` додати:

```cmake
add_subdirectory(homework_06)
```

Після цього працює той самий цикл:

```bash
cmake --preset debug
cmake --build --preset debug
clang-format -i homework_06/src/main.cpp
cmake-format -i --config-file=/.cmake-format.json homework_06/CMakeLists.txt
clang-tidy homework_06/src/main.cpp -p build/debug
```

## Як читати clang-tidy output

Значущий рядок має такий формат:

```text
homework_06/src/main.cpp:12:7: warning: message text [check-name]
```

Важливі частини:

- `homework_06/src/main.cpp` - файл, де знайдено diagnostic.
- `12:7` - рядок і колонка.
- `warning` або `error` - рівень сигналу.
- `[check-name]` - назва clang-tidy check.

Якщо `clang-tidy` друкує тільки службові рядки на кшталт `warnings generated`,
але немає рядків з шляхом до файлу, рядком, колонкою і назвою check, тоді
потрібно дивитись повний output і команду запуску. Найчастіші причини:

- не виконано `cmake --preset debug`;
- `-p` вказує не на ту build-директорію;
- source-файл не підключено до жодного CMake target.

## Коли можна NOLINT

`NOLINT` - це точкове вимкнення конкретного clang-tidy diagnostic. Його варто
використовувати тільки після того, як warning прочитано і причина лишити код
саме таким зафіксована поруч.

Дозволені випадки:

- false positive clang-tidy, коли код коректний, а check помиляється;
- навчальний або test-код, де приклад навмисно порушує правило;
- вимога зовнішнього API, системного callback-а або C ABI;
- низькорівневий код, де альтернатива гірша для читабельності або безпеки.

Не використовувати `NOLINT`, щоб приховати:

- warning, який ще не розібрано;
- реальний bug або undefined behavior;
- warning-и відразу на весь файл без дуже сильної причини;
- style issue, який можна виправити форматером або простою зміною коду.

Краще вказувати назву check і причину:

```cpp
// NOLINTNEXTLINE(readability-magic-numbers) - Test value mirrors the assignment sample.
const auto timeout_ms = 1500;
```

Або для одного виразу в кінці рядка:

```cpp
const auto* packet = reinterpret_cast<const Packet*>(data); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast) - Wire format defines Packet layout.
```

Гірший варіант:

```cpp
const auto timeout_ms = 1500; // NOLINT
```

Такий коментар не пояснює, який check вимкнено і чому. У C++ source/header
коментар біля `NOLINT` писати англійською, як і решту коментарів у C++ коді.

Після форматування не варто змішувати в одному commit функціональну зміну і
масове наведення стилю, якщо форматер зачепив багато вже існуючого коду.
Loading