(require 'fcuny-defuns) (require 'fcuny-vars) (use-package gitconfig-mode :ensure t) (use-package gitattributes-mode :ensure t) (use-package gitignore-mode :ensure t) (use-package magit :ensure t :after (flyspell) :bind (("C-x g" . magit-status)) :custom (vc-follow-symlinks t) :config ;; if we're on darwin, we're on a work laptop, so let's make sure we ;; use the proper `git' binary. (when (string= system-type "darwin") (setq magit-git-executable "/opt/twitter_mde/bin/git")) ;; I want to see these things by default (add-to-list 'magit-section-initial-visibility-alist '(untracked . show)) (add-to-list 'magit-section-initial-visibility-alist '(unstaged . show)) (add-to-list 'magit-section-initial-visibility-alist '(unpulled . show)) (add-to-list 'magit-section-initial-visibility-alist '(unpushed . show)) (add-to-list 'magit-section-initial-visibility-alist '(stashes . show)) ;; no need to show the last 10 commits, 5 is enough. (setq magit-log-section-commit-count 5) ;; when working with source, some of the hooks are extremely ;; expensive and don't add much values (i.e tags). Let's reduce the ;; list to things that are actually useful. This still takes ~10 ;; seconds when running `magit-status'. (setq git-commit-setup-hook '(git-commit-save-message git-commit-turn-on-auto-fill git-commit-turn-on-flyspell git-commit-propertize-diff with-editor-usage-message)) (setq magit-refs-sections-hook '(magit-insert-error-header magit-insert-branch-description magit-insert-local-branches)) (setq magit-status-sections-hook '(magit-insert-status-headers magit-insert-merge-log magit-insert-rebase-sequence magit-insert-am-sequence magit-insert-sequencer-sequence magit-insert-untracked-files magit-insert-unstaged-changes magit-insert-staged-changes magit-insert-stashes)) (setq magit-status-headers-hook '(magit-insert-error-header magit-insert-diff-filter-header magit-insert-head-branch-header))) (use-package magit-repos :ensure nil :after (magit) :custom (magit-repository-directories '(("~/workspace" . 1)))) (use-package git-commit :ensure t :after magit :hook (git-commit-mode . fcuny/git-commit-auto-fill) :custom (git-commit-summary-max-length 50) :preface (defun fcuny/git-commit-auto-fill () "Ensures that the commit body does not exceed 72 characters." (setq-local fill-column 72) (setq-local comment-auto-fill-only-comments nil))) (use-package forge :ensure t :after (magit) :custom (forge-database-file (expand-file-name "forge-database-file.sqlite" fcuny/path-emacs-var)) :config (add-to-list 'forge-alist '("git.fcuny.net:222" "git.fcuny.net/api/v1" "git.fcuny.net" forge-gitea-repository))) (use-package git-link :ensure t :after magit :bind (("C-c g l" . git-link) ("C-c g a" . git-link-commit)) :config (defun fcuny/get-sg-remote-from-hostname (hostname) (format "sourcegraph.twitter.biz/%s" hostname)) (defun fcuny/git-link-work-sourcegraph (hostname dirname filename _branch commit start end) ;;; For a given repository, build the proper link for sourcegraph. ;;; Use the default branch of the repository instead of the ;;; current one (we might be on a feature branch that is not ;;; available on the remote). (require 'magit-branch) (let ((sg-base-url (fcuny/get-sg-remote-from-hostname hostname)) (main-branch (magit-main-branch))) (git-link-sourcegraph sg-base-url dirname filename main-branch commit start end))) (defun fcuny/git-link-commit-work-sourcegraph (hostname dirname commit) (let ((sg-base-url (fcuny/get-sg-remote-from-hostname hostname))) (git-link-commit-sourcegraph sg-base-url dirname commit))) ;; for work related repositories, open them in our instance of sourcegraph (add-to-list 'git-link-remote-alist '("twitter" fcuny/git-link-work-sourcegraph)) (add-to-list 'git-link-commit-remote-alist '("twitter" fcuny/git-link-commit-work-sourcegraph)) ;; for personal code I use gitea, which is similar to codeberg (add-to-list 'git-link-remote-alist '("git\\.fcuny\\.net" git-link-codeberg)) (add-to-list 'git-link-commit-remote-alist '("git\\.fcuny\\.net" git-link-commit-codeberg)) (setq git-link-open-in-browser 't)) ;; https://magit.vc/manual/magit/Per_002dRepository-Configuration.html ;; we don't want to refresh buffers in source. This should help with ;; performances. (dir-locals-set-class-variables 'huge-git-repository '((nil . ((magit-refresh-buffers . nil))))) (dir-locals-set-directory-class "/Users/fcuny/workspace/source" 'huge-git-repository) ;; https://magit.vc/manual/magit/Performance.html ;; disable Git from the VC mode, since we use magit. This should help ;; with performances. (setq vc-handled-backends (delq 'Git vc-handled-backends)) (defun fcuny/clone-repo (url) "Clone a repository in the workspace" (interactive "sURL:") (let* ((repo-name (magit-clone--url-to-name url)) (target-dir (concat fcuny/path-workspace "/" repo-name))) (magit-clone-regular url target-dir nil))) (provide 'fcuny-git)