From fc8cf0ed8a5bd1507865df888a37ac5e90a46416 Mon Sep 17 00:00:00 2001 From: Arun Isaac Date: Sat, 9 Jul 2022 16:38:46 +0530 Subject: commit: Index commit messages too. * tissue/commit.scm: New file. * tissue/web/server.scm (%css)[.search-result-commit]: Add COMMIT marker. * bin/tissue: Import (tissue commit). * tissue.scm (#:indexed-documents): Add commits. * issues/index-commit-messages.gmi: Close issue. --- tissue/commit.scm | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++ tissue/web/server.scm | 5 +- 2 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 tissue/commit.scm (limited to 'tissue') diff --git a/tissue/commit.scm b/tissue/commit.scm new file mode 100644 index 0000000..2ff6553 --- /dev/null +++ b/tissue/commit.scm @@ -0,0 +1,125 @@ +;;; tissue --- Text based issue tracker +;;; Copyright © 2022 Arun Isaac +;;; +;;; This file is part of tissue. +;;; +;;; tissue is free software: you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation, either version 3 of the License, or +;;; (at your option) any later version. +;;; +;;; tissue is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;;; General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with tissue. If not, see . + +(define-module (tissue commit) + #:use-module (oop goops) + #:use-module (term ansi-color) + #:use-module (git) + #:use-module (tissue document) + #:use-module (tissue git) + #:use-module (tissue person) + #:use-module (tissue utils) + #:export ( + commit-hash + doc:commit-author + doc:commit-author-date + commits-in-current-repository)) + +(define-class () + (hash #:getter commit-hash #:init-keyword #:hash) + ;; We prefix commit-author and commit-author-date with doc: in order + ;; to not conflict with similarly named functions from (git) and + ;; (tissue git). + (author #:getter doc:commit-author #:init-keyword #:author) + (author-date #:getter doc:commit-author-date #:init-keyword #:author-date)) + +(define-method (document-id-term (commit )) + "Return the ID term for DOCUMENT." + (string-append "Qcommit." (commit-hash commit))) + +(define-method (document-term-generator (commit )) + "Return a term generator indexing COMMIT." + (let ((term-generator (next-method))) + (index-person! term-generator (doc:commit-author commit) "A") + term-generator)) + +(define-method (document-snippet-source-text (commit )) + "Return the source text for COMMIT from which to extract a search +result snippet." + (commit-body + (commit-lookup (current-git-repository) + (string->oid (commit-hash commit))))) + +(define-method (document-text (commit )) + "Return the full text of COMMIT." + (commit-message + (commit-lookup (current-git-repository) + (string->oid (commit-hash commit))))) + +(define-method (print (commit ) mset port) + "Print COMMIT, a object, to PORT as part of command-line +search results. MSET is the xapian MSet object representing a list of +search results." + (display (colorize-string (document-title commit) 'MAGENTA 'UNDERLINE) + port) + (newline port) + (display (colorize-string "COMMIT" 'BOLD 'YELLOW) + port) + (display " " port) + (display (colorize-string (commit-hash commit) 'YELLOW) + port) + (newline port) + (display (string-append + "authored " + (colorize-string (human-date-string (doc:commit-author-date commit)) 'CYAN) + " by " + (colorize-string (doc:commit-author commit) 'CYAN)) + port) + (newline port) + (let ((snippet (document-snippet commit mset))) + (unless (string-null? snippet) + (display snippet port) + (newline port) + (newline port)))) + +(define-method (document->sxml (commit ) mset) + "Render COMMIT, a object, to SXML. MSET is the xapian MSet +object representing a list of search results." + `(li (@ (class ,(string-append "search-result search-result-commit"))) + (a (@ (href ,(document-web-uri commit)) + (class "search-result-title")) + ,(document-title commit)) + (div (@ (class "search-result-metadata")) + ,(string-append + (format #f "authored ~a by ~a" + (human-date-string (doc:commit-author-date commit)) + (doc:commit-author commit)))) + ,@(let ((snippet (document-sxml-snippet commit mset))) + (if snippet + (list `(div (@ (class "search-result-snippet")) + ,@snippet)) + (list))))) + +(define (repository-commits repository) + "Return a list of objects representing commits in +REPOSITORY." + (fold-commits (lambda (commit result) + (cons (make + #:title (commit-summary commit) + #:hash (oid->string (commit-id commit)) + #:author (resolve-alias (signature-name (commit-author commit)) + (%aliases)) + #:author-date (commit-author-date commit)) + result)) + (list) + repository)) + +(define (commits-in-current-repository) + "Return a list of objects representing commits in current +repository." + (repository-commits (current-git-repository))) diff --git a/tissue/web/server.scm b/tissue/web/server.scm index 6b6f088..39d63e2 100644 --- a/tissue/web/server.scm +++ b/tissue/web/server.scm @@ -70,7 +70,9 @@ form { text-align: center; } font-size: larger; } .search-result-title, .search-result-title:before { vertical-align: middle; } -.search-result-document .search-result-title:before, .search-result-issue .search-result-metadata:before { +.search-result-commit .search-result-metadata:before, +.search-result-document .search-result-title:before, +.search-result-issue .search-result-metadata:before { font-size: xx-small; font-weight: bold; margin: 0 0.2em; @@ -78,6 +80,7 @@ form { text-align: center; } background-color: darkmagenta; color: white; } +.search-result-commit .search-result-metadata:before { content: \"COMMIT\"; } .search-result-document .search-result-title:before { content: \"DOC\"; } .search-result-open-issue .search-result-metadata:before { content: \"ISSUE\"; -- cgit v1.2.3