Newer
Older
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
set gitlab_host https://git.recolic.net
# set gitlab_namespace_src users/root groups/recolic-hust
set gitlab_namespace_src users/root
set github_user_dst "rtestgithubapi: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"
function echo2
echo $argv 1>&2
end
function sync_one_project
set project_name $argv[1]
set project_url $argv[2]
set github_project_desc "This is a read-only mirror for $project_url"
echo2 "Syncing $project_url to github:$github_user_dst..."
# Prepare github repository
set resp (curl -s -u $github_user_dst --data "{\"name\":\"$project_name\", \"description\":\"$github_project_desc\"}" https://api.github.com/user/repos)
if echo $resp | grep -F "name already exists on this account"
# Good. Update existing repo
else if echo $resp | grep -F $github_project_desc
echo2 "Creating new github repository success: $project_name"
else
echo2 "Failed to create or update github repo: $resp"
return 2
end
set github_username (echo $github_user_dst | sed 's/:.*$//g')
set github_project_url "https://$github_user_dst@github.com/$github_username/$project_name.git"
# Do the sync
test -d $project_name
or begin
git clone $project_url $project_name
and cd $project_name
and git remote add dst $github_project_url
and cd ..
or return 3
end
cd $project_name
# https://stackoverflow.com/questions/67054889/force-git-pull-to-resolve-divergent-by-discard-all-local-commits
and git fetch
and git reset --hard "@{upstream}"
and git push --tags --force dst (git branch --show-current)
and cd ..
or return 4
end
function do_namespace_copy
set ns_src $argv[1]
echo2 "Processing gitlab namespace $ns_src..."
set project_list (curl -s "$gitlab_host/api/v4/$ns_src/projects?per_page=9999" | json2table http_url_to_repo -p | grep VAL: | sed 's/^VAL: //g' | sed 's/|//g')
set workdir (pwd) # to avoid some failure in sync_one_project changes the workdir.
for project_url in $project_list
set project_name (echo "$project_url" | sed 's/.git$//g' | sed 's/^.*\///g')
sync_one_project $project_name $project_url
or echo2 "sync_one_project fails for $project_name with status=$status"
sleep 10
end
end
for ns in $gitlab_namespace_src
do_namespace_copy $ns
end