#gitlab 리뷰할 merge request를 org todo로 만들기
여전히 매일 동료가 어제 커밋한 코드를 읽고 있다. 읽는 단위는 바뀌었다. 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