cleepcli 1.43.8__tar.gz → 1.43.10__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cleepcli-1.43.8/cleepcli.egg-info → cleepcli-1.43.10}/PKG-INFO +1 -1
- {cleepcli-1.43.8 → cleepcli-1.43.10}/bin/ccli +16 -2
- {cleepcli-1.43.8 → cleepcli-1.43.10}/bin/cleep-cli +16 -2
- {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/package.py +96 -24
- {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/test.py +4 -1
- {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/version.py +1 -1
- {cleepcli-1.43.8 → cleepcli-1.43.10/cleepcli.egg-info}/PKG-INFO +1 -1
- {cleepcli-1.43.8 → cleepcli-1.43.10}/LICENSE +0 -0
- {cleepcli-1.43.8 → cleepcli-1.43.10}/MANIFEST.in +0 -0
- {cleepcli-1.43.8 → cleepcli-1.43.10}/README.md +0 -0
- {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/__init__.py +0 -0
- {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/check.py +0 -0
- {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/ci.py +0 -0
- {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/cleepapi.py +0 -0
- {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/config.py +0 -0
- {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/console.py +0 -0
- {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/docs.py +0 -0
- {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/file.py +0 -0
- {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/git.py +0 -0
- {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/module.py +0 -0
- {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/tools.py +0 -0
- {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/watch.py +0 -0
- {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli.egg-info/SOURCES.txt +0 -0
- {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli.egg-info/dependency_links.txt +0 -0
- {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli.egg-info/requires.txt +0 -0
- {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli.egg-info/top_level.txt +0 -0
- {cleepcli-1.43.8 → cleepcli-1.43.10}/pyproject.toml +0 -0
- {cleepcli-1.43.8 → cleepcli-1.43.10}/requirements.txt +0 -0
- {cleepcli-1.43.8 → cleepcli-1.43.10}/setup.cfg +0 -0
- {cleepcli-1.43.8 → cleepcli-1.43.10}/setup.py +0 -0
|
@@ -463,12 +463,26 @@ def corebuild():
|
|
|
463
463
|
@click.option('--version', required=True, help='Version to publish.')
|
|
464
464
|
@click.option('--prerelease', is_flag=True, default=False, help='Pre-release flag')
|
|
465
465
|
@click.option('--tag', required=True, help='Release git tag.')
|
|
466
|
-
|
|
466
|
+
@click.option(
|
|
467
|
+
'--force',
|
|
468
|
+
is_flag=True,
|
|
469
|
+
default=False,
|
|
470
|
+
help='If release already exists, replace .deb/.sha256 assets (keep git tag).',
|
|
471
|
+
)
|
|
472
|
+
@click.option(
|
|
473
|
+
'--skip-existing',
|
|
474
|
+
is_flag=True,
|
|
475
|
+
default=False,
|
|
476
|
+
help='If release already exists, exit 0 without uploading.',
|
|
477
|
+
)
|
|
478
|
+
def corepublish(version, prerelease, tag, force, skip_existing):
|
|
467
479
|
"""
|
|
468
480
|
Publish built Cleep debian package
|
|
469
481
|
"""
|
|
470
482
|
p = Package()
|
|
471
|
-
res = p.publish_cleep(
|
|
483
|
+
res = p.publish_cleep(
|
|
484
|
+
version, prerelease, tag, force=force, skip_existing=skip_existing
|
|
485
|
+
)
|
|
472
486
|
|
|
473
487
|
if not res:
|
|
474
488
|
sys.exit(1)
|
|
@@ -463,12 +463,26 @@ def corebuild():
|
|
|
463
463
|
@click.option('--version', required=True, help='Version to publish.')
|
|
464
464
|
@click.option('--prerelease', is_flag=True, default=False, help='Pre-release flag')
|
|
465
465
|
@click.option('--tag', required=True, help='Release git tag.')
|
|
466
|
-
|
|
466
|
+
@click.option(
|
|
467
|
+
'--force',
|
|
468
|
+
is_flag=True,
|
|
469
|
+
default=False,
|
|
470
|
+
help='If release already exists, replace .deb/.sha256 assets (keep git tag).',
|
|
471
|
+
)
|
|
472
|
+
@click.option(
|
|
473
|
+
'--skip-existing',
|
|
474
|
+
is_flag=True,
|
|
475
|
+
default=False,
|
|
476
|
+
help='If release already exists, exit 0 without uploading.',
|
|
477
|
+
)
|
|
478
|
+
def corepublish(version, prerelease, tag, force, skip_existing):
|
|
467
479
|
"""
|
|
468
480
|
Publish built Cleep debian package
|
|
469
481
|
"""
|
|
470
482
|
p = Package()
|
|
471
|
-
res = p.publish_cleep(
|
|
483
|
+
res = p.publish_cleep(
|
|
484
|
+
version, prerelease, tag, force=force, skip_existing=skip_existing
|
|
485
|
+
)
|
|
472
486
|
|
|
473
487
|
if not res:
|
|
474
488
|
sys.exit(1)
|
|
@@ -250,7 +250,9 @@ sha256sum $DEB > $SHA256
|
|
|
250
250
|
self.logger.exception('Error deleting tag "%s"' % tag_name)
|
|
251
251
|
return False
|
|
252
252
|
|
|
253
|
-
def publish_cleep(
|
|
253
|
+
def publish_cleep(
|
|
254
|
+
self, version, prerelease, tag, force=False, skip_existing=False
|
|
255
|
+
):
|
|
254
256
|
"""
|
|
255
257
|
Publish cleep version on github
|
|
256
258
|
|
|
@@ -258,9 +260,17 @@ sha256sum $DEB > $SHA256
|
|
|
258
260
|
version (str): cleep version
|
|
259
261
|
prerelease (bool): True to publish pre-release version
|
|
260
262
|
tag (str): associated git tag
|
|
263
|
+
force (bool): If release already exists, replace .deb/.sha256 assets
|
|
264
|
+
without deleting the git tag (safe for CI replay)
|
|
265
|
+
skip_existing (bool): If release already exists, exit successfully
|
|
266
|
+
without uploading (mutually exclusive intent with force —
|
|
267
|
+
force wins if both are set)
|
|
261
268
|
"""
|
|
262
269
|
label = "pre-release" if prerelease else "release"
|
|
263
|
-
token = os.environ
|
|
270
|
+
token = os.environ.get("GITHUB_TOKEN") or os.environ.get("GITHUB_ACCESS_TOKEN")
|
|
271
|
+
if not token:
|
|
272
|
+
self.logger.error("GITHUB_TOKEN is not set")
|
|
273
|
+
return False
|
|
264
274
|
github = Github(token)
|
|
265
275
|
repo = github.get_repo("%s/%s" % (config.GITHUB_ORG, config.GITHUB_REPO))
|
|
266
276
|
|
|
@@ -274,12 +284,18 @@ sha256sum $DEB > $SHA256
|
|
|
274
284
|
changes = os.path.abspath(
|
|
275
285
|
os.path.join(config.REPO_DIR, "..", "cleep_%s_armhf.changes" % version)
|
|
276
286
|
)
|
|
287
|
+
missing = False
|
|
277
288
|
if not os.path.exists(archive):
|
|
278
289
|
self.logger.error('Archive file "%s" does not exist' % archive)
|
|
290
|
+
missing = True
|
|
279
291
|
if not os.path.exists(sha256):
|
|
280
292
|
self.logger.error('Checksum file "%s" does not exist' % sha256)
|
|
293
|
+
missing = True
|
|
281
294
|
if not os.path.exists(changes):
|
|
282
295
|
self.logger.error('Changes file "%s" does not exist' % changes)
|
|
296
|
+
missing = True
|
|
297
|
+
if missing:
|
|
298
|
+
return False
|
|
283
299
|
|
|
284
300
|
# get changelog
|
|
285
301
|
cmd = (
|
|
@@ -294,7 +310,7 @@ sha256sum $DEB > $SHA256
|
|
|
294
310
|
changelog = "\n".join([line.strip() for line in result["stdout"]])
|
|
295
311
|
self.logger.debug("Changelog:\n%s" % changelog)
|
|
296
312
|
|
|
297
|
-
# search existing release
|
|
313
|
+
# search existing release (by title = version name)
|
|
298
314
|
release_found = None
|
|
299
315
|
releases = repo.get_releases()
|
|
300
316
|
for release in releases:
|
|
@@ -304,27 +320,50 @@ sha256sum $DEB > $SHA256
|
|
|
304
320
|
release_found = release
|
|
305
321
|
break
|
|
306
322
|
|
|
307
|
-
if release_found
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
323
|
+
if release_found:
|
|
324
|
+
if skip_existing and not force:
|
|
325
|
+
self.logger.info(
|
|
326
|
+
'Release "%s" already exists — skip (--skip-existing)',
|
|
327
|
+
version,
|
|
328
|
+
)
|
|
329
|
+
return True
|
|
330
|
+
|
|
331
|
+
if force:
|
|
332
|
+
return self.__replace_release_assets(
|
|
333
|
+
release_found,
|
|
334
|
+
version,
|
|
335
|
+
changelog,
|
|
336
|
+
prerelease,
|
|
337
|
+
archive,
|
|
338
|
+
sha256,
|
|
339
|
+
)
|
|
319
340
|
|
|
320
|
-
|
|
321
|
-
|
|
341
|
+
if release_found.prerelease or release_found.draft:
|
|
342
|
+
# Legacy RC path: delete release + tag, then recreate.
|
|
343
|
+
# Prefer --force to replace assets without touching the tag.
|
|
344
|
+
self.logger.info(
|
|
345
|
+
'Deleting existing %s "%s"...', label, release_found.tag_name
|
|
346
|
+
)
|
|
347
|
+
try:
|
|
348
|
+
release_found.delete_release()
|
|
349
|
+
except Exception:
|
|
350
|
+
self.logger.exception("Error deleting existing %s:", label)
|
|
351
|
+
return False
|
|
352
|
+
|
|
353
|
+
if not self.__delete_github_tag(release_found.tag_name, token):
|
|
354
|
+
return False
|
|
355
|
+
release_found = None
|
|
356
|
+
else:
|
|
357
|
+
self.logger.error(
|
|
358
|
+
'Release "%s" already exists — use --force to replace '
|
|
359
|
+
"assets or --skip-existing to no-op",
|
|
360
|
+
version,
|
|
361
|
+
)
|
|
322
362
|
return False
|
|
323
363
|
|
|
324
364
|
# create release
|
|
325
365
|
self.logger.info('Creating new %s "%s"...', label, version)
|
|
326
366
|
try:
|
|
327
|
-
commits = repo.get_commits()
|
|
328
367
|
release_found = repo.create_git_release(
|
|
329
368
|
tag=tag,
|
|
330
369
|
name=version,
|
|
@@ -332,20 +371,53 @@ sha256sum $DEB > $SHA256
|
|
|
332
371
|
draft=False,
|
|
333
372
|
prerelease=prerelease,
|
|
334
373
|
)
|
|
335
|
-
except:
|
|
374
|
+
except Exception:
|
|
336
375
|
self.logger.exception("Error occured creating new %s:", label)
|
|
337
376
|
return False
|
|
338
377
|
|
|
339
|
-
|
|
378
|
+
return self.__upload_release_assets(release_found, archive, sha256)
|
|
379
|
+
|
|
380
|
+
def __replace_release_assets(
|
|
381
|
+
self, release, version, changelog, prerelease, archive, sha256
|
|
382
|
+
):
|
|
383
|
+
"""Update existing release metadata and replace .deb / .sha256 assets."""
|
|
384
|
+
self.logger.info(
|
|
385
|
+
'Replacing assets on existing release "%s" (tag=%s)...',
|
|
386
|
+
version,
|
|
387
|
+
release.tag_name,
|
|
388
|
+
)
|
|
389
|
+
try:
|
|
390
|
+
release.update_release(
|
|
391
|
+
name=version,
|
|
392
|
+
message=changelog,
|
|
393
|
+
draft=False,
|
|
394
|
+
prerelease=prerelease,
|
|
395
|
+
)
|
|
396
|
+
except Exception:
|
|
397
|
+
self.logger.exception("Error updating release metadata:")
|
|
398
|
+
return False
|
|
399
|
+
|
|
400
|
+
wanted = {os.path.basename(archive), os.path.basename(sha256)}
|
|
401
|
+
try:
|
|
402
|
+
for asset in release.get_assets():
|
|
403
|
+
if asset.name in wanted:
|
|
404
|
+
self.logger.info('Deleting existing asset "%s"...', asset.name)
|
|
405
|
+
asset.delete_asset()
|
|
406
|
+
except Exception:
|
|
407
|
+
self.logger.exception("Error deleting existing assets:")
|
|
408
|
+
return False
|
|
409
|
+
|
|
410
|
+
return self.__upload_release_assets(release, archive, sha256)
|
|
411
|
+
|
|
412
|
+
def __upload_release_assets(self, release, archive, sha256):
|
|
340
413
|
try:
|
|
341
414
|
self.logger.info('Uploading asset "%s"...' % archive)
|
|
342
|
-
|
|
415
|
+
release.upload_asset(archive)
|
|
343
416
|
self.logger.info('Uploading asset "%s"...' % sha256)
|
|
344
|
-
|
|
345
|
-
except:
|
|
417
|
+
release.upload_asset(sha256)
|
|
418
|
+
except Exception:
|
|
346
419
|
self.logger.exception("Error uploading assets:")
|
|
347
420
|
return False
|
|
348
|
-
|
|
349
421
|
return True
|
|
350
422
|
|
|
351
423
|
# TODO code for draft release removed for problem downloading draft assets
|
|
@@ -224,6 +224,9 @@ cd "%(path)s"
|
|
|
224
224
|
|
|
225
225
|
# copy coverage file to standart location (in module tests directory) for coverage report tools
|
|
226
226
|
if copy_to:
|
|
227
|
+
if not os.path.isfile(coverage_file_path):
|
|
228
|
+
self.logger.error('Coverage file missing: %s' % coverage_file_path)
|
|
229
|
+
return False
|
|
227
230
|
shutil.copyfile(coverage_file_path, os.path.join(copy_to, '.coverage'))
|
|
228
231
|
|
|
229
232
|
self.logger.debug('Return code: %s' % self.__endless_command_return_code)
|
|
@@ -238,7 +241,7 @@ cd "%(path)s"
|
|
|
238
241
|
"""
|
|
239
242
|
return """
|
|
240
243
|
cd "%s"
|
|
241
|
-
COVERAGE_FILE=%s coverage run --omit="*/lib/python*/*","test_*" --source="../backend" --concurrency=
|
|
244
|
+
COVERAGE_FILE=%s coverage run --omit="*/lib/python*/*","test_*" --source="../backend" --concurrency=thread -m unittest discover
|
|
242
245
|
""" % (module_tests_path, coverage_file_path)
|
|
243
246
|
|
|
244
247
|
def __get_tests_cmd_with_pattern(self, module_tests_path, pattern):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|