Create a gist now

Instantly share code, notes, and snippets.

Changed - a changelog fabricator for D
///Written in the D programming language
/**
A script to fetch bugfixes from D Bugzilla between given dates and print them out in DDoc form.
*/
module changed;
import std.net.curl, std.conv, std.exception, std.algorithm, std.csv, std.typecons,
std.stdio, std.datetime, std.array, std.string, std.format, std.getopt;
auto templateRequest =
`http://d.puremagic.com/issues/buglist.cgi?username=crap2crap%40yandex.ru&password=powerlow7&chfieldto={to}&query_format=advanced&chfield=resolution&chfieldfrom={from}&bug_status=RESOLVED&resolution=FIXED&product=D&ctype=csv&columnlist=component%2Cbug_severity%2Cshort_desc`;
auto generateRequest(string templ, Date start, Date end)
{
auto ss = format("%04s-%02s-%02s", start.year, to!int(start.month), start.day);
auto es = format("%04s-%02s-%02s", end.year, to!int(end.month), end.day);
return templateRequest.replace("{from}", ss).replace("{to}", es);
}
auto dateFromStr(string sdate)
{
int year, month, day;
formattedRead(sdate, "%s-%s-%s", &year, &month, &day);
return Date(year, month, day);
}
struct Entry
{
int id;
string severity, summary;
}
int main(string[] args)
{
string start_date, end_date;
bool ddoc = false;
getopt(args,
"start", &start_date, // numeric
"end", &end_date); // string
if(start_date.empty)
{
writefln("*ERROR: No start date set.\nUsage example:\n%s --start=YYYY-MM-HH [--end=YYYY-MM-HH] ", args[0]);
return 1;
}
auto start = dateFromStr(start_date);
auto end = end_date.empty ? to!Date(Clock.currTime()) : dateFromStr(end_date);
auto req = generateRequest(templateRequest, start, end);
stderr.writeln(req);
auto data = req.get;
Entry[] dmd, druntime, phobos;
//stderr.writeln(data);
foreach(fields; csvReader!(Tuple!(int, string, string, string))(data, null))
{
//auto fields = splitCSV(line);
switch(fields[1].toUpper()){
case "DMD":
dmd ~= Entry(fields[0], fields[2], fields[3].idup);
break;
case "DRUNTIME":
druntime ~= Entry(fields[0], fields[2].idup, fields[3].idup);
break;
case "PHOBOS":
phobos ~= Entry(fields[0], fields[2].idup, fields[3].idup);
break;
default:
stderr.writeln("Skipping Issue ", fields[0], " Component: ", fields[1]);
}
}
void writeEntry(Entry e)
{
writefln("$(LI $(BUGZILLA %s): %s)", e.id, e.summary);
}
writeln("$(DMDBUGSFIXED ");
foreach(e; sort!"a.id < b.id"(dmd))
writeEntry(e);
writeln(")");
writeln("$(RUNTIMEBUGSFIXED ");
foreach(e; sort!"a.id < b.id"(druntime))
writeEntry(e);
writeln(")");
writeln("$(LIBBUGSFIXED ");
foreach(e; sort!"a.id < b.id"(phobos))
writeEntry(e);
writeln(")");
return 0;
}
@DmitryOlshansky
Owner

Usage: rdmd changed.d --start=2012-08-02
to get what would be changelog entries for upcoming 2.061

@DmitryOlshansky
Owner

rdmd changed.d --start=2012-04-12 --end=2012-08-02 > changlog.dd
Would get 2.060 changelog and show that there are some bugs that were indeed fixed but not currently listed on dlang.org e.g issue 2006.

@DmitryOlshansky
Owner

Mhm std.datetime months are now printed as abbreviations by default, odd.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment