<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def gitlab( task: Task, url: str, token: str, repository: str, filename: str, content: str = "", action: str = "create", dry_run: bool = False, branch: str = "master", destination: str = "", ref: str = "master", commit_message: str = "", ) -> Result: """ Exposes some of the Gitlab API functionality for operations on files in a Gitlab repository. Example: nornir.run(files.gitlab, action="create", url="https://gitlab.localhost.com", token="ABCD1234", repository="test", filename="config", ref="master") Arguments: dry_run: Whether to apply changes or not url: Gitlab instance URL token: Personal access token repository: source/destination repository filename: source/destination file name content: content to write action: ``create``, ``update``, ``get`` branch: destination branch destination: local destination filename (only used in get action) ref: branch, commit hash or tag (only used in get action) commit_message: commit message Returns: Result object with the following attributes set: * changed (``bool``):
 * diff (``str``):
 unified diff """

    dry_run = task.is_dry_run(dry_run)

    session = requests.session()
    session.headers.update({"PRIVATE-TOKEN": token})

    if commit_message == "":
        commit_message = "File created with nornir"

    pid = _get_repository(session, url, repository)

    if action == "create":
        diff = _create(
            task, session, url, pid, filename, content, branch, commit_message, dry_run
        )
    elif action == "update":
        diff = _update(
            task, session, url, pid, filename, content, branch, commit_message, dry_run
        )
    elif action == "get":
        diff = _get(task, session, url, pid, filename, destination, ref, dry_run)
    return Result(host=task.host, diff=diff, changed=bool(diff))