Changeset 15439 in project


Ignore:
Timestamp:
08/13/09 18:49:44 (10 years ago)
Author:
sjamaan
Message:

Implement handling of conflicts

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

Legend:

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

    r15437 r15439  
    3939  (qwiki-repos-uri qwiki-repos-username qwiki-repos-password
    4040   get-history call-with-input-revision checkout-sources! update-sources!
    41    store-changes!)
     41   store-changes! undo-changes!)
    4242
    4343(import chicken scheme)
     
    8484
    8585(define (update-sources! source-path)
    86   (svn-update (qwiki-repos-uri) source-path svn-opt-revision-head
    87               (qwiki-repos-username) (qwiki-repos-password)))
     86  (if (and (file-exists? source-path)
     87           (not (directory? source-path)))
     88      (update-sources! (pathname-directory source-path))
     89      (svn-update (qwiki-repos-uri) source-path svn-opt-revision-head
     90                  (qwiki-repos-username) (qwiki-repos-password))))
    8891
    8992(define (store-changes! source-path message username password)
    90   (let* ((user (or username (qwiki-repos-username)))
    91          (pass (or password (qwiki-repos-password)))
    92          (get-info
    93           (lambda (path)
    94             (let ((info '()))
    95               (svn-client-info path
    96                                svn-opt-revision-unspecified
    97                                svn-opt-revision-unspecified
    98                                (lambda (path i) (set! info (cons i info)))
    99                                #f user pass)
    100               (and (not (null? info)) (car info))))))
    101    (let loop ((source-path source-path))
    102      (if (get-info source-path)
    103          (svn-commit source-path user pass message)
    104          (begin
    105            (loop (pathname-directory source-path)) ; Add parent dirs if needed
    106            (svn-add source-path user pass)
    107            (svn-commit source-path user pass message))))))
     93  (or
     94   (let* ((user (or username (qwiki-repos-username)))
     95          (pass (or password (qwiki-repos-password)))
     96          (get-info
     97           (lambda (path)
     98             (let ((info '()))
     99               (svn-client-info path
     100                                svn-opt-revision-unspecified
     101                                svn-opt-revision-unspecified
     102                                (lambda (path i) (set! info (cons i info)))
     103                                #f user pass)
     104               (and (not (null? info)) (car info))))))
     105     (let loop ((source-path source-path))
     106       (if (get-info source-path)
     107           (svn-commit source-path user pass message)
     108           (begin
     109             (loop (pathname-directory source-path)) ; Add parent dirs if needed
     110             (svn-add source-path user pass)
     111             (svn-commit source-path user pass message)))))
     112   (error "Could not store changes")))
     113
     114(define (undo-changes! source-path)
     115  (svn-client-revert (list source-path) #t
     116                     (qwiki-repos-username)
     117                     (qwiki-repos-password)))
    108118
    109119)
  • release/4/qwiki/trunk/qwiki.scm

    r15437 r15439  
    143143         ;; it can be extended by plugins.  The names of the buttons are
    144144         ;; pretty much tied to the code though
    145          (content (qwiki-sxml-page-template
    146                    `(
    147                      ,(if (alist-ref 'preview postdata)
    148                           `(div (@ (class "preview"))
    149                                 (h2 "Preview")
    150                                 ,(wiki-parse source))
    151                           "")
    152                      (p "username: " ,username " password: " ,password " auth: " ,auth)
    153                      (form (@ (method "post"))
    154                            (label "Article contents:"
    155                                   (textarea (@ (name "source"))
    156                                             ,source))
    157                            (label "Description of your changes:"
    158                                   (textarea (@ (name "comment"))
    159                                             ,comment))
    160                            (label "I would like to authenticate"
    161                                   (input (@ (type "checkbox")
    162                                             (name "auth")
    163                                             ,@(if auth
    164                                                   '((checked "checked"))
    165                                                   '()))))
    166                            (label "Username:"
    167                                   (input (@ (type "text")
    168                                             (name "username")
    169                                             (value ,username))))
    170                            (label "Password:"
    171                                   (input (@ (type "password")
    172                                             (name "password")
    173                                             (value ,password))))
    174                            (input (@ (type "submit")
    175                                      (name "save")
    176                                      (value "Save")))
    177                            (input (@ (type "submit")
    178                                      (name "preview")
    179                                      (value "Preview"))))))))
     145         (make-form
     146          (lambda (#!optional message)
     147            (qwiki-sxml-page-template
     148             `(,(if (alist-ref 'preview postdata)
     149                    `(div (@ (class "preview"))
     150                          (h2 "Preview")
     151                          ,(wiki-parse source))
     152                    "")
     153               ,(if message
     154                    `(div (@ class "message") ,message)
     155                    "")
     156               (p "username: " ,username " password: " ,password " auth: " ,auth)
     157               (form (@ (method "post"))
     158                     (label "Article contents:"
     159                            (textarea (@ (name "source"))
     160                                      ,source))
     161                     (label "Description of your changes:"
     162                            (textarea (@ (name "comment"))
     163                                      ,comment))
     164                     (label "I would like to authenticate"
     165                            (input (@ (type "checkbox")
     166                                      (name "auth")
     167                                      ,@(if auth
     168                                            '((checked "checked"))
     169                                            '()))))
     170                     (label "Username:"
     171                            (input (@ (type "text")
     172                                      (name "username")
     173                                      (value ,username))))
     174                     (label "Password:"
     175                            (input (@ (type "password")
     176                                      (name "password")
     177                                      (value ,password))))
     178                     (input (@ (type "submit")
     179                               (name "save")
     180                               (value "Save")))
     181                     (input (@ (type "submit")
     182                               (name "preview")
     183                               (value "Preview")))))))))
    180184    (if (alist-ref 'save postdata)
    181185        (begin
    182186          (with-output-to-path source-file (lambda () (display source)))
    183           (store-changes! source-file comment
    184                           (and auth username) (and auth password))
    185           (redirect-to-qwiki-page req action: "show"))
    186         (send-content content))))
     187          (handle-exceptions exn
     188            (begin
     189              (undo-changes! source-file)
     190              (update-sources! source-file)
     191              (send-content (make-form (conc "Warning! Someone has edited this page while you were editing it. You can click save again to overwrite those changes with yours if this is the case."
     192                                             (if auth
     193                                                 " It is also possible your username/password are incorrect."
     194                                                 "")))))
     195            (store-changes! source-file comment
     196                            (and auth username) (and auth password))
     197            (redirect-to-qwiki-page req action: "show")))
     198        (send-content (make-form)))))
    187199
    188200(define (redirect-to-qwiki-page req
Note: See TracChangeset for help on using the changeset viewer.