[chronometrist] refactor OSM hook function

This commit is contained in:
contrapunctus 2021-08-03 05:34:05 +05:30
parent cd07480db8
commit 2e4814eb25
1 changed files with 46 additions and 41 deletions

View File

@ -653,6 +653,51 @@ Return nil (and run `magit-status') if the user answers no."
(defun my-make-osm-url (id)
(concat "https://www.openstreetmap.org/changeset/" id))
(defun my-get-saved-changeset-id (chronometrist-file)
(-let* (((&plist :changesets saved-changesets)
(chronometrist-loop-file for plist in chronometrist-file
when (equal "OSM" (plist-get plist :name))
return plist))
(((&plist :osm-url last-url)) (last saved-changesets)))
(when last-url
(last (split-string last-url "/")))))
(defun my-save-osm-changeset-details ()
"Save OSM changeset details in `chronometrist-file'."
(request
"https://api.openstreetmap.org/api/0.6/changesets"
:params '(("display_name" . "contrapunctus"))
:parser (lambda () (libxml-parse-xml-region (point) (point-max)))
:success
(cl-function
(lambda (&key data &allow-other-keys)
(-let* ((last-id (my-get-saved-changeset-id chronometrist-file))
(response-changesets (esxml-node-children data))
(new-changesets
(if last-id
(cl-loop with id
for changeset in response-changesets do
(setq id (alist-get
'id (esxml-node-attributes changeset)))
if (equal id last-id)
return (reverse changesets)
else collect
(list
:osm-url
(my-make-osm-url id)
:osm-comment
(my-get-changeset-comment changeset)) into changesets)
;; no changeset information in file - just use
;; the latest changeset from the response
(let* ((changeset (first response-changes))
(id (alist-get 'id (esxml-node-attributes changeset)))
(comment (my-get-changeset-comment changeset)))
`((:osm-url ,(my-make-osm-url id)
:osm-comment ,comment))))))
(chronometrist-sexp-replace-last
(chronometrist-plist-update
(chronometrist-last) `(:changesets ,new-changesets))))))))
(defun contrapunctus-after-project-stop (project)
(pcase project
("OSM"
@ -662,47 +707,7 @@ Return nil (and run `magit-status') if the user answers no."
;; minutes. When connected, request the changesets, look for the
;; first changeset with a "created_at" which is less than the
;; clock-out time.
(request
"https://api.openstreetmap.org/api/0.6/changesets"
:params '(("display_name" . "contrapunctus"))
:parser (lambda () (libxml-parse-xml-region (point) (point-max)))
:success
(cl-function
(lambda (&key data &allow-other-keys)
(-let* (((&plist :changesets saved-changesets)
(chronometrist-loop-file for plist in chronometrist-file
when (equal "OSM" (plist-get plist :name))
return plist))
(((&plist :osm-url last-url))
(last saved-changesets))
((last-id)
(when last-url
(last (split-string last-url "/"))))
(response-changesets (esxml-node-children data))
(new-changesets
(if last-id
(cl-loop with id
for changeset in response-changesets do
(setq id (alist-get
'id (esxml-node-attributes changeset)))
if (equal id last-id)
return (reverse changesets)
else collect
(list
:osm-url
(my-make-osm-url id)
:osm-comment
(my-get-changeset-comment changeset)) into changesets)
;; no changeset information in file - just use
;; the latest changeset from the response
(let* ((changeset (first response-changes))
(id (alist-get 'id (esxml-node-attributes changeset)))
(comment (my-get-changeset-comment changeset)))
`((:osm-url ,(my-make-osm-url id)
:osm-comment ,comment))))))
(chronometrist-sexp-replace-last
(chronometrist-plist-update
(chronometrist-last) `(:changesets ,new-changesets))))))))
(my-save-osm-changeset-details))
(_ (delete-other-windows))))
#+END_SRC