API Changelog

Compatibility Policy

Bitbucket Data Center aims to maintain API compatibility between minor releases (e.g. between 7.0 and 7.1). Methods and classes marked as deprecated will be removed in the next major release. For example, methods marked as deprecated in Bitbucket Data Center 8.1 or 8.2 will be removed in Bitbucket Data Center 9.0.

Bitbucket Data Center 9.4

Branch permissions

Bitbucket 9.4 adds a new type of branch permission to restrict creation of new branches.

Java API changes

  • Added new value NO_CREATES in enum com.atlassian.bitbucket.repository.ref.restriction.RefRestrictionType

REST API changes

  • "type" field now supports a new value "no-creates" in the request body for the following REST APIs:
    • POST /rest/branch-permissions/latest/projects/{projectKey}/restrictions
    • POST /rest/branch-permissions/latest/projects/{projectKey}/repos/{repositorySlug}/restrictions
  • "type" field can now have a new value "no-creates" in the response body for the following REST APIs:
    • GET /rest/branch-permissions/latest/projects/{projectKey}/restrictions
    • GET /rest/branch-permissions/latest/projects/{projectKey}/restrictions/{id}
    • GET /rest/branch-permissions/latest/projects/{projectKey}/repos/{repositorySlug}/restrictions
    • GET /rest/branch-permissions/latest/projects/{projectKey}/repos/{repositorySlug}/restrictions/{id}

User email updates

By default, 9.4 requires the user's password when a user updates their own email. When the ENFORCE_PASSWORD_USER_EMAIL_UPDATE standard feature is enabled, then updating a user's email via UserService or the /rest/api/latest/users REST API will require the user's current password, and the update will be rejected if the correct password is not provided.

Java API changes:

  • Added a new value ENFORCE_PASSWORD_USER_EMAIL_UPDATE in StandardFeature enum
  • Deprecated UserService#updateUser(String displayName, String emailAddress) for removal in 10.0
  • Added new method UserService#updateUser(String displayName, String emailAddress, String password)
  • Added new method NavBuilder.UserAccount#email

Modification in existing endpoints:

  • Added password field to PUT /rest/api/latest/users

Bitbucket Data Center 9.3

Two-step verification (2SV)

Bitbucket Data Center 9.3 has implemented two-step verification (2SV), which includes new REST API for authentication and a new login screen. For plugins that interact with the pre-existing login screen, it is worth noting that compatibility may break and changes will be required.

Some key REST API additions worth calling out:

  • POST /tsv/latest/authenticate authenticates as the given user
  • POST /tsv/latest/authenticate/totp-code authenticates as the given user using a TOTP code
  • POST /tsv/latest/authenticate/recovery-code authenticates as the given user using a recovery code
  • POST /tsv/latest/status retrieves the status of two-step verification for the authenticated user
  • POST /tsv/latest/elevate-permissions/totp elevates permissions for the authenticated user using a TOTP code
  • POST /tsv/latest/elevate-permissions/recovery-code elevates permissions for the authenticated user using a recovery code
  • POST /tsv/latest/elevate-permissions/password elevates permissions for the authenticated user using a password
  • GET /authconfig/latest/login-options returns a list of available login options, which contains details about the metadata required for the login page

All new REST API related to 2SV and the new login screen can be found under 'Authentication'.

File Store SPI

Bitbucket Data Center 9.3 includes new SPI to allow plugins to implement a file store that can be used to store Git LFS objects, and in future possibly other files. It permits Bitbucket to generate pre-signed URLs for file uploads and downloads to/from what is typically going to be an external file store such as AWS S3 (which Bitbucket provides an implementation for).

Plugins intending the implement a file store must implement the com.atlassian.bitbucket.filestore.PluginFileStore interface.

For the file store implementation to be picked up they have to be defined as a com.atlassian.bitbucket.filestore.PluginFileStoreModuleDescriptor module in the plugin's atlassian-plugin.xml file. See the module description for <file-store> for more information.

Multiline suggestions

Java API changes:

  • Added new class com.atlassian.bitbucket.comment.LineNumberRange
  • Added new methods getMultilineDestinationRange and getMultilineSourceRange in com.atlassian.bitbucket.comment.CommentThreadDiffAnchor

Modification in existing endpoints:

Added multilineSpan fields for comments that span multiple lines in the following endpoints:

  • GET /rest/project/{projectKey}/repos/{repositorySlug}/commits/{commitHash}/comments
  • GET /rest/project/{projectKey}/repos/{repositorySlug}/commits/{commitHash}/comments/{commentId}
  • GET /rest/project/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/activities
  • GET /rest/project/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/comments
  • GET /rest/project/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/comments/{commentId}

Mockito 5.x upgrade

Although the bitbucket-parent Maven POM file is not considered stable API, an upgrade to the version of the Mockito mocking framework is worth noting. Plugins that either use bitbucket-parent as their parent POM or import it for the purposes of "dependencyManagement" may see changes to test code as the specific Mockito version dependency may be inherited from bitbucket-parent.

Note: The Mockito framework is a test dependency only and its upgrade will not impact a plugin's compatibility with Bitbucket Data Center.

The upgrade from Mockito 4.x to 5.x involves a number of breaking changes. Plugin developers are encouraged to update unit tests where Mockito is used, and can find more information in the Mockito 5 release notes.

Plugin developers who wish to depend on the bitbucket-parent artifact at 9.3 or later, but still wish to continue using Mockito 4.x, can override the dependency in the POM for their own plugin.

Bitbucket Data Center 9.2

Multiline comments

Java API changes:

  • Added new method isMultilineAnchor, getMultilineStartLine and getMultilineStartLineType in com.atlassian.bitbucket.comment.CommentThreadDiffAnchor

Modification in existing endpoints:

Added multilineMarker fields for comments that span multiple lines in the following endpoints:

  • GET /rest/project/{projectKey}/repos/{repositorySlug}/commits/{commitHash}/comments
  • GET /rest/project/{projectKey}/repos/{repositorySlug}/commits/{commitHash}/comments/{commentId}
  • GET /rest/project/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/activities
  • GET /rest/project/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/comments
  • GET /rest/project/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/comments/{commentId}

Mirroring (Mirror)

Added new endpoint to get out-of-sync repositories

  • GET /rest/mirroring/latest/supportInfo/out-of-sync-repos/content

Added new endpoints to find out which mirror farm node is holding a lock for a given repository, or all currently held locks in the farm

  • GET /rest/mirroring/latest/supportInfo/projects/{projectKey}/repos/{repositorySlug}/repo-lock-owner
  • GET /rest/mirroring/latest/supportInfo/repo-lock-owners

System Maintenance

Enabled cluster node information endpoint on mirrors

  • GET /rest/api/latest/admin/cluster

Bitbucket Data Center 9.1

Diff Stats Summary

New REST endpoints to get diff stats summary

  • GET /rest/project/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/diff-stats-summary
  • GET /rest/project/{projectKey}/repos/{repositorySlug}/commits/{commitId}/diff-stats-summary
  • GET /rest/project/{projectKey}/repos/{repositorySlug}/compare/diff-stats-summary

Mirroring (Mirror)

Added new endpoints for starting and ending a rolling upgrade:

  • POST /rest/mirroring/latest/zdu/start
  • POST /rest/mirroring/latest/zdu/end

Modifications in existing endpoints:

  • Added contentUpdatedDate and metadataUpdatedDate fields for content and metadata hashes respectively, in the following endpoints:
    • GET /rest/mirroring/latest/repo-hashes
    • GET /rest/mirroring/latest/repo-hashes/content
    • GET /rest/mirroring/latest/repo-hashes/metadata

Bitbucket Data Center 9.0

Java 17 is required

Bitbucket 9 requires Java 17. Support for running on Java 8 and 11 has been removed.

Similarly, apps developed for Bitbucket 9 will need to use a Java 17 JDK.

Platform 7 upgrade

Bitbucket 9.0 includes an upgrade to Atlassian Data Center Platform 7.0. This upgrade puts us in a better position to respond to security changes with reduced disruption and breaking changes for your apps.

As part of this work, we have upgraded numerous Atlassian and third-party components to benefit from the latest security patches and bug fixes.

The Prepare your Data Center app for Platform 7 page contains an extensive list of the changes in Platform 7 and guides on how to migrate your app to Platform 7.

Deprecated Java APIs removed

We have removed Interfaces, classes, and methods in the Bitbucket Java API that were marked as deprecated in Bitbucket 8.x.

Apps that use any of these interfaces generally won’t build with Bitbucket 9.0.

Precompiled apps that used any of the removed interfaces will fail to install or run in Bitbucket 9.0, typically with java.lang.NoSuchMethodError or java.lang.ClassNotFoundExceptions.

Removed third-party API packages

Platform 7 and Bitbucket 9.0 have removed the ability for your apps to load many third-party libraries, as well as a few Atlassian-specific libraries, from the Bitbucket application. This group of libraries are called "gray APIs", as they were never intended to become part of the product’s API.

You will need to start bundling your own copies of these libraries with your apps if you wish to continue using them.

This change will allow us to improve Bitbucket more frequently without breaking your app or requiring you to do significant testing and rework when things change.

The following packages are no longer available to apps from Bitbucket. Apps that still wish to use these classes can bundle the classes within their app:

