Skip to content

Commit 19e17f0

Browse files
committed
Allow to remove main branch
1 parent da4db9f commit 19e17f0

File tree

2 files changed

+9
-13
lines changed

2 files changed

+9
-13
lines changed

pyiceberg/table/update/__init__.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -459,8 +459,6 @@ def _(update: SetSnapshotRefUpdate, base_metadata: TableMetadata, context: _Tabl
459459
@_apply_table_update.register(RemoveSnapshotsUpdate)
460460
def _(update: RemoveSnapshotsUpdate, base_metadata: TableMetadata, context: _TableMetadataUpdateContext) -> TableMetadata:
461461
for remove_snapshot_id in update.snapshot_ids:
462-
if remove_snapshot_id == base_metadata.current_snapshot_id:
463-
raise ValueError(f"Can't remove current snapshot id {remove_snapshot_id}")
464462
if not any(s.snapshot_id == remove_snapshot_id for s in base_metadata.snapshots):
465463
raise ValueError(f"Snapshot with snapshot id {remove_snapshot_id} does not exist: {base_metadata.snapshots}")
466464

@@ -502,13 +500,11 @@ def _(update: RemoveSnapshotRefUpdate, base_metadata: TableMetadata, context: _T
502500
if base_metadata.snapshot_by_id(existing_ref.snapshot_id) is None:
503501
raise ValueError(f"Cannot remove {update.ref_name} ref with unknown snapshot {existing_ref.snapshot_id}")
504502

505-
if update.ref_name == MAIN_BRANCH:
506-
raise ValueError("Cannot remove main branch")
503+
current_snapshot_id = None if update.ref_name == MAIN_BRANCH else base_metadata.current_snapshot_id
507504

508-
metadata_refs = {**base_metadata.refs}
509-
metadata_refs.pop(update.ref_name, None)
505+
metadata_refs = {ref_name: ref for ref_name, ref in base_metadata.refs.items() if ref_name != update.ref_name}
510506
context.add_update(update)
511-
return base_metadata.model_copy(update={"refs": metadata_refs})
507+
return base_metadata.model_copy(update={"refs": metadata_refs, "current_snapshot_id": current_snapshot_id})
512508

513509

514510
@_apply_table_update.register(AddSortOrderUpdate)

tests/table/test_init.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -822,12 +822,12 @@ def test_update_remove_snapshots_doesnt_exist(table_v2: Table) -> None:
822822
update_table_metadata(table_v2.metadata, (update,))
823823

824824

825-
def test_update_remove_snapshots_cant_remove_current_snapshot_id(table_v2: Table) -> None:
826-
update = RemoveSnapshotsUpdate(
827-
snapshot_ids=[3055729675574597004],
828-
)
829-
with pytest.raises(ValueError, match="Can't remove current snapshot id 3055729675574597004"):
830-
update_table_metadata(table_v2.metadata, (update,))
825+
def test_update_remove_snapshots_remove_current_snapshot_id(table_v2: Table) -> None:
826+
update = RemoveSnapshotsUpdate(snapshot_ids=[3055729675574597004])
827+
new_metadata = update_table_metadata(table_v2.metadata, (update,))
828+
assert len(new_metadata.refs) == 1
829+
assert new_metadata.refs["test"].snapshot_id == 3051729675574597004
830+
assert new_metadata.current_snapshot_id is None
831831

832832

833833
def test_update_metadata_add_update_sort_order(table_v2: Table) -> None:

0 commit comments

Comments
 (0)