let update_dir ?(recursive=true) dir =
  let temp_file = Filename.temp_file "ocamlcvs" "update" in
  let com = Printf.sprintf
    "cd %s ; cvs update %s -d %s > %s"
      (Filename.quote dir)
      !Ocvs_config.update_options
      (if recursive then "-R" else "-l")
      temp_file
  in
  let n = Sys.command com in
  if n = 0 then
    (
     let l = analyse_update_file temp_file in
     delete_file temp_file ;
     List.map
       (fun (f, action) -> (Filename.concat dir f, action))
       l
    )
  else
    (
     delete_file temp_file ;
     raise (Ocvs_types.CvsFailure (Ocvs_messages.error_exec com))
    )