1
2
assets
ch.qos.logback.classic.db.names
ch.qos.logback.classic.jmx
com.atlassian.analytics.client
com.atlassian.analytics.client.api
com.atlassian.analytics.client.api.browser
com.atlassian.analytics.client.api.mobile
com.atlassian.annotations.tenancy
com.atlassian.applinks.application
com.atlassian.applinks.application.bamboo
com.atlassian.applinks.application.bitbucket
com.atlassian.applinks.application.confluence
com.atlassian.applinks.application.crowd
com.atlassian.applinks.application.fecru
com.atlassian.applinks.application.generic
com.atlassian.applinks.application.jira
com.atlassian.applinks.application.refapp
com.atlassian.applinks.application.subversion
com.atlassian.applinks.core
com.atlassian.applinks.core.auth
com.atlassian.applinks.core.common
com.atlassian.applinks.core.concurrent
com.atlassian.applinks.core.event
com.atlassian.applinks.core.link
com.atlassian.applinks.core.manifest
com.atlassian.applinks.core.oauth2
com.atlassian.applinks.core.plugin
com.atlassian.applinks.core.plugin.condition
com.atlassian.applinks.core.property
com.atlassian.applinks.core.refapp
com.atlassian.applinks.core.rest
com.atlassian.applinks.core.rest.auth
com.atlassian.applinks.core.rest.client
com.atlassian.applinks.core.rest.context
com.atlassian.applinks.core.rest.exceptionmapper
com.atlassian.applinks.core.rest.model
com.atlassian.applinks.core.rest.model.adapter
com.atlassian.applinks.core.rest.permission
com.atlassian.applinks.core.rest.ui
com.atlassian.applinks.core.rest.util
com.atlassian.applinks.core.upgrade
com.atlassian.applinks.core.util
com.atlassian.applinks.core.v1.rest
com.atlassian.applinks.core.v2.rest
com.atlassian.applinks.core.webfragment
com.atlassian.applinks.internal.application
com.atlassian.applinks.internal.common
com.atlassian.applinks.internal.common.application
com.atlassian.applinks.internal.common.applink
com.atlassian.applinks.internal.common.auth.oauth
com.atlassian.applinks.internal.common.auth.oauth.util
com.atlassian.applinks.internal.common.auth.trusted
com.atlassian.applinks.internal.common.cache
com.atlassian.applinks.internal.common.capabilities
com.atlassian.applinks.internal.common.docs
com.atlassian.applinks.internal.common.event
com.atlassian.applinks.internal.common.exception
com.atlassian.applinks.internal.common.i18n
com.atlassian.applinks.internal.common.json
com.atlassian.applinks.internal.common.lang
com.atlassian.applinks.internal.common.net
com.atlassian.applinks.internal.common.permission
com.atlassian.applinks.internal.common.rest.interceptor
com.atlassian.applinks.internal.common.rest.model.applink
com.atlassian.applinks.internal.common.rest.model.oauth
com.atlassian.applinks.internal.common.rest.model.status
com.atlassian.applinks.internal.common.rest.util
com.atlassian.applinks.internal.common.status.oauth
com.atlassian.applinks.internal.common.web
com.atlassian.applinks.internal.common.web.condition
com.atlassian.applinks.internal.common.web.data
com.atlassian.applinks.internal.common.web.soy
com.atlassian.applinks.internal.rest
com.atlassian.applinks.internal.rest.applink
com.atlassian.applinks.internal.rest.applink.data
com.atlassian.applinks.internal.rest.capabilities
com.atlassian.applinks.internal.rest.client
com.atlassian.applinks.internal.rest.feature
com.atlassian.applinks.internal.rest.interceptor
com.atlassian.applinks.internal.rest.migration
com.atlassian.applinks.internal.rest.model
com.atlassian.applinks.internal.rest.model.applink
com.atlassian.applinks.internal.rest.model.auth.compatibility
com.atlassian.applinks.internal.rest.model.capabilities
com.atlassian.applinks.internal.rest.model.migration
com.atlassian.applinks.internal.rest.model.status
com.atlassian.applinks.internal.rest.status
com.atlassian.applinks.internal.status
com.atlassian.applinks.internal.status.error
com.atlassian.applinks.internal.status.oauth
com.atlassian.applinks.internal.status.oauth.remote
com.atlassian.applinks.internal.status.remote
com.atlassian.applinks.internal.status.support
com.atlassian.applinks.ui
com.atlassian.applinks.ui.admin
com.atlassian.applinks.ui.admin.applinkwizard
com.atlassian.applinks.ui.admin.confluence
com.atlassian.applinks.ui.auth
com.atlassian.applinks.ui.confluence
com.atlassian.applinks.ui.validators
com.atlassian.applinks.ui.velocity
com.atlassian.audit.core
com.atlassian.audit.core.ecosystem
com.atlassian.audit.core.impl.broker
com.atlassian.audit.core.impl.service
com.atlassian.audit.core.spi
com.atlassian.audit.core.spi.service
com.atlassian.audit.spi.entity
com.atlassian.audit.spi.feature
com.atlassian.audit.spi.lookup
com.atlassian.audit.spi.migration
com.atlassian.audit.spi.permission
com.atlassian.bamboo
com.atlassian.bitbucket.access.tokens
com.atlassian.bitbucket.branch.automerge
com.atlassian.bitbucket.dmz.admin.banner
com.atlassian.bitbucket.dmz.annotation
com.atlassian.bitbucket.dmz.auditing
com.atlassian.bitbucket.dmz.autodecline
com.atlassian.bitbucket.dmz.build
com.atlassian.bitbucket.dmz.build.operations
com.atlassian.bitbucket.dmz.build.server
com.atlassian.bitbucket.dmz.build.status
com.atlassian.bitbucket.dmz.build.status.dao
com.atlassian.bitbucket.dmz.build.status.legacy
com.atlassian.bitbucket.dmz.cluster
com.atlassian.bitbucket.dmz.cluster.exception
com.atlassian.bitbucket.dmz.codeowners
com.atlassian.bitbucket.dmz.comment
com.atlassian.bitbucket.dmz.commit
com.atlassian.bitbucket.dmz.concurrent
com.atlassian.bitbucket.dmz.deployment
com.atlassian.bitbucket.dmz.deployments
com.atlassian.bitbucket.dmz.deployments.event
com.atlassian.bitbucket.dmz.discovery
com.atlassian.bitbucket.dmz.emoticon
com.atlassian.bitbucket.dmz.features
com.atlassian.bitbucket.dmz.git.lfs
com.atlassian.bitbucket.dmz.hook.script
com.atlassian.bitbucket.dmz.idx
com.atlassian.bitbucket.dmz.markup.renderer
com.atlassian.bitbucket.dmz.mdc
com.atlassian.bitbucket.dmz.mesh
com.atlassian.bitbucket.dmz.migration
com.atlassian.bitbucket.dmz.mirror
com.atlassian.bitbucket.dmz.mirror.event
com.atlassian.bitbucket.dmz.mirror.hash
com.atlassian.bitbucket.dmz.monitoring
com.atlassian.bitbucket.dmz.notification
com.atlassian.bitbucket.dmz.notification.commit
com.atlassian.bitbucket.dmz.notification.pull
com.atlassian.bitbucket.dmz.notification.pull.custom
com.atlassian.bitbucket.dmz.notification.repository
com.atlassian.bitbucket.dmz.permission
com.atlassian.bitbucket.dmz.policy
com.atlassian.bitbucket.dmz.process
com.atlassian.bitbucket.dmz.pull
com.atlassian.bitbucket.dmz.pull.automerge
com.atlassian.bitbucket.dmz.pull.template
com.atlassian.bitbucket.dmz.ratelimit
com.atlassian.bitbucket.dmz.repository
com.atlassian.bitbucket.dmz.repositorymanagement
com.atlassian.bitbucket.dmz.request
com.atlassian.bitbucket.dmz.resilience
com.atlassian.bitbucket.dmz.secretscanning
com.atlassian.bitbucket.dmz.secretscanning.event
com.atlassian.bitbucket.dmz.secretscanning.scan
com.atlassian.bitbucket.dmz.secretscanning.validation
com.atlassian.bitbucket.dmz.server
com.atlassian.bitbucket.dmz.settingsrestriction
com.atlassian.bitbucket.dmz.signature.verification
com.atlassian.bitbucket.dmz.ssh
com.atlassian.bitbucket.dmz.suggestion
com.atlassian.bitbucket.dmz.systemsigning
com.atlassian.bitbucket.dmz.throttle
com.atlassian.bitbucket.dmz.upgrade.async
com.atlassian.bitbucket.dmz.upm
com.atlassian.bitbucket.dmz.user
com.atlassian.bitbucket.dmz.web
com.atlassian.bitbucket.dmz.x509
com.atlassian.bitbucket.dmz.x509.event
com.atlassian.bitbucket.dmz.xsrf
com.atlassian.bitbucket.mirroring.upstream
com.atlassian.bitbucket.rest
com.atlassian.bitbucket.rest.activity
com.atlassian.bitbucket.rest.annotation
com.atlassian.bitbucket.rest.attachment
com.atlassian.bitbucket.rest.auth
com.atlassian.bitbucket.rest.autodecline
com.atlassian.bitbucket.rest.avatar
com.atlassian.bitbucket.rest.build
com.atlassian.bitbucket.rest.cluster
com.atlassian.bitbucket.rest.comment
com.atlassian.bitbucket.rest.commit
com.atlassian.bitbucket.rest.content
com.atlassian.bitbucket.rest.dashboard
com.atlassian.bitbucket.rest.deployment
com.atlassian.bitbucket.rest.enrich
com.atlassian.bitbucket.rest.exception
com.atlassian.bitbucket.rest.fragment
com.atlassian.bitbucket.rest.hook.repository
com.atlassian.bitbucket.rest.hook.script
com.atlassian.bitbucket.rest.job
com.atlassian.bitbucket.rest.label
com.atlassian.bitbucket.rest.license
com.atlassian.bitbucket.rest.log
com.atlassian.bitbucket.rest.mail
com.atlassian.bitbucket.rest.markup
com.atlassian.bitbucket.rest.mesh
com.atlassian.bitbucket.rest.migration
com.atlassian.bitbucket.rest.permission
com.atlassian.bitbucket.rest.project
com.atlassian.bitbucket.rest.property
com.atlassian.bitbucket.rest.pull
com.atlassian.bitbucket.rest.pull.automerge
com.atlassian.bitbucket.rest.pull.reviewer
com.atlassian.bitbucket.rest.ratelimit
com.atlassian.bitbucket.rest.repository
com.atlassian.bitbucket.rest.scm
com.atlassian.bitbucket.rest.scope
com.atlassian.bitbucket.rest.secretscanning
com.atlassian.bitbucket.rest.server
com.atlassian.bitbucket.rest.settingsrestriction
com.atlassian.bitbucket.rest.suggestion
com.atlassian.bitbucket.rest.user
com.atlassian.bitbucket.rest.util
com.atlassian.bitbucket.rest.validation
com.atlassian.bitbucket.rest.x509
com.atlassian.bitbucket.scm.cache.internal
com.atlassian.bitbucket.scm.cache.internal.event
com.atlassian.bitbucket.scm.cache.internal.jmx
com.atlassian.bitbucket.scm.cache.internal.mesh
com.atlassian.bitbucket.server.swagger.annotations
com.atlassian.bitbucket.ssh.util
com.atlassian.botocss
com.atlassian.business.insights.api
com.atlassian.business.insights.api.cluster
com.atlassian.business.insights.api.config
com.atlassian.business.insights.api.customfields
com.atlassian.business.insights.api.customfields.model
com.atlassian.business.insights.api.dataset
com.atlassian.business.insights.api.exceptions
com.atlassian.business.insights.api.extract
com.atlassian.business.insights.api.filter
com.atlassian.business.insights.api.pagination
com.atlassian.business.insights.api.schema
com.atlassian.business.insights.api.user
com.atlassian.business.insights.api.writer
com.atlassian.ccev
com.atlassian.chaperone.obr
com.atlassian.clover
com.atlassian.clover.ant
com.atlassian.clover.ant.groovy
com.atlassian.clover.ant.taskdefs
com.atlassian.clover.ant.tasks
com.atlassian.clover.ant.tasks.testng
com.atlassian.clover.ant.types
com.atlassian.clover.api
com.atlassian.clover.api.ci
com.atlassian.clover.api.command
com.atlassian.clover.api.instrumentation
com.atlassian.clover.api.optimization
com.atlassian.clover.api.registry
com.atlassian.clover.cfg
com.atlassian.clover.cfg.instr
com.atlassian.clover.cfg.instr.java
com.atlassian.clover.cmdline
com.atlassian.clover.context
com.atlassian.clover.instr
com.atlassian.clover.instr.java
com.atlassian.clover.instr.tests
com.atlassian.clover.instr.tests.naming
com.atlassian.clover.io.tags
com.atlassian.clover.lang
com.atlassian.clover.model
com.atlassian.clover.optimization
com.atlassian.clover.recorder
com.atlassian.clover.recorder.junit
com.atlassian.clover.recorder.pertest
com.atlassian.clover.recorder.spock
com.atlassian.clover.registry
com.atlassian.clover.registry.entities
com.atlassian.clover.registry.format
com.atlassian.clover.registry.metrics
com.atlassian.clover.registry.util
com.atlassian.clover.remote
com.atlassian.clover.reporters
com.atlassian.clover.reporters.console
com.atlassian.clover.reporters.filters
com.atlassian.clover.reporters.html
com.atlassian.clover.reporters.html.source
com.atlassian.clover.reporters.html.source.groovy
com.atlassian.clover.reporters.html.source.java
com.atlassian.clover.reporters.json
com.atlassian.clover.reporters.pdf
com.atlassian.clover.reporters.util
com.atlassian.clover.reporters.xml
com.atlassian.clover.services
com.atlassian.clover.spec.instr.test
com.atlassian.clover.spi.lang
com.atlassian.clover.spi.reporters.html.source
com.atlassian.clover.util
com.atlassian.clover.util.collections
com.atlassian.clover.util.format
com.atlassian.clover.util.trie
com.atlassian.clover.versions
com.atlassian.collectors
com.atlassian.config.spring
com.atlassian.config.xml
com.atlassian.confluence.page
com.atlassian.crowd.azure
com.atlassian.crowd.cache
com.atlassian.crowd.common.analytics.events
com.atlassian.crowd.common.analytics.statistics.collectors
com.atlassian.crowd.common.diff
com.atlassian.crowd.common.features
com.atlassian.crowd.common.properties
com.atlassian.crowd.common.util
com.atlassian.crowd.console.value.directory
com.atlassian.crowd.crypto
com.atlassian.crowd.darkfeature
com.atlassian.crowd.directory.authentication
com.atlassian.crowd.directory.authentication.impl
com.atlassian.crowd.directory.cache
com.atlassian.crowd.directory.cache.exception
com.atlassian.crowd.directory.cache.model
com.atlassian.crowd.directory.hybrid
com.atlassian.crowd.directory.ldap
com.atlassian.crowd.directory.ldap.cache
com.atlassian.crowd.directory.ldap.connectionpool
com.atlassian.crowd.directory.ldap.connectionpool.data
com.atlassian.crowd.directory.ldap.connectionpool.mapper
com.atlassian.crowd.directory.ldap.control
com.atlassian.crowd.directory.ldap.control.ldap
com.atlassian.crowd.directory.ldap.credential
com.atlassian.crowd.directory.ldap.mapper
com.atlassian.crowd.directory.ldap.mapper.attribute
com.atlassian.crowd.directory.ldap.mapper.attribute.group
com.atlassian.crowd.directory.ldap.mapper.attribute.user
com.atlassian.crowd.directory.ldap.mapper.entity
com.atlassian.crowd.directory.ldap.monitoring
com.atlassian.crowd.directory.ldap.name
com.atlassian.crowd.directory.ldap.util
com.atlassian.crowd.directory.ldap.validator
com.atlassian.crowd.directory.query
com.atlassian.crowd.directory.rest
com.atlassian.crowd.directory.rest.delta
com.atlassian.crowd.directory.rest.endpoint
com.atlassian.crowd.directory.rest.entity
com.atlassian.crowd.directory.rest.entity.delta
com.atlassian.crowd.directory.rest.entity.group
com.atlassian.crowd.directory.rest.entity.membership
com.atlassian.crowd.directory.rest.entity.user
com.atlassian.crowd.directory.rest.entity.user.password
com.atlassian.crowd.directory.rest.entity.user.rename
com.atlassian.crowd.directory.rest.mapper
com.atlassian.crowd.directory.rest.resolver
com.atlassian.crowd.directory.rest.util
com.atlassian.crowd.directory.rfc4519
com.atlassian.crowd.directory.ssl
com.atlassian.crowd.directory.synchronisation
com.atlassian.crowd.directory.synchronisation.cache
com.atlassian.crowd.directory.synchronisation.utils
com.atlassian.crowd.emailchange
com.atlassian.crowd.embedded.admin.authorisation
com.atlassian.crowd.embedded.directory
com.atlassian.crowd.embedded.event
com.atlassian.crowd.embedded.spi
com.atlassian.crowd.embedded.validator
com.atlassian.crowd.embedded.validator.impl
com.atlassian.crowd.embedded.validator.rule
com.atlassian.crowd.feature
com.atlassian.crowd.function
com.atlassian.crowd.hibernate.hsql
com.atlassian.crowd.integration
com.atlassian.crowd.integration.directory
com.atlassian.crowd.integration.http
com.atlassian.crowd.integration.http.filter
com.atlassian.crowd.integration.http.util
com.atlassian.crowd.integration.rest.entity
com.atlassian.crowd.integration.rest.service
com.atlassian.crowd.integration.rest.service.factory
com.atlassian.crowd.integration.rest.util
com.atlassian.crowd.license
com.atlassian.crowd.licensing
com.atlassian.crowd.lock
com.atlassian.crowd.lookandfeel
com.atlassian.crowd.manager.application.canonicality
com.atlassian.crowd.manager.application.filtering
com.atlassian.crowd.manager.application.search
com.atlassian.crowd.manager.audit.mapper
com.atlassian.crowd.manager.authentication
com.atlassian.crowd.manager.cache
com.atlassian.crowd.manager.cluster.message
com.atlassian.crowd.manager.directory.monitor.poller
com.atlassian.crowd.manager.directory.nestedgroups
com.atlassian.crowd.manager.emailscan
com.atlassian.crowd.manager.license
com.atlassian.crowd.manager.login
com.atlassian.crowd.manager.login.exception
com.atlassian.crowd.manager.mail
com.atlassian.crowd.manager.proxy
com.atlassian.crowd.manager.recovery
com.atlassian.crowd.manager.rememberme
com.atlassian.crowd.manager.tombstone
com.atlassian.crowd.manager.validation
com.atlassian.crowd.mapper
com.atlassian.crowd.model.alias
com.atlassian.crowd.model.audit
com.atlassian.crowd.model.cluster
com.atlassian.crowd.model.config
com.atlassian.crowd.model.licensing
com.atlassian.crowd.model.page
com.atlassian.crowd.model.property
com.atlassian.crowd.model.scheduling
com.atlassian.crowd.model.sso.idp
com.atlassian.crowd.model.tombstone
com.atlassian.crowd.password.saltgenerator
com.atlassian.crowd.plugin.descriptors
com.atlassian.crowd.search.hibernate
com.atlassian.crowd.search.hibernate.audit
com.atlassian.crowd.search.ldap
com.atlassian.crowd.search.ldap.filter
com.atlassian.crowd.search.ldap.test
com.atlassian.crowd.service
com.atlassian.crowd.service.client
com.atlassian.crowd.service.cluster
com.atlassian.crowd.service.factory
com.atlassian.crowd.service.license
com.atlassian.crowd.service.support
com.atlassian.crowd.service.token
com.atlassian.crowd.util.cache
com.atlassian.crowd.web
com.atlassian.crucible
com.atlassian.db.config.password
com.atlassian.diagnostics
com.atlassian.diagnostics.detail
com.atlassian.diagnostics.ipd.internal.spi
com.atlassian.diagnostics.util
com.atlassian.editlive
com.atlassian.event
com.atlassian.event.config
com.atlassian.event.internal
com.atlassian.event.legacy
com.atlassian.event.remote.internal.auth
com.atlassian.event.remote.internal.http
com.atlassian.event.remote.internal.json
com.atlassian.event.spi
com.atlassian.event.spring
com.atlassian.extras.api.bamboo
com.atlassian.extras.api.clover
com.atlassian.extras.api.confluence
com.atlassian.extras.api.crowd
com.atlassian.extras.api.crucible
com.atlassian.extras.api.fisheye
com.atlassian.extras.api.greenhopper
com.atlassian.extras.api.jira
com.atlassian.extras.api.plugin
com.atlassian.extras.api.stash
com.atlassian.extras.common
com.atlassian.extras.common.log
com.atlassian.extras.common.org.springframework.util
com.atlassian.extras.common.util
com.atlassian.extras.core
com.atlassian.extras.core.bamboo
com.atlassian.extras.core.bitbucket
com.atlassian.extras.core.clover
com.atlassian.extras.core.confluence
com.atlassian.extras.core.crowd
com.atlassian.extras.core.crucible
com.atlassian.extras.core.fisheye
com.atlassian.extras.core.greenhopper
com.atlassian.extras.core.jira
com.atlassian.extras.core.plugins
com.atlassian.extras.core.stash
com.atlassian.extras.core.transformer
com.atlassian.extras.decoder.api
com.atlassian.extras.decoder.v1
com.atlassian.extras.decoder.v1.confluence
com.atlassian.extras.decoder.v2
com.atlassian.extras.keymanager
com.atlassian.extras.legacy.util
com.atlassian.failurecache
com.atlassian.failurecache.executor
com.atlassian.failurecache.failures
com.atlassian.failurecache.updates
com.atlassian.failurecache.util.date
com.atlassian.fisheye
com.atlassian.fugue
com.atlassian.fugue.retry
com.atlassian.greenhopper
com.atlassian.healthcheck.core
com.atlassian.healthcheck.spi
com.atlassian.hibernate.extras
com.atlassian.hibernate.extras.batching
com.atlassian.hibernate.extras.event
com.atlassian.hibernate.extras.hql
com.atlassian.hibernate.extras.type
com.atlassian.html.encode
com.atlassian.httpclient.apache.httpcomponents
com.atlassian.ip
com.atlassian.jira
com.atlassian.johnson.spring.event
com.atlassian.johnson.spring.lifecycle
com.atlassian.johnson.spring.web
com.atlassian.johnson.spring.web.context
com.atlassian.johnson.spring.web.context.support
com.atlassian.johnson.spring.web.filter
com.atlassian.johnson.spring.web.servlet
com.atlassian.johnson.spring.web.servlet.support
com.atlassian.jwt
com.atlassian.jwt.applinks
com.atlassian.jwt.applinks.exception
com.atlassian.jwt.core
com.atlassian.jwt.core.http
com.atlassian.jwt.core.http.auth
com.atlassian.jwt.core.keys
com.atlassian.jwt.core.reader
com.atlassian.jwt.core.writer
com.atlassian.jwt.exception
com.atlassian.jwt.httpclient
com.atlassian.jwt.internal
com.atlassian.jwt.internal.applinks
com.atlassian.jwt.internal.sal
com.atlassian.jwt.internal.security
com.atlassian.jwt.internal.servlet
com.atlassian.jwt.internal.writer
com.atlassian.jwt.reader
com.atlassian.jwt.writer
com.atlassian.labs.restbrowser.plugin
com.atlassian.labs.restbrowser.provider
com.atlassian.labs.restbrowser.rest.model
com.atlassian.labs.restbrowser.rest.services
com.atlassian.labs.restbrowser.servlet
com.atlassian.labs.restbrowser.util
com.atlassian.lesscss.spi
com.atlassian.license
com.atlassian.license.applications.bamboo
com.atlassian.license.applications.clover
com.atlassian.license.applications.confluence
com.atlassian.license.applications.crowd
com.atlassian.license.applications.crucible
com.atlassian.license.applications.editliveplugin
com.atlassian.license.applications.fisheye
com.atlassian.license.applications.greenhopper
com.atlassian.license.applications.jira
com.atlassian.license.applications.perforceplugin
com.atlassian.license.applications.sharepoint
com.atlassian.license.applications.vssplugin
com.atlassian.license.decoder
com.atlassian.license.util
com.atlassian.linkaggregation
com.atlassian.mail.server.impl
com.atlassian.mail.server.impl.util
com.atlassian.marketplace.client
com.atlassian.marketplace.client.api
com.atlassian.marketplace.client.encoding
com.atlassian.marketplace.client.http
com.atlassian.marketplace.client.impl
com.atlassian.marketplace.client.model
com.atlassian.marketplace.client.util
com.atlassian.net
com.atlassian.plugin.cache
com.atlassian.plugin.cache.filecache
com.atlassian.plugin.cache.filecache.impl
com.atlassian.plugin.connect.api
com.atlassian.plugin.connect.api.auth
com.atlassian.plugin.connect.api.auth.scope
com.atlassian.plugin.connect.api.descriptor
com.atlassian.plugin.connect.api.lifecycle
com.atlassian.plugin.connect.api.property
com.atlassian.plugin.connect.api.request
com.atlassian.plugin.connect.api.util
com.atlassian.plugin.connect.api.web
com.atlassian.plugin.connect.api.web.condition
com.atlassian.plugin.connect.api.web.context
com.atlassian.plugin.connect.api.web.iframe
com.atlassian.plugin.connect.api.web.redirect
com.atlassian.plugin.connect.bitbucket
com.atlassian.plugin.connect.bitbucket.auth
com.atlassian.plugin.connect.bitbucket.lifecycle
com.atlassian.plugin.connect.bitbucket.usermanagement
com.atlassian.plugin.connect.bitbucket.web
com.atlassian.plugin.connect.bitbucket.web.condition
com.atlassian.plugin.connect.bitbucket.web.context
com.atlassian.plugin.connect.modules.beans
com.atlassian.plugin.connect.modules.beans.builder
com.atlassian.plugin.connect.modules.beans.builder.nested.dialog
com.atlassian.plugin.connect.modules.beans.nested
com.atlassian.plugin.connect.modules.beans.nested.dialog
com.atlassian.plugin.connect.modules.bitbucket.beans
com.atlassian.plugin.connect.modules.bitbucket.schema
com.atlassian.plugin.connect.modules.gson
com.atlassian.plugin.connect.modules.schema
com.atlassian.plugin.connect.modules.util
com.atlassian.plugin.connect.plugin
com.atlassian.plugin.connect.plugin.api
com.atlassian.plugin.connect.plugin.auth
com.atlassian.plugin.connect.plugin.auth.applinks
com.atlassian.plugin.connect.plugin.auth.jwt
com.atlassian.plugin.connect.plugin.auth.oauth2
com.atlassian.plugin.connect.plugin.auth.scope
com.atlassian.plugin.connect.plugin.auth.scope.whitelist
com.atlassian.plugin.connect.plugin.auth.user
com.atlassian.plugin.connect.plugin.descriptor
com.atlassian.plugin.connect.plugin.descriptor.event
com.atlassian.plugin.connect.plugin.lifecycle
com.atlassian.plugin.connect.plugin.lifecycle.event
com.atlassian.plugin.connect.plugin.lifecycle.upm
com.atlassian.plugin.connect.plugin.property
com.atlassian.plugin.connect.plugin.request
com.atlassian.plugin.connect.plugin.request.url
com.atlassian.plugin.connect.plugin.rest
com.atlassian.plugin.connect.plugin.rest.addons
com.atlassian.plugin.connect.plugin.rest.data
com.atlassian.plugin.connect.plugin.rest.license
com.atlassian.plugin.connect.plugin.rest.oauth2
com.atlassian.plugin.connect.plugin.util
com.atlassian.plugin.connect.plugin.web
com.atlassian.plugin.connect.plugin.web.blacklist
com.atlassian.plugin.connect.plugin.web.condition
com.atlassian.plugin.connect.plugin.web.context
com.atlassian.plugin.connect.plugin.web.context.condition
com.atlassian.plugin.connect.plugin.web.dialog
com.atlassian.plugin.connect.plugin.web.iframe
com.atlassian.plugin.connect.plugin.web.item
com.atlassian.plugin.connect.plugin.web.jsapi
com.atlassian.plugin.connect.plugin.web.page
com.atlassian.plugin.connect.plugin.web.panel
com.atlassian.plugin.connect.plugin.web.redirect
com.atlassian.plugin.connect.plugin.webhook
com.atlassian.plugin.connect.spi
com.atlassian.plugin.connect.spi.auth.applinks
com.atlassian.plugin.connect.spi.auth.user
com.atlassian.plugin.connect.spi.lifecycle
com.atlassian.plugin.connect.spi.module
com.atlassian.plugin.connect.spi.web.condition
com.atlassian.plugin.connect.spi.web.context
com.atlassian.plugin.connect.spi.web.item
com.atlassian.plugin.connect.spi.web.panel
com.atlassian.plugin.event.impl
com.atlassian.plugin.impl
com.atlassian.plugin.main
com.atlassian.plugin.osgi.container.impl
com.atlassian.plugin.osgi.factory.transform.stage
com.atlassian.plugin.osgi.hook.dmz
com.atlassian.plugin.osgi.hook.dmz.packages
com.atlassian.plugin.osgi.hostcomponents.impl
com.atlassian.plugin.schema.spi
com.atlassian.plugin.web.baseconditions
com.atlassian.plugin.web.conditions
com.atlassian.plugin.web.descriptors
com.atlassian.plugin.web.impl
com.atlassian.plugin.web.model
com.atlassian.plugin.web.renderer
com.atlassian.plugin.webresource
com.atlassian.plugin.webresource.analytics
com.atlassian.plugin.webresource.analytics.events
com.atlassian.plugin.webresource.assembler
com.atlassian.plugin.webresource.assembler.html
com.atlassian.plugin.webresource.bigpipe
com.atlassian.plugin.webresource.cdn
com.atlassian.plugin.webresource.cdn.mapper
com.atlassian.plugin.webresource.condition
com.atlassian.plugin.webresource.data
com.atlassian.plugin.webresource.event
com.atlassian.plugin.webresource.filter.rewrite
com.atlassian.plugin.webresource.graph
com.atlassian.plugin.webresource.impl
com.atlassian.plugin.webresource.impl.annotators
com.atlassian.plugin.webresource.impl.config
com.atlassian.plugin.webresource.impl.discovery
com.atlassian.plugin.webresource.impl.helpers
com.atlassian.plugin.webresource.impl.helpers.data
com.atlassian.plugin.webresource.impl.helpers.url
com.atlassian.plugin.webresource.impl.http
com.atlassian.plugin.webresource.impl.snapshot
com.atlassian.plugin.webresource.impl.snapshot.resource
com.atlassian.plugin.webresource.impl.snapshot.resource.strategy.contentprovider
com.atlassian.plugin.webresource.impl.snapshot.resource.strategy.contenttype
com.atlassian.plugin.webresource.impl.snapshot.resource.strategy.path
com.atlassian.plugin.webresource.impl.snapshot.resource.strategy.stream
com.atlassian.plugin.webresource.impl.support
com.atlassian.plugin.webresource.impl.support.factory
com.atlassian.plugin.webresource.impl.support.http
com.atlassian.plugin.webresource.legacy
com.atlassian.plugin.webresource.models
com.atlassian.plugin.webresource.prebake
com.atlassian.plugin.webresource.servlet
com.atlassian.plugin.webresource.transformer
com.atlassian.plugin.webresource.transformer.instance
com.atlassian.plugin.webresource.url
com.atlassian.plugin.webresource.util
com.atlassian.plugins.authentication.api.util
com.atlassian.plugins.client.resource
com.atlassian.plugins.license.entity
com.atlassian.plugins.license.exception
com.atlassian.plugins.license.model
com.atlassian.plugins.license.service
com.atlassian.plugins.rest.common
com.atlassian.plugins.rest.common.error.jersey
com.atlassian.plugins.rest.common.error.jersey.constants
com.atlassian.plugins.rest.common.expand
com.atlassian.plugins.rest.common.expand.entity
com.atlassian.plugins.rest.common.expand.interceptor
com.atlassian.plugins.rest.common.expand.parameter
com.atlassian.plugins.rest.common.expand.resolver
com.atlassian.plugins.rest.common.feature
com.atlassian.plugins.rest.common.feature.jersey
com.atlassian.plugins.rest.common.filter
com.atlassian.plugins.rest.common.interceptor
com.atlassian.plugins.rest.common.json
com.atlassian.plugins.rest.common.multipart
com.atlassian.plugins.rest.common.multipart.fileupload
com.atlassian.plugins.rest.common.multipart.jersey
com.atlassian.plugins.rest.common.sal.websudo
com.atlassian.plugins.rest.common.security
com.atlassian.plugins.rest.common.security.descriptor
com.atlassian.plugins.rest.common.security.jersey
com.atlassian.plugins.rest.common.template
com.atlassian.plugins.rest.common.transaction
com.atlassian.plugins.rest.common.util
com.atlassian.plugins.rest.common.validation
com.atlassian.plugins.rest.common.version
com.atlassian.plugins.rest.module
com.atlassian.plugins.rest.module.servlet
com.atlassian.plugins.shortcuts.api
com.atlassian.rest.annotation
com.atlassian.sal.core.auth
com.atlassian.sal.core.component
com.atlassian.sal.core.csrf
com.atlassian.sal.core.executor
com.atlassian.sal.core.features
com.atlassian.sal.core.lifecycle
com.atlassian.sal.core.message
com.atlassian.sal.core.net
com.atlassian.sal.core.permission
com.atlassian.sal.core.pluginsettings
com.atlassian.sal.core.rdbms
com.atlassian.sal.core.scheduling
com.atlassian.sal.core.search
com.atlassian.sal.core.search.parameter
com.atlassian.sal.core.search.query
com.atlassian.sal.core.transaction
com.atlassian.sal.core.upgrade
com.atlassian.sal.core.usersettings
com.atlassian.sal.core.util
com.atlassian.sal.core.websudo
com.atlassian.sal.core.xsrf
com.atlassian.sal.spi
com.atlassian.scheduler.caesium.cron
com.atlassian.scheduler.caesium.cron.parser
com.atlassian.scheduler.caesium.cron.rule
com.atlassian.scheduler.caesium.cron.rule.field
com.atlassian.scheduler.caesium.impl
com.atlassian.scheduler.caesium.migration
com.atlassian.scheduler.caesium.spi
com.atlassian.secrets
com.atlassian.secrets.store.algorithm
com.atlassian.secrets.store.algorithm.paramters
com.atlassian.secrets.store.algorithm.serialization
com.atlassian.secrets.store.aws
com.atlassian.secrets.store.base64
com.atlassian.secrets.store.vault
com.atlassian.secrets.store.vault.auth
com.atlassian.secrets.store.vault.auth.kubernetes
com.atlassian.secrets.store.vault.auth.token
com.atlassian.secrets.tomcat.cipher
com.atlassian.secrets.tomcat.protocol
com.atlassian.secrets.tomcat.utils
com.atlassian.security.java8.serialfilter
com.atlassian.security.xml.libs
com.atlassian.stash.internal.markup
com.atlassian.stash.plugin.velocity
com.atlassian.tenancy.api
com.atlassian.tenancy.api.event
com.atlassian.tenancy.api.helper
com.atlassian.theme.internal
com.atlassian.theme.internal.api
com.atlassian.theme.internal.api.request
com.atlassian.theme.internal.api.user
com.atlassian.theme.internal.request
com.atlassian.troubleshooting.api
com.atlassian.troubleshooting.api.healthcheck
com.atlassian.troubleshooting.api.healthcheck.exception
com.atlassian.troubleshooting.api.supportzip
com.atlassian.uri
com.atlassian.util.concurrent
com.atlassian.util.concurrent.atomic
com.atlassian.util.contentcache.internal
com.atlassian.util.contentcache.internal.util
com.atlassian.util.integration
com.atlassian.util.profiling
com.atlassian.util.profiling.filters
com.atlassian.util.profiling.micrometer
com.atlassian.util.profiling.micrometer.analytics
com.atlassian.util.profiling.micrometer.analytics.events
com.atlassian.util.profiling.micrometer.util
com.atlassian.util.profiling.object
com.atlassian.util.profiling.strategy
com.atlassian.util.profiling.strategy.impl
com.atlassian.webhooks.external
com.atlassian.webhooks.migration
com.atlassian.webresource.api.prebake
com.atlassian.zdu.internal.api
com.atlassian.zdu.rest.dto
com.atlassion.jwt
com.fasterxml.jackson.dataformat.yaml
com.fasterxml.jackson.dataformat.yaml.snakeyaml.error
com.fasterxml.jackson.dataformat.yaml.util
com.fasterxml.jackson.datatype.jdk8
com.fasterxml.jackson.datatype.jsr310
com.fasterxml.jackson.datatype.jsr310.deser
com.fasterxml.jackson.datatype.jsr310.deser.key
com.fasterxml.jackson.datatype.jsr310.ser
com.fasterxml.jackson.datatype.jsr310.ser.key
com.fasterxml.jackson.datatype.jsr310.util
com.fasterxml.jackson.jaxrs.annotation
com.fasterxml.jackson.jaxrs.base
com.fasterxml.jackson.jaxrs.base.nocontent
com.fasterxml.jackson.jaxrs.cfg
com.fasterxml.jackson.jaxrs.json
com.fasterxml.jackson.jaxrs.json.annotation
com.fasterxml.jackson.jaxrs.util
com.fasterxml.jackson.module.jaxb
com.fasterxml.jackson.module.jaxb.deser
com.fasterxml.jackson.module.jaxb.ser
com.fasterxml.jackson.module.paramnames
com.github.fge
com.github.fge.jackson
com.github.fge.jackson.jsonpointer
com.github.fge.jsonschema
com.github.fge.jsonschema.cfg
com.github.fge.jsonschema.core
com.github.fge.jsonschema.core.exceptions
com.github.fge.jsonschema.core.keyword.syntax
com.github.fge.jsonschema.core.keyword.syntax.checkers
com.github.fge.jsonschema.core.keyword.syntax.checkers.common
com.github.fge.jsonschema.core.keyword.syntax.checkers.draftv3
com.github.fge.jsonschema.core.keyword.syntax.checkers.draftv4
com.github.fge.jsonschema.core.keyword.syntax.checkers.helpers
com.github.fge.jsonschema.core.keyword.syntax.checkers.hyperschema
com.github.fge.jsonschema.core.keyword.syntax.dictionaries
com.github.fge.jsonschema.core.load
com.github.fge.jsonschema.core.load.configuration
com.github.fge.jsonschema.core.load.download
com.github.fge.jsonschema.core.load.uri
com.github.fge.jsonschema.core.messages
com.github.fge.jsonschema.core.processing
com.github.fge.jsonschema.core.ref
com.github.fge.jsonschema.core.report
com.github.fge.jsonschema.core.tree
com.github.fge.jsonschema.core.tree.key
com.github.fge.jsonschema.core.util
com.github.fge.jsonschema.core.util.equivalence
com.github.fge.jsonschema.examples
com.github.fge.jsonschema.examples.split
com.github.fge.jsonschema.exceptions
com.github.fge.jsonschema.format
com.github.fge.jsonschema.format.common
com.github.fge.jsonschema.format.draftv3
com.github.fge.jsonschema.format.extra
com.github.fge.jsonschema.format.helpers
com.github.fge.jsonschema.keyword.digest
com.github.fge.jsonschema.keyword.digest.common
com.github.fge.jsonschema.keyword.digest.draftv3
com.github.fge.jsonschema.keyword.digest.draftv4
com.github.fge.jsonschema.keyword.digest.helpers
com.github.fge.jsonschema.keyword.validator
com.github.fge.jsonschema.keyword.validator.common
com.github.fge.jsonschema.keyword.validator.draftv3
com.github.fge.jsonschema.keyword.validator.draftv4
com.github.fge.jsonschema.keyword.validator.helpers
com.github.fge.jsonschema.library
com.github.fge.jsonschema.library.digest
com.github.fge.jsonschema.library.format
com.github.fge.jsonschema.library.validator
com.github.fge.jsonschema.main
com.github.fge.jsonschema.main.cli
com.github.fge.jsonschema.messages
com.github.fge.jsonschema.processors.build
com.github.fge.jsonschema.processors.data
com.github.fge.jsonschema.processors.digest
com.github.fge.jsonschema.processors.format
com.github.fge.jsonschema.processors.syntax
com.github.fge.jsonschema.processors.validation
com.github.fge.jsonschema.validator
com.github.fge.msgsimple
com.github.fge.msgsimple.bundle
com.github.fge.msgsimple.load
com.github.fge.msgsimple.locale
com.github.fge.msgsimple.provider
com.github.fge.msgsimple.source
com.github.fge.uritemplate
com.github.fge.uritemplate.expression
com.github.fge.uritemplate.parse
com.github.fge.uritemplate.render
com.github.fge.uritemplate.vars
com.github.fge.uritemplate.vars.specs
com.github.fge.uritemplate.vars.values
com.google.common.annotations
com.google.common.base
com.google.common.base.internal
com.google.common.cache
com.google.common.collect
com.google.common.escape
com.google.common.eventbus
com.google.common.graph
com.google.common.hash
com.google.common.html
com.google.common.io
com.google.common.math
com.google.common.net
com.google.common.primitives
com.google.common.reflect
com.google.common.util.concurrent
com.google.common.util.concurrent.internal
com.google.common.xml
com.google.gson
com.google.gson.annotations
com.google.gson.internal
com.google.gson.internal.bind
com.google.gson.internal.bind.util
com.google.gson.internal.reflect
com.google.gson.internal.sql
com.google.gson.reflect
com.google.gson.stream
com.google.protobuf
com.opensymphony.module.sitemesh.util
com.opensymphony.sitemesh
com.opensymphony.sitemesh.compatability
com.opensymphony.sitemesh.webapp
com.opensymphony.sitemesh.webapp.decorator
com.rometools.rome.feed
com.rometools.rome.feed.atom
com.rometools.rome.io
com.sun.jersey.api
com.sun.jersey.api.client
com.sun.jersey.api.client.async
com.sun.jersey.api.client.config
com.sun.jersey.api.client.filter
com.sun.jersey.api.container
com.sun.jersey.api.container.filter
com.sun.jersey.api.container.httpserver
com.sun.jersey.api.core
com.sun.jersey.api.core.servlet
com.sun.jersey.api.json
com.sun.jersey.api.model
com.sun.jersey.api.provider.jaxb
com.sun.jersey.api.representation
com.sun.jersey.api.uri
com.sun.jersey.api.view
com.sun.jersey.api.wadl.config
com.sun.jersey.client.impl
com.sun.jersey.client.impl.async
com.sun.jersey.client.proxy
com.sun.jersey.client.urlconnection
com.sun.jersey.core.header
com.sun.jersey.core.header.reader
com.sun.jersey.core.impl.provider.entity
com.sun.jersey.core.impl.provider.header
com.sun.jersey.core.impl.provider.xml
com.sun.jersey.core.osgi
com.sun.jersey.core.provider
com.sun.jersey.core.provider.jaxb
com.sun.jersey.core.reflection
com.sun.jersey.core.spi.component
com.sun.jersey.core.spi.component.ioc
com.sun.jersey.core.spi.factory
com.sun.jersey.core.spi.scanning
com.sun.jersey.core.spi.scanning.uri
com.sun.jersey.core.util
com.sun.jersey.impl
com.sun.jersey.json.impl
com.sun.jersey.json.impl.provider.entity
com.sun.jersey.json.impl.reader
com.sun.jersey.json.impl.writer
com.sun.jersey.localization
com.sun.jersey.server.impl
com.sun.jersey.server.impl.application
com.sun.jersey.server.impl.cdi
com.sun.jersey.server.impl.component
com.sun.jersey.server.impl.container
com.sun.jersey.server.impl.container.filter
com.sun.jersey.server.impl.container.httpserver
com.sun.jersey.server.impl.container.servlet
com.sun.jersey.server.impl.ejb
com.sun.jersey.server.impl.inject
com.sun.jersey.server.impl.managedbeans
com.sun.jersey.server.impl.model
com.sun.jersey.server.impl.model.method
com.sun.jersey.server.impl.model.method.dispatch
com.sun.jersey.server.impl.model.parameter
com.sun.jersey.server.impl.model.parameter.multivalued
com.sun.jersey.server.impl.modelapi.annotation
com.sun.jersey.server.impl.modelapi.validation
com.sun.jersey.server.impl.monitoring
com.sun.jersey.server.impl.provider
com.sun.jersey.server.impl.resource
com.sun.jersey.server.impl.template
com.sun.jersey.server.impl.uri
com.sun.jersey.server.impl.uri.rules
com.sun.jersey.server.impl.uri.rules.automata
com.sun.jersey.server.impl.wadl
com.sun.jersey.server.probes
com.sun.jersey.server.spi.component
com.sun.jersey.server.wadl
com.sun.jersey.server.wadl.generators
com.sun.jersey.server.wadl.generators.resourcedoc
com.sun.jersey.server.wadl.generators.resourcedoc.model
com.sun.jersey.server.wadl.generators.resourcedoc.xhtml
com.sun.jersey.spi
com.sun.jersey.spi.container
com.sun.jersey.spi.container.servlet
com.sun.jersey.spi.dispatch
com.sun.jersey.spi.inject
com.sun.jersey.spi.monitoring
com.sun.jersey.spi.resource
com.sun.jersey.spi.scanning
com.sun.jersey.spi.scanning.servlet
com.sun.jersey.spi.service
com.sun.jersey.spi.template
com.sun.jersey.spi.uri.rules
i18n
io.grpc
io.grpc.protobuf
io.grpc.stub
io.swagger.v3.oas.annotations
io.swagger.v3.oas.annotations.callbacks
io.swagger.v3.oas.annotations.enums
io.swagger.v3.oas.annotations.extensions
io.swagger.v3.oas.annotations.headers
io.swagger.v3.oas.annotations.info
io.swagger.v3.oas.annotations.links
io.swagger.v3.oas.annotations.media
io.swagger.v3.oas.annotations.parameters
io.swagger.v3.oas.annotations.responses
io.swagger.v3.oas.annotations.security
io.swagger.v3.oas.annotations.servers
io.swagger.v3.oas.annotations.tags
java.rmi.activation
java.security.acl
javax.activity
javax.cache
javax.cache.annotation
javax.cache.configuration
javax.cache.event
javax.cache.expiry
javax.cache.integration
javax.cache.management
javax.cache.processor
javax.cache.spi
javax.el
javax.jws
javax.jws.soap
javax.persistence
javax.persistence.criteria
javax.persistence.metamodel
javax.persistence.spi
javax.rmi
javax.rmi.CORBA
javax.security.auth.message
javax.security.auth.message.callback
javax.security.auth.message.config
javax.security.auth.message.module
javax.transaction
javax.xml.soap
javax.xml.ws
javax.xml.ws.handler
javax.xml.ws.handler.soap
javax.xml.ws.http
javax.xml.ws.soap
javax.xml.ws.spi
javax.xml.ws.spi.http
javax.xml.ws.wsaddressing
net.jcip.annotations
net.minidev.json
net.minidev.json.annotate
net.minidev.json.parser
net.minidev.json.reader
net.minidev.json.writer
net.oauth
net.oauth.signature
net.oauth.signature.pem
net.sf.cglib.asm
net.sf.cglib.beans
net.sf.cglib.core
net.sf.cglib.core.internal
net.sf.cglib.proxy
net.sf.cglib.reflect
net.sf.cglib.transform
net.sf.cglib.transform.impl
net.sf.cglib.util
org.apache.commons.collections4
org.apache.commons.collections4.bag
org.apache.commons.collections4.bidimap
org.apache.commons.collections4.collection
org.apache.commons.collections4.comparators
org.apache.commons.collections4.functors
org.apache.commons.collections4.iterators
org.apache.commons.collections4.keyvalue
org.apache.commons.collections4.list
org.apache.commons.collections4.map
org.apache.commons.collections4.multimap
org.apache.commons.collections4.multiset
org.apache.commons.collections4.properties
org.apache.commons.collections4.queue
org.apache.commons.collections4.sequence
org.apache.commons.collections4.set
org.apache.commons.collections4.splitmap
org.apache.commons.collections4.trie
org.apache.commons.collections4.trie.analyzer
org.apache.commons.compress
org.apache.commons.compress.archivers
org.apache.commons.compress.archivers.ar
org.apache.commons.compress.archivers.arj
org.apache.commons.compress.archivers.cpio
org.apache.commons.compress.archivers.dump
org.apache.commons.compress.archivers.examples
org.apache.commons.compress.archivers.jar
org.apache.commons.compress.archivers.sevenz
org.apache.commons.compress.archivers.tar
org.apache.commons.compress.archivers.zip
org.apache.commons.compress.changes
org.apache.commons.compress.compressors
org.apache.commons.compress.compressors.brotli
org.apache.commons.compress.compressors.bzip2
org.apache.commons.compress.compressors.deflate
org.apache.commons.compress.compressors.deflate64
org.apache.commons.compress.compressors.gzip
org.apache.commons.compress.compressors.lz4
org.apache.commons.compress.compressors.lz77support
org.apache.commons.compress.compressors.lzma
org.apache.commons.compress.compressors.lzw
org.apache.commons.compress.compressors.pack200
org.apache.commons.compress.compressors.snappy
org.apache.commons.compress.compressors.xz
org.apache.commons.compress.compressors.z
org.apache.commons.compress.compressors.zstandard
org.apache.commons.compress.harmony
org.apache.commons.compress.harmony.archive.internal.nls
org.apache.commons.compress.harmony.pack200
org.apache.commons.compress.harmony.unpack200
org.apache.commons.compress.harmony.unpack200.bytecode
org.apache.commons.compress.harmony.unpack200.bytecode.forms
org.apache.commons.compress.java.util.jar
org.apache.commons.compress.parallel
org.apache.commons.compress.utils
org.apache.commons.digester
org.apache.commons.digester.annotations
org.apache.commons.digester.annotations.handlers
org.apache.commons.digester.annotations.internal
org.apache.commons.digester.annotations.providers
org.apache.commons.digester.annotations.reflect
org.apache.commons.digester.annotations.rules
org.apache.commons.digester.annotations.spi
org.apache.commons.digester.annotations.utils
org.apache.commons.digester.parser
org.apache.commons.digester.plugins
org.apache.commons.digester.plugins.strategies
org.apache.commons.digester.substitution
org.apache.commons.digester.xmlrules
org.apache.commons.lang
org.apache.commons.lang.builder
org.apache.commons.lang.enum
org.apache.commons.lang.enums
org.apache.commons.lang.exception
org.apache.commons.lang.math
org.apache.commons.lang.mutable
org.apache.commons.lang.reflect
org.apache.commons.lang.text
org.apache.commons.lang.time
org.apache.commons.pool
org.apache.commons.pool.impl
org.apache.commons.pool2
org.apache.commons.pool2.impl
org.apache.commons.pool2.proxy
org.apache.commons.validator
org.apache.commons.validator.javascript
org.apache.commons.validator.resources
org.apache.commons.validator.routines
org.apache.commons.validator.routines.checkdigit
org.apache.commons.validator.util
org.apache.felix.webconsole
org.apache.http.impl.nio
org.apache.http.impl.nio.bootstrap
org.apache.http.impl.nio.client
org.apache.http.impl.nio.codecs
org.apache.http.impl.nio.conn
org.apache.http.impl.nio.pool
org.apache.http.impl.nio.reactor
org.apache.http.impl.nio.ssl
org.apache.http.nio
org.apache.http.nio.client
org.apache.http.nio.client.methods
org.apache.http.nio.client.util
org.apache.http.nio.conn
org.apache.http.nio.conn.scheme
org.apache.http.nio.conn.ssl
org.apache.http.nio.entity
org.apache.http.nio.params
org.apache.http.nio.pool
org.apache.http.nio.protocol
org.apache.http.nio.reactor
org.apache.http.nio.reactor.ssl
org.apache.http.nio.util
org.apache.log4j.helpers
org.apache.log4j.spi
org.apache.log4j.xml
org.apache.logging.log4j.internal
org.apache.logging.log4j.simple
org.apache.logging.log4j.spi
org.apache.logging.log4j.status
org.apache.xml.serialize
org.apache.xmlcommons
org.codehaus.jackson
org.codehaus.jackson.annotate
org.codehaus.jackson.format
org.codehaus.jackson.impl
org.codehaus.jackson.io
org.codehaus.jackson.jaxrs
org.codehaus.jackson.map
org.codehaus.jackson.map.annotate
org.codehaus.jackson.map.deser
org.codehaus.jackson.map.deser.impl
org.codehaus.jackson.map.deser.std
org.codehaus.jackson.map.exc
org.codehaus.jackson.map.ext
org.codehaus.jackson.map.introspect
org.codehaus.jackson.map.jsontype
org.codehaus.jackson.map.jsontype.impl
org.codehaus.jackson.map.module
org.codehaus.jackson.map.ser
org.codehaus.jackson.map.ser.impl
org.codehaus.jackson.map.ser.std
org.codehaus.jackson.map.type
org.codehaus.jackson.map.util
org.codehaus.jackson.node
org.codehaus.jackson.schema
org.codehaus.jackson.sym
org.codehaus.jackson.type
org.codehaus.jackson.util
org.codehaus.jackson.xc
org.dom4j
org.dom4j.bean
org.dom4j.datatype
org.dom4j.dom
org.dom4j.dtd
org.dom4j.io
org.dom4j.jaxb
org.dom4j.rule
org.dom4j.rule.pattern
org.dom4j.swing
org.dom4j.tree
org.dom4j.util
org.dom4j.xpath
org.dom4j.xpp
org.hibernate.validator
org.hibernate.validator.cfg
org.hibernate.validator.cfg.context
org.hibernate.validator.cfg.defs
org.hibernate.validator.cfg.defs.br
org.hibernate.validator.cfg.defs.pl
org.hibernate.validator.cfg.defs.ru
org.hibernate.validator.constraints
org.hibernate.validator.constraints.br
org.hibernate.validator.constraints.pl
org.hibernate.validator.constraints.ru
org.hibernate.validator.constraints.time
org.hibernate.validator.constraintvalidation
org.hibernate.validator.constraintvalidators
org.hibernate.validator.engine
org.hibernate.validator.group
org.hibernate.validator.internal
org.hibernate.validator.internal.cfg.context
org.hibernate.validator.internal.constraintvalidators
org.hibernate.validator.internal.constraintvalidators.bv
org.hibernate.validator.internal.constraintvalidators.bv.money
org.hibernate.validator.internal.constraintvalidators.bv.notempty
org.hibernate.validator.internal.constraintvalidators.bv.number
org.hibernate.validator.internal.constraintvalidators.bv.number.bound
org.hibernate.validator.internal.constraintvalidators.bv.number.bound.decimal
org.hibernate.validator.internal.constraintvalidators.bv.number.sign
org.hibernate.validator.internal.constraintvalidators.bv.size
org.hibernate.validator.internal.constraintvalidators.bv.time
org.hibernate.validator.internal.constraintvalidators.bv.time.future
org.hibernate.validator.internal.constraintvalidators.bv.time.futureorpresent
org.hibernate.validator.internal.constraintvalidators.bv.time.past
org.hibernate.validator.internal.constraintvalidators.bv.time.pastorpresent
org.hibernate.validator.internal.constraintvalidators.hv
org.hibernate.validator.internal.constraintvalidators.hv.br
org.hibernate.validator.internal.constraintvalidators.hv.pl
org.hibernate.validator.internal.constraintvalidators.hv.ru
org.hibernate.validator.internal.constraintvalidators.hv.time
org.hibernate.validator.internal.engine
org.hibernate.validator.internal.engine.constraintdefinition
org.hibernate.validator.internal.engine.constraintvalidation
org.hibernate.validator.internal.engine.groups
org.hibernate.validator.internal.engine.messageinterpolation
org.hibernate.validator.internal.engine.messageinterpolation.el
org.hibernate.validator.internal.engine.messageinterpolation.parser
org.hibernate.validator.internal.engine.messageinterpolation.util
org.hibernate.validator.internal.engine.path
org.hibernate.validator.internal.engine.resolver
org.hibernate.validator.internal.engine.scripting
org.hibernate.validator.internal.engine.validationcontext
org.hibernate.validator.internal.engine.valuecontext
org.hibernate.validator.internal.engine.valueextraction
org.hibernate.validator.internal.metadata
org.hibernate.validator.internal.metadata.aggregated
org.hibernate.validator.internal.metadata.aggregated.rule
org.hibernate.validator.internal.metadata.core
org.hibernate.validator.internal.metadata.descriptor
org.hibernate.validator.internal.metadata.facets
org.hibernate.validator.internal.metadata.location
org.hibernate.validator.internal.metadata.provider
org.hibernate.validator.internal.metadata.raw
org.hibernate.validator.internal.properties
org.hibernate.validator.internal.properties.javabean
org.hibernate.validator.internal.util
org.hibernate.validator.internal.util.annotation
org.hibernate.validator.internal.util.classhierarchy
org.hibernate.validator.internal.util.logging
org.hibernate.validator.internal.util.logging.formatter
org.hibernate.validator.internal.util.privilegedactions
org.hibernate.validator.internal.util.stereotypes
org.hibernate.validator.internal.xml
org.hibernate.validator.internal.xml.config
org.hibernate.validator.internal.xml.mapping
org.hibernate.validator.messageinterpolation
org.hibernate.validator.metadata
org.hibernate.validator.parameternameprovider
org.hibernate.validator.path
org.hibernate.validator.resourceloading
org.hibernate.validator.spi.cfg
org.hibernate.validator.spi.group
org.hibernate.validator.spi.messageinterpolation
org.hibernate.validator.spi.nodenameprovider
org.hibernate.validator.spi.properties
org.hibernate.validator.spi.resourceloading
org.hibernate.validator.spi.scripting
org.jboss.logging
org.jdom
org.jdom.adapters
org.jdom.filter
org.jdom.input
org.jdom.output
org.jdom.transform
org.jdom.xpath
org.jdom2
org.jdom2.adapters
org.jdom2.filter
org.jdom2.input
org.jdom2.input.sax
org.jdom2.input.stax
org.jdom2.internal
org.jdom2.located
org.jdom2.output
org.jdom2.output.support
org.jdom2.transform
org.jdom2.util
org.jdom2.xpath
org.jdom2.xpath.jaxen
org.jdom2.xpath.util
org.joda.time
org.joda.time.base
org.joda.time.chrono
org.joda.time.convert
org.joda.time.field
org.joda.time.format
org.joda.time.tz
org.joda.time.tz.data
org.joda.time.tz.data.Africa
org.joda.time.tz.data.America
org.joda.time.tz.data.America.Argentina
org.joda.time.tz.data.America.Indiana
org.joda.time.tz.data.America.Kentucky
org.joda.time.tz.data.America.North_Dakota
org.joda.time.tz.data.Antarctica
org.joda.time.tz.data.Arctic
org.joda.time.tz.data.Asia
org.joda.time.tz.data.Atlantic
org.joda.time.tz.data.Australia
org.joda.time.tz.data.Etc
org.joda.time.tz.data.Europe
org.joda.time.tz.data.Indian
org.joda.time.tz.data.Pacific
org.omg.CORBA
org.omg.CORBA.DynAnyPackage
org.omg.CORBA.ORBPackage
org.omg.CORBA.TypeCodePackage
org.omg.CORBA.portable
org.omg.CORBA_2_3
org.omg.CORBA_2_3.portable
org.omg.CosNaming
org.omg.CosNaming.NamingContextExtPackage
org.omg.CosNaming.NamingContextPackage
org.omg.Dynamic
org.omg.DynamicAny
org.omg.DynamicAny.DynAnyFactoryPackage
org.omg.DynamicAny.DynAnyPackage
org.omg.IOP
org.omg.IOP.CodecFactoryPackage
org.omg.IOP.CodecPackage
org.omg.Messaging
org.omg.PortableInterceptor
org.omg.PortableInterceptor.ORBInitInfoPackage
org.omg.PortableServer
org.omg.PortableServer.CurrentPackage
org.omg.PortableServer.POAManagerPackage
org.omg.PortableServer.POAPackage
org.omg.PortableServer.ServantLocatorPackage
org.omg.PortableServer.portable
org.omg.SendingContext
org.omg.stub.java.rmi
org.omg.stub.javax.management.remote.rmi
org.osgi.service.obr
org.osgi.util
org.slf4j.bridge
org.slf4j.impl
org.springframework.osgi.context

