@@ -200,32 +200,42 @@ def _find_or_create_user_id():
200
200
{"user_id": "16fd2706-8baf-433b-82eb-8c7fada847da"}
201
201
IDs are generated randomly with UUID4.
202
202
"""
203
+ config_file = Path (
204
+ user_config_dir (os .path .join ("iterative" , "telemetry" ), False )
205
+ )
206
+ config_file .parent .mkdir (mode = 0o755 , parents = True , exist_ok = True )
207
+ lockfile = str (config_file .with_suffix (".lock" ))
203
208
# DVC backwards-compatibility
204
- old = Path (user_config_dir (str (Path ("dvc" ) / "user_id" ), "iterative" ))
205
- # cross-product path
206
- new = Path (user_config_dir (str (Path ("iterative" ) / "telemetry" ), False ))
207
- new .parent .mkdir (mode = 0o755 , parents = True , exist_ok = True )
208
- lockfile = str (new .with_suffix (".lock" ))
209
+ config_file_old = Path (
210
+ user_config_dir (os .path .join ("dvc" , "user_id" ), "iterative" )
211
+ )
212
+ lockfile_old = str (config_file_old .with_suffix (".lock" ))
209
213
210
214
try :
211
215
with FileLock ( # pylint: disable=abstract-class-instantiated
212
216
lockfile , timeout = 5
213
217
):
214
- uid = generate_id ()
215
- if new .exists ():
216
- uid = json .load (new .open (encoding = "utf8" ))["user_id" ]
217
- else :
218
- if old .exists ():
219
- uid = json .load (old .open (encoding = "utf8" ))["user_id" ]
220
- json .dump ({"user_id" : uid }, new .open ("w" , encoding = "utf8" ))
221
-
222
- # only for non-DVC packages,
223
- # write legacy file in case legacy DVC is installed later
224
- if not old .exists () and uid .lower () != DO_NOT_TRACK_VALUE .lower ():
225
- json .dump ({"user_id" : uid }, old .open ("w" , encoding = "utf8" ))
226
-
227
- if uid .lower () != DO_NOT_TRACK_VALUE .lower ():
228
- return uid
218
+ user_id = read_user_id (config_file )
219
+ if user_id is None :
220
+ if config_file_old .parent .is_dir ():
221
+ with FileLock (lockfile_old , timeout = 5 ):
222
+ user_id = read_user_id (config_file_old )
223
+ if user_id is None :
224
+ user_id = generate_id ()
225
+ with config_file .open (mode = "w" , encoding = "utf8" ) as fd :
226
+ json .dump ({"user_id" : user_id }, fd )
227
+
228
+ if user_id .lower () != DO_NOT_TRACK_VALUE .lower ():
229
+ return user_id
229
230
except Timeout :
230
231
logger .debug ("Failed to acquire %s" , lockfile )
231
232
return None
233
+
234
+
235
+ def read_user_id (config_file : Path ):
236
+ try :
237
+ with config_file .open (encoding = "utf8" ) as fd :
238
+ return json .load (fd )["user_id" ]
239
+ except (FileNotFoundError , ValueError , KeyError ):
240
+ pass
241
+ return None
0 commit comments