Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
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;
}
Owner

DmitryOlshansky commented Sep 16, 2012

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

Owner

DmitryOlshansky commented Sep 16, 2012

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.

Owner

DmitryOlshansky commented Dec 24, 2012

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