File: //usr/share/jed/lib/chglog.sl
% Maintain ChangeLog files
custom_variable ("ChangeLog_Filename",
#ifdef VMS
"$CHANGE_LOG$.TXT"
#else
"ChangeLog"
#endif
);
custom_variable ("ChangeLog_User",
sprintf ("%s <%s>", get_realname (), get_emailaddress ()));
custom_variable ("ChangeLog_Indent_Amount", 8);
private define get_changelog_date ()
{
variable tm, day, month, year;
tm = localtime (_time ());
sprintf ("%d-%0d-%0d", 1900 + tm.tm_year, 1+tm.tm_mon, tm.tm_mday);
}
private define format_changelog_heading ()
{
variable date = get_changelog_date ();
return sprintf ("%s %s", date, ChangeLog_User);
}
private define locate_changelog_file ()
{
variable file, dir;
(,dir,,) = getbuf_info ();
forever
{
file = dircat (dir, ChangeLog_Filename);
if (1 == file_status (file))
return file;
% This may need modified for non-Unix systems...
#ifdef UNIX
dir = expand_filename (dircat (dir, "../"));
if (dir == "/")
break;
#elifdef IBMPC_SYSTEM
dir = expand_filename (dircat (dir, "..\\"));
if ((dir == "/") or (dir == "\\"))
break;
if (strlen (dir) == 3)
{
if (dir[1] == ':')
break;
}
#elifdef VMS
% Does this work?
dir = expand_filename (dircat (dir, "[-]"));
#endif
}
verror ("Unable to find a ChangeLog file");
}
private define get_changelog_file_item ()
{
variable dir, file;
(file, dir,,) = getbuf_info ();
ifnot (strlen (file))
return "";
if (file == ChangeLog_Filename)
return "";
return dircat (dir, file);
}
private define get_changelog_function ()
{
variable fun = mode_get_mode_info ("chglog_get_item");
if (fun != NULL)
fun = @fun ();
if (fun == NULL)
return "";
return fun;
}
private define wrap_hook ()
{
push_spot ();
bol_trim (); whitespace (ChangeLog_Indent_Amount + 2);
pop_spot ();
}
public define changelog_add_change ()
{
variable heading = format_changelog_heading ();
variable file = get_changelog_file_item ();
variable function = get_changelog_function ();
variable changelog = locate_changelog_file ();
if (strlen (file))
{
% Make it with respect to the changelog directory
variable i = 0;
while (changelog[i] == file[i]) % can this fail in practice?
i++;
file = file [[i:]];
}
() = read_file (changelog);
set_buffer_no_backup ();
pop2buf (whatbuf ());
text_mode ();
set_buffer_hook ("wrap_hook", &wrap_hook);
bob ();
ifnot (bol_fsearch (heading))
{
vinsert ("%s\n\n", heading);
bob ();
}
eol ();
variable m = create_user_mark ();
skip_chars (" \t\n*");
variable create_new_entry = 1;
if (looking_at (file))
{
go_right (strlen (file));
_get_point (); % on stack
skip_chars (" :");
create_new_entry = (() == _get_point ());
}
if (create_new_entry)
{
goto_user_mark (m);
insert ("\n\n");
whitespace (ChangeLog_Indent_Amount);
vinsert ("* %s ", file);
}
else
{
ifnot (re_fsearch ("^[ \t]*$"))
{
eob ();
}
trim ();
newline ();
go_up_1 ();
whitespace (8);
}
if (strlen (function))
vinsert ("(%s): ", function);
else if (create_new_entry and strlen (file))
{
trim ();
insert (": ");
}
}