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))
Example #2
0
 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)
Example #3
0
    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)
Example #4
0
 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}
Example #5
0
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
Example #6
0
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
Example #7
0
 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)
Example #8
0
    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
Example #9
0
    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
Example #10
0
 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()