RefRestrictionService.match return type change

Changed the return type of RefRestrictionService.match to Map<RefChange, List<RefRestriction>> to avoid the use of a Guava Multimap.

Jakarta dependency changes

Bitbucket 9.0 and Platform 7 have changed to use the jakarta versions of many javax dependencies. In all cases, this involves no changes the packages/classes within. If your addon imports Bitbucket's dependencies, it will no longer be able to use the javax version of a dependency. For example, javax.servlet:javax.servlet-api has been replaced with jakarta.servlet:jakarta.servlet-api.

REST v2

Platform 7 and Bitbucket 9.0 have rearchitected the Java APIs used to implement REST resources, which we’re calling REST v2.

Note that this isn't a change to Bitbucket's REST API, which remains largely unchanged. These changes will only impact app developers. The underlying libraries, Jackson and Jersey, have been upgraded to the latest versions. REST v2 also makes use of JAX-RS 2.

As part of this change, the following projects have been replaced with REST v2 versions:

  • bitbucket-rest-api has been replaced by bitbucket-rest-v2-api.
  • bitbucket-rest-spi has been replaced by bitbucket-rest-v2-spi.
  • bitbucket-rest-model has been removed with most classes moved to bitbucket-rest-v2-api.

The REST v2 upgrade guide contains advice and examples on how to upgrade your app to use REST v2. There is further, Bitbucket-specific advice on Bitbucket REST v2 migration for app developers page.

