<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description></description><title>Agavi</title><generator>Tumblr (3.0; @agavi)</generator><link>http://blog.agavi.org/</link><item><title>Fixing SVN Merge History in Git Repositories</title><description>&lt;p&gt;Assuming you use the fabulous &lt;a href="https://github.com/nirvdrum/svn2git"&gt;svn2git&lt;/a&gt; to convert your SVN repository to a Git one, you might still run into a problem: merge history.&lt;/p&gt;

&lt;h3&gt;Why And How To Fix Merge History&lt;/h3&gt;

&lt;h4&gt;Things Might Be Just Fine&lt;/h4&gt;

&lt;p&gt;If you have always used SVN 1.5 or newer and thus have &lt;code&gt;svn:mergeinfo&lt;/code&gt; properties for all your merges, you can ignore this part, as &lt;code&gt;git-svn&lt;/code&gt; will correctly identify merges from, say, a branch back to &lt;code&gt;trunk&lt;/code&gt; (or &lt;code&gt;master&lt;/code&gt; once the conversion is done) and attach two parents to that commit: the previous commit in &lt;code&gt;master&lt;/code&gt;, and the last commit from the branch that&amp;#8217;s being merged.&lt;/p&gt;

&lt;p&gt;In such a case, your history will look something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git log --pretty=format:\"%h %ad | %s%d [%an]\" --graph --date=short
* 0d34dbe 2009-08-12 | allow passing of arbitrary arguments to ant (HEAD, master) [felix]
*   a199e71 2009-07-06 | merging the changes from [3853:4186/branches/felix-tutorial-app-rewrite] major rewrite of tutorial apps major rewrite of build scripts [felix]
|\  
* | 2121341 2009-07-06 | removing staging apps for backmerge, somehow svn mucks up if I don't [felix]
| *   145e1aa 2009-07-06 | merging the changes from [4165:4184/branches/felix-build-scripts-rewrite] fixes #1115 (felix-tutorial-app-rewrite) [felix]
| |\  
| | * 2a9b5cc 2009-07-06 | fix excludes for svn directories (felix-build-scripts-rewrite) [felix]
| | * ec374ec 2009-07-02 | reorganized the stylesheets a little, make a custom base that does not set doctypes on the output and a stylesheet for the website as well as for the xhtml documentation that inherit from it [felix]
| | * f119381 2009-07-01 | modified the toolkits build system to allow overriding the xsl for the toc-generation [felix]
| | * 576b71b 2009-06-29 | creating branch for build scripts rewrite, fixing build problems in dita-ot 1.4.2 and greater refs #1115 [felix]
| |/  
| * 6e8e682 2009-06-26 | added a note about Action::executeRead() to the chapter about module creation fixes #1091 [felix]
| * 976c384 2009-02-18 | creating a branch for the rewrite of the tutorial apps to incorporate latest best practices. [felix]
* | 2121341 2009-07-06 | removing staging apps for backmerge, somehow svn mucks up if I don't [felix]
|/  
* fd87653 2008-10-31 | dump current versions of refguide [mikeseth]
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;But You&amp;#8217;re Probably Screwed&lt;/h4&gt;

&lt;p&gt;If, however, you did not have merge tracking yet, the history will look like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git log --pretty=format:\"%h %ad | %s%d [%an]\" --graph --date=short
* 0d34dbe 2009-08-12 | allow passing of arbitrary arguments to ant (HEAD, master) [felix]
* a199e71 2009-07-06 | merging the changes from [3853:4186/branches/felix-tutorial-app-rewrite] major rewrite of tutorial apps major rewrite of build scripts [felix]
* 2121341 2009-07-06 | removing staging apps for backmerge, somehow svn mucks up if I don't [felix]
* fd87653 2008-10-31 | dump current versions of refguide [mikeseth]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The reason becomes apparent when we use &lt;code&gt;git-rev-list&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git rev-list --all --graph --oneline --date-order
* 0d34dbe allow passing of arbitrary arguments to ant
* a199e71 merging the changes from [3853:4186/branches/felix-tutorial-app-rewrite] major rewrite of tutorial apps major rewrite of build scripts
* 2121341 removing staging apps for backmerge, somehow svn mucks up if I don't
| * 145e1aa merging the changes from [4165:4184/branches/felix-build-scripts-rewrite] fixes #1115
| | * 2a9b5cc fix excludes for svn directories
| | * ec374ec reorganized the stylesheets a little, make a custom base that does not set doctypes on the output and a stylesheet for the website as well as for the xhtml documentation that inherit from it
| | * f119381 modified the toolkits build system to allow overriding the xsl for the toc-generation
| | * 576b71b creating branch for build scripts rewrite, fixing build problems in dita-ot 1.4.2 and greater refs #1115
| |/  
| * 6e8e682 added a note about Action::executeRead() to the chapter about module creation fixes #1091
| * 976c384 creating a branch for the rewrite of the tutorial apps to incorporate latest best practices.
|/  
* fd87653 dump current versions of refguide
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The merge commits (&lt;code&gt;145e1aa&lt;/code&gt; and &lt;code&gt;a199e71&lt;/code&gt;) each have only one parent and do not point to the merged commits. This ancestry is then lost when running &lt;code&gt;git log&lt;/code&gt;. As a result, it will later be really difficult or impossible to find the commits from those branches again, especially if the corresponding branches have been removed from the origin.&lt;/p&gt;

&lt;h4&gt;Grafts To The Rescue&lt;/h4&gt;

&lt;p&gt;You can override parents of a commit in Git using a file called &lt;code&gt;grafts&lt;/code&gt;, which needs to reside in &lt;code&gt;.git/info/&lt;/code&gt;. In consists of several lines with commit hashes separated by a space character, where the first hash is the commit you want to define parents for, and the following hashes are the parents.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: you must use full hashes, not abbreviated ones.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To fix the history above, we must define the parents in &lt;code&gt;.git/info/grafts&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;a199e7194c5a4382c7d1057c84a55fcb535c8ed2 2121341005ef4fee0c1755d9ee083b6f0fbaf295 145e1aa687c7b1277c683b8116324a1552ba6454
145e1aa687c7b1277c683b8116324a1552ba6454 6e8e6828f7be352571faccef981568f4acc9ccb1 2a9b5ccf4b0870973508b37bef8d7759889a4f27
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Note: for a merge from, say, master to a branch (to sync the branch with master/trunk), you would use &lt;code&gt;$synccommit $lastmastercommit $lastbranchcommit&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If we now run &lt;code&gt;git log --pretty=format:\"%h %ad | %s%d [%an]\" --graph --date=short&lt;/code&gt;, things will look just like we expected.&lt;/p&gt;

