1+ import typing as t
2+
13import click
24
3- from pulp_glue .common .context import PluginRequirement
5+ from pulp_glue .common .context import (
6+ EntityDefinition ,
7+ EntityFieldDefinition ,
8+ PluginRequirement ,
9+ PulpEntityContext ,
10+ )
411from pulp_glue .common .i18n import get_translation
512from pulp_glue .python .context import (
613 PulpPythonDistributionContext ,
2027 label_command ,
2128 list_command ,
2229 name_option ,
30+ pass_entity_context ,
2331 pass_pulp_context ,
2432 pulp_group ,
2533 pulp_labels_option ,
2634 pulp_option ,
2735 resource_option ,
2836 show_command ,
29- update_command ,
3037)
3138
3239translation = get_translation (__package__ )
4047 context_table = {"python:python" : PulpPythonRepositoryContext },
4148 help = _ (
4249 "Repository to be used for auto-distributing."
50+ " When used with --version, this will create repository_version instead."
4351 " When set, this will unset the 'publication'."
4452 " Specified as '[[<plugin>:]<type>:]<name>' or as href."
4553 ),
@@ -75,6 +83,12 @@ def distribution(ctx: click.Context, pulp_ctx: PulpCLIContext, /, distribution_t
7583 ),
7684 ),
7785 repository_option ,
86+ pulp_option (
87+ "--version" ,
88+ type = int ,
89+ help = _ ("A repository version number, leave blank for latest." ),
90+ needs_plugins = [PluginRequirement ("python" , specifier = ">=3.21.0" )],
91+ ),
7892 content_guard_option ,
7993 pulp_option (
8094 "--allow-uploads/--block-uploads" ,
@@ -96,8 +110,77 @@ def distribution(ctx: click.Context, pulp_ctx: PulpCLIContext, /, distribution_t
96110distribution .add_command (list_command (decorators = distribution_filter_options ))
97111distribution .add_command (show_command (decorators = lookup_options ))
98112distribution .add_command (create_command (decorators = create_options ))
99- distribution .add_command (
100- update_command (decorators = lookup_options + update_options + [click .option ("--base-path" )])
101- )
102113distribution .add_command (destroy_command (decorators = lookup_options ))
103114distribution .add_command (label_command (decorators = nested_lookup_options ))
115+
116+
117+ def apply_decorators (decorators_list : list [t .Callable [..., t .Any ]]) -> t .Callable [..., t .Any ]:
118+ def decorator (func : t .Callable [..., t .Any ]) -> t .Callable [..., t .Any ]:
119+ for d in decorators_list :
120+ func = d (func )
121+ return func
122+
123+ return decorator
124+
125+
126+ @distribution .command ()
127+ @apply_decorators (lookup_options + update_options + [click .option ("--base-path" )])
128+ @pass_entity_context
129+ def update (
130+ distribution_ctx : PulpEntityContext ,
131+ / ,
132+ publication : str | None ,
133+ repository : EntityFieldDefinition ,
134+ version : int | None ,
135+ content_guard : EntityFieldDefinition ,
136+ allow_uploads : bool | None ,
137+ remote : EntityFieldDefinition ,
138+ pulp_labels : dict [str , str ] | None ,
139+ base_path : str | None ,
140+ ) -> None :
141+ """
142+ Update a Python distribution.
143+ """
144+ assert isinstance (distribution_ctx , PulpPythonDistributionContext )
145+
146+ dist_body : EntityDefinition = distribution_ctx .entity
147+ body : EntityDefinition = dict ()
148+
149+ if publication is not None :
150+ body ["publication" ] = publication
151+ if content_guard is not None :
152+ body ["content_guard" ] = content_guard
153+ if allow_uploads is not None :
154+ body ["allow_uploads" ] = allow_uploads
155+ if remote is not None :
156+ body ["remote" ] = remote
157+ if pulp_labels is not None :
158+ body ["pulp_labels" ] = pulp_labels
159+ if base_path is not None :
160+ body ["base_path" ] = base_path
161+
162+ if repository is not None and isinstance (repository , PulpPythonRepositoryContext ):
163+ repo = repository .entity
164+ if version is not None :
165+ if dist_body .get ("repository" ):
166+ distribution_ctx .update (body = {"repository" : "" }, non_blocking = True )
167+ body ["repository_version" ] = f"{ repo ['versions_href' ]} { version } /"
168+ else :
169+ if dist_body .get ("repository_version" ):
170+ distribution_ctx .update (body = {"repository_version" : "" }, non_blocking = True )
171+ body ["repository" ] = repo ["pulp_href" ]
172+ elif version is not None :
173+ if dist_body .get ("repository" ):
174+ distribution_ctx .update (body = {"repository" : "" }, non_blocking = True )
175+ body ["repository_version" ] = f"{ dist_body ['repository' ]} versions/{ version } /"
176+ elif dist_body .get ("repository_version" ):
177+ repository_href = dist_body ["repository_version" ].partition ("versions" )[0 ]
178+ body ["repository_version" ] = f"{ repository_href } versions/{ version } /"
179+ else :
180+ raise click .ClickException (
181+ _ (
182+ "Distribution doesn't have a repository set, "
183+ "please specify the repository to use with --repository"
184+ )
185+ )
186+ distribution_ctx .update (body = body )
0 commit comments