Secure Administrator Sessions

Bitbucket 9.0 introduces a new feature to ensure an administrator's identity prior to them performing administrator actions. Secure Administrator Sessions, also called Web Sudo, creates an extra layer of protection by prompting admins to re-enter their passwords to access administrative functions. By default, web sudo is enabled but it can be disabled setting the feature.websudo property in the Bitbucket home. Additionally, administrator actions can be restricted to users from specific IP addresses by setting websudo.allowlist.patterns in the Bitbucket home.

Apps can opt into web sudo by adding the @com.atlassian.sal.api.websudo.WebSudoRequired annotation to REST APIs that require admin access. Similarly, servlets that require admin access should import com.atlassian.sal.api.websudo.WebSudoManager and call the method enforceWebSudoProtection prior to allowing the user access to administrator actions.

For further information see: Adding WebSudo support to your app.

Servlet and Servlet Filter Endpoint Security

Bitbucket 9.0 introduces changes to the way authentication and authorization are checked in endpoints defined by servlets, and with similar changes for servlet filters, since it is possible to build an endpoint in a servlet filter.

Historically Bitbucket implements authentication and authorization checks in the service layer, and it still does. However as of Bitbucket 9.0 additional tools are provided to allow coarse grained authorization checks to be performed in the presentation later.

