azure-devops/azext_devops/dev/repos/ref.py (69 lines of code) (raw):
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------
from knack.log import get_logger
from knack.util import CLIError
from azext_devops.devops_sdk.v5_0.git.models import GitRefUpdate
from azext_devops.dev.common.git import resolve_git_refs
from azext_devops.dev.common.services import (get_git_client,
resolve_instance_project_and_repo)
logger = get_logger(__name__)
# pylint: disable=redefined-builtin
def list_refs(filter=None, repository=None, organization=None, project=None, detect=None):
"""List the references.
:param str filter: A filter to apply to the refs (starts with). Example: head or heads/ for the branches.
:param str repository: Name or ID of the repository.
:param str project: Name or ID of the project.
:param str detect: Automatically detect organization and project. Default is "on".
"""
organization, project, repository = resolve_instance_project_and_repo(
detect=detect,
organization=organization,
project=project,
repo=repository)
client = get_git_client(organization)
return client.get_refs(repository_id=repository,
project=project,
filter=filter)
def create_ref(name, object_id, repository=None, organization=None, project=None, detect=None):
"""Create a reference.
:param str name: Name of the reference to create (example: heads/my_branch or tags/my_tag).
:param str object_id: Id of the object to create the reference from.
:param str repository: Name or ID of the repository.
:param str project: Name or ID of the project.
:param str detect: Automatically detect organization and project. Default is "on".
"""
organization, project, repository = resolve_instance_project_and_repo(
detect=detect,
organization=organization,
project=project,
repo=repository)
client = get_git_client(organization)
# by default, the create method does not support setting the is_locked value
# to True.
ref_update = GitRefUpdate(is_locked=False,
name=resolve_git_refs(name),
new_object_id=object_id,
old_object_id='0000000000000000000000000000000000000000')
response = client.update_refs(ref_updates=[ref_update],
repository_id=repository,
project=project)[0]
if response.success is False:
raise CLIError(response.custom_message)
return response
def delete_ref(name, object_id=None, repository=None, organization=None, project=None, detect=None):
"""Delete a reference.
:param str name: Name of the reference to delete (example: heads/my_branch).
:param str object_id: Id of the reference to delete.
:param str repository: Name or ID of the repository.
:param str project: Name or ID of the project.
:param str detect: Automatically detect organization and project. Default is "on".
"""
organization, project, repository = resolve_instance_project_and_repo(
detect=detect,
organization=organization,
project=project,
repo=repository)
client = get_git_client(organization)
if object_id is None:
ref = client.get_refs(repository_id=repository, project=project, filter=name)
if not ref or len(ref) != 1:
logger.error('ref not found')
raise CLIError("Failed to find object_id for ref " + name + ". Please provide object_id.")
object_id = ref[0].object_id
ref_update = GitRefUpdate(name=resolve_git_refs(name),
new_object_id='0000000000000000000000000000000000000000',
old_object_id=object_id)
return client.update_refs(ref_updates=[ref_update],
repository_id=repository,
project=project)[0]
def lock_ref(name, repository=None, organization=None, project=None, detect=None):
"""Lock a reference.
:param str name: Name of the reference to update (example: heads/my_branch).
:param str repository: Name or ID of the repository.
:param str project: Name or ID of the project.
:param str detect: Automatically detect organization and project. Default is "on".
"""
return _update_ref(name, True, repository, organization, project, detect)
def unlock_ref(name, repository=None, organization=None, project=None, detect=None):
"""Unlock a reference.
:param str name: Name of the reference to update (example: heads/my_branch).
:param str repository: Name or ID of the repository.
:param str project: Name or ID of the project.
:param str detect: Automatically detect organization and project. Default is "on".
"""
return _update_ref(name, False, repository, organization, project, detect)
def _update_ref(name, locked, repository, organization, project, detect):
organization, project, repository = resolve_instance_project_and_repo(
detect=detect,
organization=organization,
project=project,
repo=repository)
client = get_git_client(organization)
ref_update = GitRefUpdate(is_locked=locked)
return client.update_ref(new_ref_info=ref_update,
repository_id=repository,
filter=name,
project=project)