#gitlab issue 또는 merge request의 링크와 제목 삽입하기

/emacsian/assets/2018-03-11-elisp-gitlab-inserting-links-and-titles-in-an-issue-or-a-merge-request-00.gif

위키로 Confluence를 사용하고 있다. gitlab 안에서는 #, ! 문자를 앞에 붙이면 자동으로 링크를 만들어 주는데, 밖이라 직접 링크를 만들어야 한다. confluence wiki markup으로 익스포트(export)하면 되니깐 org markup으로 작성하면 된다.

(defun parse-title (url)
  (let ((title ""))
    (with-temp-buffer
      (url-insert-file-contents url)
      (let* ((json-key-type 'string)
             (content (json-read)))
        (dolist (element content)
          (when (string= (car element) "title")
            (setq title (cdr element))))))
    title))

응답(response)에서 제목(title)을 골라낸다. url-retrieve-synchronously 함수를 처음에 사용했다. header까지 있네. 필요 없는데, 어떻게 골라내나 찾았다. body만 삽입하는 url-insert-file-contents 함수가 있네. 귀찮은 일 안 해도 된다. json으로 변환 후 title을 찾았다.

(defun insert-gitlab-issue-link (id)
  (interactive "nissue id: ")
  (insert (format "[[%s/issues/%d][#%d]]" gitlab-base-url id id)))

issue 링크만 삽입할 일도 많아서 함수로 분리했다. insert 함수는 현재 버퍼에 텍스트를 추가한다. interactive 함수에 넘긴 “nissue id: ” 인자엔 사용자 입력을 받을 타입이 같이 있다. 바로 n 문자. 숫자를 입력받는다는 말이다. 유저가 입력한 숫자가 insert-gitlab-issue-link 함수 id 인자로 넘어온다.

(defun insert-gitlab-issue (id)
  (interactive "nissue id: ")
  (insert-gitlab-issue-link id)
  (let ((url (format "%s/issues/%d?private_token=%s"
                     gitlab-api-base-url
                     id
                     gitlab-private-key)))
    (insert (format " %s" (parse-title url)))))

issue 링크를 삽입하고 gitlab issue api를 사용해 얻은 제목을 추가한다.

편하다. 이런 것하고 나면 항상 드는 생각이 있다. “진작 할걸”

전체 코드는 github.com/ohyecloudy/dotfiles 참고

참고

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

크리에이티브 커먼즈 라이선스

Published: March 11 2018


Feedback plz <3 @ohyecloudy, ohyecloudy@gmail.com