The following annotations are available:

  • @SystemAdminOnly - User requires SYS_ADMIN permission.
  • @AdminOnly - User requires ADMIN permission.
  • @LicensedOnly - User must be authenticated.
  • @AnonymousSiteAccess - If public access feature is enabled, then this is equivalent to @UnrestrictedAccess, if disabled then this is equivalent to @LicensedOnly.
  • @UnrestrictedAccess - Anonymous access allowed.

These annotations exist in the com.atlassian.annotations.security Java package, and are provided by the following Maven dependency:

1
2
<dependency>
    <groupId>com.atlassian.annotations</groupId>
    <artifactId>atlassian-annotations</artifactId>
    <scope>provided</scope>
</dependency>

By default, if no annotation is present then @LicensedOnly is assumed. This means, for servlets, a request by an unauthenticated user will fail with status 401. And for servlet filters, the filter will not be called for requests without authentication.

If one of the above security annotations are added ensure com.atlassian.annotations.security is OSGi imported by the app. If an app fails to import the package then the annotation scanner will silently fail to see the annotation and the default authentication/authorization requirement (i.e. @LicensedOnly) will be applied.

For further information see: Prepare your Data Center app to comply with secure endpoint defaults

Added REST APIs

Mirroring (Mirror)

  • Added GET /rest/mirroring/latest/progress as a replacement for now deprecated GET /rest/mirroring/latest/upstreamServers/{upstreamId}/progress
  • Added GET /rest/mirroring/latest/farmNodes as a replacement for now deprecated GET /rest/mirroring/latest/upstreamServers/{upstreamId}/farmNodes
  • Added GET /rest/mirroring/latest/upstreamServer as a replacement for now deprecated GET /rest/mirroring/latest/upstreamServers and /rest/mirroring/latest/upstreamServers/{upstreamId}
  • Added GET /rest/mirroring/latest/mirrorRepos/{externalRepositoryId} as a replacement for now deprecated GET /rest/mirroring/latest/upstreamServers/{upstreamId}/repos/{upstreamRepoId}
  • Added GET /rest/mirroring/latest/syncSettings as a replacement for now deprecated GET /rest/mirroring/latest/upstreamServers/{upstreamId}/settings
  • Added PUT /rest/mirroring/latest/syncSettings as a replacement for now deprecated PUT /rest/mirroring/latest/upstreamServers/{upstreamId}/settings
  • Added GET /rest/mirroring/latest/syncSettings/mode as a replacement for now deprecated GET /rest/mirroring/latest/upstreamServers/{upstreamId}/settings/mode
  • Added PUT /rest/mirroring/latest/syncSettings/mode as a replacement for now deprecated PUT /rest/mirroring/latest/upstreamServers/{upstreamId}/settings/mode
  • Added GET /rest/mirroring/latest/syncSettings/projects as a replacement for now deprecated GET /rest/mirroring/latest/upstreamServers/{upstreamId}/settings/projects
  • Added POST /rest/mirroring/latest/syncSettings/projects as a replacement for now deprecated POST /rest/mirroring/latest/upstreamServers/{upstreamId}/settings/projects
  • Added POST /rest/mirroring/latest/syncSettings/projects/{projectId} as a replacement for now deprecated POST /rest/mirroring/latest/upstreamServers/{upstreamId}/settings/projects/{projectId}
  • Added DELETE /rest/mirroring/latest/syncSettings/projects/{projectId} as a replacement for now deprecated DELETE /rest/mirroring/latest/upstreamServers/{upstreamId}/settings/projects/{projectId}
  • Added GET /rest/mirroring/latest/supportInfo/projects/{projectKey}/repos/{repoSlug}/repoSyncStatus

Modifications in REST APIs

Mirroring (Upstream)

  • PUT /rest/mirroring/latest/mirrorServers/{mirrorId} The request and response body don't contain the following fields and passing them in the request doesn't do anything:
    • addonDescriptorUri - This was only present in the request body and is no more applicable as the mirrors are not installed as add-on on upstream.
    • productType - This always used to be "Bitbucket".
  • POST /rest/mirroring/latest/requests The request and response body don't contain the following fields and passing them in the request doesn't do anything:
    • addonDescriptorUri - This is no more applicable as the mirrors are not installed as add-on on upstream.
    • productType - This always used to be "Bitbucket".
  • GET /rest/mirroring/latest/requests The response body doesn't contain the following fields anymore:
    • addonDescriptorUri - This is no more applicable as the mirrors are not installed as add-on on upstream.
    • productType - This always used to be "Bitbucket".
  • GET /rest/mirroring/latest/requests/{mirroringRequestId} The response body doesn't contain the following fields anymore:
    • addonDescriptorUri - This is no more applicable as the mirrors are not installed as add-on on upstream.
    • productType - This always used to be "Bitbucket".
  • GET /rest/mirroring/latest/mirrorServers The response body doesn't contain the following field anymore:
    • productType - This always used to be "Bitbucket".
  • GET /rest/mirroring/latest/mirrorServers/{mirrorId} The response body doesn't contain the following field anymore:
    • productType - This always used to be "Bitbucket".
  • GET /mirroring/latest/repos/{repoId}/mirrors now supports additional optional boolean query parameter preAuthorized. This parameter is false if not provided and setting it to true will return the URLs which are pointing to upstream and don't contain JWT. Starting Bitbucket 10.0, this will be the default behavior and the preAuthorized query parameter will be removed.
  • POST /rest/mirroring/latest/authenticate The field requiredPermissionsOnly is removed from the request body and passing it won't do anything. For non-SSH credentials, the response will contain only the highest global permission along with the highest repository permission (if repository ID is also provided in the request).

Removed REST APIs without deprecation

Mirroring (Upstream)

  • Removed GET /rest/mirroring/latest/mirrorServers/{mirrorId}/token as the upstream no longer provides a JWT to authenticate with mirrors due to a security vulnerability. Prior to 9.0.0, this end-point was used on the Mirrors setting admin screen for generating a JWT to authorize with mirrors.
  • Removed GET /rest/mirroring/latest/mirrorServers/{mirrorId}/webPanels/config as this is no more applicable due to UI changes on Mirror settings page.

