1
1
import os
2
+
2
3
import time
3
4
4
5
from conans .client .remote_manager import check_compressed_files
5
- from conans .client .rest .rest_client_common import RestCommonMethods , handle_return_deserializer
6
+ from conans .client .rest .client_routes import ClientV2ConanRouterBuilder
7
+ from conans .client .rest .rest_client_common import RestCommonMethods
6
8
from conans .client .rest .uploader_downloader import Downloader , Uploader
7
9
from conans .errors import NotFoundException , ConanException
8
10
from conans .model .info import ConanInfo
9
11
from conans .model .manifest import FileTreeManifest
10
12
from conans .model .ref import PackageReference , ConanFileReference
11
- from conans .paths import CONAN_MANIFEST , CONANINFO , EXPORT_SOURCES_TGZ_NAME , EXPORT_TGZ_NAME , \
13
+ from conans .paths import EXPORT_SOURCES_TGZ_NAME , EXPORT_TGZ_NAME , \
12
14
PACKAGE_TGZ_NAME
13
- from conans .util .env_reader import get_env
14
15
from conans .util .files import decode_text
15
16
from conans .util .log import logger
16
17
@@ -28,6 +29,10 @@ def __init__(self, remote_url, token, custom_headers, output, requester, verify_
28
29
def remote_api_url (self ):
29
30
return "%s/v2" % self .remote_url .rstrip ("/" )
30
31
32
+ @property
33
+ def conans_router (self ):
34
+ return ClientV2ConanRouterBuilder (self .remote_api_url )
35
+
31
36
def _get_file_list_json (self , url ):
32
37
data = self .get_json (url )
33
38
# Discarding (.keys()) still empty metadata for files
@@ -51,53 +56,53 @@ def _get_snapshot(self, url, reference):
51
56
return files_list , reference , rev_time
52
57
53
58
def _get_recipe_snapshot (self , reference ):
54
- url = self ._recipe_url (reference )
59
+ url = self .conans_router . recipe_snapshot (reference )
55
60
repr_ref = reference .full_repr ()
56
61
snap , reference , rev_time = self ._get_snapshot (url , repr_ref )
57
62
reference = ConanFileReference .loads (reference )
58
63
return snap , reference , rev_time
59
64
60
65
def _get_package_snapshot (self , p_ref ):
61
- url = self ._package_url (p_ref )
66
+ url = self .conans_router . package_snapshot (p_ref )
62
67
repr_ref = p_ref .full_repr ()
63
68
snap , p_reference , rev_time = self ._get_snapshot (url , repr_ref )
64
69
65
70
reference = PackageReference .loads (p_reference )
66
71
return snap , reference , rev_time
67
72
68
73
def get_conan_manifest (self , conan_reference ):
69
- url = "%s/%s" % ( self ._recipe_url (conan_reference ), CONAN_MANIFEST )
74
+ url = self .conans_router . recipe_manifest (conan_reference )
70
75
content = self ._get_remote_file_contents (url )
71
76
return FileTreeManifest .loads (decode_text (content ))
72
77
73
78
def get_package_manifest (self , package_reference ):
74
- url = "%s/%s" % ( self ._package_url (package_reference ), CONAN_MANIFEST )
79
+ url = self .conans_router . package_manifest (package_reference )
75
80
content = self ._get_remote_file_contents (url )
76
81
return FileTreeManifest .loads (decode_text (content ))
77
82
78
83
def get_package_info (self , package_reference ):
79
- url = "%s/%s" % ( self ._package_url (package_reference ), CONANINFO )
84
+ url = self .conans_router . package_info (package_reference )
80
85
content = self ._get_remote_file_contents (url )
81
86
return ConanInfo .loads (decode_text (content ))
82
87
83
88
def get_recipe (self , conan_reference , dest_folder ):
84
- url = self ._recipe_url (conan_reference )
89
+ url = self .conans_router . recipe_snapshot (conan_reference )
85
90
data = self ._get_file_list_json (url )
86
91
files = data ["files" ]
87
92
rev_time = data ["time" ]
88
93
check_compressed_files (EXPORT_TGZ_NAME , files )
89
- reference = ConanFileReference .loads (data ["reference" ])
94
+ new_ref = ConanFileReference .loads (data ["reference" ])
90
95
if EXPORT_SOURCES_TGZ_NAME in files :
91
96
files .remove (EXPORT_SOURCES_TGZ_NAME )
92
97
93
98
# If we didn't indicated reference, server got the latest, use absolute now, it's safer
94
- url = self ._recipe_url ( reference )
95
- self ._download_and_save_files (url , dest_folder , files )
99
+ urls = { fn : self .conans_router . recipe_file ( conan_reference , fn ) for fn in files }
100
+ self ._download_and_save_files (urls , dest_folder , files )
96
101
ret = {fn : os .path .join (dest_folder , fn ) for fn in files }
97
- return ret , reference , rev_time
102
+ return ret , new_ref , rev_time
98
103
99
104
def get_recipe_sources (self , conan_reference , dest_folder ):
100
- url = self ._recipe_url (conan_reference )
105
+ url = self .conans_router . recipe_snapshot (conan_reference )
101
106
data = self ._get_file_list_json (url )
102
107
files = data ["files" ]
103
108
check_compressed_files (EXPORT_SOURCES_TGZ_NAME , files )
@@ -106,31 +111,33 @@ def get_recipe_sources(self, conan_reference, dest_folder):
106
111
files = [EXPORT_SOURCES_TGZ_NAME , ]
107
112
108
113
# If we didn't indicated reference, server got the latest, use absolute now, it's safer
109
- url = self ._recipe_url (ConanFileReference .loads (data ["reference" ]))
110
- self ._download_and_save_files (url , dest_folder , files )
114
+ new_ref = ConanFileReference .loads (data ["reference" ])
115
+ urls = {fn : self .conans_router .recipe_file (new_ref , fn ) for fn in files }
116
+ self ._download_and_save_files (urls , dest_folder , files )
111
117
ret = {fn : os .path .join (dest_folder , fn ) for fn in files }
112
118
return ret
113
119
114
120
def get_package (self , package_reference , dest_folder ):
115
- url = self ._package_url (package_reference )
121
+ url = self .conans_router . package_snapshot (package_reference )
116
122
data = self ._get_file_list_json (url )
117
123
files = data ["files" ]
118
124
rev_time = data ["time" ]
119
125
check_compressed_files (PACKAGE_TGZ_NAME , files )
120
126
new_reference = PackageReference .loads (data ["reference" ])
121
127
# If we didn't indicated reference, server got the latest, use absolute now, it's safer
122
- url = self ._package_url (PackageReference .loads (data ["reference" ]))
123
- self ._download_and_save_files (url , dest_folder , files )
128
+ new_pref = PackageReference .loads (data ["reference" ])
129
+ urls = {fn : self .conans_router .package_file (new_pref , fn ) for fn in files }
130
+ self ._download_and_save_files (urls , dest_folder , files )
124
131
ret = {fn : os .path .join (dest_folder , fn ) for fn in files }
125
132
return ret , new_reference , rev_time
126
133
127
134
def get_path (self , conan_reference , package_id , path ):
128
135
129
136
if not package_id :
130
- url = self ._recipe_url (conan_reference )
137
+ url = self .conans_router . recipe_snapshot (conan_reference )
131
138
else :
132
139
package_ref = PackageReference (conan_reference , package_id )
133
- url = self ._package_url (package_ref )
140
+ url = self .conans_router . package_snapshot (package_ref )
134
141
135
142
try :
136
143
files = self ._get_file_list_json (url )
@@ -159,28 +166,34 @@ def is_dir(the_path):
159
166
ret .append (tmp )
160
167
return sorted (ret )
161
168
else :
162
- url += "/%s" % path
169
+ if not package_id :
170
+ url = self .conans_router .recipe_file (conan_reference , path )
171
+ else :
172
+ package_ref = PackageReference (conan_reference , package_id )
173
+ url = self .conans_router .package_file (package_ref , path )
174
+
163
175
content = self ._get_remote_file_contents (url )
164
176
return decode_text (content )
165
177
166
178
def _upload_recipe (self , conan_reference , files_to_upload , retry , retry_wait ):
167
179
# Direct upload the recipe
168
- url = self ._recipe_url (conan_reference )
169
- self ._upload_files (files_to_upload , url , retry , retry_wait )
180
+ urls = { fn : self .conans_router . recipe_file (conan_reference , fn ) for fn in files_to_upload }
181
+ self ._upload_files (files_to_upload , urls , retry , retry_wait )
170
182
171
183
def _upload_package (self , package_reference , files_to_upload , retry , retry_wait ):
172
- url = self ._package_url (package_reference )
173
- self ._upload_files (files_to_upload , url , retry , retry_wait )
184
+ urls = {fn : self .conans_router .package_file (package_reference , fn )
185
+ for fn in files_to_upload }
186
+ self ._upload_files (files_to_upload , urls , retry , retry_wait )
174
187
175
- def _upload_files (self , files , base_url , retry , retry_wait ):
188
+ def _upload_files (self , files , urls , retry , retry_wait ):
176
189
t1 = time .time ()
177
190
failed = []
178
191
uploader = Uploader (self .requester , self ._output , self .verify_ssl )
179
192
# Take advantage of filenames ordering, so that conan_package.tgz and conan_export.tgz
180
193
# can be < conanfile, conaninfo, and sent always the last, so smaller files go first
181
194
for filename in sorted (files , reverse = True ):
182
195
self ._output .rewrite_line ("Uploading %s" % filename )
183
- resource_url = "%s/%s" % ( base_url , filename )
196
+ resource_url = urls [ filename ]
184
197
try :
185
198
response = uploader .upload (resource_url , files [filename ], auth = self .auth ,
186
199
dedup = self ._checksum_deploy , retry = retry ,
@@ -203,37 +216,17 @@ def _upload_files(self, files, base_url, retry, retry_wait):
203
216
else :
204
217
logger .debug ("\n All uploaded! Total time: %s\n " % str (time .time () - t1 ))
205
218
206
- def _download_and_save_files (self , base_url , dest_folder , files ):
219
+ def _download_and_save_files (self , urls , dest_folder , files ):
207
220
downloader = Downloader (self .requester , self ._output , self .verify_ssl )
208
221
# Take advantage of filenames ordering, so that conan_package.tgz and conan_export.tgz
209
222
# can be < conanfile, conaninfo, and sent always the last, so smaller files go first
210
223
for filename in sorted (files , reverse = True ):
211
224
if self ._output :
212
225
self ._output .writeln ("Downloading %s" % filename )
213
- resource_url = "%s/%s" % ( base_url , filename )
226
+ resource_url = urls [ filename ]
214
227
abs_path = os .path .join (dest_folder , filename )
215
228
downloader .download (resource_url , abs_path , auth = self .auth )
216
229
217
- def _recipe_url (self , conan_reference ):
218
-
219
- url = "%s/conans/%s" % (self .remote_api_url , conan_reference .dir_repr ())
220
-
221
- if conan_reference .revision :
222
- url += "/revisions/%s" % conan_reference .revision
223
- return url
224
-
225
- def _package_url (self , p_reference ):
226
- if not p_reference .conan .revision and p_reference .revision :
227
- raise ConanException ("It is needed to specify the recipe revision if you "
228
- "specify a package revision" )
229
-
230
- url = self ._recipe_url (p_reference .conan )
231
- url += "/packages/%s" % p_reference .package_id
232
- if p_reference .revision :
233
- assert (p_reference .revision is not None )
234
- url += "/revisions/%s" % p_reference .revision
235
- return url
236
-
237
230
def _remove_conanfile_files (self , conan_reference , files ):
238
231
# V2 === revisions, do not remove files, it will create a new revision if the files changed
239
232
return
@@ -242,12 +235,12 @@ def remove_packages(self, conan_reference, package_ids=None):
242
235
""" Remove any packages specified by package_ids"""
243
236
self .check_credentials ()
244
237
if not package_ids :
245
- url = self ._recipe_url (conan_reference ) + "/packages"
238
+ url = self .conans_router . remove_all_packages (conan_reference )
246
239
self .requester .delete (url , auth = self .auth , headers = self .custom_headers ,
247
240
verify = self .verify_ssl )
248
241
return
249
242
for pid in package_ids :
250
243
pref = PackageReference (conan_reference , pid )
251
- url = self ._package_url (pref )
244
+ url = self .conans_router . remove_package (pref )
252
245
self .requester .delete (url , auth = self .auth , headers = self .custom_headers ,
253
246
verify = self .verify_ssl )
0 commit comments