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. --- bin/tissue | 1 + issues/index-commit-messages.gmi | 6 ++ tissue.scm | 16 +++-- tissue/commit.scm | 125 +++++++++++++++++++++++++++++++++++++++ tissue/web/server.scm | 5 +- 5 files changed, 147 insertions(+), 6 deletions(-) create mode 100644 tissue/commit.scm diff --git a/bin/tissue b/bin/tissue index fcb704f..6e82b5b 100755 --- a/bin/tissue +++ b/bin/tissue @@ -38,6 +38,7 @@ exec guile --no-auto-compile -s "$0" "$@" (git) (xapian wrap) (xapian xapian) + (tissue commit) (tissue document) (tissue git) (tissue issue) diff --git a/issues/index-commit-messages.gmi b/issues/index-commit-messages.gmi index 54ab253..5c5ad12 100644 --- a/issues/index-commit-messages.gmi +++ b/issues/index-commit-messages.gmi @@ -5,3 +5,9 @@ Currently, we only index issues and other documents. We could also index commit messages. If a project is in the habit of writing long detailed story-like commit messages, this feature could be very useful. I have always been frustrated by the lack of stemming when searching commit messages with git log --grep. If we can index commit messages, could we even index commit diffs and source files as well? Perhaps there is something about source code that makes it harder to index? + +## Resolution + +Commit messages are now indexed. We can revisit indexing commit diffs and source code later, if need be. + +* closed diff --git a/tissue.scm b/tissue.scm index 69dba6f..8bef7e7 100644 --- a/tissue.scm +++ b/tissue.scm @@ -1,10 +1,16 @@ (tissue-configuration #:project "tissue" - #:indexed-documents (map (lambda (filename) - (slot-set (read-gemtext-issue filename) - 'web-uri - (string-append "/" (string-remove-suffix ".gmi" filename)))) - (gemtext-files-in-directory "issues")) + #:indexed-documents (append (map (lambda (filename) + (slot-set (read-gemtext-issue filename) + 'web-uri + (string-append "/" (string-remove-suffix ".gmi" filename)))) + (gemtext-files-in-directory "issues")) + (map (lambda (commit) + (slot-set commit + 'web-uri + (string-append "https://git.systemreboot.net/tissue/commit/?id=" + (commit-hash commit)))) + (commits-in-current-repository))) #:web-files (cons (file "index.html" (skribe-exporter "website/index.skb")) (filter-map (lambda (filename) 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