camlspotter avatar camlspotter committed 4e97499

dev

Comments (0)

Files changed (1)

+open Printf
 open Common
 open Tiny_json
 open Json_conv
 open Meta_conv.Open
 open Sexplib.Conv
 
-module Json = struct
-  include Json
-  let sexp_of_t j = Sexplib.Sexp.Atom (Json.show j)
-  let t_of_sexp = function
-    | Sexplib.Sexp.Atom s -> Json.parse s
-    | _ -> assert false
-end
-
 module Address = struct
   include Meta_conv.Types.Address
   let sexp_of_t _ = Sexplib.Sexp.Atom ""
 end
 
 type 'target fields = (string * ('target * Address.t)) list with sexp
+type 'target mc_leftovers = 'target fields with sexp
+
+module Json = struct
+  include Json
+  let sexp_of_t j = Sexplib.Sexp.Atom (Json.show j)
+  let t_of_sexp = function
+    | Sexplib.Sexp.Atom s -> Json.parse s
+    | _ -> assert false
+
+  type 'a named_list = (string * 'a) list with sexp
+  let json_of_named_list : ('a -> t) -> 'a named_list -> t = fun f xs -> 
+    Object (List.map (fun (name, a) -> (name, f a)) xs)
+  let named_list_of_json (d : 'a decoder) : (string * 'a) list decoder = fun ?(adrs=[]) ->
+    function
+      | Object fields -> 
+          let adrs = 0::adrs in (* CR jfuruse: wrong! *)
+          `Ok (List.map (fun (name, v) -> (name, d ~adrs v)) fields)
+      | v -> `Error (Meta_conv.Types.Error.Primitive_decoding_failure "Object expected for named list", 
+                     v,
+                     adrs)
+
+  let named_list_of_json_exn d ?adrs v = 
+    match named_list_of_json d ?adrs v with
+    | `Ok v -> v
+    | `Error err -> raise (Json_conv.Error err)
+    
+end
 
 module Scheme = struct
   type t = Hg(:"hg":) | Git(:"git":) with conv(json), sexp
 
   module Repository = struct
     type t = {
+      name              : string;
       scm               : Scheme.t;
       has_wiki          : bool;
       last_updated      : LocalTime.t;
       is_fork           : bool;
       slug              : string;
       is_private        : bool;
-      name              : string;
       language          : string;
       email_writers     : bool;
       no_public_forks   : bool;
   end
 
 
+  (* https://api.bitbucket.org/1.0/repositories/{accountname}/{repo_slug}/branches *)
+  module Branches = struct
+
+    type branch = {
+      unknown : Json.t mc_leftovers;
+    } with conv(json), sexp
+
+    type t = branch Json.named_list with conv(json), sexp
+
+    let get ~accountname ~repo_slug = 
+      let s = Curl.get_string (fun h ->
+        h#set_url (sprintf "https://api.bitbucket.org/1.0/repositories/%s/%s/branches" accountname repo_slug);
+        (* h#set_userpwd (Printf.sprintf "%s:%s" user password) *))
+      in
+      try t_of_json_exn (Json.parse s) with e -> 
+        prerr_endline (Printexc.to_string e);
+        prerr_endline s;
+        raise e
+      
+  end
 end
 
 (** user Endpoint *)
     resource_uri : string
   } with conv(json), sexp
 
-  type resp = {
+  type t = {
     user : user;
     repositories : Repositories.Repository.t list;
     rest (: Leftovers :) : Json.t fields;
       h#set_url "https://api.bitbucket.org/1.0/user";
       h#set_userpwd (Printf.sprintf "%s:%s" user password))
     in
-    try resp_of_json_exn (Json.parse s) with e -> 
+    try t_of_json_exn (Json.parse s) with e -> 
       prerr_endline (Printexc.to_string e);
       prerr_endline s;
       raise e
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.