-
Notifications
You must be signed in to change notification settings - Fork 1
/
zipcode.py
106 lines (92 loc) · 4.07 KB
/
zipcode.py
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
# Copyright The Linux Foundation
# SPDX-License-Identifier: Apache-2.0
import os
import zipfile
import util
from datatypes import ProjectRepoType, Status
# Runner for GOTCODE in GITHUB and GITHUB_SHARED
def doZipRepoCodeForSubproject(cfg, prj, sp):
# first, get path where code was collected
sp_path = os.path.join(cfg._zippath, cfg._month, "code", prj._name, sp._name)
ziporg_path = ""
if sp._repotype == ProjectRepoType.GITHUB_SHARED:
ziporg_path = os.path.join(sp_path, sp._name)
elif sp._repotype == ProjectRepoType.GITHUB:
ziporg_path = os.path.join(sp_path, sp._github_ziporg)
# remove each repo's .git directory
for repo in sp._repos:
dotgit_path = os.path.join(ziporg_path, repo, ".git")
util.retry_rmtree(dotgit_path)
# also remove its repo-dirs-delete, if any
delete_dirs = sp._repo_dirs_delete.get(repo, [])
for delete_dir in delete_dirs:
delete_dir_path = os.path.join(ziporg_path, repo, delete_dir)
print(f"{prj._name}/{sp._name}: deleting {repo}:{delete_dir}")
util.retry_rmtree(delete_dir_path)
# before zipping it all together, check and see whether it actually has any files
if not sp._code_anyfiles:
print(f"{prj._name}/{sp._name}: not zipping, no files found")
# still advance state because we passed the zip stage
sp._status = Status.ZIPPEDCODE
return True
# now zip it all together
zf_path = os.path.join(sp_path, f"{ziporg_path}-{sp._code_pulled}.zip")
print(f"{prj._name}/{sp._name}: zipping into {zf_path}")
if os.path.exists(zf_path):
os.remove(zf_path)
zf = zipfile.ZipFile(zf_path, 'w', compression=zipfile.ZIP_DEFLATED)
for root, _, files in os.walk(ziporg_path):
for f in files:
fpath = os.path.join(root, f)
rpath = os.path.relpath(fpath, ziporg_path)
if not os.path.islink(fpath):
zf.write(fpath, arcname=rpath)
zf.close()
# and finally, remove the original unzipped directory
util.retry_rmtree(ziporg_path)
# success - advance state
sp._status = Status.ZIPPEDCODE
sp._code_path = zf_path
return True
# Runner for GOTCODE in GERRIT
def doZipRepoCodeForGerritSubproject(cfg, prj, sp):
# first, get path where code was collected
sp_path = os.path.join(cfg._zippath, cfg._month, "code", prj._name, sp._name)
ziporg_path = os.path.join(sp_path, sp._name)
# remove each repo's .git directory
for repo in sp._repos:
dashName = repo.replace("/", "-")
dstFolder = os.path.join(ziporg_path, dashName)
dotgit_path = os.path.join(dstFolder, ".git")
util.retry_rmtree(dotgit_path)
# also remove its repo-dirs-delete, if any
delete_dirs = sp._repo_dirs_delete.get(repo, [])
for delete_dir in delete_dirs:
delete_dir_path = os.path.join(ziporg_path, dashName, delete_dir)
print(f"{prj._name}/{sp._name}: deleting {repo}:{delete_dir}")
util.retry_rmtree(delete_dir_path)
# before zipping it all together, check and see whether it actually has any files
if not sp._code_anyfiles:
print(f"{prj._name}/{sp._name}: not zipping, no files found")
# stop here, we checked for code and there isn't any
sp._status = Status.STOPPED
return True
# now zip it all together
zf_path = os.path.join(sp_path, f"{ziporg_path}-{sp._code_pulled}.zip")
print(f"{prj._name}/{sp._name}: zipping into {zf_path}")
if os.path.exists(zf_path):
os.remove(zf_path)
zf = zipfile.ZipFile(zf_path, 'w', compression=zipfile.ZIP_DEFLATED)
for root, _, files in os.walk(ziporg_path):
for f in files:
fpath = os.path.join(root, f)
rpath = os.path.relpath(fpath, ziporg_path)
if not os.path.islink(fpath):
zf.write(fpath, arcname=rpath)
zf.close()
# and finally, remove the original unzipped directory
util.retry_rmtree(ziporg_path)
# success - advance state
sp._status = Status.ZIPPEDCODE
sp._code_path = zf_path
return True