Deprecated REST APIs removed

Tasks are now managed using Comments with BLOCKER severity. The following deprecated REST endpoints have been removed:

Get pull request tasks

  • Removed: GET /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/tasks
  • Replacement: GET /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/blocker-comments

Get pull request task count

  • Removed: GET /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/tasks/count
  • Replacement: GET /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/blocker-comments?count=true

Create task

  • Removed: POST /rest/api/latest/tasks
  • Replacement: POST /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/comments, passing the attribute severity set to BLOCKER.

Get task

  • Removed: GET /rest/api/latest/tasks/{taskId}
  • Replacement: GET /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/comments/{commentId}

Update task

  • Removed: PUT /rest/api/latest/tasks/{taskId}
  • Replacement: PUT /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/comments/{commentId}, to resolve a task, pass the attribute state set to RESOLVED.

Delete task

  • Removed: DELETE /rest/api/latest/tasks/{taskId}
  • Replacement: DELETE /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/comments/{commentId}

The following mirroring REST endpoints have been removed:

Change upstream settings

This operation is now automatically triggered by a background task.

  • Removed: POST /rest/mirroring/latest/upstreamServers/{upstreamId}/repos/{upstreamRepoId}/synchronization
  • Removed: POST /rest/mirroring/latest/upstreamServers/{upstreamId}/synchronization

On disable of mirror addon

Starting from 4.6.0, mirrors no longer specify a disabled lifecycle callback in their addon descriptor. Prior to 4.6.0, this was the callback method that was called when the mirroring atlassian-connect add-on has been disabled in the upstream server identified by upstreamId.

  • Removed: POST rest/mirroring/latest/upstreamServers/{upstreamId}/addon/disabled

On enable of mirror addon

Starting from 4.6.0, mirrors no longer specify an enabled lifecycle callback in their addon descriptor. Prior to 4.6.0, this was the callback method that was called when the mirroring atlassian-connect add-on has been enabled in the upstream server identified by upstreamId.

  • Removed: POST /rest/mirroring/latest/upstreamServers/{upstreamId}/addon/enabled

Frontend: Source view Web Fragments replaced with Client Side Extensions

Web Fragments on the source view page have been converted to Client Side Extensions (CSEs). Apps that want to extend the source view page should move the React-based CSE framework. You can read more about using CSEs here. We also have an example app that uses CSEs.

The following plugin points have been migrated to CSEs:

  • bitbucket.file-content.source.toolbar.primary
  • bitbucket.file-content.source.toolbar.secondary
  • bitbucket.file-content.diff.toolbar.primary
  • bitbucket.file-content.diff.toolbar.secondary
  • bitbucket.file-content.diff-view.options
  • bitbucket.branch.layout.actions.dropdown (source view only)

Client Side Extensions documentation

Web Fragments documentation

Frontend: jQuery update

jQuery has been updated to version 3.6.0 and jQuery Migrate to version 3.4.1. If your app uses jQuery, we recommend upgrading to version 3.6.0 for best performance and compatibility going forward.

Important things to note about the frontend API changes:

Bitbucket Data Center 8.18

Draft PR

Added the following endpoints:

Modifications in existing endpoints:

Added optional draft parameter for the following endpoint to filter pull requests by draft status

  • GET /rest/api/latest/projects/{{projectKey}}/repos/{{repositorySlug}}/pull-requests

Java API changes:

  • Added new method isDraft in PullRequest
  • Added new method visit in PullRequestActivityVisitor for PullRequestDraftStatusUpdatedActivity
  • Added new method isDraft in PullRequestCreateRequest
  • Added new method draft in PullRequestCreateRequest
  • Added new interface PullRequestDraftStatusUpdatedActivity
  • Added new method isDraft in PullRequestImportRequest
  • Added new method draft in PullRequestImportRequest
  • Added new value DRAFT_STATUS in PullRequestOrderenum
  • Added new method isDraft in PullRequestSearchRequest
  • Added new method draft in PullRequestSearchRequest
  • Added new constructor in PullRequestUpdatedEvent which takes previousDraft as a parameter
  • Deprecated previous constructor in PullRequestUpdatedEvent
  • Added new method isDraft in PullRequestUpdatedEvent
  • Added new method isPreviousDraft in PullRequestUpdatedEvent
  • Added new method isDraft in PullRequestUpdateRequest
  • Added new method draft in PullRequestUpdateRequest
  • Added new method isDraft in RestPullRequest
  • Added new method hasDraft in RestPullRequest
  • Added new class RestPullRequestDraftStatusUpdatedActivity

Bitbucket Data Center 8.17

Signed system commits

Added the following endpoints:

Update and retrieve the configuration for signed system commits

  • POST /rest/api/latest/system-signing/configuration
  • GET /rest/api/latest/system-signing/configuration

Modifications in existing endpoints:

Updated order query parameter for the following endpoint to accept a list of dimensions to order by

  • GET /rest/api/latest/dashboard/pull-requests

Java API changes:

  • Added new method getOrders in PullRequestSearchRequest which returns a list to order search results in
  • Deprecated getOrder in PullRequestSearchRequest
  • Added new method orders in PullRequestSearchRequest

Bitbucket Data Center 8.16

Merge-base endpoints

Added the following endpoints:

Returns the best common ancestor between two commits

  • GET /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/commits/{commitId}/merge-base?otherCommitId={otherCommitId}

Return the best common ancestor between the latest commits of the source and target branches of the pull request

  • GET /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/merge-base?otherCommitId={otherCommitId}

Java API changes:

  • Added new method getMergeBase in PullRequestService

Bitbucket Data Center 8.15

Pull request auto-merge

Added the following endpoints:

Create, update, delete and get auto-merge settings at project level

  • PUT /rest/api/latest/projects/{projectKey}/settings/auto-merge
  • DELETE /rest/api/latest/projects/{projectKey}/settings/auto-merge
  • GET /rest/api/latest/projects/{projectKey}/settings/auto-merge

Create, update, delete and get auto-merge settings at repository level

  • PUT /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/settings/auto-merge
  • DELETE /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/settings/auto-merge
  • GET /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/settings/auto-merge

Request the system to try merging a pull request when auto-merge is already requested for it

  • POST /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/auto-merge

Cancel a request for auto-merging the pull request

  • DELETE /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/auto-merge

Getting details of an auto-merge request for the pull request

  • GET /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/auto-merge

Modifications in existing endpoints:

Added autoMerge field in the request body for the following endpoint to submit auto-merge request for the pull request

  • POST /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/merge

Added autoMerge field in the response body for the following endpoint when the action field is equal to MERGED. The new field indicates if the merged activity denotes an auto-merge action by the system or a manual merge by the user

  • POST /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/activities

Java API changes:

  • Added new values AUTO_MERGE_CANCELLED and AUTO_MERGE_REQUESTED in PullRequestAction enum.
  • Added a new value PULL_REQUEST_AUTO_MERGE in StandardFeature enum.
  • Added a new constructor in SimplePullRequestMergeHookRequest.Builder class that accepts additional parameter abortOnFirstVeto.
  • Added 2 new constructors and deprecated 2 existing constructors in PullRequestMergedEvent.
  • Added new method isAutoMerge in PullRequestMergedEvent.
  • Added new method isAutoMerge in PullRequestMergedActivity.
  • Added new method isAutoMerge in RestPullRequestMergedActivity.
  • Added new enum AutoMergeCancelledReason.
  • Added new interface PullRequestAutoMergeCancelledActivity.
  • Added a new overload of visit method in PullRequestActivityVisitor which takes a parameter of type PullRequestAutoMergeCancelledActivity.
  • Added new event classes:
    • PullRequestAutoMergeCancelledEvent
    • PullRequestAutoMergeRequestedEvent
  • Added new exception classes:
    • AutoMergeNotRequestedException
    • AutoMergeSettingNotEnabledException
  • Added a new interface AutoMergeRequest
  • Added a new interface AutoMergeService.
  • Added a new interface AutoMergeSettings.
  • Added a new class AutoMergeProcessingResult.
  • Added a new class AutoMergeSettingsCreateRequest.
  • Added a new interface AutoMergeSettingsService.
  • Added following new classes in rest-model module:
    • RestAutoMergeProcessingResult
    • RestAutoMergeProjectSettingsRequest
    • RestAutoMergeRequest
    • RestAutoMergeRestrictedSettings
    • RestAutoMergeSettings
    • RestAutoMergeSettingsRequest
  • Added a new method isAutoMerge in RestPullRequestMergeRequest in rest-model module.

Bitbucket Server 8.14

Java API changes:

  • Deprecated getContext method in PullRequestMergeRequest and context method in PullRequestMergeRequest.Builder.
  • Deprecated getContext method in PullRequestMergeCommandParameters and context method in PullRequestMergeCommandParameters.Builder.
  • Deprecated getContext in MergeRequest SPI.
  • Deprecated method getContext in RestPullRequestMergeRequest in rest-model module.
  • Added new exception classes in git-api module:
    • GitEmptyRebaseBeforeMergeException
    • GitEmptySquashException
    • GitMergeStrategyException
    • GitRebaseBeforeMergeConflictedException
    • GitUnsupportedMergeStrategyException

Bitbucket Server 8.13

Ability to revert commits

Java API/SPI changes at SCM level:

  • Added a new value REVERT in the ScmFeature enum.
  • Added a new method revert in ScmExtendedCommandFactory.
  • Added a new method revert in PluginExtendedCommandFactory SPI to allow SCMs to provide their own implementation for reverting commits.
  • Added a new class RevertCommandParameters to describe a request to revert the commit.

SSH Keys

Java API changes:

  • Deprecated com.atlassian.bitbucket.ssh.util.KeyUtils provided by the module ssh-api, for removal in 9.0. Use third-party alternatives for operations on SSH public keys.
  • Deprecated @EncodedPublicKey and the associated com.atlassian.bitbucket.ssh.validation.PublicKeyValidator for removal in 9.0. Use alternate ways of validating encoded SSH public keys.
    • Added isDisabled method in FeatureManager.

Bitbucket Server 8.12

Easier management of licensed users

Added the following endpoints:

Get active user directories, you can specify an optional query param to include inactive directories

  • GET /rest/api/latest/admin/user-directories?includeInactive=<includeInactive>

Pull request commit message templates

Commit message templates are an extension on the existing Merge Strategies

If no value is provided for the template when posting to existing resources no change is made to the template. Sending an empty object for the template will remove the template.

New Java API exists to create and remove templates, but not to get rendered templates.

Bitbucket Server 8.10

Project settings restrictions

Added the following endpoints:

Create a new restriction in the given project

  • POST /rest/api/latest/projects/{projectKey}/settings-restriction

Delete a restriction in the given project with the provided namespace, feature key and optional component key

  • DELETE /rest/api/latest/projects/{projectKey}/settings-restriction?namespace=<namespace>&featureKey=<featureKey>&componentKey=<componentKey>

Gets a restriction in the given project with the provided namespace, feature key and optional component key if one is present

  • GET /rest/api/latest/projects/{projectKey}/settings-restriction?namespace=<namespace>&featureKey=<featureKey>&componentKey=<componentKey>

Gets all restriction in the given project with the provided namespace and feature key if any are present

  • GET /rest/api/latest/projects/{projectKey}/settings-restriction/all?namespace=<namespace>&featureKey=<featureKey>

Automatic branch merging feature is renamed to cascading merge

Starting 8.10, automatic branch merging feature is known as cascading merge. Following classes are deprecated for removal in 9.0:

  • AutomaticMergeEvent is replaced by a new class CascadingMergeEvent
  • AutomaticMergeStoppedEvent is replaced by a new class CascadingMergeStoppedEvent
  • AutomaticMergeStopReason is replaced by a new class CascadingMergeStopReason
  • AutomaticMergeSucceededEvent is replaced by a new class CascadingMergeSucceededEvent

Bitbucket Server 8.9

Resolvable/collapsible pull request comments

Added threadResolved body parameter to the following endpoints:

  • GET /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/comments/{commentId}
  • PUT /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/comments/{commentId}

New endpoint for Mesh

  • DELETE /rest/api/latest/admin/git/mesh/nodes/{id}

Bitbucket Server 8.8

New endpoints for webhooks

Prior to 8.8, webhooks only existed at the repository level. In 8.8, we've added support for project level webhooks.

New REST endpoints:

Create a webhook in the given project

  • POST /rest/api/latest/projects/{projectKey}/webhooks

Find webhooks in the given project

  • GET /rest/api/latest/projects/{projectKey}/webhooks

Get a webhook in the given project

  • GET /rest/api/latest/projects/{projectKey}/webhooks/{webhookId}

Delete a webhook in the given project

  • DELETE /rest/api/latest/projects/{projectKey}/webhooks/{webhookId}

Update an existing webhook in the given project

  • PUT /rest/api/latest/projects/{projectKey}/webhooks/{webhookId}

Get the latest invocations for a specific webhook in the given project

  • GET /rest/api/latest/projects/{projectKey}/webhooks/{webhookId}/latest

Get the statistics for a specific webhook in the given project

  • GET /rest/api/latest/projects/{projectKey}/webhooks/{webhookId}/statistics

Get the statistics summary for a specific webhook in the given project

  • GET /rest/api/latest/projects/{projectKey}/webhooks/{webhookId}/statistics/summary

Test connectivity to a specific endpoint

  • POST /rest/api/latest/projects/{projectKey}/webhooks/test?url=<url>&?sslVerificationRequired=<true|false>

Search webhooks in the given repository and parent project by scope.

  • GET /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/webhooks/search?scopeType=<scopeType>

Bitbucket Server 8.7

RestSshKey class updated to contain created date, expiry days and last authenticated fields

New endpoints for SSH keys global settings

Global settings that enforce the maximum expiry of SSH keys and restrictions on SSH key types

  • GET /rest/ssh/latest/admin

  • PUT /rest/ssh/latest/admin

Get supported SSH key algorithms and lengths

  • GET /rest/ssh/latest/admin/supported-key-types

Get SSH key by ID

  • GET /rest/ssh/latest/keys/{id}

Bitbucket Server 8.6

New endpoints to troubleshoot mirrors

Inspect the contents of a mirror farm's ref changes queue

  • GET /rest/mirroring/latest/supportInfo/refChangesQueue

Gets the number of items within the ref changes queue

  • GET /rest/mirroring/latest/supportInfo/refChangesQueue/count

Gets the sync status of repositories on the mirror node

  • GET /rest/mirroring/latest/supportInfo/repoSyncStatus

Bitbucket Server 8.5

New endpoint to search permissions

Search direct and implied permissions of users and groups

  • GET /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/permissions/search
  • GET /rest/api/latest/projects/{projectKey}/permissions/search

New endpoints for secret scanning

Project level allow list rules

  • GET /rest/api/latest/projects/{projectKey}/secret-scanning/allowlist
  • POST /rest/api/latest/projects/{projectKey}/secret-scanning/allowlist
  • GET /rest/api/latest/projects/{projectKey}/secret-scanning/allowlist/{id}
  • DELETE /rest/api/latest/projects/{projectKey}/secret-scanning/allowlist/{id}
  • PUT /rest/api/latest/projects/{projectKey}/secret-scanning/allowlist/{id}

Repository level allow list rules

  • GET /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/secret-scanning/allowlist
  • POST /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/secret-scanning/allowlist
  • GET /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/secret-scanning/allowlist/{id}
  • DELETE /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/secret-scanning/allowlist/{id}
  • PUT /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/secret-scanning/allowlist/{id}

Bitbucket Server 8.4

New endpoints for secret scanning

