Nano Hash - криптовалюты, майнинг, программирование

API сервера Bitbucket: поиск базы слияния ветки

Резюме

Предлагает ли Bitbucket server (не Cloud) API эквивалент git merge-base branch1 branch2 для поиска общего предка двух ветвей?

Подробности

Мы хотели бы использовать API Bitbucket, чтобы определить, когда функциональная ветвь устарела, т. е. не была перебазирована или объединена с основной или какой-либо другой основной ветвью (разработка, выпуск и т. д.) в течение некоторого времени — скажем, недели. Я вижу следующую конечную точку REST

/rest/api/1.0/projects/EXAMPLE/repos/exampleRepo/commits/?since=release/1.2.3&until=bugfix'

Это может дать все коммиты not on release/1.2.3 в приведенном выше примере. В случае перебазированной ветки это нормально - я просто найду самую старую фиксацию для конкретной ветки, а ее родителем является база слияния.

Однако некоторые люди объединяют коммиты для обновления ветки функций (например, git merge release/1.2.3 в ветке функций), и лучшее, что я могу придумать, это:

  1. Разобрать сообщение фиксации для Merge branch 'release/1.2.3' of <repo> into bugfix, которое кажется хрупким, потому что кто-то может переписать сообщение фиксации слияния.
  2. Найдите самую последнюю фиксацию с двумя родителями, возьмите вторую (кажется, исходную ветку), найдите ее в исходной ветке и, если найдете, используйте ее как основу для определения возраста общего предка.

  • слияние ветки релиза не делает ветку не слишком старой? 20.10.2020
  • В вашем заголовке написано Bibucket server API: вы ищете решение только для API? или можно запускать обычные команды git на клоне репо? 20.10.2020
  • Я ищу решение только для API. Это для репо-приемника webhook, работающего в облегченном режиме. 20.10.2020

Ответы:


1

не пробовал, но по идее должно работать

Конечная точка

/rest/api/1.0/projects/EXAMPLE/repos/exampleRepo/commits/?since=release/1.2.3&until=bugfix'

будет работать и для не перебазированных веток. Эта конечная точка является эквивалентом

git rev-list bugfix ^release/1.2.3

и это именно то, что вам нужно.

bugfix             C1---C2---C3----C4
                  /       /     /
release/1.2.3 -R0----R1-------R2---R3

В этом случае

git rev-list bugfix ^release/1.2.3

вернется

C4
C3
C2
C1

Таким образом, родитель C1 будет базой для перебазирования. Не получится, если ветка bugfix будет объединена с release/1.2.3

bugfix             C1---C2---C3----C4--
                  /       /     /      \
release/1.2.3 -R0----R1-------R2---R3--R4--R5

В этом случае вам нужно будет найти R4 по

git rev-list ^bugfix release/1.2.3

or

/rest/api/1.0/projects/EXAMPLE/repos/exampleRepo/commits/?since=bugfix&until=release/1.2.3'

это должно вернуться

R5
R4
R3

Итак, вам нужно пройти через R5, R4 и R3 и проверить, является ли C4 родителем. Как только вы нашли R4, вы можете взять его родителей и вызвать конечную точку.

/rest/api/1.0/projects/EXAMPLE/repos/exampleRepo/commits/?since=R3&until=C4'
20.10.2020
  • Спасибо за развернутый ответ, скоро все проверю 22.10.2020

  • 2

    Возможно, обходным путем для поиска базы слияния является проверка истории release/1.2.3 :

    если история release/1.2.3 достаточно регулярна, возможно, вам будет лучше посмотреть на

    .../commits/?since=bugfix&until=release/1.2.3
    

    и взять родителя последнего коммита из этого списка.

    Я бы предложил добавить опцию --first-parent, но API, похоже, не предлагает этот флаг.

    20.10.2020
  • Спасибо! Я уточнил, что имел в виду под «слишком старым». Например, я перемещаю или сливаю родительскую ветку в какой-то период времени. 20.10.2020
  • Я не нашел способа получить базу слияния через API (но опять же, у меня нет большого опыта работы с API, я только читал документ); Я отредактировал свой ответ для альтернативного предложения. 20.10.2020
  • В любом случае, спасибо, что заглянули, я рассмотрю все это более подробно завтра. 20.10.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..