Community technical support mailing list was retired 2010 and replaced with a professional technical support team. For assistance please contact: Pre-sales Technical support via email to sales@march-hare.com.
Tony Hoyle wrote: > On Tue, 15 Apr 2003 07:45:07 -0500, "Kari Hoijarvi" > <hoijarvi at me.wustl.edu> wrote: > >> It indeed could be nice, if you didn't have to parse the >> CVSNT output. Adding XML output option is probably less >> work than writing a parser to do it. >> > You *have* to be joking. I estimate 3-6 months work to make a server > that uses XML, and it would be completely incompatible with all other > CVS servers (so nobody would use it anyway). > > I really don't understand why anyone would want an XML version anyway > (and not to be too harsh, spending 10 seconds sticking tags around > every word in the output from 'cvs log' does *not* constitute an XML > schema) - the client/server protocol is well defined and easy to > parse. Sorry, I do not know the internals of CVSNT and even not the CVS server protocol. I am simply using the output of the command lines. So I thought, it should be possible to change the client such that it produces similar output. Tony, what I in fact did, is to write a parser using an XML tool (MetaMorphosis) that parses the output of CVS -log. The parse tree is represented as XML. >From this xml, I derived the XML schema. One of the major problems is the extraction of the descriptions. So the production rules below will fail if a user comment starts with "--" or with "==". Here are the production rules I am using: grammar [] !bg <cvslog> . <cvslog> = <noncvsfiles> (<rcsinfo> | <_ws> | <garbage> ) * . <noncvsfiles> = <noncvsfile> * . <noncvsfile> = ("? "%) <_restline> . <garbage> =! ^[\n]? "\n". <rcsinfo> =! <rcsfile> <workingfile> <head> <branch> <locks> <accesslist> <symbolicnames> <keywordsubstitution> <totalrevisions> (";" [ \t]! % ) <selectedrevisions> ("description:\n" %)<description>* ("========================================================================== ===\n" %) . <_restline> = ([ ]?%) ^[\n]? ("\n"%) . <_ws> = ([ \n\t]! %) . <rcsfile> =! ("RCS file:" % ) <_restline> . <workingfile> =! ("Working file: "%) <_restline> . <head> =! ("head:"%) <_restline> . <branch> =! ("branch:"%) <_restline> . <locks> =! ("locks:" %) <_restline> . <accesslist> =! ("access list:" %) <_restline> . <symbolicnames> =! ("symbolic names:\n" %) <symbolicname> * . <symbolicname> =! ([ \t]!%) <_restline> . <keywordsubstitution> =! ("keyword substitution:"%) <_restline> . <totalrevisions> = ("total revisions: "%) [0-9]! . <selectedrevisions> = ("selected revisions:"%) <_restline> . <description> =! ("----------------------------\n" %) <revision> <date> (";"%) <author> (";"%) <state> (";"%) <lines>/ ( ("\n"%))/ <comment>/ . <revision> = ("revision"%) <_restline>. <date> = ("date: "%) ^[;]! . <keep> = <yyyy> ("/"%) <mon> ("/"%) <dd> (" "%) <hh> (":"%) <min> (":"%) <sec> . <yyyy> = [0-9][0-9][0-9][0-9] . <mon> = "1" [0-2] | "0" [0-9] . <dd> = [0-2] [0-9] | "3" [0-1] . <hh> = [0-1][0-9] | "2" [0-3] . <min> = [0-5][0-9] . <sec> = [0-5][0-9] . <author> = ([ ]! "author: "%) ^[;]!. <state> = ([ ]! "state: "%) ^[;]!. <lines> = ([ ]! "lines: "%) <addedlines> ([ ]! %) <deletedlines> . <addedlines> = ("+"%) [0-9]! . <deletedlines> = ("-"%) [0-9]! . <comment> =! ( ^[\-\=] ^[\n]? "\n" )* . // todo: does not cover "--foo" !eg ;