-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Expand file tree
/
Copy pathrepo-name-collision-detection.sh
More file actions
230 lines (211 loc) · 8.21 KB
/
repo-name-collision-detection.sh
File metadata and controls
230 lines (211 loc) · 8.21 KB
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
#!/bin/bash
#########################################
# Collision detection script to verify #
# That all Repos in an Org do NOT exist #
# in the master Organization #
# #
# @admiralAwkbar #
#########################################
#
# Legend:
# This script is used to see if repo names from one organization
# are found in another ogranization. This is helpful
# when your consolidating organizations into a single Org
#
# To run the script:
# - chmod +x script.sh
# - export GITHUB_TOKEN=YourGithubTokenWithAccessToBothOrgs
# - ./script OriginalOrg MasterOrg
#
# The script will come back with a list of any repos that have a
# name collision that will cause errors in a migration process
#
########
# VARS #
########
ORIG_ORG=$1 # Name of the users GitHub Organization
MASTER_ORG=$2 # Name of the master Organization
GITHUB_TOKEN='' # Token to authenticate into GitHub
######################################
# Will be set when the script is ran #
######################################
ORIG_ORG_REPOS= # Array of all the repositories in Organization
MASTER_ORG_REPOS= # Array of all the repositories in Organization
COLLISION_REPOS= # Repos that will have a collision
################################################################################
######################## SUB ROUTINES BELOW ####################################
################################################################################
################################################################################
#### Sub Routine ValidateInput #################################################
ValidateInput()
{
###########################################
# Need to make sure we have all varaibles #
###########################################
# Validate we have Original Organization Name
if [[ -z $ORIG_ORG ]]; then
echo "ERROR: No Original Organization given!"
echo $0 <Original_Organization_Name> <Master_Organization_Name>
exit 1
fi
# Validate we have Master Organization Name
if [[ -z $MASTER_ORG ]]; then
echo "ERROR: No Master Organization given!"
echo $0 <Original_Organization_Name> <Master_Organization_Name>
exit 1
fi
# Validate we have a token to connect to GitHub
if [[ -z $GITHUB_TOKEN ]]; then
echo "ERROR: No GitHub Token given!"
echo "Please update script with GitHub token or place token in the environment"
echo "Example: Comment out line GITHUB_TOKEN='' and then export GITHUB_TOKEN=YourToken"
echo $0 <Original_Organization_Name> <Master_Organization_Name>
exit 1
fi
}
################################################################################
#### Sub Routine Header ########################################################
Header()
{
###############################
# Print the basic header info #
###############################
echo "-----------------------------------------------------"
echo "------ GitHub Repo Collision Detection Script -------"
echo "-- Validating Repo name not found inside master Org -"
echo "-----------------------------------------------------"
echo ""
echo "Original Organization:[$ORIG_ORG]"
echo "Master Organization:[$MASTER_ORG]"
echo ""
}
################################################################################
#### Sub Routine GetOrigOrgInfo ################################################
GetOrigOrgInfo()
{
####################################
# Get all repositories in User Org #
####################################
echo "-----------------------------------------------------"
echo "Gathering all repos from Original Organization:[$ORIG_ORG]"
ORIG_ORG_RESPONSE=$(curl -s --request GET \
--url https://api.github.com/orgs/$ORIG_ORG/repos \
--header "authorization: Bearer $GITHUB_TOKEN" \
--header 'content-type: application/json')
#######################################################
# Loop through list of repos in original organization #
#######################################################
echo "-----------------------------------------------------"
echo "Parsing repo names from Original Organization:"
for orig_repo in $(echo "${ORIG_ORG_RESPONSE}" | jq -r '.[] | @base64');
do
get_orig_repo_name()
{
echo ${orig_repo} | base64 --decode | jq -r ${1}
}
# Get the name of the repo
ORIG_REPO_NAME=$(get_orig_repo_name '.name')
echo "Name:[$ORIG_REPO_NAME]"
ORIG_ORG_REPOS+=($ORIG_REPO_NAME)
done
}
################################################################################
#### Sub Routine GetMasterOrgInfo ##############################################
GetMasterOrgInfo()
{
######################################
# Get all repositories in MASTER Org #
######################################
echo "-----------------------------------------------------"
echo "Gathering all repos from Master Organization:[$MASTER_ORG]"
MASTER_ORG_RESPONSE=$(curl -s --request GET \
--url https://api.github.com/orgs/$MASTER_ORG/repos \
--header "authorization: Bearer $GITHUB_TOKEN" \
--header 'content-type: application/json')
#####################################################
# Loop through list of repos in master organization #
#####################################################
echo "-----------------------------------------------------"
echo "Parsing repo names from Master Organization:"
for master_repo in $(echo "${MASTER_ORG_RESPONSE}" | jq -r '.[] | @base64');
do
get_master_repo_name()
{
echo ${master_repo} | base64 --decode | jq -r ${1}
}
# Get the name of the repo
MASTER_REPO_NAME=$(get_master_repo_name '.name')
echo "Name:[$MASTER_REPO_NAME]"
MASTER_ORG_REPOS+=($MASTER_REPO_NAME)
done
}
################################################################################
#### Sub Routine CheckCollisions ###############################################
CheckCollisions()
{
############################
# Check for any collisions #
############################
echo "-----------------------------------------------------"
echo "Checking for collisions"
for new_repo in ${ORIG_ORG_REPOS[@]};
do
if [[ " ${MASTER_ORG_REPOS[@]} " =~ " ${new_repo} " ]]; then
# We have found the name of the repo in the master org
echo "ERROR: Collision detection repo:[$new_repo]"
COLLISION_REPOS+=($new_repo)
fi
done
##############################
# Print the collisions found #
##############################
echo "-----------------------------------------------------"
echo "COLLISION_REPOS:"
for repo in ${COLLISION_REPOS[@]};
do
echo "$repo"
done
}
################################################################################
#### Sub Routine Footer ########################################################
Footer()
{
###################################################
# Check to see if we exit with success or failure #
###################################################
echo "-----------------------------------------------------"
if [ ${#COLLISION_REPOS[@]} -eq 0 ]; then
echo "No collisions detected"
exit 0
else
echo "ERROR: Collisions detected!"
exit 1
fi
}
################################################################################
############################## MAIN ############################################
################################################################################
##################
# Validate input #
##################
ValidateInput
##########
# Header #
##########
Header
####################################
# Get all repositories in User Org #
####################################
GetOrigOrgInfo
######################################
# Get all repositories in MASTER Org #
######################################
GetMasterOrgInfo
##############################################################################
# Check if original is already in master, if so add to COLLISION_REPOS array #
##############################################################################
CheckCollisions
####################
# Print the footer #
####################
Footer