@@ -435,6 +435,24 @@ def _set_ref_snapshot(
435435
436436 return updates , requirements
437437
438+ def _remove_ref_snapshot (self , ref_name : str ) -> UpdatesAndRequirements :
439+ """Remove a snapshot ref.
440+
441+ Args:
442+ ref_name: branch / tag name to remove
443+
444+ Returns
445+ The updates and requirements for the remove-snapshot-ref.
446+ """
447+ updates = (RemoveSnapshotRefUpdate (ref_name = ref_name ),)
448+ requirements = (
449+ AssertRefSnapshotId (
450+ snapshot_id = self .table_metadata .refs [ref_name ].snapshot_id if ref_name in self .table_metadata .refs else None ,
451+ ref = ref_name ,
452+ ),
453+ )
454+ return updates , requirements
455+
438456 def update_schema (self , allow_incompatible_changes : bool = False , case_sensitive : bool = True ) -> UpdateSchema :
439457 """Create a new UpdateSchema to alter the columns of this table.
440458
@@ -1023,6 +1041,23 @@ def _(update: SetSnapshotRefUpdate, base_metadata: TableMetadata, context: _Tabl
10231041 return base_metadata .model_copy (update = metadata_updates )
10241042
10251043
1044+ @_apply_table_update .register (RemoveSnapshotRefUpdate )
1045+ def _ (update : RemoveSnapshotRefUpdate , base_metadata : TableMetadata , context : _TableMetadataUpdateContext ) -> TableMetadata :
1046+ if (existing_ref := base_metadata .refs .get (update .ref_name )) is None :
1047+ return base_metadata
1048+
1049+ if base_metadata .snapshot_by_id (existing_ref .snapshot_id ) is None :
1050+ raise ValueError (f"Cannot remove { update .ref_name } ref with unknown snapshot { existing_ref .snapshot_id } " )
1051+
1052+ if update .ref_name == MAIN_BRANCH :
1053+ raise ValueError ("Cannot remove main branch" )
1054+
1055+ metadata_refs = {** base_metadata .refs }
1056+ metadata_refs .pop (update .ref_name , None )
1057+ context .add_update (update )
1058+ return base_metadata .model_copy (update = {"refs" : metadata_refs })
1059+
1060+
10261061@_apply_table_update .register (AddSortOrderUpdate )
10271062def _ (update : AddSortOrderUpdate , base_metadata : TableMetadata , context : _TableMetadataUpdateContext ) -> TableMetadata :
10281063 context .add_update (update )
@@ -1997,6 +2032,21 @@ def create_tag(self, snapshot_id: int, tag_name: str, max_ref_age_ms: Optional[i
19972032 self ._requirements += requirement
19982033 return self
19992034
2035+ def remove_tag (self , tag_name : str ) -> ManageSnapshots :
2036+ """
2037+ Remove a tag.
2038+
2039+ Args:
2040+ tag_name (str): name of tag to remove
2041+
2042+ Returns:
2043+ This for method chaining
2044+ """
2045+ update , requirement = self ._transaction ._remove_ref_snapshot (ref_name = tag_name )
2046+ self ._updates += update
2047+ self ._requirements += requirement
2048+ return self
2049+
20002050 def create_branch (
20012051 self ,
20022052 snapshot_id : int ,
@@ -2029,6 +2079,20 @@ def create_branch(
20292079 self ._requirements += requirement
20302080 return self
20312081
2082+ def remove_branch (self , branch_name : str ) -> ManageSnapshots :
2083+ """
2084+ Remove a branch.
2085+
2086+ Args:
2087+ branch_name (str): name of branch to remove
2088+ Returns:
2089+ This for method chaining
2090+ """
2091+ update , requirement = self ._transaction ._remove_ref_snapshot (ref_name = branch_name )
2092+ self ._updates += update
2093+ self ._requirements += requirement
2094+ return self
2095+
20322096
20332097class UpdateSchema (UpdateTableMetadata ["UpdateSchema" ]):
20342098 _schema : Schema
0 commit comments