let parse_request_aptitude s =
  if not (String.exists s "aptitude"then fatal "Not a valid aptitude command" ;
  let s = String.slice ~first:((String.find s "aptitude")) s in
  let suite = ref None in
  (* XXX we parse a lot of options, but we do not handle them ... *)
  let options = [
    ("-t"Arg.String (fun l -> suite := Some(l)), ""); (* default suite *)
    ("-s"Arg.Unit (fun _ -> ()), "");
    ("-y"Arg.Unit (fun _ -> ()), "");
    ("-v"Arg.Unit (fun _ -> ()), "");
    ("--full-resolver"Arg.Unit (fun _ -> ()), "");
    ("--safe-resolver"Arg.Unit (fun _ -> ()), "");
    ("-f"Arg.Unit (fun _ -> ()), ""); (* fix-broken *)
    ("-r"Arg.Unit (fun _ -> ()), ""); (* with-reccomends *)
    ("--with-recommends"Arg.Unit (fun _ -> ()), "");
    ("-R"Arg.Unit (fun _ -> ()), ""); (* without-reccomends *)
    ("--without-recommends"Arg.Unit (fun _ -> ()), "");
    ] 
  in
  let reqlist = ref [] in
  let anon s = reqlist := s :: !reqlist in
  begin
    begin try Arg.parse_argv ~current:(ref 0) (Array.of_list (Pcre.split ~rex:blank_regexp s)) options anon ""
    with Arg.Bad s -> fatal "%s" s end ;
    match List.rev !reqlist with
    |"install" :: tl -> Install(List.map (parse_pkg_req !suite) tl)
    |"remove" :: tl -> Remove(List.map parse_req tl)
    |["upgrade"| ["safe-upgrade"| ["dist-upgrade"-> Upgrade(!suite)
    |["full-upgrade"-> DistUpgrade(!suite)
    |-> fatal "Bad aptitude request '%s'" s
  end