Project level rules

  • GET /rest/api/latest/projects/{projectKey}/secret-scanning/rules
  • POST /rest/api/latest/projects/{projectKey}/secret-scanning/rules
  • GET /rest/api/latest/projects/{projectKey}/secret-scanning/rules/{id}
  • DELETE /rest/api/latest/projects/{projectKey}/secret-scanning/rules/{id}
  • PUT /rest/api/latest/projects/{projectKey}/secret-scanning/rules/{id}

Repository level rules

  • GET /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/secret-scanning/rules
  • POST /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/secret-scanning/rules
  • GET /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/secret-scanning/rules/{id}
  • DELETE /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/secret-scanning/rules/{id}
  • PUT /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/secret-scanning/rules/{id}

Bitbucket Server 8.3

Permission bulk revoke

Revoke all permissions for the specified project/repository for the given groups and users

  • DELETE /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/permissions
  • DELETE /rest/api/latest/projects/{projectKey}/permissions

New endpoints for secret scanning

Global level rules

  • GET /rest/api/latest/secret-scanning/rules
  • POST /rest/api/latest/secret-scanning/rules
  • GET /rest/api/latest/secret-scanning/rules/{id}
  • DELETE /rest/api/latest/secret-scanning/rules/{id}
  • PUT /rest/api/latest/secret-scanning/rules/{id}

Bitbucket Server 8.2

New project permission

REPO_CREATE has been added as a project permission to give users more autonomy to create repositories and maintain them. Users can now create, import and fork repositories into a project they are assigned REPO_CREATE in. When a user creates, imports or forks a repository they will automatically be added as an admin to that repository. The user will also have REPO_WRITE access to the project.

Bitbucket Server 8.0

End of Windows Support

Microsoft Windows has always been an inferior platform for hosting Bitbucket Server when compared to Linux. Disk I/O and process forking performance is poor on Windows and this impacts Bitbucket’s performance. As a result, we have never supported Data Center licenses or licenses with more than 500 users on Windows.

Bitbucket 8.0 will not support hosting on the Windows operating system. For app developers running Windows, we recommend running Bitbucket from within Windows Subsystem for Linux or in a virtual machine.

Deprecated Java APIs removed

Interfaces, classes, and methods in the Bitbucket Data Center Java API that were previously marked as deprecated have been removed.

Plugins that use any of these interfaces (which would have generated deprecation warnings when built against Bitbucket Server 7.x) generally won’t build with Bitbucket Data Center 8.x

Precompiled plugins that used any of the removed interfaces will fail to install or run in Bitbucket Data Center 8.x, typically with java.lang.NoSuchMethodError or java.lang.ClassNotFoundExceptions.

ScmCommandBuilder changes and the GitWorkTree API

Bitbucket 8.0 includes changes to support Bitbucket Mesh, which uses replication to provide scaling and high availability. Bitbucket needs to have strict control over updates to repositories to ensure all replicas are updated in sync. Several commands that could earlier be invoked using ScmCommandBuilder can no longer be used directly starting in 8.0. The following is a comprehensive list of such commands:

1
2
"add", "apply", "bisect", "checkout", "checkout-index", "citoool", "clean", "clone", "commit", "commit-tree", "config", 
"credential", "credential-cache", "credential-store", "daemon", "fast-import", "filter-branch", "gc", "gui", 
"imap-send", "init", "init-db", "instaweb", "ls-files", "merge-file", "merge-index", "merge-one-file", "merge-tree", 
"prune", "read-tree", "reflog", "reset", "restore", "rm", "stash", "send-email", "show-index", "sparse-checkout", 
"status", "submodule", "switch", "web--browse", "update-index", "worktree", "write-tree"

Some commands in the above list will be restricted in Bitbucket 8.0 to prevent changes that could break the replication mechanism. Other commands only make sense in non-bare repositories and will only be supported in the context of a GitWorkTree. The GitWorkTree API was introduced in Bitbucket 7.14 and there is an introduction to the API in the Bitbucket 7.14 API changelog.

Removed API and REST resources related to Tasks

In Bitbucket 7.2, Tasks were replaced with “blocker comments” in order to support top-level tasks and tasks with rich text. Details on affected classes and migration guidance can be found in the Bitbucket 7.2 API changelog.

Change in return type of RepositoryDeletedEvent.getForkIds and RepositoryDeletionRequestedEvent.getForkIds

Both these classes returned an Iterable<Integer> and have been changed to return Set<Integer> for ease of use.

Replaced Bitbucket auditing API with cross-product auditing API

Bitbucket 7.0 introduced a new cross-product audit log that captured more events and more information about each event. It also introduced a new API for auditing events (and a new REST API for retrieving auditing events from the database) and deprecated the Bitbucket’s old auditing API (mostly contained within the com.atlassian.bitbucket.audit package).

Bitbucket 8.0 removes the old audit API which includes classes in com.atlassian.bitbucket.audit and a number of other classes that converted between the old system and the new system. NOTE: Bitbucket 8.0 also removes the old legacy REST API for getting audit events by project or repository.

Details on the cross-product auditing log and a short introduction to the new API can be found in this post to the Atlassian developer community.

Removed API details

The following classes and interfaces have been removed in Bitbucket Server 8.0. Please see the linked Javadoc for Bitbucket Server 7.21 for informing regarding deprecation and possible alternative classes and interfaces.

  • AvatarDeletedException
  • BuildStatus
  • BuildStatusService
  • BuildStatusSetEvent
  • BuildStatusSetRequest
  • BuildSummary
  • RestDetailedRepository
  • RestDetailedRepositoryPage
  • TaskEvent and subclasses (TaskCreatedEvent, TaskDeletedEvent, TaskUpdatedEvent)

In addition, deprecated methods in existing classes and interfaces across the whole Bitbucket Data Center API have been removed:

  • NavBuilder methods related to the Jira commit checker and the old way of building attachments.

Consult the Bitbucket Server 7.21 Java API Reference for details on the removed methods, and their alternatives in Bitbucket Server 8.x.

Deprecated Frontend APIs removed

In Bitbucket 7.0, we redesigned the pull request experience to bring a slew of new features and better performance.

Bitbucket 8.0 introduces the same experience to other areas in Bitbucket where we show code diffs: the commit diff page, the create pull request page and the branch compare page. As a result, plugin points on these pages will no longer render. Frontend plugin points on these pages will need to change, similar to what was required for the original pull request update.

New build states

CI tools can now create build statuses with UNKNOWN and CANCELLED state. Consumers of build statuses should also update their integrations to handle these possible states on a build status.

Known Issues

There is currently a bug in the Web Resource Manager that means some plugin internationalization may not work as expected. The workaround to this bug is documented in this post in our developer forums.

Bitbucket Server 7.21

SearchInformationService#getElasticsearchVersion() has been deprecated and will be removed in Bitbucket Server 8.0. SearchInformationService#getDistribution() and SearchInformationService#getVersion() should be used instead.

Bitbucket Server 7.19

Build-status

Project namespace deprecation

  • All project namespace related parameters and methods have been deprecated and will be removed in Bitbucket Server 8.0. In addition, starting from Bitbucket Server 7.19, any value passed to those methods for the namespace parameter is ignored. This should have no effect on third party plugins as namespaces were only used on Bitbucket Mirror installations, which do not allow third party plugins to run.

Bitbucket Server 7.18

Project and Repository HTTP access tokens

New REST endpoints:

  • GET /rest/access-tokens/1.0/projects/{projectKey} and GET /rest/access-tokens/1.0/projects/{projectKey}/repos/{repositorySlug}

get HTTP tokens for the provided project or repository

  • PUT /rest/access-tokens/1.0/projects/{projectKey} and PUT /rest/access-tokens/1.0/projects/{projectKey}/repos/{repositorySlug}

create an HTTP token for the provided project or repository

  • GET, DELETE, POST /rest/access-tokens/1.0/projects/{projectKey}/{tokenId} and GET, DELETE, POST /rest/access-tokens/1.0/projects/{projectKey}/repos/{repositorySlug}

get, delete or modify the provided token

Bitbucket Server 7.16

Deployments

New REST endpoints:

  • GET /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/commits/{commitId}/deployments?key=<key>&environmentKey=<environmentKey>&deploymentSequenceNumber=<deploymentSequenceNumber>

get the deployment matching the specified repositorySlug, key, environmentKey and deploymentSequenceNumber.

  • DELETE /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/commits/{commitId}/deployments?key=<key>&environmentKey=<environmentKey>&deploymentSequenceNumber=<deploymentSequenceNumber>

delete the deployment matching the specified repositorySlug, key, environmentKey and deploymentSequenceNumber.

  • POST /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/commits/{commitId}/deployments

create or update a deployment.

Bitbucket Server 7.15

Branch deletion on merge

New Java and REST API methods have been added to configure Branch deletion on merge for Project and Repository.

DeleteAfterMergeConfigurationService.deleteConfiguration(scope), DeleteAfterMergeConfigurationService.getConfiguration(scope) and DeleteAfterMergeConfigurationService.setConfiguration(DeleteAfterMergeConfigurationRequest) introduce the ability to configure Branch deletion on merge feature.

New REST endpoints:

PROJECT

  • GET /rest/branch-utils/latest/projects/{key}/delete-after-merge

get if the feature is enabled for a Project.

  • POST /rest/branch-utils/latest/projects/{key}/delete-after-merge

enable or disable the feature for a Project.

REPOSITORY

  • GET /rest/branch-utils/latest/projects/{key}/repos/{slug}/delete-after-merge

get if the configuration is enabled for a Repository.

  • POST /rest/branch-utils/latest/projects/{key}/repos/{slug}/delete-after-merge

enable or disable the configuration for a Repository.

  • DELETE /rest/branch-utils/latest/projects/{key}/repos/{slug}/delete-after-merge

delete the configuration for a Repository.

Bitbucket Server 7.14

Repository size

Bitbucket 7.14 uses a different mechanism for repository size calculation to make it more efficient. Following changes are done in the Bitbucket API/SPI:

  • A new method repositorySize is added to ScmCommandFactory.
  • ScmService#getSize is deprecated and will be removed in 8.0. This method is replaced by ScmCommandFactory#repositorySize.
  • A new interface RepositorySize that represents the size of a repository.
  • A new class RepositorySizeCommandParameters that represents the additional command parameters provided to the ScmCommandFactory#repositorySize method.
  • A new method repositorySize is added to PluginCommandFactory SPI with a default implementation that returns a
    SimpleCommand returning repository size as null. The default implementation will be removed in 8.0.
  • Scm#getSize is deprecated and will be removed in 8.0. This method is replaced by PluginCommandFactory#repositorySize.
  • A new method repositorySize is added to GitCommandFactory to return a GitCommand for calculating the repository size.
  • A new interface GitCountObjectsBuilder for building git count-objects command.
  • A new method countObjects is added to GitScmCommandBuilder for creating an instance of GitCountObjectsBuilder.
  • RepositoryService#getSize uses the new command returned by ScmCommandFactory#repositorySize. A cached value is returned which may not be updated immediately after the content changes. Also, this method uses different configuration for timeout and returns 0 when the underlying command times out.

WorkTree API

Bitbucket 7.14 introduces a new API for dealing with worktree paths in repositories. A worktree is a temporary location on disk associated with a change operation and is deleted when the operation completes or when the expiry time defined for the worktree has been reached. These are different from Git worktrees which allow managing multiple generally long-lived additional working copies for a single repository.

Historically, apps that wanted to create new (merge) commits could use the free-form API exposed by ScmCommandBuilder to manually set up a worktree using git clone --no-checkout. That will no longer be possible from 8.0 because Bitbucket Server is moving to a model where Git repositories can be moved to external nodes. As a result, it will no longer be possible to run free-form git commands to (efficiently) set up local worktrees. To address this, Bitbucket 7.14 introduces a new GitWorkTree API to allow apps to set up and work with worktrees in a way that will work with repositories hosted on external nodes. The newly introduced GitWorkTreeBuilder can be used to create a GitWorkTree for a given Repository, perform operations in the context of the GitWorkTree, and optionally publish the changes back to the Repository.

App developers are strongly encouraged to investigate whether their existing apps can be built with the new API as soon as possible and provide feedback. The initial API in Bitbucket Server 7.14 should cover many use cases, but it may have gaps that would be blockers for some apps. If app developers wait until Bitbucket Server 8.0 forces them to adopt the new API, they may find it’s not possible.

In addition, since Bitbucket Mesh will use replication to provide scaling and high availability, Bitbucket needs to have strict control over updates to repositories to ensure all replicas are updated in sync. Several commands that could earlier be invoked using ScmCommandBuilder can no longer be used directly starting 8.0. Following is a comprehensive list of such commands:

1
2
"add", "apply", "bisect", "checkout", "checkout-index", "citoool", "clean", "clone", 
"commit", "commit-tree", "config", "credential", "credential-cache", "credential-store", 
"daemon", "fast-import", "filter-branch", "gc", "gui", "imap-send", "init", "init-db",
"instaweb", "ls-files", "merge-file", "merge-index", "merge-one-file", "merge-tree", 
"prune", "read-tree", "reflog", "reset", "restore", "rm", "stash", "send-email", 
"show-index", "sparse-checkout", "status", "submodule", "switch", "web--browse",
"update-index", "worktree", "write-tree"

Some of the commands in the above list will be restricted in Bitbucket 8.0 to prevent changes that could break the replication mechanism. Other commands only make sense in non-bare repositories and will only be supported in the context of a GitWorkTree.

The basic workflow for creating a set of changes in a repository using the new GitWorkTree API looks like the following:

  • Create a new GitWorkTreeBuilder for the repository using GitWorkTreeBuilderFactory#builder(Repository).

  • Create a new temporary GitWorkTree using the GitWorkTreeBuilder. This worktree is automatically deleted after the operation completes.

    • Specify the commit the worktree should check out using GitWorkTreeBuilder#commit(String).

    • Use GitWorkTreeBuilder#execute(GitWorkTreeCallback) to execute the desired change operation in the context of the temporary GitWorkTree.

  • Add or edit files using GitWorkTree#write(String, Charset, IoConsumer), or use GitWorkTree#builder() to manipulate the index directly (though Git operations such as rm and mv) and/or to create new commits.

  • Use GitWorkTree#publish(PublishGitWorkTreeParameters) to publish the HEAD commit of the worktree to the repository, using PublishGitWorkTreeParameters.Builder#branch(String, String) to specify the target branch to update. A single branch can be updated at a time, but it is possible to call GitWorkTree#publish(PublishGitWorkTreeParameters) more than once to update different branches in the lifetime of a single GitWorkTree.

For a more complete example, refer to this page.

Build-status

In Bitbucket 7.14, the following new REST end-points are added for build-status:

  • GET /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/commits/{commitId}/builds
  • DELETE /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/commits/{commitId}/builds

The following REST end-points are deprecated:

  • GET /rest/api/1.0/build-status/latest/commits/{commitId}
  • POST /rest/api/1.0/build-status/latest/commits/{commitId}

Bitbucket Server 7.13

In Bitbucket 7.13, Bitbucket Data Center introduces a way to create reviewer groups to add to pull requests. Reviewer groups can be created on a project and repository context by users with admin permissions.

New REST endpoints:

PROJECT

  • GET /rest/api/latest/projects/{key}/settings/reviewer-groups/

get all the reviewer groups of a Project.

  • GET /rest/api/latest/projects/{key}/settings/reviewer-groups/{id}

get a specific reviewer group given the specified ID.

  • POST /rest/api/latest/projects/{key}/settings/reviewer-groups/

create a reviewer group.

  • PUT /rest/api/latest/projects/{key}/settings/reviewer-groups/{id}

update the name and users of a reviewer group given a specified ID.

  • DELETE /rest/api/latest/projects/{key}/settings/reviewer-groups/{id}

delete the reviewer group given a specified ID.

REPOSITORY

  • GET /rest/api/latest/projects/{key}/repos/{slug}/settings/reviewer-groups/

