/ftp/pub/users/ronald/proyectos/rcs-gopher/RCS/rcs-gopher_gophernicus.scm,v --> standard output revision 1.9 ;;; PENDIENTE ;; - Funci??n para generar diffs a partir del nombre de un proyecto, de un archivo y dos revisiones. ;; Para hacer esto, modificar o utilizar de base la funci??n rcs-revisiones y obtener-selector-de-revisi??n. ;; - Funci??n para generar el men?? de revisiones para elegir la primera revisi??n. ;; - Funci??n para generar el men?? de revisiones para elegir la segunda revisi??n y mostrar el diff. ;; - Funci??n para consultar el mensaje de Log de una revisi??n de un archivo perteneciente a un proyecto. YA ;; - Funci??n para generar la p??gina principal de un proyecto de rcs-gopher. CASI ;; - Funci??n para generar la p??gina principal de una colecci??n de proyectos de rcs-gopher. (use-modules (ice-9 rdelim) (ice-9 ftw) (ice-9 popen)) (define *host* "sdf.org") (define *puerto* "70") (define *proyectos* '("rcs-gopher")) ;(define *directorio-base-de-proyectos* "/ftp/pub/users/ronald/proyectos-rcs/") (define *directorio-base-de-proyectos* "proyectos/") (define *ruta-base-cgi-bin* "/users/ronald/cgi-bin/") (define *nombre-del-script-de-rcs-gopher* "rcs-gopher.sh") (define (error-en-men??-gopher mensaje) (simple-format #t "3~A\tERROR\tERROR\t70\n" mensaje)) (define (error-en-archivo mensaje) (simple-format #t "ERROR\n=====\n\n- ~A\n" mensaje)) (define (destabulizar cadena) (string-join (string-split cadena #\Tab) " ")) (define (host-y-puerto) (simple-format #f "~A\t~A" *host* *puerto*)) (define (obtener-ruta-de-archivo nombre-de-proyecto archivo) (simple-format #f "~A~A/RCS/~A,v" *directorio-base-de-proyectos* nombre-de-proyecto archivo)) (define (obtener-selector-de-revisi??n secci??n nombre-de-proyecto archivo revisi??n-a revisi??n-b) (if (null? revisi??n-b) (simple-format #f "~A~A?~A/~A/~A/~A" *ruta-base-cgi-bin* *nombre-del-script-de-rcs-gopher* secci??n nombre-de-proyecto revisi??n-a archivo) (simple-format #f "~A~A?~A/~A/~A/~A/~A" *ruta-base-cgi-bin* *nombre-del-script-de-rcs-gopher* secci??n nombre-de-proyecto revisi??n-a revisi??n-b archivo))) (define (rcs-??ltima-revisi??n nombre-de-proyecto archivo) (simple-format #t "0~A\t~A\t~A\n" archivo (obtener-selector-de-revisi??n "revs" nombre-de-proyecto archivo "ULT" #nil) (host-y-puerto))) (define (obtener-selector-men??-secci??n secci??n nombre-de-proyecto) (simple-format #f "~A~A?~A/~A" *ruta-base-cgi-bin* *nombre-del-script-de-rcs-gopher* secci??n nombre-de-proyecto)) (define (obtener-n??mero-de-revisi??n texto) ;(list-ref (string-split (list-ref (string-split l??nea #\Tab) 0) #\Space) 1))))) (list-ref (string-split (list-ref (string-split texto #\Tab) 0) #\Space) 1)) (define (rcs-revisiones nombre archivo) (if (and (member nombre *proyectos*) (access? (obtener-ruta-de-archivo nombre archivo) R_OK)) (let ((puerto (open-pipe* OPEN_READ "rlog" (obtener-ruta-de-archivo nombre archivo))) (l??nea "")) (while ((lambda () (set! l??nea (read-line puerto)) (not (eof-object? l??nea)))) (if (string-prefix? "revision" l??nea) (simple-format #t "~A~A\t~A\tsdf.org\t70\n" "0" (string-titlecase (destabulizar l??nea)) (obtener-selector-de-revisi??n "revs" nombre archivo (obtener-n??mero-de-revisi??n l??nea) #nil))))) (error-en-men??-gopher "No existe este proyecto o archivo."))) (define (rcs-ver-revisi??n nombre archivo revisi??n) (if (and (member nombre *proyectos*) (access? (obtener-ruta-de-archivo nombre archivo) R_OK)) (let ((puerto (open-pipe* OPEN_READ "co" (simple-format #f "-p~A" (if (string= revisi??n "ULT") "" revisi??n)) (obtener-ruta-de-archivo nombre archivo))) (l??nea "")) (while ((lambda () (set! l??nea (read-line puerto)) (not (eof-object? l??nea)))) (simple-format #t "~A\n" l??nea))) (error-en-archivo "No existe este proyecto o archivo."))) (define (rcs-ver-log nombre archivo revisi??n) (if (and (member nombre *proyectos*) (access? (obtener-ruta-de-archivo nombre archivo) R_OK)) (let ((puerto (open-pipe* OPEN_READ "rlog" (simple-format #f "-r~A" (if (string= revisi??n "ULT") "" revisi??n)) (obtener-ruta-de-archivo nombre archivo))) (l??nea "")) (while ((lambda () (set! l??nea (read-line puerto)) (not (eof-object? l??nea)))) (simple-format #t "~A\n" l??nea))) (error-en-archivo "No existe este proyecto o archivo."))) (define (generar-entradas-comunes nombre) (for-each (lambda (nombre selector) (simple-format #t "1~A\t~A\t~A\n" nombre selector (host-y-puerto))) (list nombre "Revisiones" "Diffs" "Logs") (list (obtener-selector-men??-secci??n "inicio" nombre) (obtener-selector-men??-secci??n "revs" nombre) (obtener-selector-men??-secci??n "diffs" nombre) (obtener-selector-men??-secci??n "logs" nombre)))) (define (generar-entradas-por-archivo nombre) (let ((directorio-proyecto (simple-format #f "~A~A/RCS" *directorio-base-de-proyectos* nombre))) (for-each (lambda (archivo) (if (string-suffix? ",v" archivo) (rcs-??ltima-revisi??n nombre (string-trim-right archivo (char-set #\, #\v))))) (scandir directorio-proyecto)))) (define (rcs-men??-principal-proyecto nombre) (if (and (member nombre *proyectos*) (access? (obtener-ruta-de-archivo nombre "") R_OK)) (begin (generar-entradas-comunes nombre) (generar-entradas-por-archivo nombre)) (error-en-men??-gopher "No existe este proyecto o archivo."))) (rcs-ver-revisi??n "rcs-gopher" "rcs-gopher_gophernicus.scm" "1.2") (rcs-ver-log "rcs-gopher" "rcs-gopher_gophernicus.scm" "1.2") (rcs-revisiones "rcs-gopher" "rcs-gopher_gophernicus.scm") (generar-entradas-comunes "rcs-gopher") (generar-entradas-por-archivo "rcs-gopher")