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) fv = FilesValidator() change_log = run_command('git diff --name-status {}'.format(args.git_sha1)) modified_files, added_files, _, _ = fv.get_modified_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)
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 release_notes_section(self, store, title_prefix, current_server_version): res = "" if store: new_str = "" new_count = 0 for path in store: with open(path, 'r') as file_obj: print(' - adding release notes ({}) for file - [{}]... '. format(path, title_prefix), end='') raw_content = file_obj.read() cnt = self.load_data(raw_content) from_version = cnt.get("fromversion") if from_version is not None and server_version_compare( current_server_version, from_version) < 0: print("Skipped because of version differences") 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 print("Success") else: print("Skipped") 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 return res
def get_release_notes(self, file_path, data): """ 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. """ rn_path = get_release_notes_file_path(file_path) return get_latest_release_notes_text(rn_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 validate_file_release_notes(self): """Validate that the file has proper release notes when modified. This function updates the class attribute self._is_valid instead of passing it back and forth. """ if self.is_renamed: print_warning("You might need RN please make sure to check that.") return if os.path.isfile(self.file_path): rn_path = get_release_notes_file_path(self.file_path) # check rn file exists and contain text if not os.path.isfile(rn_path) or os.stat(rn_path).st_size == 0: print_error( 'File {} is missing releaseNotes, please add.'.format( self.file_path)) self._is_valid = False
def get_release_notes(self, file_path, data): """ 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. """ rn_path = get_release_notes_file_path(file_path) if not os.path.isfile(rn_path): # releaseNotes were not provided return None with open(rn_path) as f: rn = f.read() if not rn: # empty releaseNotes is not supported return None return rn.strip()