(* COCANWIKI - a wiki written in Objective CAML.
* Written by Richard W.M. Jones <rich@merjis.com>.
* Copyright (C) 2004 Merjis Ltd.
- * $Id: cocanwiki_diff.ml,v 1.1 2004/10/21 11:42:05 rich Exp $
+ * $Id: cocanwiki_diff.ml,v 1.3 2004/11/01 12:57:53 rich Exp $
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
open Printf
open Cocanwiki_files
+open Cocanwiki
(* Convenience code for generating diffs between versions. See diff.ml
* and edit.ml which both use this code.
content ^ "\n\n") sections)) ^
"CSS:\n\n" ^ css
+let le_re = Pcre.regexp "\r?\n"
+let le_subst = Pcre.subst "\n"
+
let diff_cmd old_page new_page =
+ (* Convert line-endings in the input files from \r\n to \n. Diff
+ * can get confused by the \r characters, particularly in side-by-side
+ * mode when asked to expand tabs (-y -t).
+ *)
+ let f = Pcre.replace ~rex:le_re ~itempl:le_subst in
+ let new_page = f new_page in
+ let old_page = f old_page in
+
let new_filename = output_tempfile new_page in
let old_filename = output_tempfile old_page in
- let cmd = sprintf "diff -u %s %s ||:" old_filename new_filename in
+ (* Side-by-side mode was good, but stupidly implemented. It's
+ * disabled right now.
+ *)
+ let diff_sidebyside = false in
+
+ let options =
+ if not diff_sidebyside then
+ "-u"
+ else
+ "-y --left-column" in
+ let options = options ^ " -t -b -B" in
+
+ let cmd = sprintf "diff %s %s %s ||:" options old_filename new_filename in
let diff = pget cmd in
+ (* Remove the temporary files. *)
+ unlink new_filename; unlink old_filename;
+
let diff =
- match diff with
- _ :: _ :: diff -> diff
- | diff -> diff in
+ if not diff_sidebyside then
+ match diff with
+ _ :: _ :: diff -> diff
+ | diff -> diff
+ else diff in
- unlink new_filename; unlink old_filename;
String.concat "\n" diff
let get_version_for_diff (dbh : Dbi.connection) version =
page
)
-let get_diff (dbh : Dbi.connection) hostid page ?old_version ~version () =
+let get_diff (dbh : Dbi.connection) hostid page ?old_version ~version ()=
let old_version =
match old_version with
| Some version -> version