Привязать ветки и запросы на слияние к задаче

POST /repos/{owner}/{repo}/issues/{issue_number}/development

Описание

Метод POST привязывает указанные ветки и запросы на слияние к задаче. Метод не применяется к запросам на слияние.

Частичные ошибки привязки возвращаются в теле ответа в поле errors.

Метод применяется для связывания задачи с активной разработкой (ветками и запросами на слияние) для отслеживания прогресса.

Примечание: для pull request маршрут возвращает 422 Unprocessable Entity.

Токен

Требуется токен с правами на Запись для Репозитория.

Заголовки

ПараметрОбязательныйОписание
AcceptНетТип содержимого ответа. Рекомендуется установить значение application/vnd.gitverse.object+json;version=1
AuthorizationДаТокен доступа. Формат: Bearer <YOUR-TOKEN> или token <YOUR-TOKEN>
Content-TypeДаТип содержимого запроса: application/json

Параметры пути

ПараметрТипОбязательныйОписание
ownerstringДаВладелец репозитория (логин пользователя или имя организации)
repostringДаНазвание репозитория (без расширения .git)
issue_numberintegerДаНомер задачи

Тело запроса

ПолеОбязательноеТип и форматОписание
pulls или branchesДа, хотя бы одномассивОбъекты, которые нужно прикрепить.
pulls[].numberДа для элемента pullsцелое > 0Номер pull request.
pulls[].owner_name, pulls[].repo_nameНет, но только паройстрокиРепозиторий PR; без обоих полей используется текущий.
branches[].nameДа для элемента branchesстрокаИмя ветки.
branches[].owner_name, branches[].repo_nameНет, но только паройстрокиРепозиторий ветки; без обоих полей используется текущий.

Пример тела запроса со структурированными объектами:

{
  "pulls": [{ "number": 18 }],
  "branches": [{ "name": "feature/login", "owner_name": "acme", "repo_name": "demo" }]
}

Пример запроса

curl -X POST "https://api.gitverse.ru/repos/user/my-repo/issues/18/development" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/vnd.gitverse.object+json;version=1" \
  -H "Content-Type: application/json" \
  -d '{"branches": [{"name": "feature/issue-18"}], "pulls": [{"number": 42}]}'

Замените YOUR_TOKEN на ваш личный токен доступа.

Пример ответа (200 OK)

При успешном выполнении сервер возвращает обновленный объект связанной разработки:

{
    "pulls": [
        {
            "id": 6740,
            "url": "https://gitverse.ru/user_42/neo2/pulls/5",
            "number": 5,
            "user": {
                "id": 8960,
                "name": "Maria Kuznetsova",
                "login": "user_99",
                "type": "User",
                "bio": "",
                "email": null,
                "avatar_url": "https://gitverse.ru/avatars/5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8e5c7f5e3d5b0c4a9e6f1d2c3",
                "html_url": "https://gitverse.ru/user_99",
                "url": "https://api.gitverse.ru/users/user_99",
                "followers_url": "https://api.gitverse.ru/users/user_99/followers",
                "following_url": "https://api.gitverse.ru/users/user_99/following{/other_user}",
                "repos_url": "https://api.gitverse.ru/users/user_99/repos",
                "organizations_url": "https://api.gitverse.ru/users/user_99/orgs",
                "site_admin": false,
                "location": null,
                "is_verified": false,
                "followers": 0,
                "following": 0,
                "public_repos": 1,
                "stars_count": 0,
                "created_at": "2026-07-06T12:30:58Z",
                "updated_at": "2026-09-08T14:22:30Z"
            },
            "title": "Примеры синглтона на Java: приватный конструктор (с минусами) и лучшая реализация через enum",
            "body": "## Сводка\n\nРеализованы два варианта синглтона на Java: с приватным статическим конструктором и с использованием enum. Добавлены тесты, демонстрирующие уязвимость первого подхода через reflection и устойчивость enum-синглтона.\n\n## Изменения\n\n- src/main/java/src/SingletonPrivateConstructor.java — пример синглтона с приватным статическим конструктором (ленивая инициализация через classloader). В комментариях описаны все минусы подхода: уязвимость через reflection, уязвимость через десериализацию, сложность тестирования и жёсткая связность.\n- src/main/java/src/SingletonEnum.java — лучшая реализация синглтона через enum (по Joshua Bloch, Effective Java, Item 3). В комментариях объяснены преимущества: устойчивость к reflection, корректная работа с сериализацией, потокобезопасность, компактность.\n- test/java/src/SingletonTest.java — набор тестов, подтверждающих: идентичность обоих синглтонов при нормальном использовании, возможность обхода приватного конструктора через reflection, невозможность обхода enum-синглтона.\n\n## Проверка\n\nКоманды и результаты:\n- javac (javac 25.0.3) — компиляция прошла успешно, ошибок нет\n- java src.SingletonTest — все 4 теста выполнены:\n  1. Базовая работа — оба синглтона возвращают один экземпляр\n  2. Reflection-взлом private-конструктора — подтверждён (true, созданы два разных объекта)\n  3. Enum-устойчивость к reflection — подтверждена (NoSuchMethodException)\n  4. Идентичность getInstance — обе реализации возвращают один объект\n\n## Риски\n\n- Изменений в существующий код нет, risk минимальный.\n- Тесты используют reflection для демонстрации уязвимости; в production-коде это не используется.\n- Нет сборки (Maven/Gradle) — проверено прямой компиляцией javac.",
            "labels": [],
            "milestone": null,
            "assignee": null,
            "assignees": [],
            "requested_reviewers": [
                {
                    "id": 242,
                    "name": "",
                    "login": "user_42",
                    "type": "User",
                    "bio": "",
                    "email": "user_42@mail.org",
                    "avatar_url": "https://gitverse.ru/avatars/8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92",
                    "html_url": "https://gitverse.ru/user_42",
                    "url": "https://api.gitverse.ru/users/user_42",
                    "followers_url": "https://api.gitverse.ru/users/user_42/followers",
                    "following_url": "https://api.gitverse.ru/users/user_42/following{/other_user}",
                    "repos_url": "https://api.gitverse.ru/users/user_42/repos",
                    "organizations_url": "https://api.gitverse.ru/users/user_42/orgs",
                    "site_admin": false,
                    "location": null,
                    "is_verified": false,
                    "followers": 0,
                    "following": 0,
                    "public_repos": 7,
                    "stars_count": 0,
                    "created_at": "2025-05-21T08:07:22Z",
                    "updated_at": "2026-09-02T06:24:23Z"
                }
            ],
            "requested_teams": [],
            "state": "open",
            "locked": false,
            "draft": false,
            "comments": 6,
            "html_url": "https://gitverse.ru/user_42/neo2/pulls/5",
            "diff_url": "https://gitverse.ru/user_42/neo2/pulls/5.diff",
            "patch_url": "https://gitverse.ru/user_42/neo2/pulls/5.patch",
            "mergeable": true,
            "merged": false,
            "merged_at": null,
            "merge_commit_sha": null,
            "merged_by": null,
            "maintainer_can_modify": false,
            "additions": 90,
            "deletions": 0,
            "changed_files": 3,
            "review_comments": 1,
            "base": {
                "label": "master",
                "ref": "master",
                "sha": "756eb2fbea6a74a3119e03f71dd6025b10f15fbb",
                "repo_id": 41662,
                "repo": {
                    "id": 41662,
                    "name": "neo2",
                    "full_name": "user_42/neo2",
                    "owner": {
                        "login": "user_42",
                        "id": 242,
                        "avatar_url": "https://gitverse.ru/avatars/8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92",
                        "url": "https://api.gitverse.ru/users/user_42",
                        "html_url": "https://gitverse.ru/user_42",
                        "followers_url": "https://api.gitverse.ru/users/user_42/followers",
                        "following_url": "https://api.gitverse.ru/users/user_42/following{/other_user}",
                        "organizations_url": "https://api.gitverse.ru/users/user_42/orgs",
                        "repos_url": "https://api.gitverse.ru/users/user_42/repos",
                        "type": "User",
                        "user_view_type": "public",
                        "site_admin": false
                    },
                    "private": false,
                    "html_url": "https://gitverse.ru/user_42/neo2",
                    "description": null,
                    "fork": false,
                    "forks": 0,
                    "forks_count": 0,
                    "language": null,
                    "stargazers_count": 0,
                    "watchers": 0,
                    "watchers_count": 0,
                    "size": 30,
                    "default_branch": "master",
                    "open_issues": 4,
                    "open_issues_count": 4,
                    "is_template": false,
                    "topics": [],
                    "archived": false,
                    "disabled": false,
                    "visibility": "public",
                    "pushed_at": "2026-08-12T16:07:39Z",
                    "has_issues": true,
                    "has_wiki": true,
                    "has_projects": true,
                    "has_pages": false,
                    "has_downloads": false,
                    "allow_forking": true,
                    "homepage": null,
                    "license": null,
                    "created_at": "2026-08-04T10:14:49Z",
                    "updated_at": "2026-09-07T13:26:02Z",
                    "allow_merge_commit": true,
                    "allow_squash_merge": true,
                    "allow_rebase_merge": true,
                    "delete_branch_on_merge": false,
                    "clone_url": "https://gitverse.ru/user_42/neo2.git",
                    "ssh_url": "git@gitverse.ru:user_42/neo2.git",
                    "mirror_url": null,
                    "url": "https://api.gitverse.ru/repos/user_42/neo2",
                    "contents_url": "https://api.gitverse.ru/repos/user_42/neo2/contents/{+path}",
                    "forks_url": "https://api.gitverse.ru/repos/user_42/neo2/forks",
                    "hooks_url": "https://api.gitverse.ru/repos/user_42/neo2/hooks",
                    "issue_comment_url": "https://api.gitverse.ru/repos/user_42/neo2/issues/comments{/number}",
                    "issues_url": "https://api.gitverse.ru/repos/user_42/neo2/issues{/number}",
                    "languages_url": "https://api.gitverse.ru/repos/user_42/neo2/languages",
                    "pulls_url": "https://api.gitverse.ru/repos/user_42/neo2/pulls{/number}",
                    "permissions": {
                        "pull": true,
                        "push": true,
                        "admin": true
                    },
                    "role_name": "admin",
                    "template_repository": null,
                    "parent": null
                }
            },
            "head": {
                "label": "java-singleton",
                "ref": "java-singleton",
                "sha": "6c9042189bcf45b2828f7b7bb6e860476613100d",
                "repo_id": 41662,
                "repo": {
                    "id": 41662,
                    "name": "neo2",
                    "full_name": "user_42/neo2",
                    "owner": {
                        "login": "user_42",
                        "id": 242,
                        "avatar_url": "https://gitverse.ru/avatars/8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92",
                        "url": "https://api.gitverse.ru/users/user_42",
                        "html_url": "https://gitverse.ru/user_42",
                        "followers_url": "https://api.gitverse.ru/users/user_42/followers",
                        "following_url": "https://api.gitverse.ru/users/user_42/following{/other_user}",
                        "organizations_url": "https://api.gitverse.ru/users/user_42/orgs",
                        "repos_url": "https://api.gitverse.ru/users/user_42/repos",
                        "type": "User",
                        "user_view_type": "public",
                        "site_admin": false
                    },
                    "private": false,
                    "html_url": "https://gitverse.ru/user_42/neo2",
                    "description": null,
                    "fork": false,
                    "forks": 0,
                    "forks_count": 0,
                    "language": null,
                    "stargazers_count": 0,
                    "watchers": 0,
                    "watchers_count": 0,
                    "size": 30,
                    "default_branch": "master",
                    "open_issues": 4,
                    "open_issues_count": 4,
                    "is_template": false,
                    "topics": [],
                    "archived": false,
                    "disabled": false,
                    "visibility": "public",
                    "pushed_at": "2026-08-12T16:07:39Z",
                    "has_issues": true,
                    "has_wiki": true,
                    "has_projects": true,
                    "has_pages": false,
                    "has_downloads": false,
                    "allow_forking": true,
                    "homepage": null,
                    "license": null,
                    "created_at": "2026-08-04T10:14:49Z",
                    "updated_at": "2026-09-07T13:26:02Z",
                    "allow_merge_commit": true,
                    "allow_squash_merge": true,
                    "allow_rebase_merge": true,
                    "delete_branch_on_merge": false,
                    "clone_url": "https://gitverse.ru/user_42/neo2.git",
                    "ssh_url": "git@gitverse.ru:user_42/neo2.git",
                    "mirror_url": null,
                    "url": "https://api.gitverse.ru/repos/user_42/neo2",
                    "contents_url": "https://api.gitverse.ru/repos/user_42/neo2/contents/{+path}",
                    "forks_url": "https://api.gitverse.ru/repos/user_42/neo2/forks",
                    "hooks_url": "https://api.gitverse.ru/repos/user_42/neo2/hooks",
                    "issue_comment_url": "https://api.gitverse.ru/repos/user_42/neo2/issues/comments{/number}",
                    "issues_url": "https://api.gitverse.ru/repos/user_42/neo2/issues{/number}",
                    "languages_url": "https://api.gitverse.ru/repos/user_42/neo2/languages",
                    "pulls_url": "https://api.gitverse.ru/repos/user_42/neo2/pulls{/number}",
                    "permissions": {
                        "pull": true,
                        "push": true,
                        "admin": true
                    },
                    "role_name": "admin",
                    "template_repository": null,
                    "parent": null
                }
            },
            "created_at": "2026-08-12T15:58:09Z",
            "updated_at": "2026-08-20T07:38:23Z",
            "closed_at": null
        }
    ],
    "branches": [
        {
            "name": "java-singleton",
            "commit": {
                "url": "https://gitverse.ru/public/api/repos/user_42/neo2/commits/6c9042189bcf45b2828f7b7bb6e860476613100d",
                "sha": "6c9042189bcf45b2828f7b7bb6e860476613100d",
                "html_url": "https://gitverse.ru/user_42/neo2/commit/6c9042189bcf45b2828f7b7bb6e860476613100d",
                "created": "2026-08-12T16:07:34Z"
            },
            "protected": false,
            "repository": {
                "id": 41662,
                "name": "neo2",
                "full_name": "user_42/neo2",
                "owner": {
                    "login": "user_42",
                    "id": 242,
                    "avatar_url": "https://gitverse.ru/avatars/8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92",
                    "url": "https://api.gitverse.ru/users/user_42",
                    "html_url": "https://gitverse.ru/user_42",
                    "followers_url": "https://api.gitverse.ru/users/user_42/followers",
                    "following_url": "https://api.gitverse.ru/users/user_42/following{/other_user}",
                    "organizations_url": "https://api.gitverse.ru/users/user_42/orgs",
                    "repos_url": "https://api.gitverse.ru/users/user_42/repos",
                    "type": "User",
                    "user_view_type": "public",
                    "site_admin": false
                },
                "private": false,
                "html_url": "https://gitverse.ru/user_42/neo2",
                "description": null,
                "fork": false,
                "forks": 0,
                "forks_count": 0,
                "language": "Text",
                "stargazers_count": 0,
                "watchers": 0,
                "watchers_count": 0,
                "size": 30,
                "default_branch": "master",
                "open_issues": 4,
                "open_issues_count": 4,
                "is_template": false,
                "topics": [],
                "archived": false,
                "disabled": false,
                "visibility": "public",
                "pushed_at": "2026-08-12T16:07:39Z",
                "has_issues": true,
                "has_wiki": true,
                "has_projects": true,
                "has_pages": false,
                "has_downloads": false,
                "allow_forking": true,
                "homepage": null,
                "license": null,
                "created_at": "2026-08-04T10:14:49Z",
                "updated_at": "2026-09-07T13:26:02Z",
                "allow_merge_commit": true,
                "allow_squash_merge": true,
                "allow_rebase_merge": true,
                "delete_branch_on_merge": false,
                "clone_url": "https://gitverse.ru/user_42/neo2.git",
                "ssh_url": "git@gitverse.ru:user_42/neo2.git",
                "mirror_url": null,
                "url": "https://api.gitverse.ru/repos/user_42/neo2",
                "contents_url": "https://api.gitverse.ru/repos/user_42/neo2/contents/{+path}",
                "forks_url": "https://api.gitverse.ru/repos/user_42/neo2/forks",
                "hooks_url": "https://api.gitverse.ru/repos/user_42/neo2/hooks",
                "issue_comment_url": "https://api.gitverse.ru/repos/user_42/neo2/issues/comments{/number}",
                "issues_url": "https://api.gitverse.ru/repos/user_42/neo2/issues{/number}",
                "languages_url": "https://api.gitverse.ru/repos/user_42/neo2/languages",
                "pulls_url": "https://api.gitverse.ru/repos/user_42/neo2/pulls{/number}",
                "permissions": {
                    "pull": true,
                    "push": true,
                    "admin": true
                },
                "role_name": "admin",
                "template_repository": null,
                "parent": null
            }
        }
    ]
}

Не найденные или недоступные объекты не отменяют операцию: они перечисляются в errors.pulls или errors.branches как Not Found.

Структура ответа

Ответ — объект Development (связанная разработка). Полная структура описана в графе объектов, раздел «Объект Development».

На корневом уровне объект содержит:

ПолеТипОписание
pullsarrayСвязанные запросы на слияние (см. PullRequest)
branchesarrayСвязанные ветки (см. Branch)

Коды ответа

КодСтатусОписание
200OKВетки и PR привязаны к задаче.
400Bad RequestНекорректные параметры запроса.
404Not FoundЗадача или репозиторий не найдены.
422Unprocessable EntityОшибка валидации данных (в т.ч. вызов для pull request).
500Internal Server ErrorВнутренняя ошибка сервера GitVerse.

Пример тела ошибки

При ответе 400 тело ответа имеет следующий вид:

{
  "error": {
    "code": "BAD_REQUEST",
    "documentation_url": "https://gitverse.ru/docs/developers/public-api/",
    "message": "The request format is invalid",
    "status": 400
  }
}