let children_revisions (revs : cvs_revision list) rev =
  match rev.rev_number with
    [] -> []
  | _ ->
      let subbranch_numbers = subranches_numbers revs rev in
      let first_subs = List.fold_left
          (fun acc -> fun n ->
            match first_subbranch_revision n revs with
              None -> acc
            | Some r -> r :: acc
          )
          []
          subbranch_numbers
      in
      let len = List.length rev.rev_number in
      let s = string_of_revision_number rev.rev_number in
      let f rev2 =
        if rev2.rev_number = [] then
          false
        else
          let len2 = List.length rev2.rev_number in
          if len < len2 then
            len + 2 = len2 &&
            (fst (Ocvs_misc.get_n_first_ele len rev2.rev_number)) = rev.rev_number &&
            List.mem rev2 first_subs

          else if len = len2 then
            try
              let (before, after) = Ocvs_misc.get_n_first_ele (len - 1) rev.rev_number in
              let (before2, after2) = Ocvs_misc.get_n_first_ele (len - 1) rev2.rev_number in
              before = before2 &&
              (List.hd after) + 1 = List.hd (after2)
            with
              Not_found ->
                (List.hd (List.rev rev.rev_number)) + 1 = List.hd (List.rev rev2.rev_number)
            | Invalid_argument s ->
                prerr_endline ("Invalid argument "^s);
                false
          else
            false
      in
      let res = List.filter f revs in
      print_DEBUG (s^" ->");
      List.iter (fun r -> print_DEBUG (" "^(string_of_revision_number r.rev_number))) res ;
      res