#gitlab merge request를 org todo로 만들기

/emacsian/assets/2018-04-02-convert-gitlab-merge-requests-to-org-todo-00.gif

여전히 매일 동료가 어제 커밋한 코드를 읽고 있다. 읽는 단위는 바뀌었다. gitlab에선 커밋 단위보다 merge request 단위로 읽어야 덩어리 분리가 잘 된다. 매일 직접 웹페이지를 방문해서 merge한 날짜를 확인해서 읽을 범위를 정하곤 했다. 어디까지 읽었지? 헷갈릴까 봐 새 창으로 잔뜩 띄어놓고 지우면서 merge request를 읽었다. 콩알만한 탭 크기를 보며 생각했다. 이게 뭐 하는 짓이람. 매일 하는 일이니 시간 좀 투자하기로 했다.

(defun merge-requests-updated-url (begin-date end-date)
  (let ((before (format "%sT00:00:00.000%%2B09:00" end-date))
        (after (format "%sT00:00:00.000%%2B09:00" begin-date))
        (options "order_by=updated_at&state=merged&scope=all&per_page=100"))
    (format "%s/merge_requests?%s&updated_after=%s&updated_before=%s&private_token=%s"
            gitlab-api-base-url
            options
            after
            before
            gitlab-private-key)))

Merge requests API 호출 URL을 만드는 함수다. updated_after, updated_before 인자가 작동 안 해서 삽질 좀 했다. “내가 뭘 잘못했겠지.” 잘 모르는 분야니 처음부터 끝까지 날 의심한다. 기능을 구현한 <Resolve “API support for selecting only updated issues before/after a given date”> merge request까지 찾아갔다. 내가 뭘 잘못하고 있는지 확인하려고. 마일스톤에 10.6 버전이 적혀있네. 회사에서 쓰고 있는 버전은 10.5.x. 버전 업을 하니 언제 애 먹였냐는 듯이 잘 동작한다. API에 동작 버전이 없는 게 약점이다. updated_after 인자는 10.6 버전부터 동작. 이런 게 안 보인다.

100개가 넘으면 어떡하지? per_page=100 이렇게 처리하고 말았다. 나중에 100개 넘으면 그때 고민한다.

(defun merge-request-ids-updated (begin-date end-date)
  (let ((ids '())
        (json-array-type 'list)
        (url (merge-requests-updated-url begin-date end-date)))
    (with-temp-buffer
      (url-insert-file-contents url)
      (let* ((json-key-type 'string)
             (content (json-read)))
        (dolist (merge-request content)
          (dolist (element merge-request)
            (when (string= (car element) "iid")
              (add-to-list 'ids (cdr element)))))))
    ids))

Merge requests API 응답에서 merge request id를 뽑는다. id만 있으면 <#gitlab issue 또는 merge request의 링크와 제목 삽입하기> 글에서 만든 함수를 사용할 수 있다.

(defun insert-gitlab-mrs-range ()
  (interactive)
  (let* ((begin-date (org-read-date))
         (end-date (org-read-date))
         (ids (merge-request-ids-updated begin-date end-date)))
    (dolist (id ids)
      (insert "*** TODO ")
      (insert-gitlab-mr id)
      (insert "\n"))))

입력한 날짜 사이에 업데이트한 merge request를 org todo로 추가한다. org-read-date 함수를 호출하면 calendar로 날짜 입력을 할 수 있다.

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


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


Published: April 02 2018


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