[Providing this information to the notify script makes sense. I haven't looked closely at this patch, and there is still the issue of mumble mumble new trigger interface mumble mumble. -kingdon] From: "Ian Crow" To: Subject: Submission: Enhanced notification messages Date: Tue, 15 Dec 1998 14:54:45 +1300 Content-Type: multipart/mixed; boundary="----=_NextPart_000_003D_01BE283A.DA9CDCC0" This is a multi-part message in MIME format. ------=_NextPart_000_003D_01BE283A.DA9CDCC0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Hi there I thought others might find the following useful. I've been working against the 1.9 code, but I can't see any differences in the area I was working in the 1.10 code, so here are the diffs against the 1.9. I found the submission details a bit confusing re whether to send diffs of NOTES and ChangeLog, or simply suitable new entries. I opted for the latter. Also I wasn't sure if a context diff was suitable for the patch, but its the best I could figure. NEWS * Notifications can now include user names (both watcher and 'changer'), event type, file affected and repository name on command line to notification command. ChangeLog * edit.c, cvs.texinfo: Extended set of information that can be passed to notification command via substitutions. See cvs.texinfo or edit.c for details. Patches (these are diff -c against the CVS 1.9 distribution): ------=_NextPart_000_003D_01BE283A.DA9CDCC0 Content-Type: application/octet-stream; name="cvs.texinfo-cdiff" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="cvs.texinfo-cdiff" KioqIC9vcHQvdG9vbF9zcmMvY3ZzLTEuOS9kb2MvY3ZzLnRleGluZm8JV2VkIE9jdCAgMiAxODow Mzo0MyAxOTk2Ci0tLSBjdnMudGV4aW5mbwlUdWUgRGVjIDE1IDE0OjEyOjU4IDE5OTgKKioqKioq KioqKioqKioqCioqKiAyNjA2LDI2MjkgKioqKgogIAogIEBjaW5kZXggbm90aWZ5IChhZG1pbiBm aWxlKQogIFdoZW4gdGhlIGNvbmRpdGlvbnMgZXhpc3QgZm9yIG5vdGlmaWNhdGlvbiwgQHNje2N2 c30KISBjYWxscyB0aGUgQGZpbGV7bm90aWZ5fSBhZG1pbmlzdHJhdGl2ZSBmaWxlLiAgRWRpdAog IEBmaWxle25vdGlmeX0gYXMgb25lIGVkaXRzIHRoZSBvdGhlciBhZG1pbmlzdHJhdGl2ZQogIGZp bGVzIChAcHhyZWZ7SW50cm8gYWRtaW5pc3RyYXRpdmUgZmlsZXN9KS4gIFRoaXMKICBmaWxlIGZv bGxvd3MgdGhlIHVzdWFsIGNvbnZlbnRpb25zIGZvciBhZG1pbmlzdHJhdGl2ZQogIGZpbGVzIChA cHhyZWZ7c3ludGF4fSksIHdoZXJlIGVhY2ggbGluZSBpcyBhIHJlZ3VsYXIKISBleHByZXNzaW9u IGZvbGxvd2VkIGJ5IGEgY29tbWFuZCB0byBleGVjdXRlLiAgVGhlCiEgY29tbWFuZCBzaG91bGQg Y29udGFpbiBhIHNpbmdsZSBvY3VycmVuY2Ugb2YgQHNhbXB7JXN9CiEgd2hpY2ggd2lsbCBiZSBy ZXBsYWNlZCBieSB0aGUgdXNlciB0byBub3RpZnk7IHRoZSByZXN0CiEgb2YgdGhlIGluZm9ybWF0 aW9uIHJlZ2FyZGluZyB0aGUgbm90aWZpY2F0aW9uIHdpbGwgYmUKISBzdXBwbGllZCB0byB0aGUg Y29tbWFuZCBvbiBzdGFuZGFyZCBpbnB1dC4gIFRoZQohIHN0YW5kYXJkIHRoaW5nIHRvIHB1dCBp biB0aGUgQGNvZGV7bm90aWZ5fSBmaWxlIGlzIHRoZQogIHNpbmdsZSBsaW5lOgogIAogIEBleGFt cGxlCiEgQUxMIG1haWwgJXMgLXMgXCJDVlMgbm90aWZpY2F0aW9uXCIKICBAZW5kIGV4YW1wbGUK ICAKISBUaGlzIGNhdXNlcyB1c2VycyB0byBiZSBub3RpZmllZCBieSBlbGVjdHJvbmljIG1haWwu CiAgQGMgRklYTUU6IHNob3VsZCBpdCBiZSB0aGlzIGhhcmQgdG8gc2V0IHVwIHRoaXMKICBAYyBi ZWhhdmlvciAoYW5kIHRoZSByZXN1bHQgd2hlbiBvbmUgZmFpbHMgdG8gZG8gc28sCiAgQGMgc2ls ZW50IGZhaWx1cmUgdG8gbm90aWZ5LCBzbyBub24tb2J2aW91cyk/ICBTaG91bGQKLS0tIDI2MDYs MjY1MyAtLS0tCiAgCiAgQGNpbmRleCBub3RpZnkgKGFkbWluIGZpbGUpCiAgV2hlbiB0aGUgY29u ZGl0aW9ucyBleGlzdCBmb3Igbm90aWZpY2F0aW9uLCBAc2N7Y3ZzfQohIHVzZXMgdGhlIEBmaWxl e25vdGlmeX0gYWRtaW5pc3RyYXRpdmUgZmlsZS4gIEVkaXQKICBAZmlsZXtub3RpZnl9IGFzIG9u ZSBlZGl0cyB0aGUgb3RoZXIgYWRtaW5pc3RyYXRpdmUKICBmaWxlcyAoQHB4cmVme0ludHJvIGFk bWluaXN0cmF0aXZlIGZpbGVzfSkuICBUaGlzCiAgZmlsZSBmb2xsb3dzIHRoZSB1c3VhbCBjb252 ZW50aW9ucyBmb3IgYWRtaW5pc3RyYXRpdmUKICBmaWxlcyAoQHB4cmVme3N5bnRheH0pLCB3aGVy ZSBlYWNoIGxpbmUgaXMgYSByZWd1bGFyCiEgZXhwcmVzc2lvbiBmb2xsb3dlZCBieSBhIGNvbW1h bmQgdG8gZXhlY3V0ZS4KISAKISBUaGUgY29tbWFuZCBtYXkgY29udGFpbiBhIG9jdXJyZW5jZXMg b2YgdGhlIGZvbGxvd2luZwohIHN1YnN0aXR1dGlvbiBzdHJpbmdzLCB3aGljaCB3aWxsIGJlIHJl cGxhY2VkIGJ5IHRoZQohIGFzc29jaWF0ZWQgdmFsdWU7IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24g cmVnYXJkaW5nCiEgdGhlIG5vdGlmaWNhdGlvbiBpcyBzdXBwbGllZCB0byB0aGUgY29tbWFuZCBv biBzdGFuZGFyZAohIGlucHV0LCBidXQgdGhlIGZvcm1hdCBvZiB0aGlzIGlzIGhhcmQgY29kZWQg d2l0aGluIENWUy4KISAKISBAdGFibGUgQGNvZGUKISBAaXRlbSAlcwohIE5vdGlmeWVlOiB1c2Vy IHRvIG5vdGlmeSBvZiBldmVudCAoJ3RoZSB3YXRjaGVyJykKISAKISBAaXRlbSAldwohIENhdXNl cjogdXNlciB3aG8gY2F1c2VkIGV2ZW50CiEgCiEgQGl0ZW0gJWYKISBGaWxlOiBmaWxlIGFmZmVj dGVkIGJ5IGV2ZW50CiEgCiEgQGl0ZW0gJXQKISBUeXBlOiB0eXBlIG9mIGV2ZW50IGJlaW5nIG5v dGlmaWVkCiEgCiEgQGl0ZW0gJVIKISBSZXBvc2l0b3J5OiBmdWxsIHJlcG9zaXRvcnkgcGF0aAoh IAohIEBpdGVtICVyCiEgUmVwb3NpdG9yeSBhYmJyZXZpYXRpb246IHNob3J0IHJlcG9zaXRvcnkg cGF0aAohIEBlbmQgdGFibGUKISAKISBBIHR5cGljYWwgdGhpbmcgdG8gcHV0IGluIHRoZSBAY29k ZXtub3RpZnl9IGZpbGUgaXMgdGhlCiAgc2luZ2xlIGxpbmU6CiAgCiAgQGV4YW1wbGUKISBBTEwg bWFpbCAlcyAtcyBcIkNWUyBub3RpZmljYXRpb246ICVmXCIKICBAZW5kIGV4YW1wbGUKICAKISBU aGlzIGNhdXNlcyB1c2VycyB0byBiZSBub3RpZmllZCBieSBlbGVjdHJvbmljIG1haWwgd2l0aAoh IHRoZSBuYW1lIG9mIHRoZSBhZmZlY3RlZCBmaWxlIGFwcGVhcmluZyBpbiB0aGUgbWVzc2FnZSBz dWJqZWN0LgogIEBjIEZJWE1FOiBzaG91bGQgaXQgYmUgdGhpcyBoYXJkIHRvIHNldCB1cCB0aGlz CiAgQGMgYmVoYXZpb3IgKGFuZCB0aGUgcmVzdWx0IHdoZW4gb25lIGZhaWxzIHRvIGRvIHNvLAog IEBjIHNpbGVudCBmYWlsdXJlIHRvIG5vdGlmeSwgc28gbm9uLW9idmlvdXMpPyAgU2hvdWxkCg== ------=_NextPart_000_003D_01BE283A.DA9CDCC0 Content-Type: application/octet-stream; name="edit.c-cdiff" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="edit.c-cdiff" *** /opt/tool_src/cvs-1.9/src/edit.c Tue Aug 27 06:18:05 1996 --- edit.c Tue Dec 15 13:43:40 1998 *************** *** 578,583 **** --- 578,585 ---- =20 static int notify_proc PROTO ((char *repository, char *filter)); =20 + #define NOTIFY_PROG_BUFFER 1024 +=20 static int notify_proc (repository, filter) char *repository; *************** *** 586,620 **** FILE *pipefp; char *prog; char *expanded_prog; ! char *p; ! char *q; char *srepos; struct notify_proc_args *args =3D notify_args; =20 srepos =3D Short_Repository (repository); ! prog =3D xmalloc (strlen (filter) + strlen (args->notifyee) + 1); ! /* Copy FILTER to PROG, replacing the first occurrence of %s with ! the notifyee. We only allocated enough memory for one %s, and = I doubt ! there is a need for more. */ ! for (p =3D filter, q =3D prog; *p !=3D '\0'; ++p) { ! if (p[0] =3D=3D '%') { ! if (p[1] =3D=3D 's') { ! strcpy (q, args->notifyee); ! q +=3D strlen (q); ! strcpy (q, p + 2); ! q +=3D strlen (q); break; } ! else ! continue; } ! *q++ =3D *p; } - *q =3D '\0'; =20 /* FIXME: why are we calling expand_proc? Didn't we already expand it in Parse_Info, before passing it to notify_proc? */ expanded_prog =3D expand_path (prog, "notify", 0); --- 588,680 ---- FILE *pipefp; char *prog; char *expanded_prog; ! size_t prog_pos; char *srepos; struct notify_proc_args *args =3D notify_args; =20 srepos =3D Short_Repository (repository); ! prog =3D xmalloc (NOTIFY_PROG_BUFFER); !=20 ! /* Copy FILTER to PROG, replacing the occurrences of %? with ! appropriate values. If our buffer is too small then silently ! don't perform the substitution. !=20 ! FIXME: The buffer used for the expanded string is fixed size, but ! at least its guaranteed not to overflow. Should probably magically ! grow as required. ! */ ! prog_pos =3D 0; !=20 ! while ( *filter ) { ! if (filter[0] =3D=3D '%') { ! switch (filter[1]) { ! case 's': /* Notfiyee: person watching file */ ! if ( prog_pos + strlen(args->notifyee) < NOTIFY_PROG_BUFFER ) ! { ! strcpy (prog + prog_pos, args->notifyee); ! prog_pos +=3D strlen (args->notifyee); ! } break; + case 'w': /* Causer: person now acting on file */ + if ( prog_pos + strlen(args->who) < NOTIFY_PROG_BUFFER ) + { + strcpy (prog + prog_pos, args->who); + prog_pos +=3D strlen (args->who); + } + break; + case 't': /* Type: type of action causing notification */ + if ( prog_pos + strlen(args->type) < NOTIFY_PROG_BUFFER ) + { + strcpy (prog + prog_pos, args->type); + prog_pos +=3D strlen (args->type); + } + break; + case 'f': /* File: Name of file acted on */ + if ( prog_pos + strlen(args->file) < NOTIFY_PROG_BUFFER ) + { + strcpy (prog + prog_pos, args->file); + prog_pos +=3D strlen (args->file); + } + break; + case 'R': /* Repository: Full repository path */ + if ( prog_pos + strlen(repository) < NOTIFY_PROG_BUFFER ) + { + strcpy (prog + prog_pos, repository); + prog_pos +=3D strlen (repository); + } + break; + case 'r': /* Repository abbrev: Short repository path */ + if ( prog_pos + strlen(srepos) < NOTIFY_PROG_BUFFER ) + { + strcpy (prog + prog_pos, srepos); + prog_pos +=3D strlen (srepos); + } + break; + default: /* Unrecognised: preserve it anyway */ + if ( prog_pos + 2 < NOTIFY_PROG_BUFFER ) + { + sprintf(prog + prog_pos, "%%%c", filter[1]); + prog_pos +=3D 2; + } + break; } !=20 ! filter +=3D 2; } ! else ! { ! if ( prog_pos + 1 < NOTIFY_PROG_BUFFER ) ! { ! prog[prog_pos++] =3D *filter++; ! } ! } } =20 + prog[prog_pos] =3D '\0'; +=20 /* FIXME: why are we calling expand_proc? Didn't we already expand it in Parse_Info, before passing it to notify_proc? */ expanded_prog =3D expand_path (prog, "notify", 0); *************** ------=_NextPart_000_003D_01BE283A.DA9CDCC0--