gitlab 상태를 휴가로 바꾸는 emacs lisp 대화형(interactive) 함수

1 minute read

휴가일 때, slack status:palm_tree: 휴가 로 바꾸고 있다. 멘션을 하려고 아이디를 타이핑하다 보면 휴가 상태가 바로 보여서 압박감을 준다. 진짜 급한 일이 아니면 휴가 중에 멘션을 받지 않는 좋은 효과가 있어서 휴가를 쓰면 꼭 설정한다.

gitlab에도 현재 상태를 설정할 수 있는 기능이 있다. 휴가인지 아닌지 해당 팀원의 slack 상태를 보는 게 암묵적인 룰이긴 한데, gitlab에도 휴가 중인 걸 세팅할 수 있다면 팀원이 편할 것 같아서 세팅하기 시작했다.

slack, gitlab 따로 휴가를 세팅하고 복귀하면 풀어주고를 해야 한다. 이걸 한 번에 할 수 있는 방법을 찾아봤다. 결론부터 말하면 gitlab은 성공했고 slack은 실패했다. slack은 users.profile.set API를 사용하면 되는데, user 레벨 토큰이 필요하다. 그 말은 봇을 만든다면 user 별로 활성화해야 한다. 휴가 설정 하나 때문에 봇을 만들고 워크스페이스에 입장까지 시켜야 한다. 너무 번거롭다.

gitlab은 사용자 토큰으로 /user/status REST API를 사용하면 손쉽게 설정할 수 있다. slack과 다르게 템플릿이 없어서 :palm_tree: 이모지를 세팅하고 상태를 적을 수 있는 텍스트 박스에 휴가 를 적어야 한다. slack이랑 gitlab을 한 번에 변경하는 건 힘들지만 gitlab이라도 하자면서 작업을 했다.

curl을 호출하는 bash 스크립트를 만들까? 노노 emacs lisp로 짜면 되는데, 왜 그러나요.

(use-package request)

emacs lisp HTTP 라이브러리인 emacs-request를 설치했다.

(defun my-gitlab-status-vacation ()
  (interactive)
  (my-gitlab--set-status "palm_tree" "휴가")
  )

(defun my-gitlab-status-clear ()
  (interactive)
  (my-gitlab--set-status "" "")
  )

(defun my-gitlab--set-status (emoji message)
  (when (not (boundp 'gitlab-api-url)) (throw 'gitlab-api-url "not bound")) #<--- 1
  (when (not (boundp 'gitlab-private-key)) (throw 'gitlab-private-key "not bound")) <#--- 2
  (request
    (format "%s/user/status?private_token=%s" gitlab-api-url gitlab-private-key)
    :type "PUT"
    :data (json-encode `(("emoji" . ,emoji) ("message" . ,message)))
    :headers '(("Content-Type" . "application/json"))
    :sync t
    :parser 'json-read
    :encoding 'utf-8
    :complete (cl-function
                (lambda (&key response &allow-other-keys)
                   (message "Done: %s" (request-response-status-code response)))))
  )

emacs 기본 라이브러리를 사용하면 속 터지는데 emacs-request 라이브러리는 엄청 편하다. 휴가 상태를 설정하는 my-gitlab-status-vacation 함수와 업무로 복귀한 후 상태를 지우는 my-gitlab-status-clear 함수를 대화형(interactive) 함수로 등록했다. gitlab-api-url 변수와 gitlab-private-key 변수는 버전 컨트롤하지 않고 로컬에만 저장한다. 그래서 1번 코드와 2번 코드로 설정을 안 했을 때, 빠르게 실패하게 한다.

M-x my-gitlab-status-vacation

다음날이 휴가면 이 함수를 호출하고

M-x my-gitlab-status-clear

출근하면 이 함수를 호출한다.

emacs lisp 함수를 호출해 slack과 gitlab을 한 방에 변경하는 게 목표였는데, gitlab만 성공했다. 휴가 설정을 gitlab에서 하는 게 조금이라도 더 편해져서 만족한다.

C-x C-s C-x C-c