monotone-debian
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Monotone-debian] Bug#574562: monotone-viz incompatible with monotone ve


From: Francis Russell
Subject: [Monotone-debian] Bug#574562: monotone-viz incompatible with monotone version in unstable
Date: Sun, 04 Apr 2010 21:57:03 +0100
User-agent: Mozilla-Thunderbird 2.0.0.22 (X11/20090707)

reopen 574562
thanks

I'm reopening this as upstream release 1.0.2 isn't compatible with the
current version of monotone. A version that works with 0.46 onwards is
only available in the net.venge.monotone-viz.new-stdio branch
(http://cia.vc/stats/project/monotone-viz) and forks off from 1.0.2.
Revision 142b487d0b2cc5e24e17998407f7921f2372ea3c in the net-stdio
branch is available from the monotone-viz repo. However, this still
doesn't work quite correctly without a patch I was sent from Stéphane
Gimenez (author of the new-stdio changes) after I found problems with
that revision (included earlier in this bug report).

To simplify things, I've included a patch against 1.0.2-1 that
incorporates both the changes from the new-stdio branch, and what I was
sent from Stéphane Gimenez. They only affect the file automate.ml.

Francis
--- monotone-viz-1.0.2/automate.ml      2007-05-13 18:07:38.000000000 +0100
+++ monotone-viz-1.0.2.new-stdio/automate.ml    2010-04-04 21:40:28.000000000 
+0100
@@ -44,7 +44,7 @@
   | `OUTPUT       of string
   | `ERROR        of string
   | `SYNTAX_ERROR of string]
-type chunk = command_id * int * bool * string
+type chunk = command_id * bool * string
 type process = {
     p_in  :  in_watch ;
     p_out : out_watch ;
@@ -152,7 +152,7 @@
     try 
       match Giochannel.read_chars w.out_w.w_chan w.out_sb with
       | `NORMAL read ->
-         if debug then log "%s cb: read %d" w.out_w.w_name read ;
+         if debug then log "%s cb: read %d" w.out_w.w_name read;
          Buffer.add_substring w.out_buffer w.out_sb 0 read ;
          w.out_cb w.out_buffer
       | `EOF ->
@@ -258,8 +258,8 @@
 
 
 
-let find_four_colon b =
-  let to_find = ref 4 in
+let find_three_colon b =
+  let to_find = ref 3 in
   let i = ref 0 in
   while !to_find > 0 do
     let c = Buffer.nth b !i in
@@ -277,22 +277,20 @@
 
 let decode_stdio_chunk b =
   try
-    let header_len = find_four_colon b in
+    let header_len = find_three_colon b in
     let h = Buffer.sub b 0 header_len in
     let c1 = String.index_from h 0 ':' in
     let number = int_of_string (string_slice ~e:c1 h) in
-    let code   = int_of_char h.[c1 + 1] - int_of_char '0' in
     let c2 = String.index_from h (c1 + 1) ':' in
-    let last   = h.[c2 + 1] in
+    let last   = h.[c1 + 1] in
     let c3 = String.index_from h (c2 + 1) ':' in
-    let c4 = String.index_from h (c3 + 1) ':' in
-    let len   = int_of_string (string_slice ~s:(c3 + 1) ~e:c4 h) in
+    let len   = int_of_string (string_slice ~s:(c2 + 1) ~e:c3 h) in
     if Buffer.length b < header_len + len
     then
       `INCOMPLETE
     else
       let data = truncate_buffer b header_len len in
-      `CHUNK (number, code, last = 'l', data)
+      `CHUNK (number, last = 'l', data)
   with Invalid_argument _ ->
     `INCOMPLETE
 
@@ -305,11 +303,11 @@
   | `INCOMPLETE ->
       ()
 
-  | `CHUNK (nb, _, _, _) when aborted_cmd p nb ->
+  | `CHUNK (nb, _, _) when aborted_cmd p nb ->
       p.chunks <- List.remove_assoc nb p.chunks ;
       out_cb p b
 
-  | `CHUNK ((nb, code, false, data) as chunk) ->
+  | `CHUNK ((nb, false, data) as chunk) ->
       if debug then log "decoded a chunk" ;
       let previous_chunks =
        try List.assoc nb p.chunks
@@ -320,7 +318,7 @@
       previous_chunks := chunk :: !previous_chunks ;
       out_cb p b
 
-  | `CHUNK ((nb, code, true, data) as chunk) ->
+  | `CHUNK ((nb, true, data) as chunk) ->
       if debug then log "decoded last chunk" ;
       let chunks =
        try 
@@ -333,14 +331,14 @@
       p.callbacks <- List.remove_assoc nb p.callbacks ;
       let msg = 
        String.concat ""
-         (List.map (fun (_, _, _, d) -> d) chunks) in
-      let data =
-       match code with
-       | 0 -> `OUTPUT msg
-       | 1 -> `SYNTAX_ERROR msg
-       | 2 -> `ERROR msg
+         (List.map (function (_, false, d) -> d | (_, true, d) -> "") chunks) 
in
+      let code =
+       match data with
+       | "0" -> `OUTPUT msg
+       | "1" -> `SYNTAX_ERROR msg
+       | "2" -> `ERROR msg
        | _ -> failwith "invalid_code in automate stdio output" in
-      ignore (Glib.Idle.add ~prio:0 (fun () -> cb data ; false)) ;
+      ignore (Glib.Idle.add ~prio:0 (fun () -> cb code ; false)) ;
       out_cb p b
 
 
@@ -409,6 +407,20 @@
       chunks = [] ;
       exit_cb = (fun _ -> assert false)
     } in
+  let rec check_version buf =
+    if String.contains buf '\n' then
+      String.length buf >= 18 && String.sub buf 0 18 = "format-version: 2\n"
+    else
+      match Giochannel.read_chars p.p_out.out_w.w_chan p.p_out.out_sb  with
+      | `NORMAL read -> check_version (buf ^ String.sub p.p_out.out_sb 0 read)
+      | `EOF ->
+         Giochannel.shutdown p.p_out.out_w.w_chan false;
+         Giochannel.shutdown p.p_err.out_w.w_chan false;
+         failwith "mtn version 0.46 or above is required";
+      | `AGAIN -> check_version buf
+  in
+  if not (check_version "")
+  then failwith "mtn stdio uses an unknown format-version";
   let pid = some child.Gspawn.pid in
   ignore (Gspawn.add_child_watch ~prio:50 pid (reap_cb p pid)) ;
   p.p_out.out_cb <- out_cb p ;

reply via email to

[Prev in Thread] Current Thread [Next in Thread]