summary refs log tree commit diff
diff options
context:
space:
mode:
-rwxr-xr-xbin/tissue19
-rw-r--r--tissue/issue.scm85
2 files changed, 47 insertions, 57 deletions
diff --git a/bin/tissue b/bin/tissue
index 63b5682..94ab5d6 100755
--- a/bin/tissue
+++ b/bin/tissue
@@ -93,14 +93,6 @@ to run tissue."
   (match (command-line)
     ((program _ ...) program)))
 
-(define (print-document document)
-  "Print DOCUMENT, an <issue> or <document> object."
-  ((cond
-    ((issue? document) print-issue)
-    ((doc:document? document) doc:print-document)
-    (else (raise (unknown-document-type-violation document))))
-   document))
-
 (define (print-issue issue)
   "Print ISSUE."
   (let ((number-of-posts (length (issue-posts issue))))
@@ -174,6 +166,14 @@ to run tissue."
     (newline)
     (newline)))
 
+(define (print-document document)
+  "Print DOCUMENT, an <issue> or <document> object."
+  ((cond
+    ((issue? document) print-issue)
+    ((doc:document? document) doc:print-document)
+    (else (raise (unknown-document-type-violation document))))
+   document))
+
 (define (alist->document alist)
   "Convert ALIST to an <issue> or <document> object."
   ((case (assq-ref alist 'type)
@@ -396,8 +396,7 @@ DB."
                 (exit #f)))
        (call-with-current-directory (git-top-level)
          (lambda ()
-           (parameterize ((%issue-files (tissue-configuration-issue-files (load-config)))
-                          (%aliases (tissue-configuration-aliases (load-config))))
+           (parameterize ((%aliases (tissue-configuration-aliases (load-config))))
              ;; Create hidden tissue directory unless it exists.
              (unless (file-exists? %state-directory)
                (mkdir %state-directory))
diff --git a/tissue/issue.scm b/tissue/issue.scm
index c68be9a..cbf4551 100644
--- a/tissue/issue.scm
+++ b/tissue/issue.scm
@@ -31,8 +31,7 @@
   #:use-module (xapian xapian)
   #:use-module (tissue git)
   #:use-module (tissue utils)
-  #:export (%issue-files
-            %aliases
+  #:export (%aliases
             issue
             issue?
             issue-file
@@ -56,11 +55,9 @@
             post->alist
             alist->post
             issues
+            read-gemtext-issue
             index-issue))
 
-(define %issue-files
-  (make-parameter #f))
-
 (define %aliases
   (make-parameter #f))
 
@@ -276,49 +273,43 @@ in (tissue tissue). If no alias is found, NAME is returned as such."
                           port))))
     result))
 
-(define issues
+(define file-modification-table-for-current-repository
   (memoize-thunk
-   (lambda ()
-     "Return a list of all issues, sorted oldest first."
-     ;; Get all gemini files except README.gmi and hidden files. Text
-     ;; editors tend to create hidden files while editing, and we want to
-     ;; avoid them.
-     (let ((file-modification-table (file-modification-table (current-git-repository))))
-       (sort (filter-map (lambda (file)
-                           (let* ((file-details (file-details file))
-                                  ;; Downcase keywords to make them
-                                  ;; case-insensitive.
-                                  (all-keywords (map string-downcase
-                                                     (hashtable-ref file-details 'keywords '())))
-                                  (commits (hashtable-ref file-modification-table file #f))
-                                  (commit-authors (map (lambda (commit)
-                                                         (resolve-alias (signature-name (commit-author commit))
-                                                                        (%aliases)))
-                                                       commits)))
-                             (issue file
-                                    ;; Fallback to filename if title has no alphabetic
-                                    ;; characters.
-                                    (let ((title (hashtable-ref file-details 'title "")))
-                                      (if (string-any char-set:letter title) title file))
-                                    (first commit-authors)
-                                    (commit-date (first commits))
-                                    (last commit-authors)
-                                    (commit-date (last commits))
-                                    (hashtable-ref file-details 'assigned '())
-                                    ;; "closed" is a special keyword to indicate
-                                    ;; the open/closed status of an issue.
-                                    (delete "closed" all-keywords)
-                                    (not (member "closed" all-keywords))
-                                    (hashtable-ref file-details 'tasks 0)
-                                    (hashtable-ref file-details 'completed-tasks 0)
-                                    (map (lambda (commit author)
-                                           (post author (commit-date commit)))
-                                         commits
-                                         commit-authors))))
-                         (%issue-files))
-             (lambda (issue1 issue2)
-               (time<? (date->time-monotonic (issue-created-date issue1))
-                       (date->time-monotonic (issue-created-date issue2)))))))))
+   (cut file-modification-table (current-git-repository))))
+
+(define (read-gemtext-issue file)
+  "Read issue from gemtext FILE. Return an <issue> object."
+  (let* ((file-details (file-details file))
+         ;; Downcase keywords to make them
+         ;; case-insensitive.
+         (all-keywords (map string-downcase
+                            (hashtable-ref file-details 'keywords '())))
+         (commits (hashtable-ref (file-modification-table-for-current-repository)
+                                 file #f))
+         (commit-authors (map (lambda (commit)
+                                (resolve-alias (signature-name (commit-author commit))
+                                               (%aliases)))
+                              commits)))
+    (issue file
+           ;; Fallback to filename if title has no alphabetic
+           ;; characters.
+           (let ((title (hashtable-ref file-details 'title "")))
+             (if (string-any char-set:letter title) title file))
+           (first commit-authors)
+           (commit-date (first commits))
+           (last commit-authors)
+           (commit-date (last commits))
+           (hashtable-ref file-details 'assigned '())
+           ;; "closed" is a special keyword to indicate
+           ;; the open/closed status of an issue.
+           (delete "closed" all-keywords)
+           (not (member "closed" all-keywords))
+           (hashtable-ref file-details 'tasks 0)
+           (hashtable-ref file-details 'completed-tasks 0)
+           (map (lambda (commit author)
+                  (post author (commit-date commit)))
+                commits
+                commit-authors))))
 
 (define (index-person term-generator name prefix)
   "Index all aliases of person of canonical NAME using TERM-GENERATOR