.. _repo-admin-tasks:

Common Admin Tasks for Repositories
-----------------------------------


Manually Force Delete Repository
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

In case of attached forks or pull-requests repositories should be archived.
Here is how to force delete a repository and remove all dependent objects


.. code-block:: bash
   :dedent: 1

    # starts the ishell interactive prompt
    $ ./rcstack cli ishell

.. code-block:: python
   :dedent: 1

    In [4]: from rhodecode.model.repo import RepoModel
    In [3]: repo = Repository.get_by_repo_name('test_repos/repo_with_prs')
    In [5]: RepoModel().delete(repo, forks='detach', pull_requests='delete')
    In [6]: Session().commit()


Below is a fully automated example to force delete repositories reading from a
file where each line is a repository name. This can be executed via simple CLI command
without entering the interactive shell.

Save the below content as a file named `repo_delete_task.py`


.. code-block:: python
   :dedent: 1

    from rhodecode.model.db import *
    from rhodecode.model.repo import RepoModel
    with open('delete_repos.txt', 'rb') as f:
        # read all lines from file
        repos = f.readlines()
        for repo_name in repos:
            repo_name = repo_name.strip()  # cleanup the name just in case
            repo = Repository.get_by_repo_name(repo_name)
            if not repo:
                raise Exception('Repo with name {} not found'.format(repo_name))
            RepoModel().delete(repo, forks='detach', pull_requests='delete')
            Session().commit()
            print('Removed repository {}'.format(repo_name))


The code above will read the names of repositories from a file called `delete_repos.txt`
Each lines should represent a single name e.g `repo_name_1` or `repo_group/repo_name_2`

Run this line from CLI to execute the code from the `repo_delete_task.py` file and
exit the ishell after the execution::

    echo "%run repo_delete_task.py" | ./rcstack cli ishell --no-tty


Bulk edit permissions for all repositories or groups
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

In case when a permissions should be applied in bulk here are two ways to apply
the permissions onto *all* repositories and/or repository groups.

1) Start by running the interactive ishell interface

.. code-block:: bash
   :dedent: 1

    # starts the ishell interactive prompt
    $ ./rcstack cli ishell


2a) Add user called 'admin' into all repositories with write permission.
    Permissions can be also `repository.read`, `repository.admin`, `repository.none`


.. code-block:: python
   :dedent:

   In [1]: from rhodecode.model.repo import RepoModel
   In [2]: user = User.get_by_username('admin')
   In [3]: permission_name = 'repository.write'
   In [4]: for repo in Repository.get_all():
      ...:     RepoModel().grant_user_permission(repo, user, permission_name)
      ...:     Session().commit()

2b) Add user called 'admin' into all repository groups with write permission.
    Permissions can be also can be `group.read`, `group.admin`, `group.none`

.. code-block:: python
   :dedent:

   In [1]: from rhodecode.model.repo import RepoModel
   In [2]: user = User.get_by_username('admin')
   In [3]: permission_name = 'group.write'
   In [4]: for repo_group in RepoGroup.get_all():
       ...:     RepoGroupModel().grant_user_permission(repo_group, user, permission_name)
       ...:     Session().commit()


Delete a problematic pull request
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: python
   :dedent:

   In [1]: from rhodecode.model.pull_request import PullRequestModel
   In [2]: pullrequest_id = 123
   In [3]: pr = PullRequest.get(pullrequest_id)
   In [4]: super_admin = User.get_first_super_admin()
   In [5]: PullRequestModel().delete(pr, super_admin)
   In [6]: Session().commit()
