The unified diff between revisions [6420622a..] and [e5ee75e6..] is displayed below. It can also be downloaded as a raw diff.

#
#
# 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