analyze-gnome-dvcs.scm 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #!/usr/bin/env guile
  2. !#
  3. (use-modules (charting) (charting csv) (ice-9 match))
  4. (define data
  5. (match (program-arguments)
  6. ((_ csv-file)
  7. (csv-port->row-list (open-input-file csv-file)))
  8. ((prog . _)
  9. (format (current-error-port) "usage: ~a CSV-FILE\n" prog)
  10. (exit 1))))
  11. (define (row->flags row)
  12. (let lp ((res 0) (i (1- (vector-length row))))
  13. (cond ((negative? i) res)
  14. ((string=? (vector-ref row i) "Y")
  15. (lp (logior (ash 1 i) res) (1- i)))
  16. (else (lp res (1- i))))))
  17. ;; partial schema
  18. (define KNOWS-BZR 5)
  19. (define KNOWS-GIT 6)
  20. (define KNOWS-HG 7)
  21. (define USES-BZR 8)
  22. (define USES-GIT 9)
  23. (define USES-HG 10)
  24. (define FAVORITE 14)
  25. (define (flag . flags)
  26. (apply logior (map (lambda (n) (ash 1 n)) flags)))
  27. (define KNOWS-MASK (flag KNOWS-BZR KNOWS-GIT KNOWS-HG))
  28. (define USES-MASK (flag USES-BZR USES-GIT USES-HG))
  29. (define history
  30. `(("bzr" ,KNOWS-BZR ,USES-BZR)
  31. ("git" ,KNOWS-GIT ,USES-GIT)
  32. ("hg" ,KNOWS-HG ,USES-HG)))
  33. (define (join set)
  34. (list (string-join (map car set) "+")
  35. (apply flag (map cadr set))
  36. (apply flag (map caddr set))))
  37. (define (permute l)
  38. (cond ((null? l) '())
  39. ((null? (cdr l)) (list l))
  40. (else
  41. (let ((rest (permute (cdr l))))
  42. (append (cons (list (car l))
  43. (map (lambda (x) (cons (car l) x)) rest))
  44. rest)))))
  45. (define permutations (map join (permute history)))
  46. (define (fav=? what)
  47. (lambda (row) (string=? (vector-ref row FAVORITE) what)))
  48. (define (row-has-flags row flags mask)
  49. (= (logand (row->flags row) mask) flags))
  50. (define (fav->matches favs accessor mask prefix)
  51. (map (lambda (p)
  52. (list (length (filter (lambda (row)
  53. (row-has-flags row (accessor p) mask))
  54. favs))
  55. (string-append prefix (car p))))
  56. permutations))
  57. (define (do-favorite1 vcs)
  58. (cons vcs (fav->matches (filter (fav=? vcs) data) cadr KNOWS-MASK "familiar with ")))
  59. (define (do-favorite2 vcs)
  60. (cons vcs (fav->matches (filter (fav=? vcs) data) caddr USES-MASK "regularly uses ")))
  61. (define (dochart title data output)
  62. ((@ (charting draw) reset-colors!))
  63. (make-bar-chart title data
  64. (map do-favorite1 '("bzr" "git" "hg" "svn"))
  65. #:bar-width 15
  66. #:group-spacing 25
  67. #:max-y 240
  68. #:chart-params '(#:x-axis-label "favorite vcs"
  69. #:y-axis-label "number of respondents")
  70. #:ytick-label-formatter
  71. (lambda (v) (format #f "~d" (inexact->exact (floor v))))
  72. #:bar-value-formatter
  73. (lambda (v) (format #f "~d" (inexact->exact (floor v))))
  74. #:write-to-png output))
  75. (dochart "version control systems: familiarity and preference"
  76. (map do-favorite1 '("bzr" "git" "hg" "svn"))
  77. "favorite-by-known.png")
  78. (dochart "version control systems: usage and preference"
  79. (map do-favorite2 '("bzr" "git" "hg" "svn"))
  80. "favorite-by-used.png")