-
Notifications
You must be signed in to change notification settings - Fork 6
/
private-pod-push-script.sh
executable file
·322 lines (255 loc) · 7.66 KB
/
private-pod-push-script.sh
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
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
# 调用配置文件 也可以向前向后配置路径如 . ./..//config.sh
#. ./..//config.sh
. ./config.sh
#打印时间
function displaysecs() {
local T=$1
local D=$((T/60/60/24))
local H=$((T/60/60%24))
local M=$((T/60%60))
local S=$((T%60))
(( $D > 0 )) && printf '%d days ' $D
(( $H > 0 )) && printf '%d hours ' $H
(( $M > 0 )) && printf '%d minutes ' $M
(( $D > 0 || $H > 0 || $M > 0 )) && printf 'and '
printf '%d seconds\n' $S
}
# 打印红色的文本内容 出现异常时打印
function echo_warning()
{
if [[ ${#1} > 0 ]]; then
echo "\033[31mwarning: ${1}\033[0m"
fi
}
# 打印绿色的文本内容 正常流程会使用这个打印
function echo_success()
{
if [[ ${#1} > 0 ]]; then
echo "\033[32m${1}\033[0m"
fi
}
function log_line()
{
echo "========"
}
# 每次使用后必须置空 防止出错
INPUT_NUMBER=
# 必须输入数字才能继续后面的流程
function circle_input()
{
if [[ ${#1} == 0 ]]; then
echo "circle_input func未传入参数"
exit
fi
while [[ ! "$INPUT_NUMBER" =~ [0-9] ]];do
read -p "${1}" INPUT_NUMBER
done
}
# 获取组件所在的文件夹和组件文件的路径
TMP_MODULE_PATH=""
TMP_MODULE_ADDRESS=""
function get_module_path()
{
TMP_MODULE_PATH="${WORK_DIR}${ATTACH_DIR_PATH[$1]}"
}
function get_module_address()
{
TMP_MODULE_ADDRESS="${WORK_DIR}${ATTACH_DIR_PATH[$1]}${MODULES[$1]}${SUFFIX}"
}
if [[ ${#MODULES[*]} != ${#ATTACH_DIR_PATH[*]} ]]; then
echo_warning "组件名数组和附加路径数组数量不一致!检查配置文件!"
exit
fi
echo_success "组件总数量: ${#MODULES[*]}"
# 标识文件是否存在
IS_Exists=false
function file_exists()
{
if [ -e $1 ]; then
IS_Exists=true
else
IS_Exists=false
fi
}
# 脚本所在目录
SCRIPT_PATH=$(pwd)
# 遍历所有组件名 判断文件是否存在 并展示
MODULES_COUNT=${#MODULES[*]}
NO=0
for (( i = 0; i < MODULES_COUNT; i++ )); do
# 角标+1获取编号
NO=`expr $i + 1`
# 获取组件路径
get_module_address $i
# 判断文件是否存在
file_exists $TMP_MODULE_ADDRESS
# 打印展示 打印全路径或者只打印module名
# MODULE_PODSPEC="${NO}. ${TMP_MODULE_ADDRESS}"
MODULE_PODSPEC="${NO}. ${MODULES[$i]}"
if [[ $IS_Exists == true ]]; then
echo "${MODULE_PODSPEC}"
else
echo_warning "${MODULE_PODSPEC} (文件未找到)"
fi
done
log_line
# 获取输入的组件编号
# read -p "输入组件编号: " READ_INDEX
circle_input "输入组件编号: "
# 输入的数值-1转换成数组需要的角标
INDEX=`expr $INPUT_NUMBER - 1`
INPUT_NUMBER=
log_line
# 重新获取路径和文件地址
get_module_path INDEX
# echo $TMP_MODULE_PATH
get_module_address INDEX
# echo $TMP_MODULE_ADDRESS
# 判断文件是否存在 不存在直接退出
file_exists $TMP_MODULE_ADDRESS
# echo $TMP_MODULE_ADDRESS
# echo $IS_Exists
if [[ $IS_Exists == false ]]; then
echo_warning "${TMP_MODULE_ADDRESS} 文件未找到 或 输入的组件编号错误"
exit
fi
# echo_success "选择的组件: ${MODULES[$INDEX]}"
PODSPEC_NAME=${MODULES[$INDEX]}
DIR_PATH=$TMP_MODULE_PATH
PODSPEC_PATH=$TMP_MODULE_ADDRESS
# 进入工作目录
cd $DIR_PATH
BRANCH_NAME=$(git symbolic-ref --short -q HEAD)
# 显示当前工作目录的分支号
echo_success "选择的组件 ${MODULES[$INDEX]} (${BRANCH_NAME}) "
log_line
# 1.0.0 这种版本号
OID_VERSION=''
NEW_VERSION=''
# 真正写在文件中的版本号的那一整行文本内容
OID_TMP_STRING=''
NEW_TMP_STRING=''
# 逐行匹配获取文件中的版本号
while read line
do
# echo $line
if [[ $line == s.version* ]]; then
# echo $line
# 匹配单引号或者双引号
RE="\'([^\']*)\'"
RE_DOUBLE="\"([^\"]*)\""
if [[ $line =~ $RE || $line =~ $RE_DOUBLE ]]; then
OID_VERSION=${BASH_REMATCH[1]}
echo_success "podspec版本号 $OID_VERSION"
OID_TMP_STRING=$line
# echo $OID_TMP_STRING
fi
break
fi
done < $PODSPEC_PATH
log_line
echo_success "组件仓库最后一次提交的标签版本号是 $(git describe --tags `git rev-list --tags --max-count=1`)"
log_line
read -p "输入需要设置的版本号: " parameter
NEW_VERSION="$parameter"
# echo "输入的版本号是 ${NEW_VERSION} "
log_line
if [[ ${#NEW_VERSION} == 0 ]]; then
NEW_VERSION=$OID_VERSION
echo_success "版本号未输入, 保持原样"
else
NEW_TMP_STRING=${OID_TMP_STRING/$OID_VERSION/$NEW_VERSION}
# echo $OID_TMP_STRING
# echo $NEW_TMP_STRING
# pwd
# 将输入的版本号整合成podspec文件中的一行文字 并且整行修改进去
sed -i '' "s/${OID_TMP_STRING}/${NEW_TMP_STRING}/g" $PODSPEC_PATH
echo_success "原版本号${OID_VERSION} 修改后的版本号${NEW_VERSION}"
fi
# echo "====输入提交注释===="
read -p "输入需要提交的注释内容: " parameter
READ_NEW_VERSION="$parameter"
# 如果没有输入注释 那么默认注释是podspec文件版本号
if [[ ${#READ_NEW_VERSION} == 0 ]]; then
READ_NEW_VERSION=${NEW_VERSION}
echo_success ">>>> 未输入注释, 默认使用push的tag号做为注释内容 <<<<"
else
echo_success ">>>> 输入的提交注释是: <<<<"
echo_success "${READ_NEW_VERSION}"
log_line
fi
SECONDS=0
# 所有修改的文件全量提交
git add .
echo "====正在提交===="
git commit -m "${READ_NEW_VERSION}"
echo "====正在Push===="
git tag -a ${NEW_VERSION} -m "${NEW_VERSION}"
git push --tags
git push
echo "====Push完成===="
log_line
# 所有仓库目录名的数组
ALL_REPO_DIR_NAME=()
# IS_DIR=false
COCOAPODS_PATH=~/.cocoapods/repos/
REPO_NAME=
# 是否设置默认推送仓库目录
IS_EXISTS_DEFAULT_REPO=false
# push 记录写入的文件 判断完成后会删除
TMP_LOG_FILE="${SCRIPT_PATH}/pppsTmpLog.txt"
# 判断是否设置了默认推送仓库目录名, 并且目录名是真实存在
if [ ${#DEFAULT_REPO_DIR_NAME} != 0 ] && [ -d "${COCOAPODS_PATH}${DEFAULT_REPO_DIR_NAME}" ] ; then
IS_EXISTS_DEFAULT_REPO=true
fi
if [[ $IS_EXISTS_DEFAULT_REPO == false ]]; then
# 默认忽略cocoapods的公有文件夹
echo_success "检索到以下文件夹, 已忽略"master"文件夹"
REPO_DIR_PATH=
for dir in $(ls $COCOAPODS_PATH)
do
# [ -d $dir ] && echo $dir
REPO_DIR_PATH=${COCOAPODS_PATH}${dir}
if [ -d $REPO_DIR_PATH ] && [ $dir != master ] ; then
# IS_DIR=true
# else
# IS_DIR=false
ALL_REPO_DIR_NAME+=($dir)
echo ${#ALL_REPO_DIR_NAME[*]}. $dir
# echo $dir $IS_DIR
# echo $dir
fi
done
# read -p "输入需要Push到的文件夹编号: " REPO_INDEX
circle_input "输入需要Push到的目标文件夹编号: "
REPO_INDEX=`expr $INPUT_NUMBER - 1`
INPUT_NUMBER=
# echo ${ALL_REPO_DIR_NAME[${REPO_INDEX}]}
# echo ${PODSPEC_PATH}
REPO_NAME=${ALL_REPO_DIR_NAME[${REPO_INDEX}]}
else
REPO_NAME=$DEFAULT_REPO_DIR_NAME
echo_success "读取到默认push repo文件夹 (${REPO_NAME})"
fi
pod repo push ${REPO_NAME} ${PODSPEC_PATH} ${PUSH_REPO_SOURCE} --allow-warnings --verbose --use-libraries | tee ${TMP_LOG_FILE}
COUNT=0
TOTAL_COUNT=3
# 对写入到临时文件的内容进行逐行判断, 满足3个条件表示推送成功
while read TMP_LINE
do
if [[ ${TMP_LINE} == "Adding the spec to the \`${REPO_NAME}' repo" || ${TMP_LINE} == "- [Update] ${PODSPEC_NAME} (${NEW_VERSION})" || ${TMP_LINE} == "Pushing the \`${REPO_NAME}' repo" ]]; then
COUNT=`expr ${COUNT} + 1`
fi
done < $TMP_LOG_FILE
# 移除临时的目录
rm $TMP_LOG_FILE
# 推送成功和推送失败的提示不一样
if [[ ${COUNT} == ${TOTAL_COUNT} ]]; then
echo_success "推送成功!!!!"
# echo_success "用时: ${SECONDS}s"
echo_success "用时: $(displaysecs ${SECONDS})"
echo_success "${PODSPEC_NAME} (${BRANCH_NAME}) 组件 ${NEW_VERSION} 版本 已提交到 ${REPO_NAME}"
else
echo_warning "推送失败, 请检查!!!!"
fi
# echo_success "${READ_NEW_VERSION}"