.. _tools-cli:

|RCT| CLI
---------

The commands available with |RCT| can be split into three categories:

- Remotely executable commands that can be run from your local machine once you
  have your connection details to |RCE| configured.
- Locally executable commands the can be run on the server to carry out
  general maintenance.
- Local configuration commands used to help set up your |RCT| configuration.


rhodecode-tools
---------------

Use |RCT| to setup automation, run the indexer, and install extensions for
your |RCM| instances. Options:

.. rst-class:: dl-horizontal

    \ - -apihost <api_host>
        Set the API host value.

    \ - -apikey <apikey_value>
        Set the API key value.

    \-c, - -config <config_file>
        Create a configuration file. The default file is created
        in ``~/.rhoderc``

    \ - -save-config
        Save the configuration file.

    \ - -show-config
        Show the current configuration values.

    \ - -format {json,pretty}
        Set the formatted representation.

Example usage:

.. code-block:: bash

   $ rhodecode-tools --apikey=key --apihost=http://rhodecode.server \
       --save-config

rhodecode-api
-------------

The |RC| API lets you connect to |RCE| and carry out management tasks from a
remote machine, for more information about the API, see the :ref:`api`. To
pass arguments on the command-line use the ``method:option`` syntax.

Example usage:

.. code-block:: bash

    # Run the get_repos API call and sample output
    $ rhodecode-api --instance-name=enterprise-1 create_repo \
        repo_name:brand-new repo_type:hg description:repo-desc

    {
      "error": null,
      "id": 1110,
      "result": {
        "msg": "Created new repository `brand-new`",
        "success": true,
        "task": null
      }
    }

Options:

.. rst-class:: dl-horizontal

    \ - -api-cache-only
        Requires a cache to be present when running this call

    \ - -api-cache-rebuild
        Replaces existing cached values with new ones from server

    \ - -api-cache <PATH>
        Use a special cache dir to read responses from instead of the server

    \ - -api-cert-verify
         Verify the endpoint ssl certificate

    \ - -api-cert <PATH>
         Path to alternate CA bundle.

    \ - -apihost <api_host>
        Set the API host value.

    \ - -apikey <apikey_value>
        Set the API key value.

    \ - -instance-name <instance-id>
        Set the instance name

    \-I, - -install-dir <DIR>
        Location of application instances

    \-c, - -config <.rhoderc-file>
        Location of the :file:`.rhoderc`

    \-F, - -format {json,pretty}
        Set the formatted representation.

    \-h, - -help
        Show help messages.

    \-v, - -verbose
        Enable verbose messaging

rhodecode-cleanup-gists
-----------------------

Use this to delete gists within |RCM|. Options:

.. rst-class:: dl-horizontal

    \-c, - -config <config_file>
        Set the file path to the configuration file. The default file is
        :file:`/home/{user}/.rhoderc`

    \ - -corrupted
        Remove gists with corrupted metadata.

    \ - -dont-ask
        Remove gists without asking for confirmation.

    \-h, - -help
        Show help messages. current configuration values.

    \ - -instance-name <instance-id>
        Set the instance name.

    \-R, - -repo-dir
        Set the repository file path.

    \ - -version
        Display your |RCT| version.

Example usage:

.. code-block:: bash

    # Clean up gists related to an instance
    $ rhodecode-cleanup-gists --instance-name=enterprise-1
    Scanning for gists in /home/brian/repos/.rc_gist_store...
    preparing to remove [3] found gists

    # Clean up corrupted gists in an instance
    $ rhodecode-cleanup-gists --instance-name=enterprise-1 --corrupted
    Scanning for gists in /home/brian/repos/.rc_gist_store...
    preparing to remove [2] found gists
    the following gists will be archived:
      * EXPIRED: BAD METADATA        | /home/brian/repos/.rc_gist_store/5
      * EXPIRED: BAD METADATA        | /home/brian/repos/.rc_gist_store/8FtC
    are you sure you want to archive them? [y/N]: y
    removing gist /home/brian/repos/.rc_gist_store/5
    removing gist /home/brian/repos/.rc_gist_store/8FtCKdcbRKmEvRzTVsEt

rhodecode-cleanup-repos
-----------------------

Use this to manage |repos| and |repo| groups within |RCM|. Options:

