summaryrefslogtreecommitdiff
path: root/scripts/release.py
blob: da04241fe62c0f83be1c0d12dc37a8a9a9a0aff3 (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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#!/usr/bin/env python3

import os
import shutil
import sys
import tarfile

from collections.abc import MutableSet
import json


# Recipe from http://code.activestate.com/recipes/576694/


class OrderedSet(MutableSet):
    def __init__(self, iterable=None):
        self.end = end = []
        end += [None, end, end]         # sentinel node for doubly linked list
        self.map = {}                   # key --> [key, prev, next]
        if iterable is not None:
            self |= iterable

    def __len__(self):
        return len(self.map)

    def __contains__(self, key):
        return key in self.map

    # pylint: disable=arguments-differ
    def add(self, key):
        if key not in self.map:
            end = self.end
            curr = end[1]
            curr[2] = end[1] = self.map[key] = [key, curr, end]

    def __getstate__(self):
        if not self:
            # The state can't be an empty list.
            # We need to return a truthy value, or else
            # __setstate__ won't be run.
            #
            # This could have been done more gracefully by always putting
            # the state in a tuple, but this way is backwards- and forwards-
            # compatible with previous versions of OrderedSet.
            return (None,)
        return list(self)

    def __setstate__(self, state):
        if state == (None,):
            self.__init__([])
        else:
            self.__init__(state)

    def discard(self, key):
        if key in self.map:
            key, prev, nxt = self.map.pop(key)
            prev[2] = nxt
            nxt[1] = prev

    def __iter__(self):
        end = self.end
        curr = end[2]
        while curr is not end:
            yield curr[0]
            curr = curr[2]

    def __reversed__(self):
        end = self.end
        curr = end[1]
        while curr is not end:
            yield curr[0]
            curr = curr[1]

    def pop(self, last=True):
        if not self:
            raise KeyError('set is empty')
        key = self.end[1][0] if last else self.end[2][0]
        self.discard(key)
        return key

    def __repr__(self):
        if not self:
            return '%s()' % (self.__class__.__name__,)
        return '%s(%r)' % (self.__class__.__name__, list(self))

    def __eq__(self, other):
        if isinstance(other, OrderedSet):
            return len(self) == len(other) and list(self) == list(other)
        return set(self) == set(other)


HERE = os.path.realpath(os.path.dirname(__file__))


if __name__ == "__main__":
    files = sys.argv[1]
    version = sys.argv[2]
    release_name = 'gstreamer-docs-' + sys.argv[2]
    builddir = sys.argv[3]
    readme = os.path.join(builddir, "README.md")
    outname = release_name + '.tar.xz'

    version_v = version.split('.')
    version_major_minor = version_v[0] + '.' + version_v[1]
    symbols_index_dir = os.path.join(HERE, '..', 'symbols')
    symbols_version = '-1'
    symbols_version_file = os.path.join(symbols_index_dir, 'symbols_version.txt')
    try:
        with open(symbols_version_file) as sv:
            symbols_version = sv.read()
    except FileNotFoundError:
        pass

    if symbols_version != version_major_minor:
        print("Updating symbols to new major version %s" % version_major_minor, file=sys.stderr)

        symbol_index_file = os.path.join(symbols_index_dir, 'symbol_index.json')
        with open(symbol_index_file, 'r', encoding='utf-8') as _:
            symbols = OrderedSet(json.load(_))

        with open(os.path.join(builddir, "hotdoc-private-GStreamer", "symbol_index.json"), 'r', encoding='utf-8') as _:
            new_symbols = OrderedSet(sorted(json.load(_)))

        with open(symbol_index_file, 'w', encoding='utf-8') as _:
            json.dump(sorted(list(symbols | new_symbols)), _, indent=2)

        with open(symbols_version_file, 'w') as sv:
            sv.write(version_major_minor)

        print("NOTE: YOU SHOULD COMMIT THE FOLLOWING FILES BEFORE PUBLISHING THE RELEASE:", file=sys.stderr)
        print(" - " + symbol_index_file, file=sys.stderr)
        print(" - " + symbols_version_file, file=sys.stderr)

        sys.exit(1)

    print("Generating %s" % os.path.realpath(os.path.join(os.path.curdir, outname)), file=sys.stderr)

    # Filter out duplicate js search assets for devhelp dir
    def exclude_filter(tarinfo):
        if '/devhelp/books/GStreamer/' in tarinfo.name:
            if '/assets/fonts' in tarinfo.name:
                return None
            if '/assets/js/search' in tarinfo.name:
                return None
            if '/dumped.trie' in tarinfo.name:
                return None

        return tarinfo

    tar = tarfile.open(outname, 'w:xz')
    tar.add(files, release_name, filter=exclude_filter)
    for license in ['LICENSE.BSD', 'LICENSE.CC-BY-SA-4.0', 'LICENSE.LGPL-2.1', 'LICENSE.MIT', 'LICENSE.OPL']:
        tar.add(os.path.join(HERE, '..', license), os.path.join(release_name, license))
    os.chdir(os.path.dirname(readme))
    tar.add(os.path.basename(readme), os.path.join(release_name, os.path.basename(readme)))
    tar.close()