aboutsummaryrefslogtreecommitdiffstats
path: root/update_manual.py
blob: ab1c4939756853922d9643840b83a40553b614b4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#!/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
from os.path import splitext, join
from shutil import rmtree, move
from zipfile import ZipFile
from subprocess import call
import fileinput



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/')
                        # with fileinput, you need to us '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) != 5:
        print("Usage: python3 update_manual.py <manual_name> " +
              "<release> <language> <archive>")
    else:
        manual_name = sys.argv[1]
        release = sys.argv[2]
        language = sys.argv[3]
        archive = sys.argv[4]

        # create the path to the manual
        manual_path = join(manual_name, release, language)

        # create the zip interface
        archive_int = ZipFile(archive)

        # 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)
        common_dir = join(manual_path, 'common')
        common_common_path = join(manual_name, release, 'common')

        if language == "en":
            # if english, copy the common directory in the manual/release path
            rmtree(common_common_path)
            move(common_dir, common_common_path)
        else:
            # or remove the common directory and ...
            rmtree(common_dir)
        
        # ... fix the links
        fix_common_path(manual_path)

        # tell git about the changes
        command_add = ['git', 'add'] + files_to_add
        call(command_add)

        command_remove = ['git', 'rm'] + files_to_remove
        call(command_remove)

        # ask for git status (the user has to commit himself)
        command_status = ['git', 'status']
        call(command_status)