forked from wesnoth/wesnoth
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathupdate_copyrights
executable file
·139 lines (116 loc) · 4.35 KB
/
update_copyrights
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
#!/usr/bin/env python3
# encoding: utf-8
##
# This script checks all media files in the repository for whether they've been modified or added without updating the file tracking image, sound, and music copyright
##
import argparse
import contextlib
import csv
import hashlib
from operator import itemgetter
import os
from pathlib import Path
from subprocess import check_output
import sys
##
# csv file layout:
# [0] = current git commit date
# [1] = file path, relative to the repository root
# [2] = license name(s)
# [3] = authorship information
# [4] = notes
# [5] = new git commit date, if different from the value in [0]
# [6] = current md5 hash
##
def do_git(file):
return str(check_output(["git", "log", "-1", "--format=%ad", "--date=format:%Y/%m/%d", file]), 'UTF-8').rstrip('\n')
def do_hash(file):
md5 = hashlib.md5()
with open(file, 'rb') as f:
while True:
data = f.read(65536)
if not data:
break
md5.update(data)
return str(md5.hexdigest())
##
# program logic start
##
args = argparse.ArgumentParser()
args.add_argument("--repo", default=".", help="The directory of the Wesnoth repository to run this script against.")
args.add_argument("--output", default="output.csv", help="The file to write the results of this script to.")
args.add_argument("--input", default="copyrights.csv", help="The file to read the existing copyright data from.")
options = args.parse_args()
os.chdir(options.repo)
with contextlib.suppress(FileNotFoundError):
os.remove(options.output)
csv_data = {}
added = []
changed = []
# Already mentioned in the CSV file, but lacking something in either the license or author fields
incomplete = []
unchanged = []
removed = []
# Sanity-check that the input is in the same order as the output would be
csvfile_needs_sorting = False
with open(options.input) as csvfile:
reader = csv.reader(csvfile)
previous_file = ""
for row in reader:
if row[0] == "Date":
continue
file = row[1]
if file < previous_file:
csvfile_needs_sorting = True
previous_file = file
if not os.path.exists(file):
removed.append(file)
continue
csv_data[file] = row
for root, _, files in os.walk(options.repo):
for filename in files:
filetype = Path(filename).suffix
if filetype == ".png" or filetype == ".jpg" or filetype == ".webp" or filetype == ".wav" or filetype == ".ogg":
file = os.path.normpath(os.path.join(root, filename))
hash = do_hash(file)
if not file in csv_data:
added.append(["", file, "", "", "", do_git(file), hash])
elif csv_data[file][6] != hash:
csv_data[file][5] = do_git(file)
csv_data[file][6] = hash
changed.append(csv_data[file])
elif csv_data[file][2].strip() == "" or csv_data[file][3].strip() == "":
incomplete.append(csv_data[file])
else:
unchanged.append(csv_data[file])
added.sort(key=itemgetter(1))
changed.sort(key=itemgetter(1))
incomplete.sort(key=itemgetter(1))
unchanged.sort(key=itemgetter(1))
final_output = added + changed + incomplete + unchanged
if options.output != "":
with open(options.output, 'w') as f:
f.write("Date,File,License,Author - Real Name(other name);Real Name(other name);etc,Notes,Needs Update,MD5\n")
for row in final_output:
f.write(",".join(row)+"\n")
else:
for row in final_output:
print(",".join(row))
any_check_failed = False
if len(removed) > 0:
any_check_failed = True
print("There are "+str(len(removed))+" removed images")
if len(added) > 0 or len(changed) > 0 or len(incomplete) > 0:
any_check_failed = True
print("There are "+str(len(added))+" new images")
print("There are "+str(len(changed))+" changed images")
print("There are "+str(len(incomplete))+" images that lack license or author information")
if options.output != "":
print("These are at the top of the output for easy editing, run the tool again after editing to sort the file")
if csvfile_needs_sorting:
any_check_failed = True
print("The input file isn’t sorted by filename")
if options.output != "" and final_output == unchanged:
print("The new output file is correctly sorted")
if any_check_failed:
sys.exit(1)