diff --git a/bumpversion/cli.py b/bumpversion/cli.py index d627d702..48097d5c 100644 --- a/bumpversion/cli.py +++ b/bumpversion/cli.py @@ -75,11 +75,57 @@ ] +def _handle_tag_only(known_args): + explicit_config = getattr(known_args, "config_file", None) + config_file = _determine_config_file(explicit_config) + vcs_info = _determine_vcs_usability() + defaults = _determine_current_version(vcs_info) + config, _config_file_exists, _config_newlines, part_configs, _files = _load_configuration( + config_file, explicit_config, defaults, + ) + version_config = _setup_versionconfig(known_args, part_configs) + current_version = version_config.parse(known_args.current_version) + context = dict( + itertools.chain( + time_context.items(), + prefixed_environ().items(), + vcs_info.items(), + special_char_context.items(), + ) + ) + context["current_version"] = version_config.serialize(current_version, context) + context["new_version"] = context["current_version"] + + tag_name = defaults.get("tag_name", "v{new_version}").format(**context) + tag_message = defaults.get("tag_message", "Bump version: {current_version} → {new_version}").format(**context) + sign_tags = defaults.get("sign_tags", False) + + vcs = None + for vc in VCS: + if vc.is_usable(): + vcs = vc + break + + if vcs is None: + logger.warning("No usable VCS found; cannot tag.") + return + + logger.info("Tagging '%s' %s in %s", tag_name, + "with message '{}'".format(tag_message) if tag_message else "without message", + vcs.__name__) + vcs.tag(sign_tags, tag_name, tag_message) + + def main(original_args=None): # determine configuration based on command-line arguments # and on-disk configuration files args, known_args, root_parser, positionals = _parse_arguments_phase_1(original_args) _setup_logging(known_args.list, known_args.verbose) + + if known_args.tag_only: + _handle_tag_only(known_args) + return + vcs_info = _determine_vcs_usability() defaults = _determine_current_version(vcs_info) explicit_config = None @@ -199,6 +245,13 @@ def _parse_arguments_phase_1(original_args): help="Don't abort if working directory is dirty", required=False, ) + root_parser.add_argument( + "--tag-only", + action="store_true", + default=False, + dest="tag_only", + help="Tag the current HEAD with current_version from config without bumping or committing.", + ) known_args, _ = root_parser.parse_known_args(args) return args, known_args, root_parser, positionals