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 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
|
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------
import webbrowser
from knack.util import CLIError
from azext_devops.dev.common.services import (get_wiki_client,
get_git_client,
get_project_id_from_name,
resolve_instance,
resolve_instance_and_project,
resolve_instance_project_and_repo)
_DEFAULT_PAGE_ADD_MESSAGE = 'Added a new page using Azure DevOps CLI'
_DEFAULT_PAGE_UPDATE_MESSAGE = 'Updated the page using Azure DevOps CLI'
_DEFAULT_PAGE_DELETE_MESSAGE = 'Deleted the page using Azure DevOps CLI'
def create_wiki(name=None, wiki_type='projectwiki', mapped_path=None, version=None,
organization=None, project=None, repository=None, detect=None):
"""Create a wiki.
:param name: Name of the new wiki.
:type name: str
:param wiki_type: Type of wiki to create.
:type wiki_type: str
:param version: [Required for codewiki type] Repository branch name to publish the code wiki from.
:type version: str
:param mapped_path: [Required for codewiki type] Mapped path of the new wiki
e.g. '/' to publish from root of repository.
:type mapped_path: str
:param repository: [Required for codewiki type] Name or ID of the repository to publish the wiki from.
:type repository: str
"""
repository_id = None
if wiki_type == 'codewiki':
if not name:
raise CLIError('--name is required for wiki type \'codewiki\'')
organization, project, repository = resolve_instance_project_and_repo(detect=detect,
organization=organization,
project=project,
repo=repository,
repo_required=True)
repository_id = _get_repository_id_from_name(organization=organization,
project=project,
repository=repository)
else:
organization, project = resolve_instance_and_project(detect=detect,
organization=organization,
project=project)
wiki_client = get_wiki_client(organization)
from azext_devops.devops_sdk.v5_0.wiki.models import WikiCreateParametersV2
wiki_params = WikiCreateParametersV2()
wiki_params.name = name
wiki_params.type = wiki_type
project_id = get_project_id_from_name(organization=organization,
project=project)
wiki_params.project_id = project_id
wiki_params.repository_id = repository_id
if mapped_path:
wiki_params.mapped_path = mapped_path
if version:
from azext_devops.devops_sdk.v5_0.wiki.models import GitVersionDescriptor
version_descriptor = GitVersionDescriptor()
version_descriptor.version = version
wiki_params.version = version_descriptor
return wiki_client.create_wiki(wiki_create_params=wiki_params, project=project)
def delete_wiki(wiki, organization=None, project=None, detect=None):
"""Delete a wiki.
:param wiki: Name or Id of the wiki to delete.
:type wiki: str
"""
organization, project = resolve_instance_and_project(detect=detect,
organization=organization,
project=project)
wiki_client = get_wiki_client(organization)
return wiki_client.delete_wiki(wiki_identifier=wiki, project=project)
def list_wiki(scope='project', organization=None, project=None, detect=None):
"""List all the wikis in a project or organization.
:param scope: List the wikis at project or organization level.
:type scope: str
"""
if scope == 'project':
organization, project = resolve_instance_and_project(detect=detect,
organization=organization,
project=project)
else:
organization = resolve_instance(detect=detect,
organization=organization)
wiki_client = get_wiki_client(organization)
return wiki_client.get_all_wikis(project=project)
def show_wiki(wiki, open=False, organization=None, project=None, detect=None): # pylint: disable=redefined-builtin
"""Show details of a wiki.
:param wiki: Name or Id of the wiki.
:type wiki: str
:param open: Open the wiki in your web browser.
:type open: bool
"""
organization, project = resolve_instance_and_project(detect=detect,
organization=organization,
project=project)
wiki_client = get_wiki_client(organization)
wiki_object = wiki_client.get_wiki(wiki_identifier=wiki, project=project)
if open:
webbrowser.open_new(url=wiki_object.remote_url)
return wiki_object
def add_page(wiki, path, comment=_DEFAULT_PAGE_ADD_MESSAGE, content=None, file_path=None,
encoding='utf-8', organization=None, project=None, detect=None):
"""Add a new page.
:param wiki: Name or Id of the wiki.
:type wiki: str
:param path: Path of the wiki page.
:type path: str
:param content: Content of the wiki page. Ignored if --file-path is specified.
:type content: str
:param file_path: Path of the file input if content is specified in the file.
:type file_path: str
:param encoding: Encoding of the file. Used in conjunction with --file-path parameter.
:type encoding: str
:param comment: Comment in the commit message of file add operation.
:type comment: str
"""
if not content and not file_path:
raise CLIError('Either --file-path or --content must be specified.')
organization, project = resolve_instance_and_project(detect=detect,
organization=organization,
project=project)
wiki_client = get_wiki_client(organization)
from azext_devops.devops_sdk.v5_0.wiki.models import WikiPageCreateOrUpdateParameters
parameters = WikiPageCreateOrUpdateParameters()
if content:
parameters.content = content
elif file_path:
from azext_devops.dev.common.utils import read_file_content
parameters.content = read_file_content(file_path=file_path, encoding=encoding)
return wiki_client.create_or_update_page(parameters=parameters, wiki_identifier=wiki,
project=project, path=path, version=None, comment=comment)
def update_page(wiki, path, version, comment=_DEFAULT_PAGE_UPDATE_MESSAGE, content=None, file_path=None,
encoding='utf-8', organization=None, project=None, detect=None):
"""Edit a page.
:param wiki: Name or Id of the wiki.
:type wiki: str
:param path: Path of the wiki page.
:type path: str
:param content: Content of the wiki page. Ignored if --file-path is specified.
:type content: str
:param file_path: Path of the file input if content is specified in the file.
:type file_path: str
:param encoding: Encoding of the file. Used in conjunction with --file-path parameter.
:type encoding: str
:param comment: Comment in the commit message of file edit operation.
:type comment: str
:param version: Version (ETag) of file to edit.
:type version: str
"""
if not content and not file_path:
raise CLIError('Either --file-path or --content must be specified.')
organization, project = resolve_instance_and_project(detect=detect,
organization=organization,
project=project)
wiki_client = get_wiki_client(organization)
from azext_devops.devops_sdk.v5_0.wiki.models import WikiPageCreateOrUpdateParameters
parameters = WikiPageCreateOrUpdateParameters()
if content:
parameters.content = content
elif file_path:
from azext_devops.dev.common.utils import read_file_content
parameters.content = read_file_content(file_path=file_path, encoding=encoding)
return wiki_client.create_or_update_page(parameters=parameters, wiki_identifier=wiki,
project=project, path=path, version=version, comment=comment)
def get_page(wiki, path, version=None, open=False, # pylint: disable=redefined-builtin
include_content=False, organization=None, project=None, detect=None, recursion_level=None):
"""Get the content of a page or open a page.
:param wiki: Name or Id of the wiki.
:type wiki: str
:param path: Path of the wiki page.
:type path: str
:param version: Version (ETag) of the wiki page.
:type version: str
:param include_content: Include content of the page.
:type include_content: str
:param open: Open the wiki page in your web browser.
:type open: bool
:param recursion_level: Include subpages of the page.
:type recursion_level: str
"""
organization, project = resolve_instance_and_project(detect=detect,
organization=organization,
project=project)
wiki_client = get_wiki_client(organization)
page_object = wiki_client.get_page(
wiki_identifier=wiki, project=project, path=path,
recursion_level=recursion_level, version_descriptor=version,
include_content=include_content)
if open:
webbrowser.open_new(url=page_object.page.remote_url)
return page_object
def delete_page(wiki, path, comment=_DEFAULT_PAGE_DELETE_MESSAGE, organization=None, project=None, detect=None):
"""Delete a page.
:param wiki: Name or Id of the wiki.
:type wiki: str
:param path: Path of the wiki page.
:type path: str
:param comment: Comment in the commit message of delete operation.
:type comment: str
"""
organization, project = resolve_instance_and_project(detect=detect,
organization=organization,
project=project)
wiki_client = get_wiki_client(organization)
return wiki_client.delete_page(wiki_identifier=wiki, path=path, comment=comment, project=project)
def _get_repository_id_from_name(organization, project, repository):
git_client = get_git_client(organization)
repository = git_client.get_repository(project=project, repository_id=repository)
return repository.id
|