# # # patch "database.ml" # from [ac1947491023a5029bdf385e23f5496d77484070] # to [53eba58747f8fa175f28249ae3b4d1676a699bfe] # # patch "database.mli" # from [adea7c4edcb55913177145025fc45d57bad3c1b0] # to [75341955c92f554a0d2ae21b5975591afdcb4416] # # patch "view.ml" # from [1939b8c99f699eb33005125453a29933794bbb90] # to [3bebbdc77835caaaeaac35f5668ba26a8bca06f4] # ============================================================ --- database.ml ac1947491023a5029bdf385e23f5496d77484070 +++ database.ml 53eba58747f8fa175f28249ae3b4d1676a699bfe @@ -65,8 +65,11 @@ let fetch_branches base64 db = let fetch_branches base64 db = List.sort compare (Sqlite3.fetch db - "SELECT DISTINCT value FROM revision_certs WHERE name = 'branch'" - (acc_one_col base64) + "SELECT value, COUNT(id) FROM revision_certs WHERE name = 'branch' GROUP BY value" + (fun acc s -> + let b = blob_col base64 s 0 in + let n = Sqlite3.column_int s 1 in + (b, n) :: acc) []) let view_name_domain = "ids_of_branch" ============================================================ --- database.mli adea7c4edcb55913177145025fc45d57bad3c1b0 +++ database.mli 75341955c92f554a0d2ae21b5975591afdcb4416 @@ -11,7 +11,7 @@ val get_filename : t -> string val get_filename : t -> string -val fetch_branches : t -> string list +val fetch_branches : t -> (string * int) list val fetch_ancestry_graph : t -> query -> agraph val fetch_revision : t -> string -> node_data val fetch_certs_and_revision : t -> string -> node_data ============================================================ --- view.ml 1939b8c99f699eb33005125453a29933794bbb90 +++ view.ml 3bebbdc77835caaaeaac35f5668ba26a8bca06f4 @@ -390,6 +390,7 @@ module Branch_selector = struct type t = { store : GTree.tree_store ; branch_column : string GTree.column ; + count_column : int GTree.column ; in_view_column : bool GTree.column ; vis_column : bool GTree.column ; w : [`CANCEL|`DELETE_EVENT|`VIEW] GWindow.dialog ; @@ -406,6 +407,7 @@ module Branch_selector = struct (* The model containing branch names *) let cl = new GTree.column_list in let branch_column = cl#add Gobject.Data.string in + let count_column = cl#add Gobject.Data.int in let in_view_column = cl#add Gobject.Data.boolean in let vis_column = cl#add Gobject.Data.boolean in let model = GTree.tree_store cl in @@ -458,6 +460,14 @@ module Branch_selector = struct ignore (view#append_column vc) ; view#set_expander_column (Some vc) end ; + begin + let vc = GTree.view_column ~title:"Count" () in + let r = GTree.cell_renderer_text [`XALIGN 1.] in + vc#pack r ; + vc#add_attribute r "text" count_column ; + vc#add_attribute r "visible" count_column ; + ignore (view#append_column vc) + end ; (* The radio buttons for the date limit *) let packing = Ui.category "Date limit" packing in @@ -494,6 +504,7 @@ module Branch_selector = struct { store = model ; branch_column = branch_column ; + count_column = count_column ; in_view_column = in_view_column ; vis_column = vis_column ; view = view ; @@ -674,9 +685,10 @@ module Branch_selector = struct let rec loop kl parent t = let m, parent = match t with - | Trie.N (v, m) -> + | Trie.N ((v, n), m) -> let row = s.store#append ?parent () in s.store#set ~row ~column:s.branch_column v ; + s.store#set ~row ~column:s.count_column n ; s.store#set ~row ~column:s.vis_column true ; m, Some row | Trie.B m when kl <> [] && at_least_two m -> @@ -695,10 +707,10 @@ module Branch_selector = struct assert (s.store#get_iter_first = None) ; (* branch names are theoretically unstructured but in practice . is used as delimiter. (NDQF) *) - List.map (fun b -> string_split '.' b, b) br + List.map (fun ((b, _) as v) -> string_split '.' b, v) br ++ List.fold_left - (fun acc (bl, b) -> Trie.insert acc bl b) + (fun acc (bl, v) -> Trie.insert acc bl v) Trie.empty ++ fill_store_from_trie s