Skip to content

Latest commit

 

History

History
757 lines (479 loc) · 23.6 KB

vcs.rst

File metadata and controls

757 lines (479 loc) · 23.6 KB

Version Control Data Functions

These functions are designed to be used by themes.

The generic interface functions are designed to provide a level of abstraction over the type of VCS that a user might be using. By using the generic interface, a theme can provide a common look for all VCS types. See the default theme function :func:`_lp_vcs_details_color` for an example of this.

.. function:: _lp_find_vcs() -> var:lp_vcs_type, var:lp_vcs_root, \
   var:lp_vcs_dir, var:lp_vcs_specific_dir, var:lp_vcs_subtype

   Returns ``true`` if the current directory is part of a version control
   repository. If not, returns ``1``. Returns the VCS type ID, subtype if one
   exists, the VCS data directory, and the repository root directory.

   If the current directory is disabled for version control using
   :attr:`LP_DISABLED_VCS_PATHS` (checked using :func:`_lp_are_vcs_enabled`),
   returns ``2``, and the returned type is set to "disabled".

   :func:`_lp_find_vcs` will only search for VCS types that are not disabled. If
   all VCS types are disabled in the config, :func:`_lp_find_vcs` will return
   ``1``, as no repository will be found.

   This function does a lightweight check for the existence of a version control
   repository, only looking for the existence of a database. It does not check
   if the database is valid or healthy. Use :func:`_lp_vcs_active` to test for
   that.

   Git worktrees have two Git directories: one is the main directory in
   *lp_vcs_dir*, which holds the DB and config. The other is the worktree
   specific directory in *lp_vcs_specific_dir*, which holds working directory
   specific information, like index and status like merge or rebase in
   progress.

   .. note::

      *lp_vcs_dir* will not be set for Fossil repositories. Protect it with
      ``"${lp_vcs_dir-}"``.

   .. note::

      *lp_vcs_specific dir* will only be set for Git repositories. Protect it
      with ``"${lp_vcs_specific_dir-}"``.

   .. note::

      *lp_vcs_subtype* will not be set usually. The only currently supported
      subtypes are `vcsh` and `svn`, which are subtypes of `git`.

   .. versionadded:: 2.0

   .. versionchanged:: 2.1
      Added the *lp_vcs_dir* and *lp_vcs_subtype* return values.
      Added support for checking the :envvar:`GIT_DIR` environment variable.

   .. versionchanged:: 2.2
      Added the *lp_vcs_specific_dir* return value.

.. function:: _lp_are_vcs_enabled()

   Returns ``true`` if the current directory is not excluded by the config
   option :attr:`LP_DISABLED_VCS_PATHS`.

Note

All following generic functions need :func:`_lp_find_vcs` to be run first, as they need lp_vcs_type to be set.

.. function:: _lp_vcs_active()

   Returns ``true`` if the detected VCS is enabled in Liquid Prompt and the
   current directory is a valid repository of that type. This check should be
   done before running any other ``_lp_vcs_*`` data functions, but can be
   omitted for speed reasons if the checks done by :func:`_lp_find_vcs` are good
   enough.

   .. versionadded:: 2.0

Note

Unless otherwise documented, the following functions return 0 for good data, 1 for no data, and 2 for unsupported function.

.. function:: _lp_vcs_bookmark() -> var:lp_vcs_bookmark

   Returns ``true`` if a bookmark is active in the repository. Returns the
   bookmark name.

   Most VCS providers do not support bookmarks.

   .. versionadded:: 2.0

.. function:: _lp_vcs_branch() -> var:lp_vcs_branch

   Returns ``true`` if a branch is active in the repository. Returns the branch
   name.

   For some VCS providers, a branch is always active.

   .. versionadded:: 2.0

.. function:: _lp_vcs_commit_id() -> var:lp_vcs_commit_id

   Returns the full commit ID of the current commit. The return code is not
   defined.

   Some VCS providers use hashes, while others use incrementing revision
   numbers. All VCS providers support some form of ID. The returned string
   should be unique enough that a user can identify the commit.

   .. versionadded:: 2.0

