Below is the file 'revision.ml' from this revision. You can also download the file.


type change =
  | DELETE of string
  | RENAME of string * string
  | ADD_DIR of string
  | ADD_FILE of string * string
  | PATCH of string * string * string
  | ATTR_CLEAR of string * string
  | ATTR_SET of string * string * string

type edge = {
    old_revision : string ;
    change_set : change list ;
  }

type t = string * edge list


type tok = Basic_io_lexer.v =
  | ID of string
  | STRING of string
  | MULT of string list
  | NONE


let rec _star acc p = parser
  | [< v = p ; nxt >] -> _star (v :: acc) p nxt
  | [<>] -> acc


let format = parser
  | [< ' [ "format_version", STRING "1" ] >] ->
      ()
let new_manifest = parser
  | [< ' [ "new_manifest", ID id ] >] ->
      id

let delete = parser
  | [< ' [ "delete", STRING p ] >] ->
      DELETE p
let rename = parser
  | [< ' [ "rename", STRING p ;
	   "to", STRING np ] >] ->
      RENAME (p, np)
let add_dir = parser
  | [< ' [ "add_dir", STRING p ] >] ->
      ADD_DIR p
let add_file = parser
  | [< ' [ "add_file", STRING p ;
	   "content", ID id ] >] ->
      ADD_FILE (p, id)
let patch = parser
  | [< ' [ "patch", STRING p ;
	   "from", ID id1 ;
	   "to", ID id2 ] >] ->
      PATCH (p, id1, id2)
let clear = parser
  | [< ' [ "clear", STRING p ;
	   "attr", STRING a ] >] ->
      ATTR_CLEAR (p, a)
let set = parser
  | [< ' [ "set", STRING p ;
	   "attr", STRING a ;
	   "value", STRING v ] >] ->
      ATTR_SET (p, a, v)
let change_set = parser
  | [< cs = _star [] delete ;
       cs = _star cs rename ;
       cs = _star cs add_dir ;
       cs = _star cs add_file ;
       cs = _star cs patch ;
       cs = _star cs clear ;
       cs = _star cs set >] -> List.rev cs

let edge = parser
  | [< ' [ "old_revision", ID id ] ; cs = change_set >] ->
      { old_revision = id ; change_set = cs }


let revision = parser
  | [< () = format ;
       manifest = new_manifest ;
       edges = _star [] edge >] ->
      manifest, List.rev edges


let revision_set lb =
  let strm =
    Stream.from
      (fun _ -> Basic_io_lexer.get_stanza lb) in
  revision strm