From c0c412ef02302ccf9e306d091d429e7df3d6278f Mon Sep 17 00:00:00 2001 From: Alex Legler Date: Sat, 26 Dec 2015 18:42:30 +0100 Subject: [PATCH] Add projects.xml generation script --- bin/projects-xml.rb | 70 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100755 bin/projects-xml.rb diff --git a/bin/projects-xml.rb b/bin/projects-xml.rb new file mode 100755 index 0000000000..328cc9360f --- /dev/null +++ b/bin/projects-xml.rb @@ -0,0 +1,70 @@ +#!/usr/bin/env ruby +# Generates projects.xml as per GLEP-67 from projects.json via semantic-data-toolkit. +# The file is only touched if contents change. +# +# Usage: projects-xml.rb +# +# Alex Legler + +require 'net/http' +require 'json' +require 'nokogiri' + +PROJECTS_JSON = URI('https://wiki.gentoo.org/rdf/projects.json') + +projects = begin + JSON.parse(Net::HTTP.get(PROJECTS_JSON)) +rescue JSON::ParserError + abort 'Cannot load projects.json.' +end + +parent_map = Hash.new { |h, k| h[k] = [] } + +projects.each_pair do |id, project| + parent_map[project['parent']] << id if project.key? 'parent' +end + +projects_xml = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml| + xml.doc.create_internal_subset('projects', nil, 'http://www.gentoo.org/dtd/projects.dtd') + xml.projects do + projects.each_pair do |id, project| + xml.project do + xml.email project['email'] + xml.name project['name'] + xml.url project['href'] + xml.description project['description'] + + if parent_map.key? id + parent_map[id].each do |subproject_id| + attributes = { ref: projects[subproject_id]['email'] } + attributes['inherit-members'] = '1' if projects[subproject_id]['propagates_members'] + + xml.subproject nil, attributes + end + end + + project['members'].sort { |a, b| a['nickname'].casecmp(b['nickname']) }.each do |member| + attributes = {} + attributes['is-lead'] = '1' if member['is_lead'] + + xml.member nil, attributes do + xml.email member['email'] + xml.name member['name'] + xml.role member['role'] if member.key?('role') && !member['role'].empty? + end + end + end + end + end +end + +output_file = ARGV[0] + +generated_xml = projects_xml.to_xml +current_xml = begin + File.read(output_file) +rescue Errno::ENOENT + '' +end + +File.write(output_file, projects_xml.to_xml) unless generated_xml == current_xml