.. function:: _lp_vcs_commits_off_remote() -> var:lp_vcs_commit_ahead, var:lp_vcs_commit_behind

   Returns ``true`` if there are commits on the current branch that are not on
   the remote tracking branch, or commits on the remote tracking branch that are
   not on this branch. Returns ``1`` if there are no differing commits. Returns
   ``2`` if there is no matching remote tracking branch. Returns ``3`` or higher
   if the VCS provider does not support remote tracking branches.

   Returns the number of commits behind and ahead.

   Most VCS providers do not support remote tracking branches.

   .. versionadded:: 2.0

.. function:: _lp_vcs_head_status() -> var:lp_vcs_head_status, var:lp_vcs_head_details

   Return ``true`` if the repository is in a special or unusual state. Return
   the special status, and any extra details (like progress in a rebase) if
   applicable.

   Many VCS providers do not have such information. This info is unlikely to be
   similar across VCSs, and should probably be displayed to a user without
   manipulation.

   .. note::

      The details are optional, and might not be set. Protect it with
      ``"${lp_vcs_head_details-}"``.

   .. versionadded:: 2.0

.. function:: _lp_vcs_remote() -> var:lp_vcs_remote

   Return ``true`` if the current branch is a remote tracking branch. The
   remote name is returned in *lp_vcs_remote*.

   Many VCS providers do not have such information. Currently this is only
   implemented for Git.

   Can be enabled by :attr:`LP_ENABLE_VCS_REMOTE`.

   .. versionadded:: 2.2

.. function:: _lp_vcs_staged_files() -> var:lp_vcs_staged_files

   Returns ``true`` if any staged files exist in the repository. In other words,
   tracked files that contain staged changes. Returns the number of staged
   files.

   Many VCS providers do not support staging.

   .. versionadded:: 2.0

.. function:: _lp_vcs_staged_lines() -> var:lp_vcs_staged_i_lines, var:lp_vcs_staged_d_lines

   Returns ``true`` if any staged lines exist in the repository. In other words,
   tracked files that contain staged changes. Returns the number of staged
   lines.

   Many VCS providers do not support staging.

   .. versionadded:: 2.0

.. function:: _lp_vcs_stash_count() -> var:lp_vcs_stash_count

   Returns ``true`` if there are stashes the repository. Returns the
   number of stashes.

   Some VCS providers refer to stashes as "shelves".

   Some VCS providers do not support stashes.

   .. versionadded:: 2.0

.. function:: _lp_vcs_tag() -> var:lp_vcs_tag

   Returns ``true`` if a tag is active in the repository. Returns the
   tag name.

   A tag will only be returned if it is a unique ID that points only to the
   current commit.

   If multiple tags match, only one is returned. Which tag is selected is not
   defined.

   Some VCS providers do not support unique tags.

   .. versionadded:: 2.0

.. function:: _lp_vcs_uncommitted_files() -> var:lp_vcs_uncommitted_files

   Returns ``true`` if any uncommitted files exist in the repository. In other
   words, tracked files that contain uncommitted changes. Returns the number of
   uncommitted files.

   Some VCS providers refer to uncommitted files as "modified" files.

   .. versionadded:: 2.0

.. function:: _lp_vcs_uncommitted_lines() -> var:lp_vcs_uncommitted_i_lines, var:lp_vcs_uncommitted_d_lines

   Returns ``true`` if any uncommitted lines exist in the repository. In other
   words, tracked files that contain uncommitted changes. Returns the number of
   uncommitted lines.

   Some VCS providers refer to uncommitted lines as "modified" or "changed"
   lines.

   .. versionadded:: 2.0

.. function:: _lp_vcs_unstaged_files() -> var:lp_vcs_unstaged_files

   Returns ``true`` if any unstaged files exist in the repository. In other
   words, tracked files that contain unstaged changes. Returns the number of
   unstaged files.

   Many VCS providers do not support staging.

   .. versionadded:: 2.0

.. function:: _lp_vcs_unstaged_lines() -> var:lp_vcs_unstaged_i_lines, var:lp_vcs_unstaged_d_lines

   Returns ``true`` if any unstaged lines exist in the repository. In other
   words, tracked files that contain unstaged changes. Returns the number of
   unstaged lines.

   Many VCS providers do not support staging.

   .. versionadded:: 2.0

.. function:: _lp_vcs_untracked_files() -> var:lp_vcs_untracked_files

   Returns ``true`` if any untracked files exist in the repository. Returns the
   number of untracked files.

   Some VCS providers refer to untracked files as "extra" files.

   .. versionadded:: 2.0

Warning

Bazaar is no longer being actively developed, and depends on Python 2, which is no longer supported. Breezy is a fork that can work with Bazaar repositories. To use Breezy in place of Bazaar, set a wrapper function:

bzr() { brz "$@"; }

Note

Bazaar does not support bookmarks. A nick is somewhat like a bookmark, but there is no command to view a naked branch name, so the nick command is used for branches.

Note

Bazaar does not support a staging area.

Note

Bazaar does not support getting details of remote tracking branches. Bazaar does not keep a local copy of the remote state, so checking this would be impossible anyway.

Note

Bazaar does not have extra head statuses. A Bazaar merge can be partially complete, but there is no command to test for it.

.. function:: _lp_bzr_active()

   Returns ``true`` if Bazaar is enabled in Liquid Prompt and the current
   directory is a valid Bazaar repository. This check should be done before
   running any other ``_lp_bzr_*`` data functions if accessing the Bazaar
   data functions directly instead of through the generic interface.

   Can be disabled by :attr:`LP_ENABLE_BZR`.

   .. versionadded:: 2.0

.. function:: _lp_bzr_branch() -> var:lp_vcs_branch

   Returns ``true`` if a branch is active in the repository. Returns the branch
   name.

   .. versionchanged:: 2.0
      Return method changed from stdout.
      No branch now returns ``false``.

.. function:: _lp_bzr_commit_id() -> var:lp_vcs_commit_id

   Returns the revision number of the current commit. The return code is not
   defined.

   .. versionadded:: 2.0

.. function:: _lp_bzr_stash_count() -> var:lp_vcs_stash_count

   Returns ``true`` if there are shelves the repository. Returns the
   number of shelves.

   .. versionadded:: 2.0

.. function:: _lp_bzr_tag() -> var:lp_vcs_tag

   Returns ``true`` if a tag is active in the repository. Returns the
   tag name.

   If multiple tags match, only one is returned. Which tag is selected is not
   defined.

   .. versionadded:: 2.0

.. function:: _lp_bzr_uncommitted_files() -> var:lp_vcs_uncommitted_files

   Returns ``true`` if any uncommitted files exist in the repository. In other
   words, tracked files that contain uncommitted changes. Returns the number of
   uncommitted files.

   .. versionadded:: 2.0

.. function:: _lp_bzr_uncommitted_lines() -> var:lp_vcs_uncommitted_i_lines, var:lp_vcs_uncommitted_d_lines

   Returns ``true`` if any uncommitted lines exist in the repository. In other
   words, tracked files that contain uncommitted changes. Returns the number of
   uncommitted lines.

   .. versionadded:: 2.0

.. function:: _lp_bzr_untracked_files() -> var:lp_vcs_untracked_files

   Returns ``true`` if any untracked files exist in the repository. Returns the
   number of untracked files.

   .. versionadded:: 2.0

Note

Fossil does not support bookmarks.

Note

Fossil does not support a staging area.

Note

Fossil does not support unique tags. Fossil tags can refer to multiple check-in IDs, so a matching tag is not a useful unique ID.

Note

Fossil does not support remote tracking branches. Fossil by default keeps the local repository in sync with the remote. Even if a user disables that, it is not possible to have a local and remote branch named the same not in sync.

.. function:: _lp_fossil_active()

   Returns ``true`` if Fossil is enabled in Liquid Prompt and the current
   directory is a valid Fossil repository. This check should be done before
   running any other ``_lp_fossil_*`` data functions if accessing the Fossil
   data functions directly instead of through the generic interface.

   Can be disabled by :attr:`LP_ENABLE_FOSSIL`.

   .. versionadded:: 2.0

.. function:: _lp_fossil_branch() -> var:lp_vcs_branch

   Returns ``true`` if a branch is active in the repository. Returns the branch
   name.

   .. versionchanged:: 2.0
      Return method changed from stdout.
      No branch now returns ``false`` and nothing instead of "no-branch".

.. function:: _lp_fossil_commit_id() -> var:lp_vcs_commit_id

   Returns the full commit hash of the current commit. The return code is not
   defined.

   .. versionadded:: 2.0

.. function:: _lp_fossil_head_status() -> var:lp_vcs_head_status

   Return ``true`` if the repository is in a special or unusual state. Return
   the special status.

   Does not return any extra details.

   .. versionadded:: 2.0

.. function:: _lp_fossil_stash_count() -> var:lp_vcs_stash_count

   Returns ``true`` if there are stashes the repository. Returns the
   number of stashes.

   .. versionadded:: 2.0

.. function:: _lp_fossil_uncommitted_files() -> var:lp_vcs_uncommitted_files

   Returns ``true`` if any uncommitted files exist in the repository. In other
   words, tracked files that contain uncommitted changes. Returns the number of
   uncommitted files.

   .. versionadded:: 2.0

.. function:: _lp_fossil_uncommitted_lines() -> var:lp_vcs_uncommitted_i_lines, var:lp_vcs_uncommitted_d_lines

   Returns ``true`` if any uncommitted lines exist in the repository. In other
   words, tracked files that contain uncommitted changes. Returns the number of
   uncommitted lines.

   .. versionadded:: 2.0

.. function:: _lp_fossil_untracked_files() -> var:lp_vcs_untracked_files

   Returns ``true`` if any untracked files exist in the repository. Returns the
   number of untracked files.

   .. versionadded:: 2.0

Note

Git does not support bookmarks.

.. function:: _lp_git_active()

   Returns ``true`` if Git is enabled in Liquid Prompt and the current directory
   is a valid Git repository. This check should be done before running any other
   ``_lp_git_*`` data functions if accessing the Git data functions directly
   instead of through the generic interface.

   Can be disabled by :attr:`LP_ENABLE_GIT`.

   .. versionadded:: 2.0

.. function:: _lp_git_branch() -> var:lp_vcs_branch

   Returns ``true`` if a branch is active in the repository. Returns the branch
   name.

   .. versionchanged:: 2.0
      Return method changed from stdout.
      No branch now returns ``false`` and nothing instead of commit ID.

.. function:: _lp_git_commit_id() -> var:lp_vcs_commit_id

   Returns the full commit hash of the current commit. The return code is not
   defined.

   .. versionadded:: 2.0

.. function:: _lp_git_commits_off_remote() -> var:lp_vcs_commit_ahead, var:lp_vcs_commit_behind

   Returns ``true`` if there are commits on the current branch that are not on
   the remote tracking branch, or commits on the remote tracking branch that are
   not on this branch. Returns ``1`` if there are no differing commits. Returns
   ``2`` if there is no matching remote tracking branch.

   Returns the number of commits behind and ahead.

   .. versionadded:: 2.0

.. function:: _lp_git_head_status() -> var:lp_vcs_head_status, var:lp_vcs_head_details

   Return ``true`` if the repository is in a special or unusual state. Return
   the special status, and any extra details (like progress in a rebase) if
   applicable.

   .. versionadded:: 2.0

.. function:: _lp_git_staged_files() -> var:lp_vcs_staged_files

   Returns ``true`` if any staged files exist in the repository. In other words,
   tracked files that contain staged changes. Returns the number of staged
   files.

   .. versionadded:: 2.0

.. function:: _lp_git_staged_lines() -> var:lp_vcs_staged_i_lines, var:lp_vcs_staged_d_lines

   Returns ``true`` if any staged lines exist in the repository. In other words,
   tracked files that contain staged changes. Returns the number of staged
   lines.

   .. versionadded:: 2.0

.. function:: _lp_git_stash_count() -> var:lp_vcs_stash_count

   Returns ``true`` if there are stashes the repository. Returns the
   number of stashes.

   .. versionadded:: 2.0

.. function:: _lp_git_tag() -> var:lp_vcs_tag

   Returns ``true`` if a tag is active in the repository. Returns the
   tag name.

   If multiple tags match, only one is returned. Which tag is selected is not
   defined.

   .. versionadded:: 2.0

.. function:: _lp_git_uncommitted_files() -> var:lp_vcs_uncommitted_files

   Returns ``true`` if any uncommitted files exist in the repository. In other
   words, tracked files that contain uncommitted changes. Returns the number of
   uncommitted files.

   .. versionadded:: 2.0

.. function:: _lp_git_uncommitted_lines() -> var:lp_vcs_uncommitted_i_lines, var:lp_vcs_uncommitted_d_lines

   Returns ``true`` if any uncommitted lines exist in the repository. In other
   words, tracked files that contain uncommitted changes. Returns the number of
   uncommitted lines.

   .. versionadded:: 2.0

.. function:: _lp_git_unstaged_files() -> var:lp_vcs_unstaged_files

   Returns ``true`` if any unstaged files exist in the repository. In other
   words, tracked files that contain unstaged changes. Returns the number of
   unstaged files.

   .. versionadded:: 2.0

.. function:: _lp_git_unstaged_lines() -> var:lp_vcs_unstaged_i_lines, var:lp_vcs_unstaged_d_lines

   Returns ``true`` if any unstaged lines exist in the repository. In other
   words, tracked files that contain unstaged changes. Returns the number of
   unstaged lines.

   .. versionadded:: 2.0

.. function:: _lp_git_untracked_files() -> var:lp_vcs_untracked_files

   Returns ``true`` if any untracked files exist in the repository. Returns the
   number of untracked files.

   .. versionadded:: 2.0

Note

Mercurial does not support a staging area.

Note

Mercurial remote tracking branches are disabled (see :func:`_lp_hg_commits_off_remote`).

.. function:: _lp_hg_active()

   Returns ``true`` if Mercurial is enabled in Liquid Prompt and the current
   directory is a valid Mercurial repository. This check should be done before
   running any other ``_lp_hg_*`` data functions if accessing the Mercurial data
   functions directly instead of through the generic interface.

   Can be disabled by :attr:`LP_ENABLE_HG`.

   .. versionadded:: 2.0

.. function:: _lp_hg_bookmark() -> var:lp_vcs_bookmark

   Returns ``true`` if a bookmark is active in the repository. Returns the
   bookmark name.

   Mercurial bookmarks work more like Git branches.

   .. versionadded:: 2.0

.. function:: _lp_hg_branch() -> var:lp_vcs_branch

   Returns ``true`` if a branch is active in the repository. Returns the branch
   name.

   All Mercurial commits have a branch, so this function should always return
   ``true``. A closer analog to Git branches are Mercurial bookmarks (see
   :func:`_lp_hg_bookmark`).

   .. versionchanged:: 2.0
      Return method changed from stdout.
      No branch now returns ``false``.

.. function:: _lp_hg_commit_id() -> var:lp_vcs_commit_id

   Returns the full global revision ID of the current commit. The return code is
   not defined.

   .. versionadded:: 2.0

.. function:: _lp_hg_commits_off_remote()

   Returns ``2`` (disabled).

   Mercurial does not keep a local copy of the remote state, so checking this
   will require a connection to the remote server. This means it is often
   prohibitively time expensive, and therefore should not be used in a prompt.
   See `issue #217`_.

   .. versionadded:: 2.0

   .. _`issue #217`: https://github.com/liquidprompt/liquidprompt/issues/217

