#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2020 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""This is a utility script for parsing the repo manifest used by gerrit.el"""

import xml.parsers.expat as xml
import sys
import argparse
import pathlib
import subprocess

def parse_manifest_projects_to_lisp_alist(repo_root_path):
    """Parse repo manifest to Lisp alist.

    Any project without a dest-branch attribute is skipped.

    Args:
        repo_root_path: The path to a repo root.

    Returns:
        Lisp readable alist with elements of the form
        ((name . dest-branch) . path)

    Raises:
        CalledProcessError: The repo tool threw an error getting the manifest.
        ExpatError: An error occured when attempting to parse.
    """

    assoc_list_entries = []

    def _project_elem_handler(name, attrs):
        """XML element handler collecting project elements to form a Lisp alist.

        Args:
            name: The name of the handled xml element.
            attrs: A dictionary of the handled xml element's attributes.
        """
        if name == 'project':
            project_name = attrs['name']
            project_path = attrs.get('path', project_name)
            dest_branch = attrs.get('dest-branch')
            if not dest_branch:
                # We skip anything without a dest-branch
                return
            # We don't want the refs/heads/ prefix of dest-branch
            dest_branch = dest_branch.replace('refs/heads/', '')

            key = '("{}" . "{}")'.format(project_name, dest_branch)
            value = '"{}"'.format(project_path)

            assoc_list_entries.append('({} . {})'.format(key, value))

    p = xml.ParserCreate()
    p.StartElementHandler = _project_elem_handler

    repo_cmd = ['repo', '--no-pager', 'manifest']
    repo_cmd_result = subprocess.run(repo_cmd,
                                     cwd=repo_root_path.expanduser().resolve(),
                                     capture_output=True,
                                     check=True)
    p.Parse(repo_cmd_result.stdout)
    return '({})'.format(''.join(assoc_list_entries))


def main(argv):
    """main."""
    arg_parser = argparse.ArgumentParser()
    arg_parser.add_argument('repo_root_path',
                            type=pathlib.Path,
                            help='System path to repo root.')
    args = arg_parser.parse_args(argv)

    try:
        print(parse_manifest_projects_to_lisp_alist(args.repo_root_path))
        return 0

    except xml.ExpatError as err:
        print('XML Parsing Error:', err)
        return 1


if __name__ == '__main__':
    sys.exit(main(sys.argv[1:]))
