File: release.py

package info (click to toggle)
azure-devops-cli-extension 1.0.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 20,384 kB
  • sloc: python: 160,782; xml: 198; makefile: 56; sh: 51
file content (133 lines) | stat: -rw-r--r-- 6,077 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------

from webbrowser import open_new

from knack.log import get_logger
from azext_devops.devops_sdk.v5_0.release.models import ArtifactMetadata, BuildVersion, ReleaseStartMetadata
from azext_devops.dev.common.services import (get_release_client, resolve_instance_and_project)
from .release_definition import get_definition_id_from_name

logger = get_logger(__name__)


def release_create(definition_id=None, definition_name=None, artifact_metadata_list=None, description=None,
                   open=False, organization=None, project=None, detect=None):  # pylint: disable=redefined-builtin
    """Request (create) a release.
    :param definition_id: ID of the definition to create. Required if --definition-name is not supplied.
    :type definition_id: int
    :param definition_name: Name of the definition to create. Ignored if --definition-id is supplied.
    :type definition_name: str
    :param open: Open the release results page in your web browser.
    :type open: bool
    :param artifact_metadata_list: Space separated "alias=version_id" pairs.
    :type artifact_metadata_list: [str]
    :param description: Description of the release.
    :type description: str
    :rtype: :class:`<ReleaseStartMetadata> <v5_0.release.models.ReleaseStartMetadata>`
    """

    organization, project = resolve_instance_and_project(
        detect=detect, organization=organization, project=project)
    if definition_id is None and definition_name is None:
        raise ValueError('Either the --definition-id argument or the --definition-name argument ' +
                         'must be supplied for this command.')
    client = get_release_client(organization)

    if definition_id is None:
        definition_id = get_definition_id_from_name(definition_name, client, project)

    artifacts = []
    if artifact_metadata_list is not None and artifact_metadata_list:
        for artifact_metadata in artifact_metadata_list:
            separator_pos = artifact_metadata.find('=')
            if separator_pos >= 0:
                instance_reference = BuildVersion(id=artifact_metadata[separator_pos + 1:])
                artifact = ArtifactMetadata(alias=artifact_metadata[:separator_pos],
                                            instance_reference=instance_reference)
                artifacts.append(artifact)
            else:
                raise ValueError('The --artifact_meta_data_list argument should consist'
                                 'of space separated "alias=version_id" pairs.' + artifact_metadata)

    release = ReleaseStartMetadata(definition_id=definition_id, artifacts=artifacts, description=description)

    created_release = client.create_release(release_start_metadata=release, project=project)

    if open:
        _open_release(created_release)

    return created_release


def release_show(id, open=False, organization=None, project=None, detect=None):  # pylint: disable=redefined-builtin
    """Get the details of a release.
    :param id: ID of the release.
    :type id: int
    :param open: Open the release results page in your web browser.
    :type open: bool
    :rtype: :class:`<Release> <v5_0.release.models.Release>`
    """
    organization, project = resolve_instance_and_project(
        detect=detect, organization=organization, project=project)
    client = get_release_client(organization)
    release = client.get_release(release_id=id, project=project)
    if open:
        _open_release(release)
    return release


def release_list(definition_id=None, min_created_time=None, max_created_time=None, source_branch=None,
                 organization=None, project=None, detect=None, top=None, status=None):
    """List release results.
    :param definition_id: ID of definition to list releases for.
    :type definition_id: int
    :param min_created_time: Releases that were created after this time.
    :type min_created_time: datetime
    :param max_created_time: Releases that were created before this time.
    :type max_created_time: datetime
    :param branch: Filter by releases for this branch.
    :type branch: str
    :param top: Maximum number of releases to list. Default is 50.
    :type top: int
    :param status: Limit to releases with this status.
    :type status: str
    :param source_branch: Filter releases for this branch.
    :type source_branch: str
    :rtype: :class:`<Release> <v5_0.release.models.Release>`
    """
    organization, project = resolve_instance_and_project(
        detect=detect, organization=organization, project=project)
    client = get_release_client(organization)

    releases = client.get_releases(definition_id=definition_id,
                                   min_created_time=min_created_time,
                                   max_created_time=max_created_time,
                                   project=project,
                                   source_branch_filter=source_branch,
                                   top=top,
                                   status_filter=status)
    return releases


def _open_release(release):
    """Open the release results page in your web browser.
    :param :class:`<Release> <v5_0.release.models.Release>` release:
    """
    url = _get_release_web_url(release)
    if url is not None and url:
        logger.debug('Opening web page: %s', url)
        open_new(url=url)


def _get_release_web_url(release):
    links = release._links  # pylint: disable=protected-access
    if links is not None and links:
        properties = links.additional_properties
        if properties is not None and properties:
            web_url = properties.get('web')
            if web_url is not None and web_url:
                return web_url.get('href')
    return None