def main(): arg_parser = argparse.ArgumentParser() arg_parser.add_argument('version', help='Release version') arg_parser.add_argument('git_sha1', help='commit sha1 to compare changes with') arg_parser.add_argument('server_version', help='Server version') arg_parser.add_argument('-d', '--date', help='release date in the format %Y-%m-%d', required=False) args = arg_parser.parse_args() date = args.date if args.date else datetime.now().strftime('%Y-%m-%d') # get changed yaml/json files (filter only relevant changed files) validate_manager = ValidateManager() change_log = run_command('git diff --name-status {}'.format(args.git_sha1)) modified_files, added_files, _, _, _ = validate_manager.filter_changed_files(change_log) for file_path in get_changed_content_entities(modified_files, added_files): if not should_clear(file_path, args.server_version): continue rn_path = get_release_notes_file_path(file_path) if os.path.isfile(rn_path): # if file exist, mark the current notes as release relevant with open(rn_path, 'r+') as rn_file: text = rn_file.read() rn_file.seek(0) text = text.replace(UNRELEASE_HEADER, CHANGE_LOG_FORMAT.format(version=args.version, date=date)) rn_file.write(text) else: # if file doesn't exist, create it with new header with open(rn_path, 'w') as rn_file: text = CHANGE_LOG_FORMAT.format(version=args.version, date=date) + get_new_header(file_path) rn_file.write(text) run_command('git add {}'.format(rn_path))
def __init__(self, file_path, modified_files=None, pack_name=None, added_files=None, ignored_errors=None, print_as_warnings=False): super().__init__(ignored_errors=ignored_errors, print_as_warnings=print_as_warnings) self.file_path = file_path self.modified_files = modified_files self.added_files = added_files self.pack_name = pack_name self.release_notes_path = get_release_notes_file_path(self.file_path) self.latest_release_notes = get_latest_release_notes_text(self.release_notes_path)
def get_release_notes(cls, file_path, data): # pylint: disable=unused-argument """ Return the release notes relevant to the added yml file. :param file_path: yml/json (or package yml) :param data: object data :return: raw release notes or None in case of an error. """ release_note_path = get_release_notes_file_path(file_path) return get_latest_release_notes_text(release_note_path)
def __init__(self, release_notes_file_path, modified_files=None, pack_name=None, added_files=None, ignored_errors=None, print_as_warnings=False, suppress_print=False, json_file_path=None): super().__init__(ignored_errors=ignored_errors, print_as_warnings=print_as_warnings, suppress_print=suppress_print, json_file_path=json_file_path) self.release_notes_file_path = release_notes_file_path self.modified_files = modified_files self.added_files = added_files self.pack_name = pack_name self.release_notes_path = get_release_notes_file_path(self.release_notes_file_path) self.latest_release_notes = get_latest_release_notes_text(self.release_notes_path) self.file_types_that_should_not_appear_in_rn = {FileType.TEST_SCRIPT, FileType.TEST_PLAYBOOK, FileType.README, FileType.RELEASE_NOTES, None}
def test_get_release_notes_file_path_invalid(): """ Given - Invalid release notes path When - Running validation on release notes. Then - Ensure None is returned """ filepath = '/SomePack/1_1_1.json' assert get_release_notes_file_path(filepath) is None
def test_get_release_notes_file_path_valid(): """ Given - Valid release notes path When - Running validation on release notes. Then - Ensure valid file path is returned """ filepath = '/SomePack/1_1_1.md' assert get_release_notes_file_path(filepath) == filepath
def __init__(self, release_notes_file_path, modified_files=None, pack_name=None, added_files=None, ignored_errors=None, print_as_warnings=False, suppress_print=False, json_file_path=None, specific_validations=None): super().__init__(ignored_errors=ignored_errors, print_as_warnings=print_as_warnings, suppress_print=suppress_print, json_file_path=json_file_path, specific_validations=specific_validations) self.release_notes_file_path = release_notes_file_path self.modified_files = modified_files self.added_files = added_files self.pack_name = pack_name self.pack_path = os.path.join(PACKS_DIR, self.pack_name) self.release_notes_path = get_release_notes_file_path(self.release_notes_file_path) self.latest_release_notes = get_latest_release_notes_text(self.release_notes_path)
def release_notes_section(self, store, title_prefix, current_server_version): res = "" beta_rn_paths = list() if store: new_str = "" new_count = 0 for path in store: with open(path, 'r') as file_obj: raw_content = file_obj.read() cnt = self.load_data(raw_content) from_version = cnt.get("fromversion") or cnt.get("fromVersion") to_version = cnt.get("toversion") or cnt.get("toVersion") if from_version is not None and server_version_compare(current_server_version, from_version) < 0: print(f'{path}: Skipped because from version: {from_version}' f' is greater than current server version: {current_server_version}') beta_rn_paths.append(path) print(f"{path} has added to beta release notes") continue if to_version is not None and server_version_compare(to_version, current_server_version) < 0: print(f'{path}: Skipped because of to version" {to_version}' f' is smaller: than current server version: {current_server_version}') continue if title_prefix == NEW_RN: ans = self.added_release_notes(path, cnt) elif title_prefix == MODIFIED_RN: ans = self.modified_release_notes(path, cnt) else: # should never get here print_error('Error:\n Unknown release notes type {}'.format(title_prefix)) return None if ans is None: print_error("Error:\n[{}] is missing releaseNotes entry, Please add it under {}".format( path, get_release_notes_file_path(path))) self.is_missing_release_notes = True elif ans: new_count += 1 new_str += ans if new_str: if self.show_secondary_header: count_str = "" if new_count > 1: count_str = " " + str(new_count) res = "\n#### %s %s %s\n" % (count_str, title_prefix, self.get_header()) res += new_str print("Collected {} beta notes".format(len(beta_rn_paths))) return res, beta_rn_paths
def is_there_release_notes(self): """Validate that the file has proper release notes when modified. This function updates the class attribute self._is_valid. Returns: (bool): is there release notes """ if os.path.isfile(self.file_path): rn_path = get_release_notes_file_path(self.file_path) release_notes = get_latest_release_notes_text(rn_path) # check release_notes file exists and contain text if release_notes is None: self.is_valid = False print_error("Missing release notes for: {}".format(self.file_path)) return False return True
def __init__(self, file_path): self.file_path = file_path self.release_notes_path = get_release_notes_file_path(self.file_path) self.latest_release_notes = get_latest_release_notes_text( self.release_notes_path) self.master_diff = self.get_master_diff()