                               (get-chrome-root))
         nil))))
 
-(defun trybot-fixup ()
+(defun trybot-fixup-win ()
+  "Fix up Windows-specific output."
+
+  ; Fix Windows paths ("d:\...\src\").
+  (save-excursion
+    (while (re-search-forward "\\(^.:\\\\.*\\\\src\\\\\\)\\(.*?\\)[(:]" nil t)
+      (replace-match "" nil t nil 1)
+      ; Line now looks like:
+      ;  foo\bar\baz.cc error message here
+      ; We want to fixup backslashes in path into forward slashes,
+      ; without modifying the error message - by matching up to the
+      ; first colon above (which will be just beyond the end of the
+      ; filename) we can use the end of the match as a limit.
+      (subst-char-in-region (point) (match-end 0) ?\\ ?/)
+      ; See if we can correct the file name casing.
+      (let ((filename (buffer-substring (match-beginning 2) (match-end 2))))
+        (if (and (not (file-exists-p filename))
+                 (setq filename (case-corrected-filename filename)))
+            (replace-match filename t t nil 2))))))
+
+(defun trybot-fixup-maclin ()
+  "Fix up Mac/Linux output."
+  (save-excursion
+    (while (re-search-forward "^/b/build/[^ ]*/src/" nil t)
+      (replace-match ""))))
+
+(defun trybot-fixup (type-hint)
   "Parse and fixup the contents of the current buffer as trybot output."
+
+  ; XXX is there something I should so so this stuff doesn't end up on the
+  ; undo stack?
 
   ;; Fixup paths.
   (cd (get-chrome-root))
 
+  (goto-char (point-min))
+
   ;; Fix up path references.
-  ; XXX is there something I should so so this stuff doesn't end up on the
-  ; undo stack?
-  (goto-char (point-min))
-  ; Fix Windows paths ("d:\...\src\").
-  (while (re-search-forward "\\(^.:\\\\.*\\\\src\\\\\\)\\(.*?\\)[(:]" nil t)
-    (replace-match "" nil t nil 1)
-    ; Line now looks like:
-    ;  foo\bar\baz.cc error message here
-    ; We want to fixup backslashes in path into forward slashes, without
-    ; modifying the error message - by matching up to the first colon above
-    ; (which will be just beyond the end of the filename) we can use the end of
-    ; the match as a limit.
-    (subst-char-in-region (point) (match-end 0) ?\\ ?/)
-    ; See if we can correct the file name casing.
-    (let ((filename (buffer-substring (match-beginning 2) (match-end 2))))
-      (if (and (not (file-exists-p filename))
-               (setq filename (case-corrected-filename filename)))
-          (replace-match filename t t nil 2))))
+  (cond ((eq type-hint 'win) (trybot-fixup-win))
+        ((eq type-hint 'mac) (trybot-fixup-maclin))
+        ((eq type-hint 'linux) (trybot-fixup-maclin))
+        (t (trybot-fixup-win) (trybot-fixup-maclin)))
 
-  ; Fix Linux/Mac paths ("/b/build/.../src/").
-  (goto-char (point-min))
-  (while (re-search-forward "^/b/build/[^ ]*/src/" nil t)
-    (replace-match ""))
-
-  ;; Clean up and switch into compilation mode.
-  (goto-char (point-min))
   (compilation-mode))
 
-(defun trybot-test (filename)
+(defun trybot-test (type-hint filename)
   "Load the given test data filename and do the trybot parse on it."
 
   (switch-to-buffer (get-buffer-create "*trybot-test*"))

    (insert-file-contents
       (concat (get-chrome-root) "tools/emacs/" filename))

    (trybot-fixup)))

(defun trybot-test-win ()
  "Load the Windows test data and do the trybot parse on it."
  (interactive)
  (trybot-test "trybot-windows.txt"))
(defun trybot-test-mac ()
  "Load the Mac test data and do the trybot parse on it."
  (interactive)
  (trybot-test "trybot-mac.txt"))
(defun trybot-test-linux ()
  "Load the Linux test data and do the trybot parse on it."
  (interactive)
  (trybot-test "trybot-linux.txt"))

(defun trybot (url)
  "Fetch a trybot URL and fix up the output into a compilation-mode buffer."

  ;; Extract the body out of the URL.
  ; TODO: delete HTTP headers somehow.
  (let ((inhibit-read-only t)
        (coding-system-for-read 'utf-8-dos)
        (type-hint (cond ((string-match "/win/" url) 'win)
                         ((string-match "/mac/" url) 'mac)
                         ; Match /linux, /linux_view, etc.
                         ((string-match "/linux" url) 'linux)
                         (t 'unknown))))
    (switch-to-buffer (get-buffer-create "*trybot*"))
    (buffer-swap-text (url-retrieve-synchronously url))

    (trybot-fixup type-hint)))

(provide 'trybot)