&lt;p&gt;We can then run &lt;code&gt;git filter-branch&lt;/code&gt; to make the grafts permanent (see step &amp;#8220;Manual Conversion&amp;#8221; below). Note that this will change commit hashes.&lt;/p&gt;

&lt;h3&gt;Manual Conversion&lt;/h3&gt;

&lt;ol&gt;&lt;li&gt;Run &lt;code&gt;svn2git &lt;a href="http://svn.example.org/repos"&gt;http://svn.example.org/repos&lt;/a&gt; --no-minimize-url --metadata --authors authors.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Create a file &lt;code&gt;.git/info/grafts&lt;/code&gt; (you can use &lt;code&gt;git svn find-rev r$rev $branch&lt;/code&gt; to find a Git commit hash for an SVN revision number)&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;git filter-branch --tag-name-filter cat -- --all&lt;/code&gt; to make the grafts permanent&lt;/li&gt;
&lt;li&gt;Check if the history looks fine&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d&lt;/code&gt; to clean up the backups created by &lt;code&gt;git-filter-branch&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Remove the now obsolete &lt;code&gt;.git/info/grafts&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;h3&gt;Automatic Conversion&lt;/h3&gt;

&lt;p&gt;For the Agavi migration, we wrote a script to automate this process; it uses a &lt;code&gt;grafts&lt;/code&gt; file that contains SVN revision numbers (and their branch names) and converts it to a &lt;code&gt;grafts&lt;/code&gt; file fit for consumption by Git. We will put that script up on GitHub together with the rest of our migration toolkit in a few days.&lt;/p&gt;

&lt;h3&gt;Broken Branches&lt;/h3&gt;

&lt;p&gt;The Agavi &lt;code&gt;documentation&lt;/code&gt; repository contains a broken branch, where the branch was made from only a portion of trunk, not from the whole of trunk, in revision &lt;a href="http://trac.agavi.org/changeset/4285"&gt;4285&lt;/a&gt;. When running this through &lt;code&gt;svn2git&lt;/code&gt;, the whole history would be terribly confused and a lot of commits would appear as duplicates since &lt;code&gt;git-svn&lt;/code&gt; interpreted the branch point wrong.&lt;/p&gt;

&lt;p&gt;The fix in this case was to simply ignore that branch and only use its merge back to trunk (in revision 4308), as the loss of history information in this case was negligible. We told &lt;code&gt;svn2git&lt;/code&gt; top stop at the revision before the branch was created, and resume at the revision where the branch gets merged back to trunk (this required a &lt;a href="https://github.com/nirvdrum/svn2git/pull/48"&gt;patch&lt;/a&gt; to svn2git):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ svn2git &lt;a href="http://svn.agavi.org/documentation"&gt;http://svn.agavi.org/documentation&lt;/a&gt; --revision 2721:4284 --no-minimize-url --metadata --authors authors.txt
$ git svn fetch -q --revision 4308:HEAD
$ git merge -q svn/trunk
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We&amp;#8217;re only merging &lt;code&gt;svn/trunk&lt;/code&gt; in this case as all the commits from 4308 onwards were made to trunk. Also, between 4284 and 4308, all commits in this repository were in the branch we&amp;#8217;re skipping - had there been commits to trunk or other branches, things would have been a tiny bit more complicated, with several calls to &lt;code&gt;git svn fetch&lt;/code&gt; and &lt;code&gt;git merge&lt;/code&gt; to put the pieces together correctly.&lt;/p&gt;</description><link>http://blog.agavi.org/post/16865375185</link><guid>http://blog.agavi.org/post/16865375185</guid><pubDate>Wed, 01 Feb 2012 15:22:00 +0000</pubDate><category>github</category></item><item><title>Finding Problems in Commit Messages and Tickets When Migrating to GitHub</title><description>&lt;p&gt;Sometimes, you commit a change, but then you realize that you did not mention the ticket ID in your commit message. Or, worse: you use the wrong ticket ID.&lt;/p&gt;

&lt;p&gt;The usual remedy is adding this info to the ticket by hand. On the Agavi Trac, when a ticket ID was incorrect in a commit message, we would typically remove the corresponding entry from the wrong ticket and move it to the correct one.&lt;/p&gt;

&lt;p&gt;When migrating to GitHub and replaying all commits and ticket changes, that becomes a problem of course: the commit message still contains text like &amp;#8220;fixes #123&amp;#8221; when in fact it was supposed to reference ticket #124.&lt;/p&gt;

&lt;p&gt;It is therefore necessary to programmatically find and mitigate such problem cases and addressing them before importing things on GitHub. Failure to correct just a single of these problems may break the whole import by having tickets remain open randomly even though they were supposed to be closed and so forth. Here is a list of situations that need to be addressed:&lt;/p&gt;

&lt;h3&gt;Commit Messages Not Showing Up in Their Tickets&lt;/h3&gt;

&lt;p&gt;Sometimes a reference to a ticket ID in a commit message does not show up in the corresponding ticket. There are several reasons why this may happen:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;The message was never supposed to reference a ticket (&amp;#8220;Attempt #2 at this stupid merge&amp;#8221;) - not a problem in Trac since there is no &amp;#8220;refs&amp;#8221; or other keyword in front of &amp;#8220;#2&amp;#8221;, but on GitHub, this commit would show up in ticket #2.&lt;br/&gt;&lt;em&gt;=&amp;gt; Such a commit message must be modified to prevent this situation.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;The message contains the wrong ticket ID and was removed from that wrong ticket (and inserted by hand on the correct ticket)&lt;br/&gt;&lt;em&gt;=&amp;gt; Such a commit message must be modified to prevent this situation.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;The Trac post-commit hook was not installed or malfunctioning&lt;br/&gt;&lt;em&gt;=&amp;gt; This usually does not require any action.&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;h3&gt;Differences in Behavior Between Trac and GitHub&lt;/h3&gt;

&lt;p&gt;Aside from the first point above, there are other subtle but important differences between how Trac and GitHub parse commit messages:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;A commit closes several tickets at once without repeating the keyword, e.g. &amp;#8220;Add bacon, closes #4 and #5&amp;#8221;. This will close both tickets in Trac, but on GitHub, only ticket #4 is closed while ticket #5 is referenced.&lt;br/&gt;&lt;em&gt;=&amp;gt; The commit message must be changed so a &amp;#8220;closes&amp;#8221; or &amp;#8220;fixes&amp;#8221; keyword appears before every ticket ID.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;A commit shows up just fine in the Trac ticket, but the reference would not be detected by GitHub, e.g. due to a missing space character (&amp;#8220;This closes #5for real&amp;#8221; would close #5 in Trac but do nothing on GitHub).&lt;br/&gt;&lt;em&gt;=&amp;gt; A space character must be inserted&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;A commit closes a ticket that was already closed (this will cause the commit to not show up at all on GitHub).&lt;br/&gt;&lt;em&gt;=&amp;gt; The commit message must be changed, or a reopen command must be sent to the ticket before pushing the second commit.&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;h3&gt;Human Interference&lt;/h3&gt;

&lt;p&gt;People do stupid things in their ticket database, so aside from the situation we already discussed where a commit referenced the wrong ticket number, we&amp;#8217;ll have to watch out for:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;A commit referencing a ticket that, at the time the commit was made, did not exist yet (a mistake frequently made by time traveling contributors making commits from the future :&amp;gt;).&lt;br/&gt;&lt;em&gt;=&amp;gt; The easiest fix here is to simply make sure the ticket is created before the commit is pushed.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;A commit message that shows up in the right (or wrong) ticket, but has been altered (for whatever reason and by whatever means).&lt;br/&gt;&lt;em&gt;=&amp;gt; The commit message must be altered accordingly (or not if that&amp;#8217;s not desirable). Optionally, punch the person who fiddled with the message.&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;h3&gt;Largely Cosmetic Issues&lt;/h3&gt;

&lt;p&gt;Finally, a few things in commit messages or tickets may not be a problem for the import, but could still be nice to fix:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;Merges done using &lt;code&gt;svnmerge&lt;/code&gt; have the nasty habit of repeating all merged commit messages and thus cluttering the history.&lt;br/&gt;&lt;em&gt;=&amp;gt; It might be nice to remove the clutter from the commit message so all the tickets mentioned in the merged revisions remain clean.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;A ticket was closed manually, but with a reference to the corresponding commit.&lt;br/&gt;&lt;em&gt;=&amp;gt; This could be fixed by putting the ticket ID into the commit message, which will take advantage of GitHub&amp;#8217;s automatic referencing or closing of tickets in such a case.&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;</description><link>http://blog.agavi.org/post/16226841135</link><guid>http://blog.agavi.org/post/16226841135</guid><pubDate>Sat, 21 Jan 2012 14:56:08 +0000</pubDate><category>github</category></item><item><title>Basic Preparations for GitHub Ticket Migration</title><description>&lt;p&gt;Before modifying the ticket and comment contents themselves (to convert them from TracWiki syntax to Github Flavored Markdown), a few more fundamental changes are necessary:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;Find missing ticket IDs (the Agavi Trac has 83 &amp;#8220;gaps&amp;#8221; in the ticket ID sequence; those were all spam tickets that got deleted, but not in time for a legit ticket showing up with a later ID in the database)&lt;/li&gt;
&lt;li&gt;Compose a list of all ticket reporters, ticket change authors (e.g. people leaving a comment) and attachment authors and create a mapping to their GitHub user names or plain display names that will be used during import&lt;/li&gt;
&lt;li&gt;Migrate all milestones to the GitHub issue tracker&lt;/li&gt;
&lt;li&gt;Migrate all versions (as labels) to the GitHub issue tracker&lt;/li&gt;
&lt;li&gt;Migrate all components (as labels) to the GitHub issue tracker&lt;/li&gt;
&lt;li&gt;Migrate all ticket types (as labels) to the GitHub issue tracker&lt;/li&gt;
&lt;li&gt;Do something about Priorities and Severities&lt;/li&gt;
&lt;/ol&gt;&lt;h3&gt;1. Finding Missing Ticket IDs&lt;/h3&gt;

&lt;p&gt;That one is fairly easy:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sqlite3 trac.db 'SELECT id FROM ticket;' | php -r '
$ids = file("php://stdin", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
echo implode("\n", array_diff(range(1, max($ids)), $ids)) . "\n";
'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The resulting list needs to be stored somewhere for later, when we replay all ticket changes - that script will produce empty dummy tickets for the missing IDs to make sure all ticket IDs line up between Trac and GitHub.&lt;/p&gt;

&lt;h3&gt;2. List Ticket Reporters/Authors&lt;/h3&gt;

&lt;p&gt;We only need SQL for this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sqlite3 trac.db '
SELECT DISTINCT (user || " = ") FROM (
    SELECT reporter AS user FROM ticket
    UNION ALL
    SELECT author AS user FROM ticket_change
    UNION ALL
    SELECT author AS user FROM attachment
) ORDER BY LOWER(user) ASC;
'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The result can be put into a file that is then filled by hand with references to people. In our case, we chose to use either a GitHub username (if known, requires some research in certain cases), half of the person&amp;#8217;s e-mail address, or a nickname in quotes:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;anonymous = "anonymous"
david = @dzuelke
steve@REDACTED.com = steve@…
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#8220;REDACTED.com&amp;#8221; is obviously not what was really in there; the ellipsis (&amp;#8220;…&amp;#8221;) is correct however.&lt;/p&gt;

&lt;p&gt;This map will be used by a script later when replaying ticket changes via the GitHub API in order to embed information about the original authors. By using GitHub usernames with the &amp;#8220;@someone&amp;#8221; notation, a link will be created; we just have to get things right on the first attempt or some people will complain about notification spam ;)&lt;/p&gt;

&lt;h3&gt;3. Migrate Milestones&lt;/h3&gt;

&lt;p&gt;Very straightforward as the GitHub issue tracker supports milestones. They existing milestones in the Trac database are simply ported over to GitHub; milestone &amp;#8220;AgaviForge&amp;#8221; will be dropped however (and the corresponding tickets later reassigned).&lt;/p&gt;

&lt;h3&gt;4. Migrate Versions (as Labels)&lt;/h3&gt;

&lt;p&gt;Versions as registered in Trac will simply be imported as labels like &amp;#8220;0.10.2&amp;#8221; or &amp;#8220;1.0.8&amp;#8221;. For now, we will import all versions except for &amp;#8220;HEAD&amp;#8221;, &amp;#8220;HEAD-1.0&amp;#8221; and &amp;#8220;HEAD-0.11&amp;#8221; since those only cause clutter and thus far have rarely been used.&lt;/p&gt;

&lt;p&gt;This will create a considerable amount of labels just for the versions; we might eventually merge them all into series labels (like &amp;#8220;1.0.x&amp;#8221; or &amp;#8220;1.1-latest&amp;#8221;, similar to e.g. Ruby on Rails). When doing that, we might also drop old series labels that are not maintained anymore, simply to cut down on clutter.&lt;/p&gt;

&lt;p&gt;One last thing to decide upon of course is the color codes for the versions. No great ideas yet, as the colors are shared with components and ticket types (see below).&lt;/p&gt;

&lt;h3&gt;5. Migrate Components (as Labels)&lt;/h3&gt;

&lt;p&gt;Components will be migrated to labels with identical names, with the exception of &amp;#8220;documentation&amp;#8221; (will be moved to a separate repository), &amp;#8220;website&amp;#8221; (never has been part of the SVN repos, but will be moved to its own GitHub repository eventually) and &amp;#8220;&lt;em&gt;OTHER&lt;/em&gt;&amp;#8221; (no label will be assigned to such issues).&lt;/p&gt;

&lt;p&gt;Again, color coding is something that&amp;#8217;s left to be decided (suggestions welcome).&lt;/p&gt;

&lt;h3&gt;6. Migrate Types (as Labels)&lt;/h3&gt;

&lt;p&gt;There currently are just three issue types: &amp;#8220;defect&amp;#8221;, &amp;#8220;enhancement&amp;#8221; and &amp;#8220;task&amp;#8221;. Those will be migrated as-is, with defects getting a flashy red color, enhancements a nice green, and tasks&amp;#8230; well&amp;#8230; turquoise maybe?&lt;/p&gt;

&lt;h3&gt;7. Priorities and Severities&lt;/h3&gt;

&lt;p&gt;Priorities will simply be dropped, they have never proven to be useful. Same for severities, although we might have a dedicated label for blockers, indicating that resolving such an issue may not be postponed until a later release.&lt;/p&gt;</description><link>http://blog.agavi.org/post/15231246114</link><guid>http://blog.agavi.org/post/15231246114</guid><pubDate>Tue, 03 Jan 2012 07:00:00 +0000</pubDate><category>github</category></item><item><title>Porting Trac Ticket Attachments to GitHub</title><description>&lt;p&gt;Some of the tickets in the Agavi Trac have attachments; these attachment files need special treatment as the GitHub issue tracker itself has no support for attachments.&lt;/p&gt;

&lt;p&gt;We&amp;#8217;ve created a repository (&lt;a href="https://github.com/agavi/trac-ticket-attachments"&gt;agavi/trac-ticket-attachments&lt;/a&gt;) for this purpose and simply imported the everything from &lt;code&gt;trac/attachments/tickets&lt;/code&gt;, which contains just a bunch of folders with the ticket ID and the attachments of the ticket inside them. Some of the files have &lt;code&gt;%20&lt;/code&gt; in them as the uploaded files had spaces in their names; we changed those to actual space characters so the URL escape does not end up in the file name in the Git repository.&lt;/p&gt;

&lt;p&gt;We will later rewrite the ticket history so the attachment links point to the corresponding files in this repository.&lt;/p&gt;</description><link>http://blog.agavi.org/post/15058515069</link><guid>http://blog.agavi.org/post/15058515069</guid><pubDate>Sat, 31 Dec 2011 02:20:32 +0000</pubDate><category>github</category></item><item><title>Testing GitHub Tickets for the Migration</title><description>&lt;p&gt;One thing we&amp;#8217;ve always put a focus on is having tickets for every change we make, and using these tickets extensively in commit messages and from other tickets so a quick &lt;code&gt;svn blame&lt;/code&gt; on a line not only shows a description of the change, but also gives a ticket number that can be looked up on &lt;a href="http://trac.agavi.org/"&gt;Trac&lt;/a&gt; to follow a discussion of the change.&lt;/p&gt;

&lt;p&gt;On numerous occasions, I looked at a bit of code, found it to be incredibly stupid, but then did an &lt;code&gt;svn blame&lt;/code&gt; anyway to figure out when the change was done. Looking up the ticket on Trac then usually gives a list of all the commits for that change, and maybe even related tickets and discussions. Often enough, that line of code then turned out to not be so stupid after all, and the day was saved.&lt;/p&gt;

&lt;p&gt;Good examples are tickets &lt;a href="http://trac.agavi.org/ticket/502"&gt;#502&lt;/a&gt; or &lt;a href="http://trac.agavi.org/ticket/1199"&gt;#1199&lt;/a&gt;, which link to related and duplicate tickets, have discussions in them and of course commits references.&lt;/p&gt;

&lt;p&gt;All these tickets contain valuable information, so it is vital to preserve all this history. However, the GitHub ticket API does not allow a timestamp in updates, which means that any ticket and any comment will have the date and time of import, and not the old date and time. Commits from the repository, however, will contain the correct timestamps as git2svn preserves that information.&lt;/p&gt;

&lt;p&gt;We tested how the GitHub issue tracker behaves with respect to timestamps, and found the following:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;For commits referencing a ticket (via &amp;#8220;refs #123&amp;#8221; or &amp;#8220;closes #456&amp;#8221;) will use the timestamp of the commit for the reference, not the timestamp of the push&lt;/li&gt;
&lt;li&gt;Comments and commit references in tickets are in the order of their creation in the tracker, not in the order of their timestamps&lt;/li&gt;
&lt;li&gt;Tickets that do not exist are not updated retroactively when referenced in a commit message&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;The result is that we can now build a database of commits and ticket changes that are in the order of their timestamps, and replay them step by step, meaning that we will convert the repos, then push a commit, then replay a ticket update or creation, then push another commit and so forth. The result will be that a ticket might contain a comment (with a timestamp of, say, January 2&amp;#160;2012&amp;#160;13:04:12 because that&amp;#8217;s the time when our API client replayed that change) followed by a commit reference that closed the ticket (with a timestamp of, say, August 4&amp;#160;2007&amp;#160;08:09:12, because that&amp;#8217;s when that change was committed).&lt;/p&gt;

&lt;p&gt;Ultimately, this means that we will be able to use GitHub&amp;#8217;s native support for &amp;#8220;refs #123&amp;#8221; or &amp;#8220;closes #456&amp;#8221;, which will look much nicer than manually having to construct comments through the API about commits referencing the issue.&lt;/p&gt;

&lt;p&gt;The remaining issue of course is that any comment and ticket will have the wrong date and time, so we&amp;#8217;ll have to include that in the next (along with a notice saying that the ticket/comment was migrated from the old Trac, just so people know), but it simply seems like there is no way around that with the GitHub API.&lt;/p&gt;

&lt;p&gt;Regarding severities and priorities, we might drop these altogether along with keywords; components can be done via labels, and so can ticket types (enhancement/task/defect) and versions. Milestones are supported natively by the GitHub issue tracker, so they won&amp;#8217;t be a problem.&lt;/p&gt;

&lt;p&gt;Certain changes in GitHub, such as changing milestones, labels or assignees, are not displayed in the web interface, even though the changes appear to be recorded internally and are available through the API, so the information itself is not lost.&lt;/p&gt;</description><link>http://blog.agavi.org/post/15044863770</link><guid>http://blog.agavi.org/post/15044863770</guid><pubDate>Fri, 30 Dec 2011 21:39:00 +0000</pubDate><category>github</category></item><item><title>Moving to GitHub!</title><description>&lt;p&gt;We have just begun working on migrating &lt;a href="http://trac.agavi.org/"&gt;trac.agavi.org&lt;/a&gt; and &lt;a href="http://svn.agavi.org/"&gt;svn.agavi.org&lt;/a&gt; to GitHub; there is whole range of things to consider, from referencing users correctly over rewriting commit messages so the correct Git commit references are included to preserving the history of tickets in their right order.&lt;/p&gt;

&lt;p&gt;We will add more blog posts as we move along to document the process in case other projects would like to do the same, and also make our migration scripts available if they are sufficiently generic to be useful to others.&lt;/p&gt;</description><link>http://blog.agavi.org/post/15041655792</link><guid>http://blog.agavi.org/post/15041655792</guid><pubDate>Fri, 30 Dec 2011 20:34:00 +0000</pubDate><category>github</category></item><item><title>Agavi 1.0.7 released!</title><description>&lt;p&gt;Agavi 1.0.7 is now available for download at &lt;a href="http://www.agavi.org/"&gt;&lt;a href="http://www.agavi.org"&gt;www.agavi.org&lt;/a&gt;&lt;/a&gt; and through the &lt;a href="http://pear.agavi.org/"&gt;PEAR channel&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The release contains just two minor changes over &lt;a href="http://blog.agavi.org/post/14227198005/agavi-1-0-7-rc2-released"&gt;RC2&lt;/a&gt;, so I&amp;#8217;ll simply quote from the final &lt;a href="http://svn.agavi.org/tags/1.0.7/RELEASE_NOTES"&gt;release notes&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The getCredentials() method on an Action is no longer called unconditionally (i.e. whether or not the isSecure() method returned false) but only if the Action is &amp;#8220;secure&amp;#8221;.&lt;/p&gt;
  
  &lt;p&gt;It is now possible to manually call shutdown() on any database adapter to close the underlying connection; another call to getConnection() will cause a reconnect.&lt;/p&gt;
  
  &lt;p&gt;AgaviFormPopulationFilter will now populate multiple forms in the order specified in the &amp;#8220;populate&amp;#8221; request attribute (when populating via an array with form IDs as keys and parameter holders as values) in namespace &amp;#8220;org.agavi.filter.FormPopulationFilter&amp;#8221;); however, if the value for a key in the &amp;#8220;populate&amp;#8221; array is boolean true (to re-populate from request data), this form will always be handled first, so error messages are inserted on that form first.&lt;/p&gt;
  
  &lt;p&gt;Testing is now compatible with both PHPUnit 3.5 and 3.6. If you want to specify code coverage filters, AgaviTesting::getCodeCoverageFilter() returns the correct instance (singleton or not depending on the PHPUnit version) for you to use. A base constraint class named &amp;#8220;AgaviBaseConstraintBecausePhpunitSucksAtBackwardsCompatibility&amp;#8221; can be used for constraints that work with both PHPUnit 3.5 and 3.6; if you implement the new matches() method introduced in PHPUnit 3.6 instead of the old evaluate(), it will automatically be called in the proper fashion depending on the PHPUnit version.&lt;/p&gt;
  
  &lt;p&gt;AgaviTesting::dispatch() can now call exit() with the appropriate shell status code (the same as returned by a vanilla PHPUnit run) to indicate success or failures/errors to the calling process. This behavior is triggered when the new optional second argument, defaulting to false, is set to true. If set to false, it returns the PHPUnit result object that may be used by custom code to perform further analysis of the test run.&lt;/p&gt;
  
  &lt;p&gt;Several other minor changes and fixes are included in this release as well; most notably, AgaviBooleanValidator&amp;#8217;s casting and exporting logic has been repaired, and AgaviConsoleRequest now properly creates an AgaviUploadedFile object with STDIN contents (when configured to read those) instead of a plain array. The PHPTAL renderer now supports configuration of character encoding via parameter &amp;#8220;encoding&amp;#8221;.&lt;/p&gt;
  
  &lt;p&gt;The timezone database was updated to version 2011n.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As always, check the &lt;a href="http://svn.agavi.org/tags/1.0.7/CHANGELOG"&gt;CHANGELOG&lt;/a&gt; for the full list of enhancements, changes and fixes.&lt;/p&gt;</description><link>http://blog.agavi.org/post/14615791332</link><guid>http://blog.agavi.org/post/14615791332</guid><pubDate>Thu, 22 Dec 2011 13:59:31 +0000</pubDate></item><item><title>Agavi 1.0.7 RC2 released!</title><description>&lt;p&gt;Agavi 1.0.7 RC2 is now available for download at &lt;a href="http://www.agavi.org/"&gt;&lt;a href="http://www.agavi.org"&gt;www.agavi.org&lt;/a&gt;&lt;/a&gt; and through the &lt;a href="http://pear.agavi.org"&gt;PEAR channel&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A few minor &lt;a href="http://svn.agavi.org/tags/1.0.7RC2/CHANGELOG"&gt;fixes and changes&lt;/a&gt; have made it in since &lt;a href="http://blog.agavi.org/post/13070555297/agavi-1-0-7-rc1-released"&gt;RC1&lt;/a&gt;; most notably, PHPUnit 3.6 should work fine now, and the Form Population Filter, when populating several forms (via an array as the value for &amp;#8220;populate&amp;#8221; with form IDs as keys) now gives precedence to boolean true values (so error messages are inserted on re-populated forms first) and processes forms in the order given in the &amp;#8220;populate&amp;#8221; array rather than in the order they appear in the document.&lt;/p&gt;

&lt;p&gt;Please test this thoroughly and give feedback if necessary so we can roll a final version before the holidays.&lt;/p&gt;</description><link>http://blog.agavi.org/post/14227198005</link><guid>http://blog.agavi.org/post/14227198005</guid><pubDate>Wed, 14 Dec 2011 20:51:35 +0000</pubDate></item><item><title>Agavi 1.0.7 RC1 released!</title><description>&lt;p&gt;Agavi 1.0.7-RC1 is now available for download at &lt;a href="http://www.agavi.org/"&gt;&lt;a href="http://www.agavi.org"&gt;www.agavi.org&lt;/a&gt;&lt;/a&gt; and via the &lt;a href="http://pear.agavi.org/"&gt;PEAR channel&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As always, the &lt;a href="http://svn.agavi.org/tags/1.0.7RC1/CHANGELOG"&gt;CHANGELOG&lt;/a&gt; has the full story, but here is a summary of the most important changes:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;p&gt;The &lt;code&gt;getCredentials()&lt;/code&gt; method on an Action is no longer called unconditionally (i.e. whether or not the &lt;code&gt;isSecure()&lt;/code&gt; method returned false) but only if the Action is &amp;#8220;secure&amp;#8221;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The PHPTAL renderer now supports configuration of character encoding via parameter &amp;#8220;encoding&amp;#8221;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It is now possible to manually call &lt;code&gt;shutdown()&lt;/code&gt; on any database adapter to close the underlying connection; another call to &lt;code&gt;getConnection()&lt;/code&gt; will cause a reconnect.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;AgaviTesting::dispatch()&lt;/code&gt; can now call &lt;code&gt;exit()?  with the appropriate shell status code (the same as returned by a vanilla PHPUnit run) to indicate success or failures/errors to the calling process. This behavior is triggered when the new optional second argument, defaulting to&lt;/code&gt;false&lt;code&gt;, is set to&lt;/code&gt;true&lt;code&gt;. If set to&lt;/code&gt;false`, it returns the PHPUnit result object that may be used by custom code to perform further analysis of the test run.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Several other minor changes and fixes are included in this release as well; most notably, &lt;code&gt;AgaviBooleanValidator&lt;/code&gt;&amp;#8217;s casting and exporting logic has been repaired, and &lt;code&gt;AgaviConsoleRequest&lt;/code&gt; now properly creates an &lt;code&gt;AgaviUploadedFile&lt;/code&gt; object with STDIN contents (when configured to read those) instead of a plain array.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The timezone database was updated to version 2011n.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>http://blog.agavi.org/post/13070555297</link><guid>http://blog.agavi.org/post/13070555297</guid><pubDate>Sun, 20 Nov 2011 18:45:54 +0000</pubDate></item><item><title>Agavi 1.0.6 released!</title><description>&lt;p&gt;We&amp;#8217;re thrilled to announce that the final version of Agavi 1.0.6 is now available for download at &lt;a href="http://www.agavi.org/"&gt;agavi.org&lt;/a&gt; and through the &lt;a href="http://pear.agavi.org/"&gt;PEAR channel&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There were no changes in this release over the release candidate, so please refer to the &lt;a href="http://blog.agavi.org/post/7490226913/agavi-1-0-6-rc1-released"&gt;RC1 release announcement&lt;/a&gt; and of course once again the &lt;a href="http://svn.agavi.org/tags/1.0.6/CHANGELOG"&gt;CHANGELOG&lt;/a&gt; to see what great new features and changes are included in this new version.&lt;/p&gt;</description><link>http://blog.agavi.org/post/7981987846</link><guid>http://blog.agavi.org/post/7981987846</guid><pubDate>Sat, 23 Jul 2011 21:43:00 +0100</pubDate></item><item><title>Agavi 1.0.6 RC1 released!</title><description>&lt;p&gt;We&amp;#8217;re happy to announce that the first release candidate for version 1.0.6 is now available for download at &lt;a href="http://www.agavi.org/"&gt;agavi.org&lt;/a&gt; and through the &lt;a href="http://pear.agavi.org/"&gt;PEAR channel&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This release adds a database adapter for Doctrine 2, a renderer for the Twig template engine, a native session storage for ext/sqlsrv and various enhancements such as support for Smarty 3 in the existing renderer and extended configuration abilities for the Doctrine 1 database adapter.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.doctrine-project.org/"&gt;Doctrine 2&lt;/a&gt; support was added, both for the &lt;a href="http://www.doctrine-project.org/projects/orm"&gt;ORM&lt;/a&gt; (&lt;code&gt;AgaviDoctrine2ormDatabase&lt;/code&gt;) and the &lt;a href="http://www.doctrine-project.org/projects/dbal"&gt;DBAL&lt;/a&gt; (&lt;code&gt;AgaviDoctrine2dbalDatabase&lt;/code&gt;) libraries. The ORM adapter can optionally utilize a pre-configured DBAL connection instead of specifying connection details itself. Both adapters allow for easy extensibility with custom logic by exposing a &lt;code&gt;prepareConfiguration()&lt;/code&gt; and a &lt;code&gt;prepareEventManager()&lt;/code&gt; method that can be used to customize the configuration and the event manager, respectively. The API documentation for both classes contains a detailed list of all options; a typical ORM adapter configuration would look similar to this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;database name="master" class="AgaviDoctrine2ormDatabase"&amp;gt;
    &amp;lt;ae:parameter name="connection"&amp;gt;
        &amp;lt;ae:parameter name="driver"&amp;gt;pdo_mysql&amp;lt;/ae:parameter&amp;gt;
        &amp;lt;ae:parameter name="host"&amp;gt;127.0.0.1&amp;lt;/ae:parameter&amp;gt;
        &amp;lt;ae:parameter name="user"&amp;gt;root&amp;lt;/ae:parameter&amp;gt;
        &amp;lt;ae:parameter name="dbname"&amp;gt;test&amp;lt;/ae:parameter&amp;gt;
    &amp;lt;/ae:parameter&amp;gt;
    &amp;lt;ae:parameter name="configuration"&amp;gt;
        &amp;lt;ae:parameter name="metadata_driver_impl_argument"&amp;gt;%core.model_dir%/Entities&amp;lt;/ae:parameter&amp;gt;
    &amp;lt;/ae:parameter&amp;gt;
&amp;lt;/database&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;An example &lt;code&gt;cli-config.php&lt;/code&gt; file demonstrating how to integrate Agavi with the Doctrine command line utilities can be found in &lt;a href="http://svn.agavi.org/tags/1.0.6RC1/etc/database/doctrine2/"&gt;etc/database/doctrine2&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The database adapter for Doctrine 1 now allows basic configuration of cache drivers for result and query caches, and added the ability to specify the class to use as the connection event listener - this allows a custom implementation to be used, where more advanced logic can be executed in the &lt;code&gt;preConnect()&lt;/code&gt; event handler method, which is useful for modifying the connection or manager objects in ways not supported through configuration options.&lt;/p&gt;

&lt;p&gt;It is now possible to use &lt;a href="http://php.net/sqlsrv"&gt;ext/sqlsrv&lt;/a&gt; as a session storage via &lt;code&gt;AgaviSqlsrvSessionStorage&lt;/code&gt; as an alternative to interfacing with Microsoft SQL Server via PDO. The session table&amp;#8217;s data column must be of type &amp;#8220;varbinary&amp;#8221;.&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://www.twig-project.org/"&gt;Twig&lt;/a&gt; template engine is supported through &lt;code&gt;AgaviTwigRenderer&lt;/code&gt;; includes and inheritance lookups are performed on the current directory first by default before falling back to the main template directory. The lookup sequence is configurable. The renderer will also attempt to load a localized template from a locale subdirectory first before picking a generic one if the template that initiated the include or extension was a localized template.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;AgaviSmartyRenderer&lt;/code&gt; received minor adjustments to support Smarty 3 without triggering deprecation notices.&lt;/p&gt;

&lt;p&gt;The Sample App now uses the regular &amp;#8220;web&amp;#8221; context to serve the WSDL for the product service; the WSDL contents can now be retrieved through the URL &lt;code&gt;/products.wsdl&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The timezone database was updated to version 2011h.&lt;/p&gt;

&lt;p&gt;A complete list of changes in this release can be found in the &lt;a href="http://svn.agavi.org/tags/1.0.6RC1/CHANGELOG"&gt;CHANGELOG&lt;/a&gt;. Please take it for a spin and report any issues before we release a final version soon!&lt;/p&gt;</description><link>http://blog.agavi.org/post/7490226913</link><guid>http://blog.agavi.org/post/7490226913</guid><pubDate>Mon, 11 Jul 2011 12:42:00 +0100</pubDate></item><item><title>Agavi 1.0.5 released!</title><description>&lt;p&gt;The final version of Agavi 1.0.5 is now available at &lt;a href="http://www.agavi.org/"&gt;&lt;a href="http://www.agavi.org"&gt;www.agavi.org&lt;/a&gt;&lt;/a&gt; and through the &lt;a href="http://pear.agavi.org/"&gt;PEAR channel&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A small number of fixes and changes have made it in since &lt;a href="http://blog.agavi.org/post/6246975561/agavi-1-0-5-rc1-released"&gt;1.0.5 RC1&lt;/a&gt;; the most important one is compatibility with PHPUnit 3.5.&lt;/p&gt;

&lt;p&gt;To support PHPUnit 3.5, we had to drop support for PHPUnit 3.4 since a few backwards-incompatible changes were made that we could not work around. Your tests should not be affected, but your run-tests.php will likely need an adjustment to use &lt;code&gt;PHP_CodeCoverage_Filter::getInstance()-&amp;gt;addDirectoryToBlacklist()&lt;/code&gt; instead of the now-removed &lt;code&gt;PHPUnit_Util_Filter::addDirectoryToFilter()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;As always, &lt;a href="http://svn.agavi.org/tags/1.0.5/CHANGELOG"&gt;CHANGELOG&lt;/a&gt; and &lt;a href="http://svn.agavi.org/tags/1.0.5/RELEASE_NOTES"&gt;RELEASE_NOTES&lt;/a&gt; will be happy to tell you all the details.&lt;/p&gt;

&lt;p&gt;Another &lt;a href="http://trac.agavi.org/milestone/1.0.6"&gt;1.0.6 release&lt;/a&gt; is planned soon with a few minor additions on the road to &lt;a href="http://trac.agavi.org/milestone/1.1"&gt;Agavi 1.1&lt;/a&gt;, which has made good progress over the last few weeks.&lt;/p&gt;</description><link>http://blog.agavi.org/post/6597768729</link><guid>http://blog.agavi.org/post/6597768729</guid><pubDate>Thu, 16 Jun 2011 21:49:09 +0100</pubDate></item><item><title>Agavi 1.0.5 RC1 released!</title><description>&lt;p&gt;Agavi 1.0.5 RC1 is now available for download at &lt;a href="http://www.agavi.org/"&gt;&lt;a href="http://www.agavi.org"&gt;www.agavi.org&lt;/a&gt;&lt;/a&gt; and through the &lt;a href="http://pear.agavi.org/"&gt;PEAR channel&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There are quite a few changes in this release, so I&amp;#8217;ll quote from the &lt;a href="http://trac.agavi.org/browser/tags/1.0.5RC1/RELEASE_NOTES"&gt;RELEASE_NOTES&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;This release improves the robustness of AgaviFormPopulationFilter especially for XHTML and HTML5, and fixes several issues. The database adapters for ext/mysql, ext/mysqli and ext/pdo (when used with MySQL connections) now also prevent potentially unsafe setting of connection encodings.&lt;/p&gt;
  
  &lt;p&gt;AgaviFormPopulationFilter can now recover from various non-fatal parse errors, such as unknown tags or malformed markup in HTML parsing mode, and undefined entities in XML parsing mode.
  This marks an end to issues with non-XML entities like &amp;#8220;&lt;code&gt;&amp;amp;nbsp;&lt;/code&gt;&amp;#8221; in XML parsing mode, and allows the use of HTML5 elements (which libxml does not know yet) in HTML parsing mode (i.e. without using the XML serialization of HTML5).
  Instead of a boolean true or false, the configuration parameter &amp;#8220;ignore_parse_errors&amp;#8221; now takes the possible values &amp;#8220;LIBXML_ERR_NONE&amp;#8221; (equivalent to boolean false), &amp;#8220;LIBXML_ERR_WARNING&amp;#8221; (quite useless), &amp;#8220;LIBXML_ERR_ERROR&amp;#8221; (the new default) and &amp;#8220;LIBXML_ERR_FATAL&amp;#8221; (equivalent to boolean true). FPF will suppress errors and continue operation if the errors encountered during parsing do not exceed the configured maximum ignore level. In the event of a fatal error, such as malformed markup in XML parsing mode, FPF will silently abort execution if &amp;#8220;LIBXML_ERR_FATAL&amp;#8221; is configured, as fatal errors are not recoverable. In all other cases, FPF will throw an exception or recover from the error, depending on the configured ignore level and the highest error level encountered during parsing.
  The new default ignore level &amp;#8220;LIBXML_ERR_ERROR&amp;#8221; means that users will see significantly fewer errors during development; it also means, however, that in HTML parsing mode in particular, well-formedness errors may remain unnoticed. For this reason, FPF will continue to log errors (if logging is enabled), and map the error level of the parse error (LIBXML_ERR_WARNING, LIBXML_ERR_ERROR or LIBXML_ERR_FATAL) to the error level of the logging system (AgaviILogger::WARN, AgaviILogger::ERROR or AgaviILogger::FATAL). As a consequence, the &amp;#8220;logging_severity&amp;#8221; configuration parameter has been removed.&lt;/p&gt;
  
  &lt;p&gt;AgaviZendclouddocumentserviceDatabase is a database adapter for Zend Framework&amp;#8217;s Zend_Cloud_DocumentService. It has a convenience interface mirroring most of the Zend_Cloud_DocumentService_Adapter functions in such a way that the collection/domain/database name does not have to be passed to every call. The collection name can then be configured in databases.xml.&lt;/p&gt;
  
  &lt;p&gt;AgaviMysqlDatabase, AgaviMysqliDatabase and AgaviPdoDatabase now throw errors when attempting to use a statement like &amp;#8220;SET NAMES utf8&amp;#8221; as an initialization query, since the respective client libraries (libmysql or mysqlnd) will not be aware of this changed character set. For the usual connection encodings like &amp;#8220;latin1&amp;#8221; or &amp;#8220;utf8&amp;#8221;, this is not a problem, but in combination with multi-byte character sets that use bytes without the most significant bit set in multi-byte character sequences (such as GBK or Big5), this may result in incorrectly quoted strings, which could ultimately result in vulnerabilities in applications.
  For AgaviMysqlDatabase and AgaviMysqliDatabase, the simple fix is to remove the &amp;#8220;SET NAMES&amp;#8221; query from &amp;#8220;init_queries&amp;#8221; and use the new option &amp;#8220;charset&amp;#8221; instead. For AgaviPdoDatabase, a similar approach (specifying the charset in the DSN) works for PHP version 5.3.6 and newer, but in older versions of PHP, the PDO MySQL driver ignores the &amp;#8220;charset&amp;#8221; option in the DSN. If your my.cnf configuration file specifies &amp;#8220;latin1&amp;#8221; and you simply switch to UTF-8 using &amp;#8220;SET NAMES utf8&amp;#8221;, this is no problem, but for some charsets, this may result in the quoting issues mentioned above. This is why AgaviPdoDatabase requires you to set &amp;#8220;warn_mysql_charset&amp;#8221; to false in such environments. With this flag explicitly disabled, it will also be possible to use &amp;#8220;SET NAMES&amp;#8221; init queries again, but be advised that this is at your own risk. You may mitigate the risks by using native prepared statements (disable PDO::ATTR_EMULATE_PREPARES), but this will not affect calls to PDO::quote() or prepared statements where this flag has been overridden.&lt;/p&gt;
  
  &lt;p&gt;Passing an empty string as the scheme in the options array when generating a URL with AgaviWebRouting will now produce a protocol-relative URL starting with &amp;#8220;//&amp;#8221;. This is useful for generated content embedded by third party sites that use both normal and secured HTTP transports.&lt;/p&gt;
  
  &lt;p&gt;AgaviMysqlSessionStorage and AgaviPdoSessionStorage have improved update and insert behaviors for MySQL that should eliminate occasional non-critical &amp;#8220;exception thrown without a stack frame&amp;#8221; errors on shutdown when no session data (including the timestamp) was modified.&lt;/p&gt;
  
  &lt;p&gt;AgaviCreoleDatabase, AgaviCreoleSessionStorage and support for Propel versions older than 1.3 in AgaviPropelDatabase have been marked deprecated and are slated for removal in Agavi 1.1.&lt;/p&gt;
  
  &lt;p&gt;The recommended URL rewrites in Apache .htaccess files have been adjusted once more to disable the DirectorySlash directive.&lt;/p&gt;
  
  &lt;p&gt;X-Forwarded-Proto style HTTPS indicators as used on Amazon&amp;#8217;s Elastic Load Balancers are now supported for the &amp;#8220;HTTPS&amp;#8221; data source key in AgaviWebRequest.&lt;/p&gt;
  
  &lt;p&gt;The timezone database has been updated to 2011g.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As usual, the &lt;a href="http://trac.agavi.org/browser/tags/1.0.5RC1/CHANGELOG"&gt;CHANGELOG&lt;/a&gt; has a comprehensive list of all changes. A final release will follow shortly if no show-stoppers are found.&lt;/p&gt;</description><link>http://blog.agavi.org/post/6246975561</link><guid>http://blog.agavi.org/post/6246975561</guid><pubDate>Mon, 06 Jun 2011 13:06:00 +0100</pubDate></item><item><title>Agavi 1.0.4 released!</title><description>&lt;p&gt;The final version of Agavi 1.0.4 is now available, our biggest maintenance release yet!&lt;/p&gt;

&lt;p&gt;You can download it at &lt;a href="http://www.agavi.org/"&gt;agavi.org&lt;/a&gt; or install it via the &lt;a href="http://pear.agavi.org/"&gt;pear.agavi.org&lt;/a&gt; PEAR channel.&lt;/p&gt;

&lt;p&gt;Here is a summary of the most important changes over 1.0.3 (for a full list, please refer to the &lt;a href="http://trac.agavi.org/browser/tags/1.0.4/RELEASE_NOTES"&gt;RELEASE_NOTES&lt;/a&gt; and &lt;a href="http://trac.agavi.org/browser/tags/1.0.4/CHANGELOG"&gt;CHANGELOG&lt;/a&gt; files):&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Support for the Windows Azure platform&lt;/li&gt;
&lt;li&gt;AgaviXsltRenderer&lt;/li&gt;
&lt;li&gt;AgaviDoctrineDatabase lazy initialization&lt;/li&gt;
&lt;li&gt;Logging enhancements&lt;/li&gt;
&lt;li&gt;AgaviBooleanValidator and other validation improvements and fixes&lt;/li&gt;
&lt;li&gt;Updated timezone database and Schematron implementation&lt;/li&gt;
&lt;li&gt;PHPUnit is no longer bundled with Agavi&lt;/li&gt;
&lt;li&gt;Resolves compatibility problems with Phing 2.4.4 due to a BC break&lt;/li&gt;
&lt;li&gt;Improved exception rendering&lt;/li&gt;
&lt;li&gt;New rewrites in the default .htaccess files&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;The ability to extract subpatterns in AgaviRegexValidator introduced in 1.0.4 RC1 has been modified, please see the associated ticket for details.&lt;/p&gt;

&lt;p&gt;The next release will be 1.0.5 with a bunch of enhancements &lt;a href="http://blog.agavi.org/post/2314316279"&gt;as detailed earlier this week&lt;/a&gt;; an RC should be out before the end of this year.&lt;/p&gt;

&lt;p&gt;Happy holidays to you and your families!&lt;/p&gt;</description><link>http://blog.agavi.org/post/2376650410</link><guid>http://blog.agavi.org/post/2376650410</guid><pubDate>Sun, 19 Dec 2010 19:23:00 +0000</pubDate></item><item><title>Agavi 1.0.4 RC1 released!</title><description>&lt;p&gt;It&amp;#8217;s been quite a while since our last release, so we&amp;#8217;re happy to announce the availability of Agavi 1.0.4 RC1, our biggest maintenance release yet!&lt;/p&gt;

&lt;p&gt;You can download it at &lt;a href="http://www.agavi.org/"&gt;agavi.org&lt;/a&gt; or install it via the &lt;a href="http://pear.agavi.org/"&gt;pear.agavi.org&lt;/a&gt; PEAR channel.&lt;/p&gt;

&lt;p&gt;Here is a summary of the most important changes in this release (for a full list, please refer to the &lt;a href="http://trac.agavi.org/browser/tags/1.0.4RC1/RELEASE_NOTES"&gt;RELEASE_NOTES&lt;/a&gt; and &lt;a href="http://trac.agavi.org/browser/tags/1.0.4RC1/CHANGELOG"&gt;CHANGELOG&lt;/a&gt; files):&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Support for the Windows Azure platform&lt;/li&gt;
&lt;li&gt;AgaviXsltRenderer&lt;/li&gt;
&lt;li&gt;AgaviDoctrineDatabase lazy initialization&lt;/li&gt;
&lt;li&gt;Logging enhancements&lt;/li&gt;
&lt;li&gt;AgaviBooleanValidator and other validation improvements and fixes&lt;/li&gt;
&lt;li&gt;Updated timezone database and Schematron implementation&lt;/li&gt;
&lt;li&gt;PHPUnit is no longer bundled with Agavi&lt;/li&gt;
&lt;li&gt;Resolves compatibility problems with Phing 2.4.4 due to a BC break&lt;/li&gt;
&lt;li&gt;Improved exception rendering&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Please test this version thoroughly and report any issues. If there aren&amp;#8217;t any major roadblocks, a final release should follow in a few days.&lt;/p&gt;

&lt;p&gt;Version 1.0.5&amp;#160;&lt;a href="http://trac.agavi.org/milestone/1.0.5"&gt;is also being planned already&lt;/a&gt; and will feature a few enhancements such as support for the Doctrine 2, Smarty 3 and Twig libraries as well as more lenient parsing of forms by FPF in both HTML and XHTML mode.&lt;/p&gt;</description><link>http://blog.agavi.org/post/2314316279</link><guid>http://blog.agavi.org/post/2314316279</guid><pubDate>Tue, 14 Dec 2010 18:33:00 +0000</pubDate></item><item><title>Agavi 1.0.3 released!</title><description>&lt;p&gt;Agavi 1.0.3 has just been released and can be downloaded at &lt;a href="http://www.agavi.org/"&gt;agavi.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Only very few changes were done since &lt;a href="http://blog.agavi.org/post/466464061/agavi-1-0-3-rc1-released"&gt;RC1&lt;/a&gt;, so I&amp;#8217;ll once more leave it to the &lt;a href="http://trac.agavi.org/browser/tags/1.0.3/RELEASE_NOTES"&gt;RELEASE_NOTES&lt;/a&gt; to list the most important changes:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;This maintenance release fixes a number of issues over &lt;a href="http://blog.agavi.org/post/356745670/agavi-1-0-2-released"&gt;Agavi 1.0.2&lt;/a&gt; and features a few minor enhancements.&lt;/p&gt;
  
  &lt;p&gt;Several issues and inconsistencies have been fixed in &lt;code&gt;AgaviNumberValidator&lt;/code&gt; and &lt;code&gt;AgaviDecimalFormatter::parse()&lt;/code&gt;. Parsing behavior is now consistent with the &lt;code&gt;NumberFormatter&lt;/code&gt; implementations of ICU and ext/intl. No integer overflow occurs when checking against min and max values, and the validator accepts non-strings as input. Exporting of the validated value is now possible, in which case the original argument is not mutated. Please note that the &amp;#8220;number&amp;#8221; validator shortcut definition specifies &amp;#8220;int&amp;#8221; as the default value for the &amp;#8220;type&amp;#8221; parameter. No value for &amp;#8220;type&amp;#8221; will automatically lead to integer or float values, depending on the size of the number in the input string. A cast to the specified type is now automatically performed if no &amp;#8220;cast_to&amp;#8221; parameter is given.&lt;/p&gt;
  
  &lt;p&gt;All file validators now perform case-insensitive checks against the list of allowed file extensions, which may now also be a parameter array instead of a space-separated list of values.&lt;/p&gt;
  
  &lt;p&gt;This release bumps the minimum required version of Phing to 2.4.0; this was necessary to fix some bugs with the build system that were next to impossible to fix for both 2.3 and 2.4 (which drastically changed some internals structures) at the same time.&lt;/p&gt;
  
  &lt;p&gt;An issue relating to the behavior of DOM in PHP 5.1.12 and PHP 5.2.3 has been addressed. Running Agavi 1.0.3 might be necessary under certain circumstances when using these versions of PHP.&lt;/p&gt;
  
  &lt;p&gt;A couple of minor fixes have been made to the routing; most notably, overwriting of routes in other &lt;code&gt;&amp;lt;ae:configuration&amp;gt;&lt;/code&gt; blocks now always works as expected, even when using implied routes.&lt;/p&gt;
  
  &lt;p&gt;Some default code templates have been updated; most notably, caching configuration files now explicitly disable caching, as otherwise, Actions that do not use a View would be cached automatically.&lt;/p&gt;
  
  &lt;p&gt;The timezone database has been updated to version 2010h.&lt;/p&gt;
  
  &lt;p&gt;For a full list of changes, please refer to the &lt;a href="http://trac.agavi.org/browser/tags/1.0.3/CHANGELOG"&gt;CHANGELOG&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://blog.agavi.org/post/526135505</link><guid>http://blog.agavi.org/post/526135505</guid><pubDate>Fri, 16 Apr 2010 18:05:00 +0100</pubDate></item><item><title>Agavi on the Azure Platform</title><description>&lt;p&gt;The next release of Agavi will have initial support for running applications on the Microsoft &lt;a href="http://www.microsoft.com/windowsazure/"&gt;Windows Azure&lt;/a&gt; platform, as well as a database adapter for the new &lt;a href="http://sqlsrvphp.codeplex.com/"&gt;ext/sqlsrv&lt;/a&gt; driver to communicate with Microsoft SQL Server and support for the IIS7 web server, which now finally has a very nice &lt;a href="http://www.iis.net/download/urlrewrite"&gt;rewrite module&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As always with these kind of features, the biggest task was getting to know the platform and its components. I spent a good amount of time setting up the necessary tools, learning the finer details of Azure deployment, researching on how the load balancing worked, finding the right rewrite rules for IIS and bending ext/sqlsrv to my will.&lt;/p&gt;

&lt;p&gt;In Agavi itself, you will merely find a new session storage class (for cloud-based sessions), a new database adapter class to talk to MSSQL, and some minor modifications to the web request and routing implementations to deal with IIS7&amp;#8217;s URL decoding behavior. The latter is still a work in progress, and requires a lot of testing since unfortunately, Apache/IIS/lighttpd/… all have vastly different behavior especially when it comes to URL decoding.&lt;/p&gt;

&lt;p&gt;All of these updates will be in Agavi 1.0.4; I plan on releasing 1.0.3 as a final first (it&amp;#8217;s been out there long enough in RC state now).&lt;/p&gt;

&lt;p&gt;Expect a blog post with examples on how to get your Agavi app up and running on Azure very soon; especially with the &lt;a href="http://www.windowsazure4e.org/"&gt;Toolkit for Eclipse&lt;/a&gt;, it&amp;#8217;s a remarkably convenient way of testing and deploying your applications on a cloud infrastructure. And there will, of course, be another article with a wrap-up of last week&amp;#8217;s &lt;a href="http://blog.agavi.org/post/502780238/jump-in-camp"&gt;Jump In Camp&lt;/a&gt;.&lt;/p&gt;</description><link>http://blog.agavi.org/post/518901216</link><guid>http://blog.agavi.org/post/518901216</guid><pubDate>Tue, 13 Apr 2010 20:52:53 +0100</pubDate><category>jumpincamp</category></item><item><title>Jump In! Camp</title><description>&lt;p&gt;&lt;a href="http://www.jumpincamp.com/"&gt;Jump In! Developers&amp;#8217; Camp&lt;/a&gt; has started today at a beautiful resort near Zürich, Switzerland. Over the next three days, we&amp;#8217;ll have workshops focusing on the topics of cloud computing, the Microsoft Azure platform. There are quite a bunch of fellow Open Source developers here, and it&amp;#8217;ll be exciting to sit together and hack away on various features.&lt;/p&gt;

&lt;p&gt;For Agavi, this means that work will be done this week on native support for the Azure cloud computing platform, support for IIS7 and the new SQL Server Driver for PHP. I&amp;#8217;m also hoping to get some support in for the table and queue stores the Azure platform offers, although that will require a lot work on the new storage subsystem planned for Agavi 1.1 that will be difficult to squeeze into the next three days.&lt;/p&gt;

&lt;p&gt;In addition to that, I&amp;#8217;ve been working on support for both input types (finally!) and a new security infrastructure that decouples authentication and authorization and will allow you, among other things, to access validated request data, so you can for instance implement an ACL subsystem to perform authorization checks directly on your business objects.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ll blog several updates over the next few days, so stay tuned!&lt;/p&gt;

&lt;p&gt;– David&lt;/p&gt;</description><link>http://blog.agavi.org/post/502780238</link><guid>http://blog.agavi.org/post/502780238</guid><pubDate>Wed, 07 Apr 2010 09:42:21 +0100</pubDate><category>jumpincamp</category></item><item><title>Agavi 1.0.3 RC1 released!</title><description>&lt;p&gt;Agavi 1.0.3 RC1 is ready for testing and can be downloaded at &lt;a href="http://www.agavi.org/"&gt;&lt;a href="http://www.agavi.org"&gt;www.agavi.org&lt;/a&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ll quote right from the &lt;a href="http://trac.agavi.org/browser/tags/1.0.3RC1/RELEASE_NOTES"&gt;release notes&lt;/a&gt; to give you an overview of the most important changes. Please help us test this release thoroughly!&lt;/p&gt;

&lt;p&gt;This maintenance release fixes a number of issues over Agavi 1.0.2 and features a few minor enhancements.&lt;/p&gt;

&lt;p&gt;Several issues and inconsistencies have been fixed in AgaviNumberValidator and AgaviDecimalFormatter::parse(). Parsing behavior is now consistent with the NumberFormatter implementations of ICU and ext/intl. No integer overflow occurs when checking against min and max values, and the validator accepts non-strings as input. Exporting of the validated value is now possible, in which case the original argument is not mutated. Please note that the &amp;#8220;number&amp;#8221; validator shortcut definition specifies &amp;#8220;int&amp;#8221; as the default value for the &amp;#8220;type&amp;#8221; parameter. No value for &amp;#8220;type&amp;#8221; will automatically lead to integer or float values, depending on the size of the number in the input string. A cast to the specified type is now automatically performed if no &amp;#8220;cast_to&amp;#8221; parameter is given.&lt;/p&gt;

&lt;p&gt;All file validators now perform case-insensitive checks against the list of allowed file extensions, which may now also be a parameter array instead of a space-separated list of values.&lt;/p&gt;

&lt;p&gt;This release bumps the minimum required version of Phing to 2.4.0; this was necessary to fix some bugs with the build system that were next to impossible to fix for both 2.3 and 2.4 (which drastically changed some internals structures) at the same time.&lt;/p&gt;

&lt;p&gt;An issue relating to the behavior of DOM in PHP 5.1.12 and PHP 5.2.3 has been addressed. Running Agavi 1.0.3 might be necessary under certain circumstances when using these versions of PHP.&lt;/p&gt;

&lt;p&gt;A couple of minor fixes have been made to the routing; most notably, overwriting of routes in other &lt;configuration&gt; blocks now always works as expected, even when using implied routes.&lt;/configuration&gt;&lt;/p&gt;

&lt;p&gt;Some default code templates have been updated; most notably, caching configuration files now explicitly disable caching, as otherwise, Actions that do not use a View would be cached automatically.&lt;/p&gt;

&lt;p&gt;The timezone database has been updated to version 2010f.&lt;/p&gt;

&lt;p&gt;For a full list of changes, please refer to the &lt;a href="http://trac.agavi.org/browser/tags/1.0.3RC1/CHANGELOG"&gt;CHANGELOG&lt;/a&gt;.&lt;/p&gt;</description><link>http://blog.agavi.org/post/466464061</link><guid>http://blog.agavi.org/post/466464061</guid><pubDate>Mon, 22 Mar 2010 22:23:24 +0000</pubDate></item><item><title>Agavi at ConFoo</title><description>&lt;p&gt;The beacon of hope that is Agavi is carried to Montréal this week, where the &lt;a href="http://www.confoo.ca/"&gt;ConFoo Web Tech conference&lt;/a&gt; takes place.&lt;/p&gt;

&lt;p&gt;David will be giving a talk on Agavi, and although we know that some of you will be there to watch it live, all those who couldn&amp;#8217;t make it to Montréal (it&amp;#8217;s a lovely city, so consider attending next year) need not despair, as at least the slides, and possibly also a recording of the talk will be posted after the conference.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re there in person, make sure to catch a seat in one of the front rows so you can be first in line after the talk to grab one of the Agavi t-shirts that made the long journey to Canada.&lt;/p&gt;</description><link>http://blog.agavi.org/post/437375988</link><guid>http://blog.agavi.org/post/437375988</guid><pubDate>Tue, 09 Mar 2010 20:33:00 +0000</pubDate></item></channel></rss>