.. function:: _lp_hg_head_status() -> var:lp_vcs_head_status

   Return ``true`` if the repository is in a special or unusual state. Return
   the special status.

   Does not return any extra details.

   This function depends on :func:`_lp_find_vcs` being run first to set
   ``lp_vcs_root``.

   .. versionadded:: 2.0

.. function:: _lp_hg_stash_count() -> var:lp_vcs_stash_count

   Returns ``true`` if there are shelves the repository. Returns the
   number of shelves.

   .. versionadded:: 2.0

.. function:: _lp_hg_tag() -> var:lp_vcs_tag

   Returns ``true`` if a tag is active in the repository. Returns the
   tag name.

   If multiple tags match, only one is returned. Which tag is selected is not
   defined.

   .. versionadded:: 2.0

.. function:: _lp_hg_uncommitted_files() -> var:lp_vcs_uncommitted_files

   Returns ``true`` if any uncommitted files exist in the repository. In other
   words, tracked files that contain uncommitted changes. Returns the number of
   uncommitted files.

   .. versionadded:: 2.0

.. function:: _lp_hg_uncommitted_lines() -> var:lp_vcs_uncommitted_i_lines, var:lp_vcs_uncommitted_d_lines

   Returns ``true`` if any uncommitted lines exist in the repository. In other
   words, tracked files that contain uncommitted changes. Returns the number of
   uncommitted lines.

   .. versionadded:: 2.0

.. function:: _lp_hg_untracked_files() -> var:lp_vcs_untracked_files

   Returns ``true`` if any untracked files exist in the repository. Returns the
   number of untracked files.

   .. versionadded:: 2.0

Note

Subversion does not support bookmarks.

Note

Subversion does not support a staging area.

Note

Subversion does not support stashes.

Note

Subversion does not have extra head statuses. A Subversion merge is no different than a manual file change, so the repository has no extra state to track.

Note

Subversion does not support remote tracking branches (as it is not a distributed version control system).

Note

Subversion does not support tags. What are generally agreed upon as being tags are internally branches. These are returned by :func:`_lp_svn_branch`.

.. function:: _lp_svn_active()

   Returns ``true`` if Subversion is enabled in Liquid Prompt and the current
   directory is a valid Subversion repository. This check should be done before
   running any other ``_lp_svn_*`` data functions if accessing the Subversion
   data functions directly instead of through the generic interface.

   Can be disabled by :attr:`LP_ENABLE_SVN`.

   .. versionadded:: 2.0

.. function:: _lp_svn_branch() -> var:lp_vcs_branch

   Returns ``true`` if a branch is active in the repository. Returns the branch
   name.

   Subversion "tags" are really branches under a "tag" directory. Tags are
   returned as their directory name, prefixed with "tag/".

   .. versionchanged:: 2.0
      Return method changed from stdout.
      No branch now returns ``false`` and nothing instead of the current
      directory.

.. function:: _lp_svn_commit_id() -> var:lp_vcs_commit_id

   Returns the revision number of the current commit. The return code is not
   defined.

   .. versionadded:: 2.0

.. function:: _lp_svn_uncommitted_files() -> var:lp_vcs_uncommitted_files

   Returns ``true`` if any uncommitted files exist in the repository. In other
   words, tracked files that contain uncommitted changes. Returns the number of
   uncommitted files.

   .. versionadded:: 2.0

.. function:: _lp_svn_uncommitted_lines() -> var:lp_vcs_uncommitted_i_lines, var:lp_vcs_uncommitted_d_lines

   Returns ``true`` if any uncommitted lines exist in the repository. In other
   words, tracked files that contain uncommitted changes. Returns the number of
   uncommitted lines.

   .. versionadded:: 2.0

.. function:: _lp_svn_untracked_files() -> var:lp_vcs_untracked_files

   Returns ``true`` if any untracked files exist in the repository. Returns the
   number of untracked files.

   .. versionadded:: 2.0