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(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()
|