get all the reviewer groups of a Repository.

  • GET /rest/api/latest/projects/{key}/repos/{slug}/settings/reviewer-groups/{id}

get a specific reviewer group given a specified ID.

  • GET /rest/api/latest/projects/{key}/repos/{slug}/settings/reviewer-groups/{id}/users

retrieve the users of a reviewer group. This does not return all the users of the group, only the users who have REPO_READ permission for the specified repository.

  • POST /rest/api/latest/projects/{key}/repos/{slug}/settings/reviewer-groups/

create a reviewer group.

  • PUT /rest/api/latest/projects/{key}/repos/{slug}/settings/reviewer-groups/{id}

update the name and users of a reviewer group with a specified ID.

  • DELETE /rest/api/latest/projects/{key}/repos/{slug}/settings/reviewer-groups/{id}

delete the reviewer group given a specified ID.

The new ReviewerGroupService introduces this ability to create, edit and delete reviewer groups.

Bitbucket Server 7.9

Rolling Upgrades

Starting with Bitbucket 7.9, Bitbucket Data Center can be upgraded without downtime through a rolling upgrade. The administrative actions required to orchestrate a rolling upgrade (such as enable upgrade mode or approve upgrade) can be triggered via the Bitbucket REST API. For more details see the Rolling Upgrades REST API documentation.

Node build version

In Bitbucket 7.9 we have updated the Bitbucket API, ClusterNode, to expose getBuildVersion. When called, the semantic Bitbucket version running on the queried node is returned. Additionally, when calling the /rest/api/1.0/admin/cluster REST endpoint, each node result will include its version.

UNKNOWN application state

The enum type,ApplicationState, was updated as part of Bitbucket 7.9 to include the value UNKNOWN. This new enum value is used to indicate that the application is in an indeterminate state.

Bitbucket Server 7.8

Shutdown hooks

A new SPI ShutdownHook allows components to respond to system shutdown as soon as it is initiated. When the Bitbucket JVM is terminated gracefully (and not killed immediately), components are shutdown in different phases over a period of time. Components implementing ShutdownHook are the first ones to be notified by invoking ShutdownHook.startShutdown, which give them opportunity to prepare for shutdown e.g. drain tasks, flush data, "finalize" the state before shutdown. ShutdownHook receives Duration as parameter in ShutdownHook.startShutdown, which is the longest system will wait for it to finish its processing before shutdown process continues without it and eventually terminates it.

Build server provider

A new SPI com.atlassian.bitbucket.build.server.PluginBuildServerProvider allows plugins to act as a proxy between Bitbucket Server and a CI tool. Implement this class, and register it in the plugin's atlassian-plugin.xml file using:

1
2
<build-server-provider
        key="my-ci-tool-provider"
        class="com.my.plugin.MyBuildServerProvider"/>

This will allow Bitbucket Server to call on the plugin when a build status is created using com.atlassian.bitbucket.build.server.PluginBuildServerProvider.getBuildServer in order to record the build status as being associated with that plugin.

Build statuses that have a build server will be able to:

  • Have log and artifact links displayed in the UI, as provided by the plugin's implementation of com.atlassian.bitbucket.build.server.BuildStatusEnricher
  • Allow the user to authenticate with the CI tool (via OAuth or similar), as provided by the plugin's implementation of com.atlassian.bitbucket.build.server.operations.PluginBuildServerClient.getAuthorizationUrl
  • Allow the user to perform actions in the CI tool, as provided by the plugin's implementation of com.atlassian.bitbucket.build.server.operations.PluginBuildServerClient.getOperations and com.atlassian.bitbucket.build.server.operations.PluginBuildServerClient.performAction

Bitbucket Server 7.7

Comment Reactions

Starting in Bitbucket 7.7 responding to comments became more interesting and fun. We have added the ability to add emoji to any comment. Any "like" that is already present on a comment will be migrated and represented as a "thumbsup" emoji instead now.

CommentReactionService.addReaction, CommentReactionService.removeReaction, and CommentReactionService.getReaction introduce this ability to add a reaction, remove a reaction, and check whether a user has reacted to a comment with a specific reaction respectively.

New REST endpoints:

  • PUT /rest/api/latest/projects/{key}/repos/{slug}/pull-requests/{id}/comments/{comment_id}/reactions/{emoticon}

can be used to add a specific emoji to a specific comment. The request header should have Content-Type: application/json.

  • DELETE /rest/api/latest/projects/{key}/repos/{slug}/pull-requests/{id}/comments/{comment_id}/reactions/{emoticon}

can be used to remove a specific emoji to a specific comment.

NOTE: CommentLikeService has been marked as deprecated as of Bitbucket Server 7.7 and is due to be removed in Bitbucket Server 8.0. It has been replaced by the new CommentReactionService. App developers who rely on the CommentLikeService are strongly encouraged to update their code to use the new CommentReactionService directly as soon as possible to add reactions, remove reactions and get reactions.

Draft Comments

In Bitbucket Server 7.7 there is a new pull request review workflow that allows an authenticated user with permission to interact with a pull request to add draft comments only visible to that authenticated user. Once the authenticated user is finished with their pull request review they can batch publish their draft comments so that other users can see the comments.

New events that are included in this change are:

  • PullRequestReviewCommentAddedEvent - which is raised when a draft comment is added to a pull request.
  • PullRequestReviewCommentRepliedEvent - which is raised when a draft reply comment is added to a pull request.
  • PullRequestReviewDiscardedEvent - which is raised when a pull request review with draft comments is discarded.
  • PullRequestReviewFinishedEvent - which is raised when a pull request review with draft comments is completed.

The CommentState enum has also been modified to include PENDING.

PullRequestService.discardReview, PullRequestService.finishReview, and PullRequestService.getReviewThreads are new methods that discard a pull request review for the authenticated user, complete and finish a pull request review for the authenticated user, and get all the comment threads with draft comments for a pull request respectively.

CommentDao.deleteBatch has been added which deletes a batch of comments.

CommentThreadDao.searchPending has been added to get all the CommentThreads that have at least one draft comment. There are three restrictions though on this method where the Commentable supplied matches the comment, the author ID matches, and the comment state is PENDING.

The new REST endpoints:

  • DELETE /rest/api/latest/projects/{key}/repos/{slug}/pull-requests/{id}/review

can be used to delete/discard a pull request review for the authenticated user.

  • GET /rest/api/latest/projects/{key}/repos/{slug}/pull-requests/{id}/review

can be used to get all the comment threads which have draft comments for a pull request review for the authenticated user.

  • PUT /rest/api/latest/projects/{key}/repos/{slug}/pull-requests/{id}/review

can be used to finish a pull request review and publish all the draft comments for the authenticated user so that other users can see the comments.

Bitbucket Server 7.6

Client-Side Extensions

In Bitbucket Server 7.6 we updated the Client-side Extensions to the latest version 1.2.0. This version introduces the PageExtensions extension type that can be used to create custom pages in Bitbucket product by plugin developers.

Refer to the creating page guide and the Client-side Extensions changelog for more information about the changes.

Bitbucket Server 7.4

Async HTTP hosting

Starting in Bitbucket Server 7.4, hosting requests (think git clone, git fetch, git push, etc.) made via HTTP now use ServletRequest.startAsync to perform request processing using a separate ExecutorService, rather than one of Tomcat's container threads. This frees up container threads to serve REST and UI requests instead, to ensure heavy hosting load doesn't impact UI responsiveness. It also allows use of Servlet 3.1's ReadListener and WriteListener to perform non-blocking I/O while handling requests, which allows Bitbucket Server to significantly reduce the number of threads used when running git http-backend.

If your app registers any Servlet Filters, or provides any HttpScmRequests, this new async functionality may impact your app.

App-provided filters

Apps can register their own Servlet Filters to be included in the FilterChain by using the <servlet-filter/> module descriptor. In Bitbucket Server 7.4, Filters registered this way are assumed to support async, and must explicitly opt out by adding <async-supported>false</async-supported> like this:

1
2
<servlet-filter name="My Filter" key="my-filter" class="com.atlassian.example.web.MyFilter"
                location="before-login">
  <async-supported>false</async-supported>
  <!-- If you want your filter applied to the ASYNC dispatcher, you must specify that
       explicitly in your dispatcher list here. e.g. ASYNC,FORWARD,REQUEST. Including
       the ASYNC dispatcher on a filter that doesn't support async makes no sense. -->
  <dispatcher>REQUEST</dispatcher>
  <url-pattern>*</url-pattern>
</servlet-filter>

Explicitly disabling async support on your filter will prevent Bitbucket Server from using Servlet 3.1 non-blocking I/O for HTTP hosting, because ReadListener and WriteListener can only be used on async requests. This will negatively impact scalability, as performing hosting operations using blocking I/O requires extra threads and imposes more overhead. Setting <async-supported>false</async-supported> is intended to be a workaround to allow app-provided Filters to block async handling while they're updated to handle async requests.

Many Filters will work correctly for async requests without any changes:

1
2
public class MyFilter implements Filter {

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
          throws IOException, ServletException {
    //If your filter applies logic here, it will generally work async without changes.

    //If your filter wraps the ServletRequest or ServletResponse, those wrappers may be
    //used on another thread if the request is processed asynchronously. Generally that
    //shouldn't matter, but it's something to be aware of.
    chain.doFilter(request, response);

    //If your filter applies logic here, it will likely require updates to work correctly.
  }

  //Other methods omitted for brevity.
}

For Filter implementations that have code after chain.doFilter, for async requests the request will not be completed when that code is reached. Such Filters need to be updated to check request.isAsyncStarted():

1
2
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
        chain.doFilter(request, response);

        if (request.isAsyncStarted()) {
        //The request is running asynchronously. Register an AsyncListener to be notified when
        //the request completes. If the request has already completed (which, due to threading,
        //may be possible), the container will immediately call onComplete on the listener when
        //it's registered with the AsyncContext here.
        //You have to check isAsyncStarted() before calling getAsyncContext() or it may throw
        //an exception if the request is not async.
        request.getAsyncContext().addListener(new AsyncListener() {

@Override
public void onComplete(AsyncEvent event) {
        //At this point the async request has completed, so run any "after" logic.
        //You can get the "most wrapped" ServletRequest and ServletResponse from the
        //AsyncContext like this:
        AsyncContext context = event.getAsyncContext();
        runAfter(context.getRequest(), context.getResponse());

        //Or you can use the ones provided to doFilter, which were provided when the
        //AsyncListener is registered, if you passed them to addListener. If you use
        //addListener(AsyncListener) the "supplied" request/response will be null.
        //runAfter(event.getSuppliedRequest(), event.getSuppliedResponse());
        }

        //There are other methods on the interface, but onComplete is generally what filters
        //that had processing after chain.doFilter care about. Note that onComplete will be
        //called even if onError or onTimeout are called; it will be called after them.
        }, request, response); //<- These will be the "supplied" request/response on AsyncEvent.
        } else {
        //The request was processed synchronously, so it's already complete.
        runAfter(request, response);
        }
        }

private void runAfter(ServletRequest request, ServletResponse response) {
        //This is the logic that would have been after chain.doFilter
        }

App-provided HttpScmRequestHandlers and HttpScmRequests

A new isAsyncSupported() property has been added to HttpScmRequest. The default is false, so, unlike Filters, app-provided HttpScmRequest implementations will not automatically start running async. After doing local testing, app developers can override the default to indicate their HttpScmRequests support async.

Even if an HttpScmRequest returns true for isAsyncSupported(), it cannot assume it will be run that way. If any app-provided Filters block async, or if a system administrator has globally disabled async handling, HttpScmRequest implementations will be called synchronously. HttpScmRequests can check isAsyncStarted() on the HttpServletRequest to determine whether the request is running synchronously or asynchronously.

HttpScmRequests do not need to use non-blocking handling for async requests. There's no requirement that they check isAsyncStarted() and have special handling for async. In general, existing blocking handling will work as-is whether a request is run synchronously or asynchronously. The check simply allows HttpScmRequests the opportunity to use async features like ReadListener and WriteListener if they choose.

1
2
public class MyHttpScmRequestHandler implements HttpScmRequestHandler {

  @Nonnull
  @Override
  public Optional<HttpScmRequest> create(@Nonnull HttpServletRequest request, @Nonnull HttpServletResponse response) {
    //Don't check request.isAsyncStarted() here. The system doesn't start async processing until
    //it has verified an HttpScmRequest can be created, so it won't be async yet.
    return Optional.of(new MyHttpScmRequest(request, response));
  }

  //Other methods omitted for brevity.
}

public class MyHttpScmRequest implements HttpScmRequest {

  private final HttpServletRequest request;
  private final HttpServletResponse response;

  public MyHttpScmRequest(HttpServletRequest request, HttpServletResponse response) {
    this.request = request;
    this.response = response;
  }

  @Override
  public void handleRequest() throws IOException {
    //Inside handleRequest() it's safe to check isAsyncStarted(). If the request is going to be
    //processed asynchronously, it will have happened by now.
    if (request.isAsyncStarted()) {
      //The request is running asynchronously. That means non-blocking features like ReadListener
      //and WriteListener are available.
    } else {
      //Even though this implementation _supports_ async, either we're deployed in Bitbucket Server
      //7.3 or older, or something else has blocked the request from running asynchronously.
    }
  }

  //This override can be _present_ even if the app still supports Bitbucket Server 7.3 and older; older
  //versions simply will not check it, and will always process requests synchronously.
  //Note that, if you want to compile your app against an older version of the HttpScmRequest SPI to
  //ensure compatibility with pre-7.4 versions, you can still add this method to allow 7.4+ to run your
  //HttpScmRequest asynchronously; just omit the @Override so it will compile.
  @Override
  public boolean isAsyncSupported() {
    return true;
  }

  //Other methods omitted for brevity.
}

New Rich Build-status

In Bitbucket Server 7.4 there is a new REST endpoint that supports receiving significantly more build information from a build server. This new information is presented in various places on the product, for the 7.4 release this is most prominent as a builds tab. To receive rich build-status the CI tool needs to POST Build Status via the new REST endpoint to Bitbucket Server.

New REST endpoint:

POST /rest/api/latest/projects/{projectKey}/repos/{repositorySlug}/commits/{commitId}/builds

We recommend using this new endpoint as it provides a better experience for users with additional test summary and duration displayed in the UI.

Repository Delete Policy

System admins can now configure the permission level needed to delete a repository by setting a repository delete policy. The permissions for setting a repository delete policy are SYS_ADMIN, ADMIN, PROJECT_ADMIN and REPO_ADMIN.

New REST endpoints:

  • PUT /rest/policies/latest/admin/repos/delete
  • GET /rest/policies/latest/admin/repos/delete

DC License Upgrade Improvements

Changed REST endpoint:

  • POST /rest/api/1.0/admin/license Returns a 400 status if the license is being changed from Server to DC, and there are Add-ons installed which will need license upgrades to DC licenses. If a parameter confirmWarning=true is supplied the license will be applied anyway and a 200 status returned.

Auditing

Internationalization has been introduced into auditing. This has resulted in a number of changes in the Bitbucket API:

  • the constants in AuditCategory are now i18n property keys instead of hard-coded English values
  • the @Auditable annotation now has an action field which can be used to explicitly specify an action (instead of having it be the class name), and this the specified action can be an i18n property key
  • the category field of @Auditable can now be an i18n property key (the system will attempt to translate the provided key, and will fallback to using it as a hard-coded English value if no property exists with that key); note that all of the constants provided in AuditCategory are valid i18n keys

Additionally, the auditing model has been extended to allow setting i18n keys in place of hard-coded English values:

  • the AuditEvent.Builder constructors which take hard-coded action and category fields have been deprecated (AuditEvent.Builder(type) can be used instead)
  • in AuditEvent.Builder, actionI18nKey(..)/categoryI18nKey(..) replacing the now deprecated action(..)/category(..)
  • AuditType.fromI18nKe