Remove tag system, use versions only for artifact references
Tags were mutable aliases that caused confusion alongside the immutable version system. This removes tags entirely, keeping only PackageVersion for artifact references. Changes: - Remove tags and tag_history tables (migration 012) - Remove Tag model, TagRepository, and 6 tag API endpoints - Update cache system to create versions instead of tags - Update frontend to display versions instead of tags - Remove tag-related schemas and types - Update artifact cleanup service for version-based ref_count
This commit is contained in:
@@ -28,7 +28,6 @@ from .models import (
|
||||
Project,
|
||||
Package,
|
||||
Artifact,
|
||||
Tag,
|
||||
ArtifactDependency,
|
||||
PackageVersion,
|
||||
)
|
||||
@@ -153,26 +152,20 @@ def parse_ensure_file(content: bytes) -> EnsureFileContent:
|
||||
project = dep.get('project')
|
||||
package = dep.get('package')
|
||||
version = dep.get('version')
|
||||
tag = dep.get('tag')
|
||||
|
||||
if not project:
|
||||
raise InvalidEnsureFileError(f"Dependency {i} missing 'project'")
|
||||
if not package:
|
||||
raise InvalidEnsureFileError(f"Dependency {i} missing 'package'")
|
||||
if not version and not tag:
|
||||
if not version:
|
||||
raise InvalidEnsureFileError(
|
||||
f"Dependency {i} must have either 'version' or 'tag'"
|
||||
)
|
||||
if version and tag:
|
||||
raise InvalidEnsureFileError(
|
||||
f"Dependency {i} cannot have both 'version' and 'tag'"
|
||||
f"Dependency {i} must have 'version'"
|
||||
)
|
||||
|
||||
dependencies.append(EnsureFileDependency(
|
||||
project=project,
|
||||
package=package,
|
||||
version=version,
|
||||
tag=tag,
|
||||
))
|
||||
|
||||
return EnsureFileContent(dependencies=dependencies)
|
||||
@@ -226,7 +219,6 @@ def store_dependencies(
|
||||
dependency_project=dep.project,
|
||||
dependency_package=dep.package,
|
||||
version_constraint=dep.version,
|
||||
tag_constraint=dep.tag,
|
||||
)
|
||||
db.add(artifact_dep)
|
||||
created.append(artifact_dep)
|
||||
@@ -292,26 +284,21 @@ def get_reverse_dependencies(
|
||||
if not artifact:
|
||||
continue
|
||||
|
||||
# Find which package this artifact belongs to via tags or versions
|
||||
tag = db.query(Tag).filter(Tag.artifact_id == dep.artifact_id).first()
|
||||
if tag:
|
||||
pkg = db.query(Package).filter(Package.id == tag.package_id).first()
|
||||
# Find which package this artifact belongs to via versions
|
||||
version_record = db.query(PackageVersion).filter(
|
||||
PackageVersion.artifact_id == dep.artifact_id,
|
||||
).first()
|
||||
if version_record:
|
||||
pkg = db.query(Package).filter(Package.id == version_record.package_id).first()
|
||||
if pkg:
|
||||
proj = db.query(Project).filter(Project.id == pkg.project_id).first()
|
||||
if proj:
|
||||
# Get version if available
|
||||
version_record = db.query(PackageVersion).filter(
|
||||
PackageVersion.artifact_id == dep.artifact_id,
|
||||
PackageVersion.package_id == pkg.id,
|
||||
).first()
|
||||
|
||||
dependents.append(DependentInfo(
|
||||
artifact_id=dep.artifact_id,
|
||||
project=proj.name,
|
||||
package=pkg.name,
|
||||
version=version_record.version if version_record else None,
|
||||
constraint_type="version" if dep.version_constraint else "tag",
|
||||
constraint_value=dep.version_constraint or dep.tag_constraint,
|
||||
version=version_record.version,
|
||||
constraint_value=dep.version_constraint,
|
||||
))
|
||||
|
||||
total_pages = (total + limit - 1) // limit
|
||||
@@ -423,8 +410,7 @@ def _resolve_dependency_to_artifact(
|
||||
db: Session,
|
||||
project_name: str,
|
||||
package_name: str,
|
||||
version: Optional[str],
|
||||
tag: Optional[str],
|
||||
version: str,
|
||||
) -> Optional[Tuple[str, str, int]]:
|
||||
"""
|
||||
Resolve a dependency constraint to an artifact ID.
|
||||
@@ -432,7 +418,6 @@ def _resolve_dependency_to_artifact(
|
||||
Supports:
|
||||
- Exact version matching (e.g., '1.2.3')
|
||||
- Version constraints (e.g., '>=1.9', '<2.0,>=1.5')
|
||||
- Tag matching
|
||||
- Wildcard ('*' for any version)
|
||||
|
||||
Args:
|
||||
@@ -440,10 +425,9 @@ def _resolve_dependency_to_artifact(
|
||||
project_name: Project name
|
||||
package_name: Package name
|
||||
version: Version or version constraint
|
||||
tag: Tag constraint
|
||||
|
||||
Returns:
|
||||
Tuple of (artifact_id, resolved_version_or_tag, size) or None if not found
|
||||
Tuple of (artifact_id, resolved_version, size) or None if not found
|
||||
"""
|
||||
# Get project and package
|
||||
project = db.query(Project).filter(Project.name == project_name).first()
|
||||
@@ -457,50 +441,24 @@ def _resolve_dependency_to_artifact(
|
||||
if not package:
|
||||
return None
|
||||
|
||||
if version:
|
||||
# Check if this is a version constraint (>=, <, etc.) or exact version
|
||||
if _is_version_constraint(version):
|
||||
result = _resolve_version_constraint(db, package, version)
|
||||
if result:
|
||||
return result
|
||||
else:
|
||||
# Look up by exact version
|
||||
pkg_version = db.query(PackageVersion).filter(
|
||||
PackageVersion.package_id == package.id,
|
||||
PackageVersion.version == version,
|
||||
).first()
|
||||
if pkg_version:
|
||||
artifact = db.query(Artifact).filter(
|
||||
Artifact.id == pkg_version.artifact_id
|
||||
).first()
|
||||
if artifact:
|
||||
return (artifact.id, version, artifact.size)
|
||||
|
||||
# Also check if there's a tag with this exact name
|
||||
tag_record = db.query(Tag).filter(
|
||||
Tag.package_id == package.id,
|
||||
Tag.name == version,
|
||||
# Check if this is a version constraint (>=, <, etc.) or exact version
|
||||
if _is_version_constraint(version):
|
||||
result = _resolve_version_constraint(db, package, version)
|
||||
if result:
|
||||
return result
|
||||
else:
|
||||
# Look up by exact version
|
||||
pkg_version = db.query(PackageVersion).filter(
|
||||
PackageVersion.package_id == package.id,
|
||||
PackageVersion.version == version,
|
||||
).first()
|
||||
if tag_record:
|
||||
if pkg_version:
|
||||
artifact = db.query(Artifact).filter(
|
||||
Artifact.id == tag_record.artifact_id
|
||||
Artifact.id == pkg_version.artifact_id
|
||||
).first()
|
||||
if artifact:
|
||||
return (artifact.id, version, artifact.size)
|
||||
|
||||
if tag:
|
||||
# Look up by tag
|
||||
tag_record = db.query(Tag).filter(
|
||||
Tag.package_id == package.id,
|
||||
Tag.name == tag,
|
||||
).first()
|
||||
if tag_record:
|
||||
artifact = db.query(Artifact).filter(
|
||||
Artifact.id == tag_record.artifact_id
|
||||
).first()
|
||||
if artifact:
|
||||
return (artifact.id, tag, artifact.size)
|
||||
|
||||
return None
|
||||
|
||||
|
||||
@@ -560,9 +518,9 @@ def _detect_package_cycle(
|
||||
Package.name == package_name,
|
||||
).first()
|
||||
if package:
|
||||
# Find all artifacts in this package via tags
|
||||
tags = db.query(Tag).filter(Tag.package_id == package.id).all()
|
||||
artifact_ids = {t.artifact_id for t in tags}
|
||||
# Find all artifacts in this package via versions
|
||||
versions = db.query(PackageVersion).filter(PackageVersion.package_id == package.id).all()
|
||||
artifact_ids = {v.artifact_id for v in versions}
|
||||
|
||||
# Get dependencies from all artifacts in this package
|
||||
for artifact_id in artifact_ids:
|
||||
@@ -605,8 +563,8 @@ def check_circular_dependencies(
|
||||
db: Database session
|
||||
artifact_id: The artifact that will have these dependencies
|
||||
new_dependencies: Dependencies to be added
|
||||
project_name: Project name (optional, will try to look up from tag if not provided)
|
||||
package_name: Package name (optional, will try to look up from tag if not provided)
|
||||
project_name: Project name (optional, will try to look up from version if not provided)
|
||||
package_name: Package name (optional, will try to look up from version if not provided)
|
||||
|
||||
Returns:
|
||||
Cycle path if detected, None otherwise
|
||||
@@ -615,17 +573,19 @@ def check_circular_dependencies(
|
||||
if project_name and package_name:
|
||||
current_path = f"{project_name}/{package_name}"
|
||||
else:
|
||||
# Try to look up from tag
|
||||
# Try to look up from version
|
||||
artifact = db.query(Artifact).filter(Artifact.id == artifact_id).first()
|
||||
if not artifact:
|
||||
return None
|
||||
|
||||
# Find package for this artifact
|
||||
tag = db.query(Tag).filter(Tag.artifact_id == artifact_id).first()
|
||||
if not tag:
|
||||
# Find package for this artifact via version
|
||||
version_record = db.query(PackageVersion).filter(
|
||||
PackageVersion.artifact_id == artifact_id
|
||||
).first()
|
||||
if not version_record:
|
||||
return None
|
||||
|
||||
package = db.query(Package).filter(Package.id == tag.package_id).first()
|
||||
package = db.query(Package).filter(Package.id == version_record.package_id).first()
|
||||
if not package:
|
||||
return None
|
||||
|
||||
@@ -682,7 +642,7 @@ def resolve_dependencies(
|
||||
db: Database session
|
||||
project_name: Project name
|
||||
package_name: Package name
|
||||
ref: Tag or version reference
|
||||
ref: Version reference (or artifact:hash)
|
||||
base_url: Base URL for download URLs
|
||||
|
||||
Returns:
|
||||
@@ -715,7 +675,7 @@ def resolve_dependencies(
|
||||
root_version = artifact_id[:12] # Use short hash as version display
|
||||
root_size = artifact.size
|
||||
else:
|
||||
# Try to find artifact by tag or version
|
||||
# Try to find artifact by version
|
||||
resolved = _resolve_dependency_to_artifact(
|
||||
db, project_name, package_name, ref, ref
|
||||
)
|
||||
@@ -820,12 +780,11 @@ def resolve_dependencies(
|
||||
dep.dependency_project,
|
||||
dep.dependency_package,
|
||||
dep.version_constraint,
|
||||
dep.tag_constraint,
|
||||
)
|
||||
|
||||
if not resolved_dep:
|
||||
# Dependency not cached on server - track as missing but continue
|
||||
constraint = dep.version_constraint or dep.tag_constraint
|
||||
constraint = dep.version_constraint
|
||||
missing_dependencies.append(MissingDependency(
|
||||
project=dep.dependency_project,
|
||||
package=dep.dependency_package,
|
||||
|
||||
Reference in New Issue
Block a user