.. rst-class:: dl-horizontal

    \-c, - -config <config_file>
        Set the file path to the configuration file. The default file is
        :file:`/home/{user}/.rhoderc`.

    \-h, - -help
        Show help messages. current configuration values.

    \ - -interactive
        Enable an interactive prompt for each repository when deleting.

    \ - -include-groups
        Remove repository groups.

    \ - -instance-name <instance-id>
        Set the instance name.

    \ - -list-only
        Display repositories selected for deletion.

    \ - -older-than <str>
        Delete repositories older that a specified time.
        You can use the following suffixes; d for days, h for hours,
        m for minutes, s for seconds.

    \-R, - -repo-dir
        Set the repository file path

Example usage:

.. code-block:: bash

    # Cleaning up repos using tools installed with RCE 350 and above
    $ ~/.rccontrol/enterprise-4/profile/bin/rhodecode-cleanup-repos \
        --instance-name=enterprise-4 --older-than=1d
    Scanning for repositories in /home/brian/repos...
    preparing to remove [2] found repositories older than 1 day, 0:00:00 (1d)

    the following repositories will be deleted completely:
    * REMOVED: 2015-08-05 00:23:18 | /home/brian/repos/rm__20150805_002318_831
    * REMOVED: 2015-08-04 01:22:10 | /home/brian/repos/rm__20150804_012210_336
    are you sure you want to remove them? [y/N]:

    # Clean up repos older than 1 year
    # If using virtualenv and pre RCE 350 tools installation
    (venv)$ rhodecode-cleanup-repos --instance-name=enterprise-1 \
        --older-than=365d

    Scanning for repositories in /home/brian/repos...
    preparing to remove [343] found repositories older than 365 days

    # clean up repos older than 3 days
    # If using virtualenv and pre RCE 350 tools installation
    (venv)$ rhodecode-cleanup-repos --instance-name=enterprise-1 \
        --older-than=3d
    Scanning for repositories in /home/brian/repos...
    preparing to remove [3] found repositories older than 3 days

.. _tools-config:

rhodecode-config
----------------

Use this to create or update a |RCE| configuration file on the local machine.

.. rst-class:: dl-horizontal

    \- -filename </path/to/config_file>
        Set the file path to the |RCE| configuration file.

    \- -show-defaults
        Display the defaults set in the |RCE| configuration file.

    \- -update
        Update the configuration with the new settings passed on the command
        line.

.. code-block:: bash

    # Create a new config file
    $ rhodecode-config --filename=dev.ini
    Wrote new config file in /Users/user/dev.ini

    # Update config value for given section:
    $ rhodecode-config --update --filename=prod.ini [handler_console]level=INFO

    $ rhodecode-config --filename=dev.ini --show-defaults
    lang=en
    cpu_number=4
    uuid=<function <lambda> at 0x10d86ac08>
    license_token=ff1e-aa9c-bb66-11e5
    host=127.0.0.1
    here=/Users/brian
    error_aggregation_service=None
    database_url=sqlite:///%(here)s/rhodecode.db?timeout=30
    git_path=git
    http_server=waitress
    port=5000

.. _tools-rhodecode-extensions:

rhodecode-extensions
--------------------

|RCT| adds additional mapping for :ref:`indexing-ref`, statistics, and adds
additional code for push/pull/create/delete |repo| hooks. These hooks can be
used to send signals to build-bots such as jenkins. Options:

.. rst-class:: dl-horizontal

    \-c, - -config <config_file>
        Create a configuration file. The default file is created
        in ``~/.rhoderc``

    \-h, - -help
         Show help messages.

    \-F, - -format {json,pretty}
        Set the formatted representation.

    \-I, - -install-dir <str>
        Set the location of the |RCE| installation. The default location is
        :file:`/home/{user}/.rccontrol/`.

    \ - -ini-file <str>
        Path to the :file:`rhodecode.ini` file for that instance.

    \ - -instance-name <instance-id>
        Set the instance name.

    \ - -plugins
         Add plugins to your |RCE| installation. See the
         :ref:`extensions-hooks-ref` section for more details.

    \ - -version
         Display your |RCT| version.


Once installed, you will see a :file:`rcextensions` folder in the instance
directory, for example :file:`home/{user}/.rccontrol/{instance-id}/rcextensions`

To install ``rcextensions``, use the following example:

.. code-block:: bash

    # install extensions on the given instance
    # If using virtualenv prior to RCE 350
    (venv)$ rhodecode-extensions --instance-name=enterprise-1 \
        --ini-file=rhodecode.ini
    Writen new extensions file to rcextensions

    # install extensions with additional plugins on the given instance
    (venv)$ rhodecode-extensions --instance-name=enterprise-1 \
        --ini-file=rhodecode.ini --plugins
    Writen new extensions file to rcextensions

    # installing extensions from 350 onwards
    # as they are packaged with RCE
    $ .rccontrol/enterprise-4/profile/bin/rhodecode-extensions --plugins \
      --instance-name=enterprise-4 --ini-file=rhodecode.ini

    Writen new extensions file to rcextensions

