let status_file file =
  let dir = Filename.dirname file in
  let f = Filename.basename file in
  let temp_file = Filename.temp_file "ocamlcvs" "status" in
  let com = Printf.sprintf "cd %s ; cvs status %s %s > %s"
      (Filename.quote dir)
      !Ocvs_config.status_options
      (Filename.quote f)
      temp_file
  in
  let n = Sys.command com in
  if n = 0 then
    (
     let l = analyse_status_file temp_file in
     delete_file temp_file ;
     try
       match l with
         [] -> raise (Ocvs_types.CvsFailure (Ocvs_messages.error_exec com))
       | ci :: _ ->
           { ci with
             cvs_file = file ;
           }
     with
       Invalid_argument _ ->
             (* lists have different lengths *)
         raise (Ocvs_types.CvsFailure (Ocvs_messages.error_exec com))
    )
  else
    (
     delete_file temp_file ;
     raise (Ocvs_types.CvsFailure (Ocvs_messages.error_exec com))
    )