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