See the new extensions inside this directory for more details about the
additional hooks available, for example see the ``push_post.py`` file.

.. code-block:: python

    import urllib
    import urllib2

    def run(*args, **kwargs):
        """
        Extra params

        :param URL: url to send the data to
        """

        url = kwargs.pop('URL', None)
        if url:
            from rhodecode.lib.compat import json
            from rhodecode.model.db import Repository

            repo = Repository.get_by_repo_name(kwargs['repository'])
            changesets = []
            vcs_repo = repo.scm_instance_no_cache()
            for r in kwargs['pushed_revs']:
                cs = vcs_repo.get_changeset(r)
                changesets.append(json.dumps(cs))

            kwargs['pushed_revs'] = changesets
            headers = {
                'User-Agent': 'RhodeCode-SCM web hook',
                'Content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
                'Accept': 'text/javascript, text/html, application/xml, '
                          'text/xml, */*',
                'Accept-Encoding': 'gzip,deflate,sdch',
            }

            data = kwargs
            data = urllib.urlencode(data)
            req = urllib2.Request(url, data, headers)
            response = urllib2.urlopen(req)
            response.read()
            return 0


rhodecode-gist
--------------

Use this to create, list, show, or delete gists within |RCM|. Options:

.. rst-class:: dl-horizontal

    \ - -api-cache-only
        Requires a cache to be present when running this call

    \ - -api-cache-rebuild
        Replaces existing cached values with new ones from server

    \ - -api-cache PATH
        Use a special cache dir to read responses from instead of the server

    \ - -api-cert-verify
         Verify the endpoint ssl certificate

    \ - -api-cert PATH
         Path to alternate CA bundle.

    \ - -apihost <api_host>
        Set the API host value.

    \ - -apikey <apikey_value>
        Set the API key value.

    \-c, - -config <config_file>
        Create a configuration file.
        The default file is created in :file:`~/.rhoderc`

    \ - -create <gistname>
        create the gist

    \-d, - -description <str>
        Set gist description

    \ - -delete <gistid>
        Delete the gist

    \-f, - -file
        Specify the filename The file extension will enable syntax highlighting.

    \-F, - -format {json,pretty}
        Set the formatted representation.

    \ - -help
        Show help messages.

    \-I, - -install-dir <DIR>
        Location of application instances

    \ - -instance-name <instance-id>
        Set the instance name.

    \ - -list
        Display instance gists.

    \-l, --lifetime <minutes>
        Set the gist lifetime. The default value is (-1) forever

    \ - -show <gistname>
        Show the content of the gist

    \-o, - -open
        After creating Gist open it in browser

    \-p, - -private
        Create a private gist

    \ - -version
         Display your |RCT| version.

Example usage:

.. code-block:: bash

    # List the gists in an instance
    (venv)brian@ubuntu:~$ rhodecode-gist --instance-name=enterprise-1 list
    {
      "error": null,
      "id": 7102,
      "result": [
        {
          "access_id": "2",
          "content": null,
          "created_on": "2015-01-19T12:52:26.494",
          "description": "A public gust",
          "expires": -1.0,
          "gist_id": 2,
          "type": "public",
          "url": "http://127.0.0.1:10003/_admin/gists/2"
        },
        {
          "access_id": "7gs6BsSEC4pKUEPLz5AB",
          "content": null,
          "created_on": "2015-01-19T11:27:40.812",
          "description": "Gist testing API",
          "expires": -1.0,
          "gist_id": 1,
          "type": "private",
          "url": "http://127.0.0.1:10003/_admin/gists/7gs6BsSEC4pKUEPLz5AB"
        }
      ]
    }

    # delete a particular gist
    # You use the access_id to specify the gist to delete
    (venv)brian@ubuntu:~$ rhodecode-gist delete 2  --instance-name=enterprise-1
    {
      "error": null,
      "id": 6284,
      "result": {
        "gist": null,
        "msg": "deleted gist ID:2"
      }
    }

    # cat a file and pipe to new gist
    # This is if you are using virtualenv
    (venv)$ cat ~/.rhoderc | rhodecode-gist --instance-name=enterprise-1 \
        -d '.rhoderc copy' create

    {
      "error": null,
      "id": 5374,
      "result": {
        "gist": {
          "access_id": "7",
          "content": null,
          "created_on": "2015-01-26T11:31:58.774",
          "description": ".rhoderc copy",
          "expires": -1.0,
          "gist_id": 7,
          "type": "public",
          "url": "http://127.0.0.1:10003/_admin/gists/7"
        },
        "msg": "created new gist"
      }
    }

    # Cat a file and pipe to gist
    # in RCE 3.5.0 tools and above
    $ cat ~/.rhoderc | ~/.rccontrol/{instance-id}/profile/bin/rhodecode-gist \
       --instance-name=enterprise-4 -d '.rhoderc copy' create
    {
      "error": null,
      "id": 9253,
      "result": {
        "gist": {
          "access_id": "4",
          "acl_level": "acl_public",
          "content": null,
          "created_on": "2015-08-20T05:54:11.250",
          "description": ".rhoderc copy",
          "expires": -1.0,
          "gist_id": 4,
          "modified_at": "2015-08-20T05:54:11.250",
          "type": "public",
          "url": "http://127.0.0.1:10000/_admin/gists/4"
        },
        "msg": "created new gist"
      }
    }


