Skip to content

Обращение к GitHub API без библиотеки github-api#82

Merged
nixel2007 merged 7 commits into
masterfrom
claude/github-api-no-extra-libs-4t37al
Jul 25, 2026
Merged

Обращение к GitHub API без библиотеки github-api#82
nixel2007 merged 7 commits into
masterfrom
claude/github-api-no-extra-libs-4t37al

Conversation

@nixel2007

@nixel2007 nixel2007 commented Jul 20, 2026

Copy link
Copy Markdown
Member

Переводит GitHubReleaseClient с org.kohsuke:github-api на java.net.http.HttpClient + gson, а распаковку архива сервера — с commons-compress на java.util.zip. У загрузчика больше нет ни клиентских библиотек GitHub, ни Jackson, ни commons-*.

Closes #81
Closes #80

Что изменилось

  • GitHubReleaseClient — переписан на java.net.http.HttpClient, ответ разбирается через gson:
    • стабильный канал — GET /releases/latest (404 трактуется как «нет подходящих релизов»);
    • pre-release — GET /releases?per_page=30: первый не-draft из списка, ассеты строго скоупятся к выбранному релизу; граница MAX_RELEASES_PAGES защищает от бесконечного опроса;
    • версия — из tag_name, флаг draft и ассеты — из своих полей структурно, поэтому содержимое body (релиз-ноуты) на результат не влияет; некорректный JSON — IOException;
    • таймауты (BslLanguageServerDownloader: проверка релиза без connect/read timeout может зависнуть #80): connect 10 с у дефолтного HttpClient + request/response 30 с на каждом запросе (.timeout(...)) — путь проверки релиза больше не может зависнуть на «немом» api.github.com;
    • заголовки Accept: application/vnd.github+json, X-GitHub-Api-Version, User-Agent, Authorization: Bearer при непустом токене; текст HTTP-ошибки включает усечённое тело ответа для диагностики;
    • добавлен публичный конструктор GitHubReleaseClient(token, httpClient) — для настройки прокси и тестов.
  • Распаковка — переведена с org.apache.commons.compress на java.util.zip.ZipFile. Так как java.util.zip не переносит unix-права из архива, бит исполнения на POSIX выставляется явно на запускаемом файле (binaryPath) — для native-image раскладки это единственный исполняемый файл бандла.
  • build.gradle.kts — удалены org.kohsuke:github-api:1.330 и org.apache.commons:commons-compress:1.28.0; добавлен com.google.code.gson:gson:2.13.1 (транзитивный compile-time error_prone_annotations исключён из рантайма).

Эффект для рантайм-замкнутости

Из classpath уходят github-api + jackson-databind/core/annotations (~4 МБ) и commons-compress + commons-codec/io/lang3 (~2.6 МБ). Добавляется только gson (OSGi-совместим, без транзитивов). Итоговый граф:

+--- org.jspecify:jspecify:1.0.0
+--- org.slf4j:slf4j-api:2.0.18
+--- com.google.code.gson:gson:2.13.1
\--- org.semver4j:semver4j:6.0.0
     \--- org.jspecify:jspecify:1.0.0

Итоговый размер замкнутости для использования загрузчика — 5 jar, ≈ 422 КиБ:

jar размер
gson 2.13.1 ~280 КиБ
slf4j-api 2.0.18 ~68 КиБ
semver4j 6.0.0 ~45 КиБ
utils ~24 КиБ
jspecify 1.0.0 ~4 КиБ
Итого ≈ 422 КиБ

Против исходных ~5.6 МБ / 12 jar — примерно 13× меньше. Конфликт версий Jackson (2.20 ↔ 2.12 из target-платформы EDT) исчезает — встраивание в OSGi-бандл (1C:EDT) становится лёгким.

Тесты

GitHubReleaseClientTest (оба канала, скоупинг ассетов к выбранному релизу, пагинация по draft'ам и её граница, заголовки/авторизация, 403/404, некорректный JSON, релиз без тега/без ассетов, устойчивость к «отравленному» body, восстановление interrupt-флага) и тест на исполняемость лаунчера (на всех ОС). Прежние тесты BslLanguageServerDownloader проходят без изменений.

🤖 Generated with Claude Code

https://claude.ai/code/session_01WwLcL3YofsPmKBJpcDoVor

Переводит GitHubReleaseClient на java.net.http.HttpClient и встроенный
минимальный JSON-парсер (RFC 8259) вместо org.kohsuke:github-api.
Из рантайм-замкнутости уходят github-api, jackson-databind/core/annotations
(~4 МБ) — остаются только slf4j-api, commons-compress, semver4j и jspecify,
что упрощает встраивание в OSGi (EDT) и убирает конфликт версий Jackson.

Поведение сохранено: стабильный канал берётся из releases/latest
(404 = нет подходящих релизов), pre-release — первый не-draft из списка
releases с дочитыванием страниц. Ассеты читаются из того же ответа,
так что вместо двух обращений к API выполняется одно. Добавлен
конструктор с внешним HttpClient (настройка прокси, тесты).

Fixes #81

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwLcL3YofsPmKBJpcDoVor
@coderabbitai

coderabbitai Bot commented Jul 20, 2026

Copy link
Copy Markdown

Review Change Stack

Walkthrough

Из удалённых библиотек GitHub API и Commons Compress загрузчик переведён на HttpClient, Gson и стандартный ZIP API. Добавлены обработка REST-ответов, пагинация релизов, тесты и установка POSIX-бита исполнения лаунчера.

Changes

Поток загрузки релиза

Layer / File(s) Summary
REST-клиент и разбор релизов
build.gradle.kts, src/main/java/com/github/_1c_syntax/utils/downloader/GitHubReleaseClient.java, src/test/java/com/github/_1c_syntax/utils/downloader/GitHubReleaseClientTest.java
GitHubReleaseClient получает stable и pre-release через REST API, обрабатывает пагинацию, draft-релизы, ассеты, заголовки, авторизацию, ошибки и прерывание потока; добавлены тесты и обновлены зависимости.
Распаковка ZIP и права лаунчера
src/main/java/com/github/_1c_syntax/utils/downloader/BslLanguageServerDownloader.java, src/test/java/com/github/_1c_syntax/utils/downloader/BslLanguageServerDownloaderTest.java
Распаковка выполняется через java.util.zip.ZipFile с UTF-8, защита от zip slip сохранена, а launcher получает OWNER_EXECUTE на POSIX; добавлен тест проверки исполняемого файла.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Downloader
  participant GitHubReleaseClient
  participant HttpClient
  participant GitHubREST
  Downloader->>GitHubReleaseClient: запрашивает последний релиз
  GitHubReleaseClient->>HttpClient: отправляет REST-запрос
  HttpClient->>GitHubREST: получает данные релиза
  GitHubREST-->>HttpClient: возвращает JSON и URL ассетов
  HttpClient-->>GitHubReleaseClient: передаёт ответ
  GitHubReleaseClient-->>Downloader: возвращает релиз и ассеты
Loading

Possibly related PRs

  • 1c-syntax/utils#72: изменяет POSIX-распаковку ZIP и установку исполняемых прав в BslLanguageServerDownloader.
  • 1c-syntax/utils#76: затрагивает поток загрузки и распаковки в BslLanguageServerDownloader.

Suggested reviewers: claude

Poem

Я, кролик, скачал релиз в лопух,
ZIP распаковал — ни пылинки вокруг.
Биту исполнения лапкой добавил,
REST-запрос к GitHub отправил.
Пусть тонкий загрузчик резво бежит!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 21.62% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Требования #81 выполнены: релизы и ассеты читаются через REST, а зависимость github-api удалена.
Out of Scope Changes check ✅ Passed Лишних изменений вне цели PR не видно; правки и тесты поддерживают переход на HttpClient, Gson и java.util.zip.
Title check ✅ Passed Заголовок точно отражает ключевое изменение: отказ от библиотеки github-api при обращении к GitHub API.
Description check ✅ Passed Описание напрямую соответствует изменениям в PR: переход на HttpClient/Gson и замену commons-compress на java.util.zip.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/github-api-no-extra-libs-4t37al

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Убирает зависимость org.apache.commons:commons-compress и притянутые ею
commons-codec/commons-io/commons-lang3 (~2.6 МБ). Распаковка архива сервера
переведена на java.util.zip.ZipFile.

java.util.zip не переносит unix-права из архива, поэтому бит исполнения на
POSIX-системах выставляется явно на файле, который и будет запущен
(binaryPath) — для native-image раскладки это единственный исполняемый файл
бандла. Добавлен тест на это (пропускается на Windows).

Итоговая рантайм-замкнутость downloader'а: slf4j-api, semver4j, jspecify.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwLcL3YofsPmKBJpcDoVor

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (4)
src/test/java/com/github/_1c_syntax/utils/downloader/JsonTest.java (2)

86-90: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Импортировать java.util.Arrays вместо полного имени в выражении.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/test/java/com/github/_1c_syntax/utils/downloader/JsonTest.java` around
lines 86 - 90, In JsonTest.parsesNestedArrays, import java.util.Arrays at the
file level and replace the fully qualified java.util.Arrays.asList reference
with Arrays.asList, leaving the test behavior unchanged.

94-113: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Добавить кейсы со знаком в \u-escape.

Список malformed не содержит "\u+041"/"\u-041" — именно они сейчас проходят разбор (см. Json.readUnicodeEscape).

💚 Дополнить набор
       "\"bad unicode \\u12GX\"",
+      "\"signed unicode \\u+041\"",
+      "\"signed unicode \\u-041\"",
       "\"truncated unicode \\u12",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/test/java/com/github/_1c_syntax/utils/downloader/JsonTest.java` around
lines 94 - 113, Добавьте в список malformed samples в тесте JsonTest кейсы со
знаком в Unicode escape, включая строки с "\u+041" и "\u-041". Убедитесь, что
эти некорректные JSON-строки проверяются как ошибки разбора через существующий
тестовый поток.
src/main/java/com/github/_1c_syntax/utils/downloader/GitHubReleaseClient.java (1)

167-172: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Сообщение об ошибке теряет тело ответа GitHub.

Для 403 непонятно, это rate limit, SAML-ограничение или неверный токен — GitHub кладёт причину в message тела. Стоит добавить усечённое тело в сообщение исключения (токен в теле не возвращается, так что утечки секретов нет).

♻️ Добавить фрагмент тела в диагностику
   private static String body(HttpResponse<String> response) throws IOException {
     if (response.statusCode() != 200) {
+      var details = response.body();
+      if (details != null && details.length() > 500) {
+        details = details.substring(0, 500);
+      }
       throw new IOException(
-        "GitHub API request " + response.request().uri() + " failed: HTTP " + response.statusCode());
+        "GitHub API request " + response.request().uri() + " failed: HTTP " + response.statusCode()
+          + " " + details);
     }
     return response.body();
   }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@src/main/java/com/github/_1c_syntax/utils/downloader/GitHubReleaseClient.java`
around lines 167 - 172, Обновите метод body(HttpResponse<String> response),
чтобы при ненулевом HTTP-статусе добавлять в IOException усечённый фрагмент
response.body() с причиной ошибки GitHub. Сохраните текущий URL и код статуса в
сообщении, ограничьте длину тела для диагностики и не изменяйте поведение
успешных ответов.
src/main/java/com/github/_1c_syntax/utils/downloader/Json.java (1)

179-204: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Парсер чисел мягче RFC 8259, а вложенный try стоит вынести.

isNumberChar разрешает ведущие нули (011L) и не проверяет структуру мантиссы/экспоненты, тогда как javadoc класса обещает «весь синтаксис RFC 8259». Для ответов GitHub это безопасно, но формулировку в javadoc лучше смягчить до «надмножество RFC 8259». Заодно — подсказка Sonar по строке 190: вложенный try просится в отдельный метод.

♻️ Вынести разбор целого литерала
-    try {
-      if (literal.indexOf('.') < 0 && literal.indexOf('e') < 0 && literal.indexOf('E') < 0) {
-        try {
-          return Long.parseLong(literal);
-        } catch (NumberFormatException outOfLongRange) {
-          return Double.parseDouble(literal);
-        }
-      }
-      return Double.parseDouble(literal);
-    } catch (NumberFormatException e) {
-      throw error("Invalid number '" + literal + "'");
-    }
+    try {
+      if (literal.indexOf('.') < 0 && literal.indexOf('e') < 0 && literal.indexOf('E') < 0) {
+        return parseIntegral(literal);
+      }
+      return Double.parseDouble(literal);
+    } catch (NumberFormatException e) {
+      throw error("Invalid number '" + literal + "'");
+    }
+  }
+
+  private static Number parseIntegral(String literal) {
+    try {
+      return Long.parseLong(literal);
+    } catch (NumberFormatException outOfLongRange) {
+      return Double.parseDouble(literal);
+    }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/main/java/com/github/_1c_syntax/utils/downloader/Json.java` around lines
179 - 204, Обновите javadoc класса Json, заменив обещание полного синтаксиса RFC
8259 на формулировку о поддержке его надмножества, поскольку readNumber и
isNumberChar допускают более мягкий формат. Вынесите вложенный try для разбора
целого литерала из readNumber в отдельный именованный метод, сохранив текущую
логику Long.parseLong с переходом на Double.parseDouble при выходе за диапазон.

Source: Linters/SAST tools

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@src/main/java/com/github/_1c_syntax/utils/downloader/GitHubReleaseClient.java`:
- Around line 116-128: Limit pagination in latestNonDraftRelease to a finite
maximum page count, stopping and returning null once that bound is reached while
preserving the existing draft filtering and empty-page behavior. Reuse an
existing page-limit constant if available; otherwise add a clearly named
constant near the other release settings.

In `@src/main/java/com/github/_1c_syntax/utils/downloader/Json.java`:
- Around line 165-177: Update readUnicodeEscape to validate that all four
characters in hex are hexadecimal digits before parsing, rejecting '+' and '-'
(and any other non-hex character) with the existing IOException path. Preserve
the exact four-character boundary check and only advance pos after successful
validation and conversion.

---

Nitpick comments:
In
`@src/main/java/com/github/_1c_syntax/utils/downloader/GitHubReleaseClient.java`:
- Around line 167-172: Обновите метод body(HttpResponse<String> response), чтобы
при ненулевом HTTP-статусе добавлять в IOException усечённый фрагмент
response.body() с причиной ошибки GitHub. Сохраните текущий URL и код статуса в
сообщении, ограничьте длину тела для диагностики и не изменяйте поведение
успешных ответов.

In `@src/main/java/com/github/_1c_syntax/utils/downloader/Json.java`:
- Around line 179-204: Обновите javadoc класса Json, заменив обещание полного
синтаксиса RFC 8259 на формулировку о поддержке его надмножества, поскольку
readNumber и isNumberChar допускают более мягкий формат. Вынесите вложенный try
для разбора целого литерала из readNumber в отдельный именованный метод,
сохранив текущую логику Long.parseLong с переходом на Double.parseDouble при
выходе за диапазон.

In `@src/test/java/com/github/_1c_syntax/utils/downloader/JsonTest.java`:
- Around line 86-90: In JsonTest.parsesNestedArrays, import java.util.Arrays at
the file level and replace the fully qualified java.util.Arrays.asList reference
with Arrays.asList, leaving the test behavior unchanged.
- Around line 94-113: Добавьте в список malformed samples в тесте JsonTest кейсы
со знаком в Unicode escape, включая строки с "\u+041" и "\u-041". Убедитесь, что
эти некорректные JSON-строки проверяются как ошибки разбора через существующий
тестовый поток.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 08edf374-1af8-4cd7-a671-0e90a8c5c65e

📥 Commits

Reviewing files that changed from the base of the PR and between a919def and 817bc99.

📒 Files selected for processing (7)
  • build.gradle.kts
  • src/main/java/com/github/_1c_syntax/utils/downloader/BslLanguageServerDownloader.java
  • src/main/java/com/github/_1c_syntax/utils/downloader/GitHubReleaseClient.java
  • src/main/java/com/github/_1c_syntax/utils/downloader/Json.java
  • src/test/java/com/github/_1c_syntax/utils/downloader/BslLanguageServerDownloaderTest.java
  • src/test/java/com/github/_1c_syntax/utils/downloader/GitHubReleaseClientTest.java
  • src/test/java/com/github/_1c_syntax/utils/downloader/JsonTest.java
💤 Files with no reviewable changes (1)
  • build.gradle.kts

Comment thread src/main/java/com/github/_1c_syntax/utils/downloader/GitHubReleaseClient.java Outdated
Comment thread src/main/java/com/github/_1c_syntax/utils/downloader/Json.java Outdated
claude added 2 commits July 25, 2026 10:31
- Json.readUnicodeEscape: разбор ровно четырёх hex-цифр через Character.digit
  вместо Integer.parseInt(hex, 16), который принимал знак (+/-) — escape со
  знаком теперь корректно отвергается как некорректный JSON.
- Json.readNumber: вложенный try вынесен в parseIntegral (замечание Sonar);
  javadoc смягчён — парсер чуть мягче RFC 8259 к числовым литералам.
- GitHubReleaseClient: пагинация pre-release ограничена MAX_RELEASES_PAGES,
  чтобы зеркало/прокси, бесконечно отдающее draft-страницу, не гоняло опрос
  до rate limit; текст ошибки HTTP дополнен усечённым телом ответа GitHub.
- Тесты на границу пагинации, тело в ошибке и escape со знаком.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwLcL3YofsPmKBJpcDoVor
Для такого узкого клиента (один репозиторий, валидный ответ GitHub) полноценный
JSON-парсер избыточен. Оба канала запрашиваются так, чтобы в ответе был ровно
один релиз:
- stable — releases/latest (как раньше);
- pre-release — releases?per_page=1&page=N: каждая страница = один релиз, draft'ы
  пропускаются переходом к следующей странице (граница MAX_RELEASES_PAGES).

Версия и ссылки на ассеты извлекаются регэкспом по самим download-ссылкам
https://github.com/<repo>/releases/download/<tag>/<file>: версия берётся из тега
в пути, имя ассета — из последнего сегмента. Поэтому произвольное содержимое поля
body релиза (markdown со скобками/кавычками) на результат не влияет — раньше
именно ради корректного скоупинга ассетов и был нужен структурный парсер.

Удалены Json.java и JsonTest.java. Добавлен тест на «отравленные» tag_name/body.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwLcL3YofsPmKBJpcDoVor

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@src/main/java/com/github/_1c_syntax/utils/downloader/GitHubReleaseClient.java`:
- Around line 70-77: Замените regex-извлечение в логике GitHubReleaseClient на
структурный разбор RFC 8259 JSON: извлекайте только поле draft и
browser_download_url из объектов assets[*], игнорируя ссылки в body и других
полях. Удалите или перестаньте использовать ASSET_URL и связанные с ним
совпадения; некорректный JSON должен обрабатываться как ошибка, а не приниматься
по найденной ссылке. Добавьте регрессионный тест для ссылки того же репозитория
в body перед настоящими ассетами.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 25b1b4ba-9182-42ab-8083-2373f2f11130

📥 Commits

Reviewing files that changed from the base of the PR and between 817bc99 and 84e2ab5.

📒 Files selected for processing (2)
  • src/main/java/com/github/_1c_syntax/utils/downloader/GitHubReleaseClient.java
  • src/test/java/com/github/_1c_syntax/utils/downloader/GitHubReleaseClientTest.java

Comment thread src/main/java/com/github/_1c_syntax/utils/downloader/GitHubReleaseClient.java Outdated
claude added 2 commits July 25, 2026 13:44
Ревью справедливо отметило: голая ссылка на старый ассет того же репозитория,
упомянутая в релиз-ноутах (body), попадала бы в ASSET_URL и задавала неверную
версию. Теперь совпадение привязано к ключу "browser_download_url", который в
корректном ответе GitHub есть только у объектов assets[*], — текст body уже не
совпадает. Регрессионный тест дополнен голой ссылкой на старый ассет в body.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwLcL3YofsPmKBJpcDoVor
По просьбе — переход на gson: лёгкий (~0.28 МБ, без транзитивов), OSGi-совместимый
JSON-парсер вместо самодельного разбора регэкспом. Возвращён естественный поток:
- pre-release снова берёт первый не-draft из списка releases (per_page=30) со
  строгим скоупингом ассетов к выбранному релизу, а не постранично по одному;
- версия берётся из tag_name, флаг draft и ассеты — из своих полей структурно,
  поэтому содержимое body на результат не влияет (нулевой остаточный риск);
- некорректный JSON — IOException, как ошибка обмена.

Транзитивный error_prone_annotations (только compile-time) исключён, чтобы не
попадал в рантайм-замкнутость: jspecify + slf4j-api + gson + semver4j.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwLcL3YofsPmKBJpcDoVor
}

