# # add_file "glib/gpattern.ml" # # add_file "glib/ocaml-gpattern.c" # # patch "Makefile" # from [f7c76bdb8d89c784245a1217a3ae62bc7c055676] # to [014069772d0984ac2b7c258cbf9078a370e3357a] # # patch "glib/gpattern.ml" # from [] # to [34bd921c0bf48d1b72d565bda6ce5b2789a970da] # # patch "glib/ocaml-gpattern.c" # from [] # to [8a80185baf2eba492d19c75dc78eea935cb1edc1] # # patch "query.ml" # from [ace2d1856ca61cfa70f708386fbeb82415ce7b4d] # to [e1f5dd585b0849a5241df459d0796856636f7b9d] # ======================================================================== --- Makefile f7c76bdb8d89c784245a1217a3ae62bc7c055676 +++ Makefile 014069772d0984ac2b7c258cbf9078a370e3357a @@ -12,7 +12,7 @@ SRC = base64.ml base64.mli sqlite3.ml sqlite3.mli IO.mli IO.ml unzip.ml unzip.mli \ - gspawn.ml gspawn.mli giochannel.ml giochannel.mli viz_gmisc.ml \ + gspawn.ml gspawn.mli giochannel.ml giochannel.mli viz_gmisc.ml gpattern.ml \ crypto.ml crypto.mli \ viz_misc.ml viz_misc.mli viz_types.ml viz_types.mli \ q.ml q.mli \ @@ -26,7 +26,8 @@ view.ml view.mli query.ml ui.ml version.ml main.ml C_OBJ = mlsqlite/ocaml-sqlite3.o \ - glib/ocaml-gspawn.o glib/ocaml-giochannel.o glib/ocaml-misc.o \ + glib/ocaml-gspawn.o glib/ocaml-giochannel.o \ + glib/ocaml-misc.o glib/ocaml-gpattern.o \ crypto/ocaml-openssl.o \ gnomecanvas_hack.o @@ -48,8 +49,9 @@ ocamlnet-0.97.1/base64.ml ocamlnet-0.97.1/base64.mli ocamlnet-0.97.1/LICENSE \ extlib-1.3/IO.ml extlib-1.3/IO.mli extlib-1.3/unzip.ml extlib-1.3/unzip.mli \ glib/gspawn.ml glib/gspawn.mli glib/giochannel.ml glib/giochannel.mli \ - glib/viz_gmisc.ml \ - glib/ocaml-gspawn.c glib/ocaml-giochannel.c glib/ocaml-misc.c \ + glib/viz_gmisc.ml glib/gpattern.ml \ + glib/ocaml-gspawn.c glib/ocaml-giochannel.c \ + glib/ocaml-misc.c glib/ocaml-gpattern.c \ glib/gspawn_tags.var glib/giochannel_tags.var \ crypto/ocaml-openssl.c crypto/crypto.ml crypto/crypto.mli ======================================================================== --- glib/gpattern.ml +++ glib/gpattern.ml 34bd921c0bf48d1b72d565bda6ce5b2789a970da @@ -0,0 +1,5 @@ + +type t + +external make : string -> t = "ml_g_pattern_spec_new" +external match_string : t -> string -> bool = "ml_g_pattern_match" ======================================================================== --- glib/ocaml-gpattern.c +++ glib/ocaml-gpattern.c 8a80185baf2eba492d19c75dc78eea935cb1edc1 @@ -0,0 +1,45 @@ +#include + +#define CAML_NAME_SPACE + +#include + +#include "wrappers.h" +#include "ml_glib.h" + +#define GPatternSpec_val(v) (* (GPatternSpec **) Data_custom_val(v)) + +static void +ml_g_pattern_spec_finalize (value v) +{ + GPatternSpec *s = GPatternSpec_val(v); + g_pattern_spec_free (s); +} + +static value +ml_wrap_g_pattern_spec (GPatternSpec *s) +{ + static const struct custom_operations g_pattern_spec_ops = { + "GPatternSpec", ml_g_pattern_spec_finalize, + custom_compare_default, custom_hash_default, + custom_serialize_default, custom_deserialize_default }; + + GPatternSpec **p; + value v; + v = caml_alloc_custom ((struct custom_operations *) &g_pattern_spec_ops, + sizeof (GPatternSpec *), + 1, 100); + p = Data_custom_val(v); + *p = s; + return v; +} + +ML_1 (g_pattern_spec_new, String_val, ml_wrap_g_pattern_spec) + +CAMLprim value +ml_g_pattern_match (value p, value s) +{ + return Val_bool (g_pattern_match (GPatternSpec_val (p), + caml_string_length (s), + String_val (s), NULL)); +} ======================================================================== --- query.ml ace2d1856ca61cfa70f708386fbeb82415ce7b4d +++ query.ml e1f5dd585b0849a5241df459d0796856636f7b9d @@ -50,17 +50,19 @@ end -let revision_contains pattern = function +let revision_contains pat = function | [ _, changes ] -> List.exists (function - | Revision_types.PATCH (f, _, _) -> f = pattern + | Revision_types.PATCH (f, _, _) | Revision_types.ADD_FILE f | Revision_types.DELETE_FILE f - | Revision_types.DELETE_DIR f -> f = pattern + | Revision_types.DELETE_DIR f -> + Gpattern.match_string pat f | Revision_types.RENAME_FILE (f1, f2) | Revision_types.RENAME_DIR (f1, f2) -> - f1 = pattern || f2 = pattern) + Gpattern.match_string pat f1 || + Gpattern.match_string pat f2) changes | _ -> (* return false for merges *) @@ -71,10 +73,11 @@ status "Searching the monotone database ..." (fun () -> + let pat = Gpattern.make revision_content in List.fold_left (fun acc id -> let r = Database.fetch_revision db id in - if revision_contains revision_content r.revision_set + if revision_contains pat r.revision_set then id :: acc else acc) [] ids)