# # # patch "database.ml" # from [8bed9e273720671d912a5ec433f82ccef4150522] # to [c3a9041e726e3ad8f2fe3116c87b4f1951d5ffde] # # patch "query.ml" # from [a3f2ba644a7f258dbbb7161b411565fe8acf410e] # to [19cf4a72f1736058a51cf9d7f520b4d2785b5b95] # # patch "revision_lexer.mll" # from [d0486161dda7795329e2da399bd82bd40e70406d] # to [8794cf0f4cddd99ce5bdfea003e411cae37be58b] # # patch "revision_parser.mly" # from [acc760bbd59cf126392749f283c3f35a5ccf5ad3] # to [79c1d103bdcba31b86edccca700058f9f3012767] # # patch "revision_types.mli" # from [7e55c956f0e7a7934c71fe31d7a87f802a2ab971] # to [5b16430bd4ee10e6e2fbeacc6e7e9cef2258775f] # # patch "view.ml" # from [1af9c977ea1aae11eb6c1cd1eac98fbaa19cb1ff] # to [3cdc7395bbd0ad5c5df16a1a0fd3fb01ed68e7ea] # ============================================================ --- database.ml 8bed9e273720671d912a5ec433f82ccef4150522 +++ database.ml c3a9041e726e3ad8f2fe3116c87b4f1951d5ffde @@ -17,6 +17,12 @@ Sqlite3.exec db "PRAGMA temp_store = MEMORY" ; Sqlite3.create_fun_1 db "unbase64" (fun s -> `TEXT (monot_decode (Sqlite3.value_text s))) +let has_rosters db = + Sqlite3.fetch db + "SELECT name FROM sqlite_master WHERE name = 'rosters'" + (fun _ _ -> true) + false + let fetch_pubkeys db tbl = Sqlite3.fetch db "SELECT id, keydata, ROWID FROM public_keys" @@ -305,14 +311,19 @@ (Printexc.to_string exn) ; raise exn -let decode_and_parse_revision s = - Revision_parser.revision_set +let decode_and_parse_revision rostered s = + let revision_parser = + if rostered + then Revision_parser.revision_set + else Revision_parser.pre_rosters_revision_set in + revision_parser Revision_lexer.lex (Lexing.from_string (Unzip.inflate_str ~kind:Unzip.GZip (monot_decode s))) -let fetch_revision_set db id = - decode_and_parse_revision +let fetch_revision_set rostered db id = + decode_and_parse_revision + rostered (List.hd (Sqlite3.fetch_f db (fun acc row -> row.(0) :: acc) [] "SELECT data FROM revisions WHERE id = '%s'" id)) @@ -414,6 +425,7 @@ db : Sqlite3.db ; pubkeys : (string, Crypto.pub_rsa_key * int) Hashtbl.t ; stmts : Sqlite3.stmt array ; + mutable rostered : bool ; } @@ -439,10 +451,12 @@ filename = fname ; db = db ; pubkeys = pubkeys ; - stmts = stmts } in + stmts = stmts ; + rostered = false } in sqlite_try (fun db -> register_base64_functions db ; - fetch_pubkeys db pubkeys) + fetch_pubkeys db pubkeys ; + v.rostered <- has_rosters db) v ; v @@ -466,7 +480,7 @@ try let revision_set = sqlite_try (fun db -> - fetch_revision_set db id) + fetch_revision_set d.rostered db id) d in let (manifest_id, edges) = revision_set in { revision_id = id ; ============================================================ --- query.ml a3f2ba644a7f258dbbb7161b411565fe8acf410e +++ query.ml 19cf4a72f1736058a51cf9d7f520b4d2785b5b95 @@ -50,7 +50,7 @@ List.exists (function | Revision_types.PATCH (f, _, _) - | Revision_types.ADD_FILE f + | Revision_types.ADD_FILE (f, _) | Revision_types.DELETE_FILE f | Revision_types.DELETE_DIR f -> Gpattern.match_string pat f ============================================================ --- revision_lexer.mll d0486161dda7795329e2da399bd82bd40e70406d +++ revision_lexer.mll 8794cf0f4cddd99ce5bdfea003e411cae37be58b @@ -6,9 +6,11 @@ let _ = List.iter (fun (k, tok) -> Hashtbl.add kwd k tok) - [ "new_manifest", NEW_MANIFEST; + [ "format_version", FORMAT_VERSION; + "new_manifest", NEW_MANIFEST; "old_revision", OLD_REVISION; "old_manifest", OLD_MANIFEST; + "content", CONTENT; "patch", PATCH; "from", FROM; "to", TO; ============================================================ --- revision_parser.mly acc760bbd59cf126392749f283c3f35a5ccf5ad3 +++ revision_parser.mly 79c1d103bdcba31b86edccca700058f9f3012767 @@ -1,24 +1,21 @@ -%token NEW_MANIFEST -%token OLD_REVISION -%token OLD_MANIFEST +%token FORMAT_VERSION +%token NEW_MANIFEST OLD_REVISION OLD_MANIFEST %token PATCH -%token FROM -%token TO -%token ADD_FILE -%token DELETE_FILE -%token DELETE_DIR -%token RENAME_FILE -%token RENAME_DIR +%token CONTENT FROM TO +%token ADD_FILE DELETE_FILE DELETE_DIR +%token RENAME_FILE RENAME_DIR %token EOF -%token ID -%token STRING +%token ID STRING -%start revision_set +%start revision_set pre_rosters_revision_set %type revision_set +%type pre_rosters_revision_set %% revision_set: - NEW_MANIFEST ID edge_list { ($2, Q.to_list $3) } + FORMAT_VERSION STRING + NEW_MANIFEST ID + edge_list { ($4, Q.to_list $5) } ; edge_list: @@ -27,10 +24,8 @@ ; edge: - OLD_REVISION ID - OLD_MANIFEST ID change_set_opt { { Revision_types.old_revision = $2 ; - Revision_types.old_manifest = $4 ; - Revision_types.change_set = Q.to_list $5 } } + OLD_REVISION ID change_set_opt { { Revision_types.old_revision = $2 ; + Revision_types.change_set = Q.to_list $3 } } ; change_set_opt: @@ -45,9 +40,29 @@ change: | PATCH STRING FROM ID TO ID { Revision_types.PATCH ($2, $4, $6) } - | ADD_FILE STRING { Revision_types.ADD_FILE $2 } + | ADD_FILE STRING { Revision_types.ADD_FILE ($2, "") } + | ADD_FILE STRING CONTENT ID { Revision_types.ADD_FILE ($2, $4) } | DELETE_FILE STRING { Revision_types.DELETE_FILE $2 } | DELETE_DIR STRING { Revision_types.DELETE_DIR $2 } | RENAME_FILE STRING TO STRING { Revision_types.RENAME_FILE ($2, $4) } | RENAME_DIR STRING TO STRING { Revision_types.RENAME_DIR ($2, $4) } ; + + + + +pre_rosters_revision_set: + NEW_MANIFEST ID + pre_rosters_edge_list { ($2, Q.to_list $3) } +; + +pre_rosters_edge_list: + pre_rosters_edge { Q.push Q.empty $1 } + | pre_rosters_edge_list edge { Q.push $1 $2 } +; + +pre_rosters_edge: + OLD_REVISION ID + OLD_MANIFEST ID change_set_opt { { Revision_types.old_revision = $2 ; + Revision_types.change_set = Q.to_list $5 } } +; ============================================================ --- revision_types.mli 7e55c956f0e7a7934c71fe31d7a87f802a2ab971 +++ revision_types.mli 5b16430bd4ee10e6e2fbeacc6e7e9cef2258775f @@ -1,7 +1,7 @@ type change = | PATCH of string * string * string - | ADD_FILE of string + | ADD_FILE of string * string | DELETE_FILE of string | DELETE_DIR of string | RENAME_FILE of string * string @@ -9,7 +9,6 @@ type edge = { old_revision : string ; - old_manifest : string ; change_set : change list ; } ============================================================ --- view.ml 1af9c977ea1aae11eb6c1cd1eac98fbaa19cb1ff +++ view.ml 3cdc7395bbd0ad5c5df16a1a0fd3fb01ed68e7ea @@ -198,8 +198,8 @@ let text_of_delta_type = function | PATCH (f, "", _) | PATCH (f, _, "") -> "" - | PATCH (f, _, _) -> f - | ADD_FILE f + | PATCH (f, _, _) + | ADD_FILE (f, _) | DELETE_FILE f -> f | DELETE_DIR f -> f ^ "/" | RENAME_FILE (o, n) -> Printf.sprintf "%s -> %s" o n