@Test
@DisabledOnOs(OS.WINDOWS)

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Почему?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тест проверяет, что makeLauncherExecutable выставляет бит исполнения, а это поведение POSIX-only:

  • makeLauncherExecutable работает только когда файловая система поддерживает posix (константа POSIX в загрузчике). На Windows такого view нет — метод там no-op, выставлять/проверять нечего.
  • Files.isExecutable() на Windows не отражает POSIX-бит: он смотрит на ACL/расширение и для лаунчера (bsl-language-server.exe) вернёт true в любом случае. То есть на Windows ассерт isTrue() прошёл бы тривиально, ничего фактически не проверяя.

Поэтому тест ограничен POSIX-системами (Linux/macOS проходят), а не отключён везде. Если предпочтительнее — могу заменить на assumeTrue(POSIX) внутри теста, но @DisabledOnOs(WINDOWS) тут ровно тот же смысл и стандартнее.


Generated by Claude Code

Инвариант «возвращённый бинарь исполняемый» держится и на Windows (.exe
исполняется по расширению), поэтому нет причин отключать тест на Windows.
Убран @DisabledOnOs(WINDOWS), тест переименован в OS-нейтральный.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WwLcL3YofsPmKBJpcDoVor
@sonarqubecloud

Copy link
Copy Markdown

@nixel2007
nixel2007 merged commit c028e07 into master Jul 25, 2026
15 checks passed
@nixel2007
nixel2007 deleted the claude/github-api-no-extra-libs-4t37al branch July 25, 2026 16:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants