;;; .doomrc --- doom runtime config -*- mode: emacs-lisp; lexical-binding: t; -*-
;;; Commentary:
;;; Code:
(require 'doom) ; be silent, byte-compiler

(after! doom-cli-ci
  ;;; Commit linter types
  (add-to-list 'doom-ci-commit-types 'module)
  (add-to-list 'doom-ci-commit-scopeless-types 'module)

  ;;; Commit linter scopes
  (add-to-list 'doom-ci-commit-scopes "cli")
  (add-to-list 'doom-ci-commit-scopes "lib")
  (add-to-list 'doom-ci-commit-scopes "docs")
  (add-to-list 'doom-ci-commit-scopes '(docs "install" ci-check-docs-scope))
  (add-to-list 'doom-ci-commit-scopes #'ci-check-module-scope)
  ;; DEPRECATED Will be removed once modules live in their own repo
  (add-to-list 'doom-ci-commit-scopes '(release "modules")))

(after! doom-cli-make
  ;;; Codeowners
  ;; I will be the default owner for everything in the repo unless a later match
  ;; takes precedence.
  (add-to-list 'doom-make-codeowners "# The default owner(s) unless another takes precedence")
  (add-to-list 'doom-make-codeowners '("*" . "@doomemacs/maintainers"))
  ;; Module maintainers (see https://git.doomemacs.org/teams)
  (add-to-list 'doom-make-codeowners "# Module maintainers")
  (save-match-data
    (setq doom-make-codeowners
          (nreverse
           (append doom-make-codeowners
                   (cl-sort
                    (cl-loop for path in (doom-module-load-path (list doom-modules-dir))
                             if (string-match "/modules/\\([^/]+\\)/\\([^/]+\\)$" path)
                             collect (cons (substring (match-string 0 path) 1)
                                           (format "@doomemacs/%s-%s"
                                                   (match-string 1 path)
                                                   (match-string 2 path))))
                    #'string-lessp :key #'car))))))

;;; Helpers
(defun ci-check-module-scope (scope _plist)
  "Only allow :CATEGORY or MODULE scopes if they actually exist."
  (doom-glob (dir!) "modules" (if (string-prefix-p ":" scope)
                                  (format "%s" (substring scope 1))
                                (format "*/%s" scope))))

(defun ci-check-docs-scope (scope _plist)
  "Allow any filename in docs/* as a scope for docs commits."
  (member
   scope (doom-files-in (doom-path (dir!) "../docs")
                        :match "\\.org$"
                        :map #'file-name-base)))

;;; .doomrc ends here
