#!/usr/bin/env python3 """ Script to update a manual in one language for one release Usage: python3 update_manual.py <manual_name> <release> <language> <archive> where: * manual_name can be 'mcc' or 'installer' * release can be 2 (installer only), 3, 4 or newer version * language is the language abreviation in lower case (en, fr, de, uk, tr...) * archive is the full path and name of the archive containing the new version of the manual (keep this file out of the git local repository) .. note:: Attention You need to have a clean and uptodate git local repository to use that script or it will try to 'git rm' files that are not under version control!! """ import sys from os import walk, makedirs from os.path import splitext, join, isdir from shutil import rmtree, move from zipfile import ZipFile from subprocess import call import fileinput import time def fix_image_path(path_to_fix, images_path): # first step: let's walk along the folder for root, dirs, files in walk(path_to_fix): # second step: identification of html files for elem in files: if splitext(elem)[1] == '.html': # third step: replacing the path with fileinput.input(files=join(root, elem), inplace=True) as f: for line in f: line = line.rstrip('\n') line = line.replace('cco:/', images_path) # with fileinput, you need to use 'print' and not 'write' to # write in the file print(line) def fix_common_path(path_to_fix): # first step: let's walk along the folder for root, dirs, files in walk(path_to_fix): # second step: identification of html files for elem in files: if splitext(elem)[1] == '.html': # third step: replacing the path with fileinput.input(files=join(root, elem), inplace=True) as f: for line in f: line = line.rstrip('\n') line = line.replace('"../common/', '"../../common/') line = line.replace('(../common/', '(../../common/') line = line.replace('</a></div><div class="navfooter">', '</a></div><div id="upload_date">Uploaded on ' + time.strftime("%d/%m/%Y", time.gmtime()) + '</div><div class="navfooter">') line = line.replace('http://docteam.mageia.nl/favicon.png','https://www.mageia.org/g/favicon.png') line = line.replace('http://docteam.mageia.nl/mageia-2013-200p.png','https://doc.mageia.org/g/mageia-2013-200p.png') # with fileinput, you need to use 'print' and not 'write' to # write in the file print(line) def check_changes_in_filelist(path_to_check, archive_list): toadd = [join(path_to_check, elem) for elem in archive_list if not elem.startswith("common")] toremove = [] for root, dirs, files in walk(path_to_check): for elem in files: namefile = join(root, elem) if namefile in toadd: toadd.remove(namefile) else: toremove.append(namefile) return toadd, toremove if __name__ == "__main__": if len(sys.argv) < 4: print("Usage: python3 update_manual.py <manual_name> " + "<release> <archive_base> [<language>]\n{} arguments given".format(len(sys.argv))) else: manual_name = sys.argv[1] release = sys.argv[2] if len(sys.argv) == 5: languages = {manual_name : sys.argv[4]} else: # define languages lists. en must be first languages = { 'installer':'en ca cs de el eo es et eu fr hr hu id it nb nl pl pt_br ro ru sk sl sq sv tr uk zh_CN', 'mcc':'en ca cs da de el es et eu fr id it nl pl pt pt_br ro ru sk sl sq sv tr uk zh_CN', 'draklive':'en cs de el es et eu fr hr nl pt_br ro sk sl sv uk zh_CN', 'netinstall':'en ca cs de el es et eu fr nb nl pt_br sl sv tg tr uk zh_CN'} archive_base = sys.argv[3] # define manuals base name root_name = {'mcc' : 'MCC', 'installer': 'DrakX', 'draklive': 'DrakLive', 'netinstall': 'NetInstall'} for language in languages[manual_name].split(' '): # create the path to the manual manual_path = join(manual_name, release, language) if not isdir(manual_path): makedirs(manual_path) print("Processing {} manual in {}".format(manual_name,language)) # create path to common directories common_dir = join(manual_path, 'common') if not isdir(common_dir): makedirs(common_dir) common_common_path = join(manual_name, release, 'common') if not isdir(common_common_path): makedirs(common_common_path) # create the path of the EN manual for missing images image_path = "../../en/content/images/" # create the zip interface archive = '{ab}/{manual}-{lang}-WebHelp-zipped.zip'.format(ab=archive_base,manual=root_name[manual_name], lang=language.upper()) try : archive_int = ZipFile(archive) except: print('{} not found'.format(archive)) continue # check for changes files_to_add, files_to_remove = \ check_changes_in_filelist(manual_path, archive_int.namelist()) # unzip the archive archive_int.extractall(manual_path) if language == "en": # if english, copy the common directory in the manual/release path rmtree(common_common_path) move(common_dir, common_common_path) # add common dir in case it's new files_to_add.append(common_common_path) else: # or remove the common directory and ... rmtree(common_dir) # ... fix the links fix_common_path(manual_path) # fix the links for missing images fix_image_path(manual_path, image_path) # tell git about the changes if len(files_to_add) == 0: print("Nothing to add to the git") else: command_add = ['git', 'add'] + files_to_add call(command_add) if len(files_to_remove) == 0: print("Nothing to remove from the git") else: command_remove = ['git', 'rm'] + files_to_remove call(command_remove) # committing command_commit = ['git', 'commit', '-m Adding or refreshing {} in {}'.format(manual_name,language), '{}/{}/{}/*'.format(manual_name,release,language)] call(command_commit)