rhodecode-index
---------------

More detailed information regarding setting up the indexer is available in
the :ref:`indexing-ref` section. Options:

.. rst-class:: dl-horizontal

    \ - -api-cache-only
        Requires a cache to be present when running this call

    \ - -api-cache-rebuild
        Replaces existing cached values with new ones from server

    \ - -api-cache PATH
        Use a special cache dir to read responses from instead of the server

    \ - -api-cert-verify
         Verify the endpoint ssl certificate

    \ - -api-cert PATH
         Path to alternate CA bundle.

    \ - -apihost <api_host>
        Set the API host value.

    \ - -apikey <apikey_value>
        Set the API key value.

    \-c, --config <config_file>
        Create a configuration file.
        The default file is created in :file:`~/.rhoderc`

    \ - -create-mapping <PATH>
         Creates an example mapping configuration for indexer.

    \-F, - -format {json,pretty}
         Set the formatted representation.

    \-h, - -help
         Show help messages.

    \ - -instance-name <instance-id>
        Set the instance name

    \-I, - -install-dir <DIR>
        Location of application instances

    \-m, - -mapping <file_name>
         Parse the output to the .ini mapping file.

    \ - -optimize
         Optimize index for performance by amalgamating multiple index files
         into one. Greatly increases incremental indexing speed.

    \-R, - -repo-dir <DIRECTORY>
         Location of repositories

    \ - -source <PATH>
         Use a special source JSON file to feed the indexer

    \ - -version
         Display your |RCT| version.

Example usage:

.. code-block:: bash

    # Run the indexer
    $ ~/.rccontrol/enterprise-4/profile/bin/rhodecode-index \
        --instance-name=enterprise-4

    # Run indexer based on mapping.ini file
    # This is using pre-350 virtualenv
    (venv)$ rhodecode-index --instance-name=enterprise-1

    # Index from the command line without creating
    # the .rhoderc file
    $ rhodecode-index --apikey=key --apihost=http://rhodecode.server \
        --instance-name=enterprise-2 --save-config

    # Create the indexing mapping file
    $ ~/.rccontrol/enterprise-4/profile/bin/rhodecode-index \
        --create-mapping mapping.ini --instance-name=enterprise-4

.. _tools-rhodecode-list-instance:

rhodecode-list-instances
------------------------

Use this command to list the instance details configured in the
:file:`~/.rhoderc` file.

.. code-block:: bash

   $ .rccontrol/enterprise-1/profile/bin/rhodecode-list-instances
   [instance:production] - Config only
   API-HOST: https://some.url.com
   API-KEY:  some.auth.token

   [instance:development] - Config only
   API-HOST: http://some.ip.address
   API-KEY:  some.auth.token


.. _tools-setup-config:

rhodecode-setup-config
----------------------

Use this command to create the ``~.rhoderc`` file required by |RCT| to access
remote instances.

.. rst-class:: dl-horizontal

    \- -instance-name <name>
        Specify the instance name in the :file:`~/.rhoderc`

    \api_host <hostname>
        Create a configuration file. The default file is created
        in ``~/.rhoderc``

    \api_key <auth-token>
        Create a configuration file. The default file is created
        in ``~/.rhoderc``


.. code-block:: bash

    (venv)$ rhodecode-setup-config --instance-name=tea api_host=URL api_key=xyz
    Config not found under /Users/username/.rhoderc, creating a new one
    Wrote new configuration into /Users/username/.rhoderc
