Changeset 33983 in project


Ignore:
Timestamp:
04/16/17 15:21:51 (6 weeks ago)
Author:
sjamaan
Message:

qwiki: Add (very bare bones) diffing option to history page.

This just delegates the diffing to svn-diff and uses colorize to
highlight the unified context diff output and any other stuff that
svn decides to put in there.

Hey, at least it's better than no diff ;)

Location:
release/4/qwiki/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • release/4/qwiki/trunk/qwiki-svn.scm

    r33970 r33983  
    3636(module qwiki-svn
    3737  (qwiki-repos-uri qwiki-repos-username qwiki-repos-password
    38    get-history call-with-input-revision checkout-sources! update-sources!
    39    store-changes! undo-changes! get-extended-property get-last-modified-revision)
     38   get-history call-with-input-revision call-with-input-changeset
     39   checkout-sources! update-sources! store-changes! undo-changes!
     40   get-extended-property get-last-modified-revision)
    4041
    4142(import chicken scheme)
     
    7071         history)))
    7172
    72 (define (call-with-input-revision file rev proc)
    73   (let ((filename (svn-client-cat
    74                     file (make-svn-opt-revision-number rev)
    75                     (qwiki-repos-username) (qwiki-repos-password))))
    76     (unless filename (error "No such file" file))
    77     (handle-exceptions exn
     73(define (call-with-file-to-remove filename proc)
     74  (handle-exceptions exn
    7875      (begin
    7976        (delete-file* filename)
    8077        (signal exn))
    81       (let ((result (call-with-input-file filename
    82                       (lambda (f)
    83                         (handle-exceptions exn
     78    (let ((result (call-with-input-file filename
     79                    (lambda (f)
     80                      (handle-exceptions exn
    8481                          (begin (close-input-port f) (signal exn))
    85                           (proc f))))))
    86         (delete-file* filename)
    87         result))))
     82                        (proc f))))))
     83      (delete-file* filename)
     84      result)))
     85
     86(define (call-with-input-revision file rev proc)
     87  (let ((filename (svn-client-cat
     88                   file (make-svn-opt-revision-number rev)
     89                   (qwiki-repos-username) (qwiki-repos-password))))
     90    (unless filename (error "No such file" file))
     91    (call-with-file-to-remove filename proc)))
     92
     93;; This basically implements "svn diff -r<rev1>:<rev2>"
     94(define (call-with-input-changeset source-path file rev1 rev2 proc)
     95  (let ((filename (svn-diff file
     96                            (make-svn-opt-revision-number rev1)
     97                            (make-svn-opt-revision-number rev2)
     98                            source-path #t
     99                            (qwiki-repos-username)
     100                            (qwiki-repos-password))))
     101    (unless filename (error "No such file" file))
     102    (call-with-file-to-remove filename proc)))
    88103
    89104(define (checkout-sources! source-path)
  • release/4/qwiki/trunk/qwiki-sxml.scm

    r33356 r33983  
    22;; qwiki-sxml - SXML rules and tools for qwiki
    33;;
    4 ;; Copyright (c) 2009-2016 Peter Bex and Ivan Raikov
     4;; Copyright (c) 2009-2017 Peter Bex and Ivan Raikov
    55;;
    66;;  Redistribution and use in source and binary forms, with or without
     
    109109     (history
    110110      *macro*
    111       . ,(lambda (tag items)
    112            `(table
    113              (tr (th "revision")
    114                  (th "author")
    115                  (th "date")
    116                  (th "description"))
    117              ,@(map (lambda (item)
    118                       ;; TODO: The nofollow should really apply to the
    119                       ;; entire page instead of each individual link.
    120                       `(tr (td (a (@ (rel "nofollow")
    121                                      (href ,(string-append
    122                                              "?action=show&rev="
    123                                              (number->string (car item)))))
    124                                   ,(car item)))
    125                            (td ,(cadr item))
    126                            (td ,(time->string (caddr item)))
    127                            (td ,(cadddr item))))
    128                     items))))
     111      . ,(lambda (tag elements)
     112           (let ((path (car elements))
     113                 (form-url (cadr elements))
     114                 (action (caddr elements))
     115                 (items (cdddr elements)))
     116             `(div
     117               (h3 "Edit history for page: " ,path)
     118               (form (@ (method "get") (action ,form-url))
     119                     (input (@ (type "hidden") (name "action")
     120                               (value ,action)))
     121                     (table
     122                      (tr (th "revision")
     123                          (th "author")
     124                          (th "date")
     125                          (th "description")
     126                          (th "r1")
     127                          (th "r2"))
     128                      ,@(map (lambda (item)
     129                               ;; TODO: The nofollow should really apply
     130                               ;; to the entire page instead of each
     131                               ;; individual link.
     132                               `(tr (td (a (@ (rel "nofollow")
     133                                              (href ,(string-append
     134                                                      "?action=show&rev="
     135                                                      (number->string (car item)))))
     136                                           ,(car item)))
     137                                    (td ,(cadr item))
     138                                    (td ,(time->string (caddr item)))
     139                                    (td ,(cadddr item))
     140                                    (td (input (@ (type "radio")
     141                                                  (name "rev1")
     142                                                  (value ,(car item)))))
     143                                    (td (input (@ (type "radio")
     144                                                  (name "rev2")
     145                                                  (value ,(car item)))))))
     146                             items))
     147                     (input (@ (type "submit")
     148                               (value "show diff between selected revisions"))))))))
     149
     150     (diff
     151      *macro*
     152      . ,(lambda (tag elems)
     153           ;; diff-language is a bit weird, but consistent with what
     154           ;; we would emit in a highlight block.
     155           (let* ((classname "highlight diff-language diff-page")
     156                  (diff (handle-exceptions exn elems
     157                          (map (lambda (s)
     158                                 (cdr (html->sxml (html-colorize 'diff s))))
     159                               elems))))
     160             `(pre (@ (class ,classname)) . ,diff))))
    129161
    130162     (wiki-content
  • release/4/qwiki/trunk/qwiki.meta

    r33973 r33983  
    33((synopsis "qwiki - the quick wiki")
    44 (depends (intarweb "1.0") (uri-common "1.0") (spiffy "5.1") (doctype "1.2")
    5           (sxml-transforms "1.4") (svn-client "0.21") estraier-client
     5          (sxml-transforms "1.4") (svn-client "0.23") estraier-client
    66          sxpath (message-digest "3.0.0") (sha1 "3.0.0") (svnwiki-sxml 0.2.1)
    77          html-parser colorize)
  • release/4/qwiki/trunk/qwiki.scm

    r32896 r33983  
    271271              (history (get-history source-file rev #f)) ; no pagination yet
    272272              (content (qwiki-sxml-page-template
    273                         `(history . ,history)
     273                        `(history ,(string-join path "/")
     274                                  "" "diff" ,@history)
    274275                        ;; We could determine the current title by parsing
    275276                        ;; the wiki page. That would be a bit wasteful though...
     
    278279                                          (string-join path "/")))
    279280                        (if (frozen? source-file) '(read-only) '(read-write)))))
     281          (send-content content)))))
     282
     283(define (qwiki-diff path req)
     284  (let ((root-path (path->source-filename '()))
     285        (source-file (path->source-filename path)))
     286    (if (not (file-exists? source-file))
     287        (redirect-to-qwiki-page req)    ; Default action
     288        (let* ((rev1 (string->number
     289                      (alist-ref 'rev1 (uri-query (request-uri req)) eq? "")))
     290               (rev2 (string->number
     291                      (alist-ref 'rev2 (uri-query (request-uri req)) eq? "")))
     292               (diff (call-with-input-changeset
     293                      root-path source-file rev1 rev2
     294                      (lambda (p) (read-string #f p))))
     295               (content (qwiki-sxml-page-template
     296                         `(diff ,(if (string=? "" diff)
     297                                     "No changes found in selected range"
     298                                     diff))
     299                         ;; We could determine the current title by parsing
     300                         ;; the wiki page. That would be a bit wasteful though...
     301                         ;; Perhaps read out svnwiki:title instead?
     302                         `(title ,(sprintf "Diff between revisions ~A and ~A for page: ~A"
     303                                    rev1 rev2 (string-join path "/")))
     304                         (if (frozen? source-file) '(read-only) '(read-write)))))
    280305          (send-content content)))))
    281306
     
    615640   `((edit    . ,qwiki-edit)
    616641     (show    . ,qwiki-show)
     642     (diff    . ,qwiki-diff)
    617643     (history . ,qwiki-history))))
    618644
Note: See TracChangeset for help on using the changeset viewer.