Function: magit-toplevel
magit-toplevel is a byte-compiled function defined in magit-git.el.
Signature
(magit-toplevel &optional DIRECTORY)
Documentation
Return the absolute path to the toplevel of the current repository.
From within the working tree or control directory of a repository return the absolute path to the toplevel directory of the working tree. As a special case, from within a bare repository return the control directory instead. When called outside a repository then return nil.
When optional DIRECTORY is non-nil then return the toplevel for
that directory instead of the one for default-directory.
Try to respect the option find-file-visit-truename, i.e., when
the value of that option is nil, then avoid needlessly returning
the truename. When a symlink to a sub-directory of the working
tree is involved, or when called from within a sub-directory of
the gitdir or from the toplevel of a gitdir, which itself is not
located within the working tree, then it is not possible to avoid
returning the truename.
Source Code
;; Defined in ~/.emacs.d/elpa/magit-20260411.1452/magit-git.el
(defun magit-toplevel (&optional directory)
"Return the absolute path to the toplevel of the current repository.
From within the working tree or control directory of a repository
return the absolute path to the toplevel directory of the working
tree. As a special case, from within a bare repository return
the control directory instead. When called outside a repository
then return nil.
When optional DIRECTORY is non-nil then return the toplevel for
that directory instead of the one for `default-directory'.
Try to respect the option `find-file-visit-truename', i.e., when
the value of that option is nil, then avoid needlessly returning
the truename. When a symlink to a sub-directory of the working
tree is involved, or when called from within a sub-directory of
the gitdir or from the toplevel of a gitdir, which itself is not
located within the working tree, then it is not possible to avoid
returning the truename."
(magit--with-refresh-cache
(cons (or directory default-directory) 'magit-toplevel)
(magit--with-safe-default-directory directory
(cond-let*
([topdir (magit-rev-parse-safe "--show-toplevel")]
[topdir (magit-expand-git-file-name topdir)]
(cond-let*
(;; Always honor these settings.
[_(not find-file-visit-truename)]
[_(not (getenv "GIT_WORK_TREE"))]
;; `--show-cdup' is the relative path to the toplevel
;; from `(file-truename default-directory)'. Here we
;; pretend it is relative to `default-directory', and
;; go to that directory. Then we check whether
;; `--show-toplevel' still returns the same value and
;; whether `--show-cdup' now is the empty string. If
;; both is the case, then we are at the toplevel of
;; the same working tree, but also avoided needlessly
;; following any symlinks.
[updir (file-name-as-directory
(magit-rev-parse-safe "--show-cdup"))]
[updir (if (file-name-absolute-p updir)
(concat (file-remote-p default-directory) updir)
(expand-file-name updir))]
[updir->topdir
(let ((default-directory updir))
(and (string-equal (magit-rev-parse-safe "--show-cdup") "")
(magit-rev-parse-safe "--show-toplevel")))]
[_(string-equal (magit-expand-git-file-name updir->topdir) topdir)]
updir)
((concat (file-remote-p default-directory)
(file-name-as-directory topdir)))))
([gitdir (magit-rev-parse-safe "--git-dir")]
[gitdir (file-name-as-directory
(if (file-name-absolute-p gitdir)
;; We might have followed a symlink.
(concat (file-remote-p default-directory)
(magit-expand-git-file-name gitdir))
(expand-file-name gitdir)))]
(cond-let*
((magit-bare-repo-p) gitdir)
;; Return the linked working tree, if any.
([link (expand-file-name "gitdir" gitdir)]
[wtree (and (file-exists-p link)
(magit-file-line link))]
;; Ignore ".git/gitdir" files that result from a Git bug.
;; This has long been fixed, but old repository may still
;; exist that contain such a file. See #2364.
[_(not (equal wtree ".git"))]
(concat (file-remote-p default-directory)
(file-name-directory wtree)))
;; The working directory may not be the parent
;; directory of .git if it was set up with
;; "git init --separate-git-dir". See #2955.
((car (rassoc gitdir magit--separated-gitdirs)))
;; Step outside the control directory to enter the working tree.
((file-name-directory (directory-file-name gitdir)))))))))