4848else :
4949 git = gitlab .GitLab (gitlab_url = gitlab_url ,token = token_secret ,ssl_verify = True )
5050
51- def findgroup (gname ):
52- #Locate the group
53- page = 1
54- while len (git .groups (page = page )) > 0 :
55- for group in git .groups (page = page ):
56- if group .name == gname :
57- return group
58- page += 1
59- else :
60- print >> stderr , "Project namespace (user or group) not found or user does not have permission of existing group."
61- print >> stderr , "gitlab-mirrors will not automatically create the project namespace."
62- exit (1 )
63-
64- def findproject (gname ,pname ,user = False ):
65- page = 1
66- while len (git .projects (page = page ,per_page = 20 )) > 0 :
67- for project in git .projects (page = page ,per_page = 20 ):
68- if not user and project .namespace ['name' ] == gname and project .name == pname :
69- return project
70- elif user and project .namespace ['path' ] == gname and project .name == pname :
71- return project
72- page += 1
73- else :
74- return False
51+ # transfer the project from the source namespace to the specified group namespace
52+ def transfer_project (src_project , group ):
53+ value = group .transfer_project (src_project .id )
54+ dest_project = git .find_project (name = src_project .name )
55+ return dest_project
7556
7657def createproject (pname ):
7758 if len (options .desc ) == 0 :
@@ -87,40 +68,55 @@ def createproject(pname):
8768 'merge_requests_enabled' : options .merge ,
8869 'wiki_enabled' : options .wiki ,
8970 'snippets_enabled' : options .snippets ,
90- 'public' : options .public
71+ 'public' : options .public ,
72+ 'namespace_id' : git .find_group (name = gitlab_namespace ).id ,
9173 }
9274 #make all project options lowercase boolean strings i.e. true instead of True
9375 for x in project_options .keys ():
9476 project_options [x ] = str (project_options [x ]).lower ()
95- new_project = git .add_project (pname ,description = description ,** project_options )
96- if gitlab_user != gitlab_namespace :
97- new_project = findproject (gitlab_user ,pname ,user = True )
98- new_project = git .group (found_group .id ).transfer_project (new_project .id )
99- if findproject (gitlab_namespace ,pname ):
100- return findproject (gitlab_namespace ,pname )
77+ print >> stderr , "Creating new project %s" % pname
78+ git .add_project (pname ,description = description ,** project_options )
79+ found_project = git .find_project (name = pname )
80+ if needs_transfer (gitlab_user , gitlab_namespace , found_project ):
81+ found_project = transfer_project (found_project , found_group )
82+ return found_project
83+
84+ # returns a Bool True if the transfer is required
85+ def needs_transfer (user , groupname , project ):
86+ namespace = False
87+ if groupname :
88+ namespace = groupname
10189 else :
102- return False
90+ namespace = user
91+ return project .namespace ['name' ] != namespace
10392
10493if options .create :
105- found_group = findgroup (gitlab_namespace )
106- found_project = findproject (gitlab_namespace ,project_name )
107-
108- if not found_project :
94+ found_group = git .find_group (name = gitlab_namespace )
95+ found_project = None
96+ # search the group namespace first
97+ found_project = git .find_project (name = project_name )
98+ if found_project :
99+ if needs_transfer (gitlab_user , gitlab_namespace , found_project ):
100+ found_project = transfer_project (found_project , found_group )
101+ if not found_project :
102+ print >> stderr , "There was a problem transferring {group}/{project}. Did you give {user} user Admin rights in gitlab?" .format (group = gitlab_namespace ,project = project_name ,user = gitlab_user )
103+ exit (1 )
104+ else :
109105 found_project = createproject (project_name )
110106 if not found_project :
111107 print >> stderr , "There was a problem creating {group}/{project}. Did you give {user} user Admin rights in gitlab?" .format (group = gitlab_namespace ,project = project_name ,user = gitlab_user )
112108 exit (1 )
113-
114109 if options .http :
115110 print found_project .http_url_to_repo
116111 else :
117112 print found_project .ssh_url_to_repo
118113elif options .delete :
119114 try :
120- deleted_project = git .project ( findproject ( gitlab_namespace , project_name ). id ).delete ()
115+ deleted_project = git .find_project ( name = project_name ).delete ()
121116 except Exception as e :
122117 print >> stderr , e
123118 exit (1 )
124119else :
125120 print >> stderr , "No --create or --delete option added."
126121 exit (1 )
122+
0 commit comments