-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsetup.py
225 lines (166 loc) · 7.49 KB
/
setup.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
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
import fileinput
import os
import shlex
import shutil
import subprocess
import time
from pathlib import Path
OLD_SEED_NAME = "Android-Seed"
OLD_PROJECT_NAME = "adaptmobile-android-seed"
APP_BUILD_GRADLE = "/app/build.gradle"
APP_NAME_CHANGE = "APP_NAME_CHANGE"
KEYSTORE_PASSWORD = "KEYSTORE_PASSWORD"
KEYSTORE_ALIAS = "KEYSTORE_ALIAS"
SEED_PACKAGE_NAME = "dk.adaptmobile.android_seed"
APP_SRC_PATH = "/app/src/main/java"
GITHUB_ORG = "adaptdk"
BITRISE_PROJECT_LOCATION_PLACEHOLDER = "SEED_PROJECT_NAME"
BITRISE_YAML_FILE = "bitrise.yml"
BITRISE_ORG = "4a2ac90a198eb532"
def find_and_replace(find, replace, file_name):
with fileinput.FileInput(file_name, inplace=True) as file:
for line in file:
print(line.replace(replace, find), end='')
def find_replace_in_dir(directory, find, replace):
for path, dirs, files in os.walk(os.path.abspath(directory)):
for filename in files:
if filename.endswith(('.kt', '.xml', '.gradle')):
filepath = os.path.join(path, filename)
with open(filepath) as file:
file_text = file.read()
file_text = file_text.replace(find, replace)
with open(filepath, "w") as file:
file.write(file_text)
def move_folder(source, destination, avoid_folders=()):
for _, dirs, files in os.walk(os.path.abspath(source)):
for avoid_folder in avoid_folders:
if avoid_folder in dirs:
dirs.remove(avoid_folder)
for _dir in dirs:
shutil.move('{0}/{1}'.format(source, _dir), destination)
for _file in files:
shutil.move('{0}/{1}'.format(source, _file), destination)
def dynamic_folder_structure(seed_package_name_split, new_package_name_split):
old_package_count = len(seed_package_name_split)
new_package_count = len(new_package_name_split)
ranger = range(old_package_count) if old_package_count >= new_package_count else range(new_package_count)
count_condition = old_package_count if old_package_count <= new_package_count else new_package_count
avoid_folders = []
cwd = ""
folder = ""
for i in ranger:
if i < count_condition:
os.rename(seed_package_name_split[i], new_package_name_split[i])
os.chdir(new_package_name_split[i])
cwd = os.getcwd()
folder = cwd
elif i > old_package_count - 1:
avoid_folders.append(new_package_name_split[i])
folder += "/" + new_package_name_split[i]
os.mkdir(folder)
if i == new_package_count - 1:
move_folder(source=cwd, destination=folder, avoid_folders=avoid_folders)
else:
os.chdir(new_package_name_split[i])
else:
source = '{0}/{1}'.format(cwd, seed_package_name_split[i])
move_folder(source=source, destination=cwd)
os.rmdir(source)
# This generates the keystore without the keytool cli.
def generate_keystore():
os.chdir("launch")
cmd = f'keytool -genkey -v -keystore release.keystore -keyalg RSA -keysize 4096 -validity 10000 -alias {alias} -dname "cn=Unknown, ou=Unknown, o=Unknown, c=Unknown" -storepass {password} -keypass {password}'
args = shlex.split(cmd)
subprocess.Popen(args)
os.chdir("..")
print("Will take some time to do this process, please wait for a while...")
def rename_package_dirs():
os.chdir(project_name + APP_SRC_PATH)
dynamic_folder_structure(SEED_PACKAGE_NAME.split("."), package_name.split("."))
os.chdir(project_name_path)
find_replace_in_dir(os.getcwd(), SEED_PACKAGE_NAME, package_name)
os.chdir('..')
def rename_app_name():
find_and_replace(find=app_name, replace=APP_NAME_CHANGE, file_name=project_name + APP_BUILD_GRADLE)
print(f'Changed app_name to {app_name}')
def rename_project():
os.rename(OLD_SEED_NAME, project_name)
os.chdir("..")
os.rename(OLD_PROJECT_NAME, project)
os.chdir(project)
print(f'Renamed project name to {project_name}')
print(f'Renamed project to {project}')
def rename_keystore_fields():
find_and_replace(find=alias, replace=KEYSTORE_ALIAS, file_name=project_name + APP_BUILD_GRADLE)
find_and_replace(find=password, replace=KEYSTORE_PASSWORD, file_name=project_name + APP_BUILD_GRADLE)
def create_private_repo():
subprocess.run(["gh", "repo", "create", "--private", "{org}/{repo_name}".format(org=GITHUB_ORG, repo_name=repo_name)])
def change_remote_url():
subprocess.run(
["git", "remote", "set-url", "origin",
print(f'Changed remote origin url to: ')
subprocess.run(["git", "remote", "--verbose"])
def initial_commit():
subprocess.run(["git", "add", "--all"])
subprocess.run(["git", "commit", "-m", "Initial commit"]) # TODO: Could take on a commit message 🤔
subprocess.run(["git", "push", "-u", "origin", "master"])
def setup_branch(branch):
subprocess.run(["git", "checkout", "-b", branch])
print(f'Changed branch to: ')
subprocess.run(["git", "branch"])
subprocess.run(["git", "push", "--set-upstream", "origin", branch])
def rename_bitrise_project_location_placeholder():
find_and_replace(find=project_name, replace=BITRISE_PROJECT_LOCATION_PLACEHOLDER, file_name=BITRISE_YAML_FILE)
print(f'Changed Bitrise PROJECT_LOCATION to: {project_name}')
def read_bitrise_token() -> str:
home = str(Path.home())
filename = f'{home}/.am_seed_token'
mode = "r" if os.path.isfile(filename) and os.path.getsize(filename) else "w"
with open(filename, mode) as file:
filesize = os.path.getsize(filename)
# Save token from input into the created file
if filesize == 0 or mode == "w":
bitrise_token = input("Enter Bitrise api token: ")
file.write(f'{bitrise_token}')
else:
# Read token from existing file that is not empty
bitrise_token = file.read()
file.close()
return bitrise_token
def setup_bitrise():
cmd = f'bash -c "bash <(curl -sfL "https://raw.githubusercontent.com/bitrise-io/bitrise-add-new-project/master/_scripts/run.sh") --api-token "{bitrise_api_token}" --org "{BITRISE_ORG}" --public "false" --website"'
args = shlex.split(cmd)
subprocess.run(args)
def gh_auth():
subprocess.run(["gh", "auth", "login"])
if __name__ == '__main__':
project_name = input("Project name like --> Boligsigen: ").replace(" ", "-")
repo_name = input("Enter GitHub repo name (defaults to {project name}-android): ")
if not repo_name:
repo_name = project_name.lower() + "-android"
project = repo_name
rename_project()
rename_bitrise_project_location_placeholder()
project_name_path = "{0}/{1}".format(os.getcwd(), project_name)
app_name = input("What's the app name: ")
rename_app_name()
package_name = input("Enter new package name like --> dk.adaptmobile.android_seed: ")
rename_package_dirs()
alias = input("Alias for the keystore: ")
password = input("Password for the keystore: ")
rename_keystore_fields()
generate_keystore()
# Wait for 2 seconds so keystore has been generated
time.sleep(2)
# Login or refresh auth token for GitHub using gh cli
gh_auth()
# Creates a private repo with gh cli
create_private_repo()
change_remote_url()
os.remove("setup.py")
initial_commit()
setup_branch("stage")
setup_branch("develop")
bitrise_api_token = read_bitrise_token()
setup_bitrise()