def main()

in build_defs/stamp_plugin_xml.py [0:0]


def main():
  args = parser.parse_args()

  if args.plugin_xml:
    dom = minidom.parse(args.plugin_xml)
  else:
    dom = minidom.parseString("<idea-plugin/>")

  since_build_numbers = {}
  until_build_numbers = {}
  if args.since_build_numbers:
    since_build_numbers = parse_key_value_items(args.since_build_numbers)

  if args.until_build_numbers:
    until_build_numbers = parse_key_value_items(args.until_build_numbers)

  is_eap = False
  with open(args.api_version_txt) as f:
    api_version = f.readline().strip()
    if api_version.endswith(" EAP"):
      is_eap = True
      api_version = api_version[:-4]
  new_elements = []

  idea_plugin = dom.documentElement

  if args.version and args.version_file:
    raise ValueError("Cannot supply both version and version_file")

  if args.version or args.version_file:
    version_elements = idea_plugin.getElementsByTagName("version")
    for element in version_elements:
      idea_plugin.removeChild(element)
    version_element = dom.createElement("version")
    new_elements.append(version_element)

    version_value = None
    if args.version:
      version_value = args.version
    else:
      with open(args.version_file) as f:
        version_value = f.read().strip()
    # Since we may release different versions that target different plugin api
    # versions simultaneously, we append the name of the api_version to the
    # plugin version.
    version_text = dom.createTextNode(version_value + "-api-version-" +
                                      _parse_major_version(api_version))
    version_element.appendChild(version_text)

  if args.stamp_since_build or args.stamp_until_build:
    if idea_plugin.getElementsByTagName("idea-version"):
      raise ValueError("idea-version element already present")

    idea_version_element = dom.createElement("idea-version")
    new_elements.append(idea_version_element)

    if is_eap:
      # IU211.6693.111 >> since_build=211.6693 and until_build=211.6693.*
      build_version = _strip_build_number(
          _strip_product_code(api_version))
    else:
      # IU211.6693.111 >> since_build=211 and until_build=211.*
      build_version = _parse_major_version(api_version)

    if args.stamp_since_build:
      if build_version in since_build_numbers.keys():
        idea_version_element.setAttribute("since-build",
                                          since_build_numbers[build_version])
      else:
        idea_version_element.setAttribute("since-build", build_version)

    if args.stamp_until_build:
      if build_version in until_build_numbers.keys():
        idea_version_element.setAttribute("until-build",
                                          until_build_numbers[build_version])
      else:
        idea_version_element.setAttribute("until-build", build_version + ".*")

  if args.changelog_file:
    if idea_plugin.getElementsByTagName("change-notes"):
      raise ValueError("change-notes element already in plugin.xml")
    changelog_element = dom.createElement("change-notes")
    changelog_text = _read_changelog(args.changelog_file)
    changelog_cdata = dom.createCDATASection(changelog_text)
    changelog_element.appendChild(changelog_cdata)
    new_elements.append(changelog_element)

  if args.plugin_id:
    if idea_plugin.getElementsByTagName("id"):
      raise ValueError("id element already in plugin.xml")
    id_element = dom.createElement("id")
    new_elements.append(id_element)
    id_text = dom.createTextNode(args.plugin_id)
    id_element.appendChild(id_text)

  if args.plugin_name:
    if idea_plugin.getElementsByTagName("name"):
      raise ValueError("name element already in plugin.xml")
    name_element = dom.createElement("name")
    new_elements.append(name_element)
    name_text = dom.createTextNode(args.plugin_name)
    name_element.appendChild(name_text)

  if args.description_file:
    if idea_plugin.getElementsByTagName("description"):
      raise ValueError("description element already in plugin.xml")
    description_element = dom.createElement("description")
    description_text = _read_description(args.description_file)
    description_cdata = dom.createCDATASection(description_text)
    description_element.appendChild(description_cdata)
    new_elements.append(description_element)

  if args.vendor_file:
    if idea_plugin.getElementsByTagName("vendor"):
      raise ValueError("vendor element already in plugin.xml")
    vendor_element = dom.createElement("vendor")
    vendor_src_element = _read_vendor(args.vendor_file)
    vendor_element.setAttribute("email",
                                vendor_src_element.getAttribute("email"))
    vendor_element.setAttribute("url", vendor_src_element.getAttribute("url"))
    vendor_text = dom.createTextNode(vendor_src_element.firstChild.data)
    vendor_element.appendChild(vendor_text)
    new_elements.append(vendor_element)

  for new_element in new_elements:
    idea_plugin.appendChild(new_element)

  sys.stdout.buffer.write(dom.toxml(encoding="utf-8"))