def METHOD_NAME(
    dataset_ids: tuple[int],
    dry_run: bool,
    limit: int,
    upload: bool,
    force: bool,
    prune: bool,
    backport: bool,
    data_metadata: bool,
    all: bool,
    workers: int,
) -> None:
    engine = get_engine()
    if backport:
        df = _active_datasets(engine, dataset_ids=list(dataset_ids), limit=limit, all=all)
        if dataset_ids:
            df = df.loc[df.id.isin(dataset_ids)]
        log.info("bulk_backport.start", n=len(df))
        if workers == 1:
            ds_row: Any
            for i, ds_row in enumerate(df.itertuples()):
                log.info(
                    "bulk_backport",
                    dataset_id=ds_row.id,
                    name=ds_row.name,
                    private=ds_row.isPrivate,
                    progress=f"{i + 1}/{len(df)}",
                )
                backport_step(
                    dataset_id=ds_row.id,
                    dry_run=dry_run,
                    upload=upload,
                    force=force,
                    engine=engine,
                    data_metadata=data_metadata,
                )
        else:
            with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as executor:
                results = executor.map(
                    lambda ds_row: backport_step(
                        dataset_id=ds_row.id,
                        dry_run=dry_run,
                        upload=upload,
                        force=force,
                        engine=engine,
                        data_metadata=data_metadata,
                    ),
                    df.itertuples(),
                )
                # raise errors from futures, otherwise they'd fail silently
                list(results)
    if prune:
        _prune_snapshots(engine, dataset_ids, dry_run, all=all)
    log.info("bulk_backport.finished")