| OLD | NEW | 
|---|
| (Empty) |  | 
|  | 1 #!/usr/bin/env python | 
|  | 2 | 
|  | 3 # This file is part of Adblock Plus <https://adblockplus.org/>, | 
|  | 4 # Copyright (C) 2006-2016 Eyeo GmbH | 
|  | 5 # | 
|  | 6 # Adblock Plus is free software: you can redistribute it and/or modify | 
|  | 7 # it under the terms of the GNU General Public License version 3 as | 
|  | 8 # published by the Free Software Foundation. | 
|  | 9 # | 
|  | 10 # Adblock Plus is distributed in the hope that it will be useful, | 
|  | 11 # but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | 13 # GNU General Public License for more details. | 
|  | 14 # | 
|  | 15 # You should have received a copy of the GNU General Public License | 
|  | 16 # along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 
|  | 17 | 
|  | 18 import os | 
|  | 19 import shutil | 
|  | 20 import subprocess | 
|  | 21 | 
|  | 22 from sitescripts.utils import get_config | 
|  | 23 | 
|  | 24 def read_projects(config): | 
|  | 25   projects = {} | 
|  | 26   for key, value in config.items("docs"): | 
|  | 27     key_parts = key.split("_", 1) | 
|  | 28     if len(key_parts) < 2: | 
|  | 29       continue | 
|  | 30     project_name, field_name = key_parts | 
|  | 31     if field_name not in {"repository", "target_directory", "command"}: | 
|  | 32       continue | 
|  | 33     projects.setdefault(project_name, {})[field_name] = value | 
|  | 34   return projects | 
|  | 35 | 
|  | 36 def sync_sources(sources_dir, repository_url): | 
|  | 37   remote_id = subprocess.check_output(["hg", "id", "--id", repository_url]) | 
|  | 38   id_path = sources_dir.rstrip(os.path.sep) + ".id" | 
|  | 39   try: | 
|  | 40     with open(id_path, "rb") as id_file: | 
|  | 41       local_id = id_file.read() | 
|  | 42     if local_id == remote_id: | 
|  | 43       return | 
|  | 44   except IOError: | 
|  | 45     pass | 
|  | 46 | 
|  | 47   shutil.rmtree(sources_dir, ignore_errors=True) | 
|  | 48   subprocess.check_call(["hg", "archive", | 
|  | 49                          "--repository", repository_url, | 
|  | 50                          "--rev", "master", | 
|  | 51                          sources_dir]) | 
|  | 52 | 
|  | 53   # In theory, it is possible that some changesets are pushed after we fetch | 
|  | 54   # the ID above, but before we run `hg archive`, which will lead to an | 
|  | 55   # unnecessary `hg archive` operation the next time this runs. | 
|  | 56   with open(id_path, "wb") as id_file: | 
|  | 57     id_file.write(remote_id) | 
|  | 58 | 
|  | 59   # This is a workaround for https://issues.adblockplus.org/ticket/3635. | 
|  | 60   os.makedirs(os.path.join(sources_dir, ".hg")) | 
|  | 61 | 
|  | 62 def replace_dir(source_dir, target_dir): | 
|  | 63   if not os.path.exists(target_dir): | 
|  | 64     parent_dir = os.path.dirname(target_dir) | 
|  | 65     try: | 
|  | 66       os.makedirs(parent_dir) | 
|  | 67     except OSError: | 
|  | 68       pass | 
|  | 69     os.rename(source_dir, target_dir) | 
|  | 70   else: | 
|  | 71     old_target_dir = target_dir.rstrip(os.path.sep) + ".old" | 
|  | 72     shutil.rmtree(old_target_dir, ignore_errors=True) | 
|  | 73     os.rename(target_dir, old_target_dir) | 
|  | 74     os.rename(source_dir, target_dir) | 
|  | 75     shutil.rmtree(old_target_dir) | 
|  | 76 | 
|  | 77 def run_generation_command(command, sources_dir, output_dir): | 
|  | 78   shutil.rmtree(output_dir, ignore_errors=True) | 
|  | 79   command = command.format(output_dir=output_dir) | 
|  | 80   subprocess.check_call(command, shell=True, cwd=sources_dir) | 
|  | 81 | 
|  | 82 def generate_docs(projects, config): | 
|  | 83   temp_directory = config.get("docs", "temp_directory") | 
|  | 84   try: | 
|  | 85     os.makedirs(temp_directory) | 
|  | 86   except OSError: | 
|  | 87     pass | 
|  | 88 | 
|  | 89   for name, data in projects.iteritems(): | 
|  | 90     sources_dir = os.path.join(temp_directory, name) | 
|  | 91     sync_sources(sources_dir, data["repository"]) | 
|  | 92     output_dir = sources_dir.rstrip(os.path.sep) + ".docs" | 
|  | 93     run_generation_command(data["command"], sources_dir, output_dir) | 
|  | 94     replace_dir(output_dir, data["target_directory"]) | 
|  | 95 | 
|  | 96 if __name__ == "__main__": | 
|  | 97   config = get_config() | 
|  | 98   projects = read_projects(config) | 
|  | 99   generate_docs(projects, config) | 
| OLD | NEW | 
|---|