fix bids init with hidden file

This commit is contained in:
bpinsard 2024-02-09 10:22:49 -05:00
parent 559ab18016
commit 6385f4f72f
2 changed files with 43 additions and 11 deletions

View File

@ -4,6 +4,7 @@ import argparse
import pathlib import pathlib
import urllib.parse import urllib.parse
import datalad.api as dlad import datalad.api as dlad
import datalad.config
import shutil import shutil
import gitlab import gitlab
import tempfile import tempfile
@ -12,6 +13,10 @@ import subprocess
import yaml import yaml
from contextlib import contextmanager from contextlib import contextmanager
REPO_TEMPLATES_PATH = (
pathlib.Path(os.path.dirname(os.path.realpath(__file__))) / "repo_templates"
)
DEBUG = bool(os.environ.get("DEBUG", False)) DEBUG = bool(os.environ.get("DEBUG", False))
if DEBUG: if DEBUG:
logging.basicConfig(level=logging.DEBUG) logging.basicConfig(level=logging.DEBUG)
@ -19,6 +24,7 @@ if DEBUG:
GITLAB_REMOTE_NAME = os.environ.get("GITLAB_REMOTE_NAME", "origin") GITLAB_REMOTE_NAME = os.environ.get("GITLAB_REMOTE_NAME", "origin")
GITLAB_TOKEN = os.environ.get("GITLAB_TOKEN", None) GITLAB_TOKEN = os.environ.get("GITLAB_TOKEN", None)
GITLAB_BOT_USERNAME = os.environ.get("GITLAB_BOT_USERNAME", None) GITLAB_BOT_USERNAME = os.environ.get("GITLAB_BOT_USERNAME", None)
GITLAB_BOT_EMAIL = os.environ.get("GITLAB_BOT_EMAIL", None)
BIDS_DEV_BRANCH = os.environ.get("BIDS_DEV_BRANCH", "dev") BIDS_DEV_BRANCH = os.environ.get("BIDS_DEV_BRANCH", "dev")
NI_DATAOPS_GITLAB_ROOT = os.environ.get("NI_DATAOPS_GITLAB_ROOT", "ni-dataops") NI_DATAOPS_GITLAB_ROOT = os.environ.get("NI_DATAOPS_GITLAB_ROOT", "ni-dataops")
@ -33,6 +39,23 @@ S3_REMOTE_DEFAULT_PARAMETERS = [
] ]
def git_global_setup(
storage_remote_url: urllib.parse.ParseResult, scope="global"
) -> None:
git_config = datalad.config.ConfigManager()
git_config.add("user.name", GITLAB_BOT_USERNAME, scope=scope)
git_config.add("user.email", GITLAB_BOT_EMAIL, scope=scope)
if storage_remote_url.scheme == "s3":
import socket
s3_ip = socket.gethostbyname(storage_remote_url.hostname)
git_config.add(
"annex.security.allowed-ip-addresses",
s3_ip,
scope=scope,
)
# TODO: rewrite for pathlib.Path input # TODO: rewrite for pathlib.Path input
def sort_series(path: pathlib.Path) -> None: def sort_series(path: pathlib.Path) -> None:
"""Sort series in separate folder """Sort series in separate folder
@ -82,7 +105,7 @@ def _build_arg_parser() -> argparse.ArgumentParser:
p.add_argument("--storage-remote", help="url to the datalad remote") p.add_argument("--storage-remote", help="url to the datalad remote")
p.add_argument( p.add_argument(
"--sort-series", "--sort-series",
type=bool, action="store_true",
default=True, default=True,
help="sort dicom series in separate folders", help="sort dicom series in separate folders",
) )
@ -115,6 +138,8 @@ def main() -> None:
output_remote = urllib.parse.urlparse(args.storage_remote) output_remote = urllib.parse.urlparse(args.storage_remote)
gitlab_url = urllib.parse.urlparse(args.gitlab_url) gitlab_url = urllib.parse.urlparse(args.gitlab_url)
git_global_setup(output_remote)
with index_dicoms( with index_dicoms(
input, input,
sort_series=args.sort_series, sort_series=args.sort_series,
@ -177,7 +202,7 @@ def index_dicoms(
# cannot pass message above so commit now # cannot pass message above so commit now
dicom_session_ds.save(message=f"index dicoms from archive {archive}") # dicom_session_ds.save(message=f"index dicoms from archive {archive}") #
# optimize git index after large import # optimize git index after large import
dicom_session_ds.repo.gc() # aggressive by default #dicom_session_ds.repo.gc() # aggressive by default
yield dicom_session_ds yield dicom_session_ds
@ -198,7 +223,9 @@ def export_data(
export_to_s3(dicom_session_ds, output_remote, session_metas) export_to_s3(dicom_session_ds, output_remote, session_metas)
def set_bot_privileges(gitlab_conn: gitlab.Gitlab, gitlab_group_path: pathlib.Path) -> None: def set_bot_privileges(
gitlab_conn: gitlab.Gitlab, gitlab_group_path: pathlib.Path
) -> None:
# add maint permissions for the dicom bot user on the study repos # add maint permissions for the dicom bot user on the study repos
study_group = get_or_create_gitlab_group(gitlab_conn, gitlab_group_path) study_group = get_or_create_gitlab_group(gitlab_conn, gitlab_group_path)
bot_user = gitlab_conn.users.list(username=GITLAB_BOT_USERNAME) bot_user = gitlab_conn.users.list(username=GITLAB_BOT_USERNAME)
@ -295,9 +322,11 @@ def init_bids(
source=bids_project_repo._attrs["ssh_url_to_repo"], source=bids_project_repo._attrs["ssh_url_to_repo"],
path=tmpdir, path=tmpdir,
) )
bids_project_ds.create(force=True) shutil.copytree(
shutil.copytree("repo_templates/bids", bids_project_ds.path, dirs_exist_ok=True) REPO_TEMPLATES_PATH / "bids", bids_project_ds.path, dirs_exist_ok=True
)
write_ci_env(bids_project_ds, gitlab_group_path) write_ci_env(bids_project_ds, gitlab_group_path)
bids_project_ds.create(force=True)
bids_project_ds.save(path=".", message="init structure and pipelines") bids_project_ds.save(path=".", message="init structure and pipelines")
bids_project_ds.install( bids_project_ds.install(
path="sourcedata/dicoms", path="sourcedata/dicoms",
@ -318,7 +347,7 @@ def init_dicom_study(
gitlab_group_path: pathlib.Path, gitlab_group_path: pathlib.Path,
) -> None: ) -> None:
shutil.copytree( shutil.copytree(
"repo_templates/dicom_study", dicom_study_ds.path, dirs_exist_ok=True REPO_TEMPLATES_PATH / "dicom_study", dicom_study_ds.path, dirs_exist_ok=True
) )
write_ci_env(dicom_study_ds, gitlab_group_path) write_ci_env(dicom_study_ds, gitlab_group_path)
dicom_study_ds.save(path=".", message="init structure and pipelines") dicom_study_ds.save(path=".", message="init structure and pipelines")
@ -326,14 +355,13 @@ def init_dicom_study(
def write_ci_env( def write_ci_env(
ds: dlad.Dataset ds: dlad.Dataset,
gitlab_group_path: pathlib.Path gitlab_group_path: pathlib.Path,
): ) -> None:
env = { env = {
"variables": { "variables": {
"STUDY_PATH": str(gitlab_group_path), "STUDY_PATH": str(gitlab_group_path),
"BIDS_PATH": str(gitlab_group_path / "bids"), "BIDS_PATH": str(gitlab_group_path / "bids"),
"NI_DATAOPS_GITLAB_ROOT": NI_DATAOPS_GITLAB_ROOT,
} }
} }
with (pathlib.Path(ds.path) / ".ci-env.yml").open("w") as outfile: with (pathlib.Path(ds.path) / ".ci-env.yml").open("w") as outfile:
@ -435,7 +463,10 @@ def export_to_s3(
# TODO: check if we can reuse a single bucket (or per study) with fileprefix # TODO: check if we can reuse a single bucket (or per study) with fileprefix
# git-annex initremote remotename ... # git-annex initremote remotename ...
remote_name = s3_url.hostname remote_name = s3_url.hostname
_, bucket_name, *fileprefix = pathlib.Path(s3_url.path).parts s3_path = s3_url.path
if '{' in s3_path:
s3_path = s3_path.format(**session_metas)
_, bucket_name, *fileprefix = pathlib.Path(s3_path).parts
fileprefix.append(session_metas["StudyInstanceUID"] + "/") fileprefix.append(session_metas["StudyInstanceUID"] + "/")
ds.repo.init_remote( ds.repo.init_remote(
remote_name, remote_name,

View File

@ -0,0 +1 @@
dummy file to trigger ci to init BIDS branches and remotes