summary refs log tree commit diff
path: root/emacs/custom/fcuny-git.el
blob: 5a2f1524d8b30ef118fed964bf60f4403d271927 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
(require 'fcuny-defuns)
(require 'fcuny-vars)

(use-package git-modes
  :ensure t
  :mode
  ("/\\.gitconfig\\'"    . gitconfig-mode)
  ("/\\.gitmodules\\'"   . gitconfig-mode)
  ("/\\.git/config\\'"   . gitconfig-mode)
  ("/\\.gitignore\\'"    . gitignore-mode)
  ("/.dockerignore\\'"   . gitignore-mode)
  ("/\\.gitattributes//" . gitattributes-mode))

(use-package magit
  :ensure t
  :after (flyspell)
  :bind (("C-x g" . magit-status))
  :custom
  (vc-follow-symlinks t)
  :custom
  (magit-completing-read-function 'ivy-completing-read))

(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))
  (auth-sources `(,(expand-file-name "authinfo.gpg" fcuny/path-emacs-etc)))
  :config
  (add-to-list 'forge-alist '("git.fcuny.net" "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.rbx.com/%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 '("github\\.rbx\\.com" fcuny/git-link-work-sourcegraph))
  (add-to-list 'git-link-commit-remote-alist '("github\\.rbx\\.com" 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)

(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)