<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -43,6 +43,16 @@ class Deploy
   def notify
     DeployMailer.send(project, current_rev, head_rev, scm_log)
   end
+
+  def month
+    created_at.strftime('%Y-%m')
+  end
+
+  def self.in_month(year_month)
+    year, month = year_month.split('-')
+    next_month = &quot;#{year}-%02i&quot; % (month.to_i + 1)
+    all(:created_at.gte =&gt; year_month, :created_at.lt =&gt; next_month, :order =&gt; [:created_at.desc])
+  end
 end
 
 class Project
@@ -56,6 +66,13 @@ class Project
   has n, :subscriptions
   has n, :users, :through =&gt; :subscriptions
 
+  def all_deploys_grouped_by_date
+    deploys.all(:order =&gt; [:created_at.desc]).inject({}) do |groups, deploy|
+      (groups[deploy.month] ||= []) &lt;&lt; deploy
+      groups
+    end
+  end
+
   def self.find_or_create(name)
     project = self.first(:name =&gt; name)
     project || self.create(:name =&gt; name)
@@ -150,7 +167,14 @@ end
 
 get '/projects/:id' do
   @project = Project.get(params[:id])
-  @deploys = @project.deploys.all(:order =&gt; [:created_at.desc])
+  if params[:show]
+    @last_deploys = @project.deploys.in_month(params[:show])
+  else
+    @last_deploys = @project.deploys.all(:order =&gt; [:created_at.desc], :limit =&gt; 10)
+  end
+
+  @grouped_deploys = @project.all_deploys_grouped_by_date
+  @years = @grouped_deploys.keys.map { |month| month.split('-').first }.uniq
 
   @title = &quot;Recent deploys for #{@project.name}&quot;
   erb :deploys_list
@@ -219,4 +243,13 @@ helpers do
   def format_time(time)
     time.strftime('%b %d %H:%M')
   end
+
+  def link_to_month(month_name, month, project, grouped_deploys)
+    number_of_deploys = grouped_deploys.has_key?(month) ? grouped_deploys[month].size : 0
+    if number_of_deploys == 0
+      month_name
+    else
+      &quot;&lt;a href=\&quot;/projects/#{project.id}?show=#{month}\&quot;&gt;#{month_name}&lt;/a&gt; &lt;small&gt;(#{number_of_deploys})&lt;/small&gt;&quot;
+    end
+  end
 end</diff>
      <filename>deployed_at.rb</filename>
    </modified>
    <modified>
      <diff>@@ -30,3 +30,13 @@ pre {
   font-family: Monaco, &quot;Lucida Console&quot;, monospace;
   font-size: 12px;
 }
+
+ul.archive {
+  float: left;
+  list-style-type: none;
+  margin: 0 40px 0 0;
+}
+
+ul.archive li a {
+  font-weight: bold;
+}</diff>
      <filename>public/deployed_at.css</filename>
    </modified>
    <modified>
      <diff>@@ -36,6 +36,34 @@ class DeployTest &lt; Test::Unit::TestCase
     assert_equal 2, deploy.get_number_of_changes
   end
 
+  test 'group by date should return empty hash' do
+    project = create_project
+    assert_equal Hash.new, project.all_deploys_grouped_by_date
+  end
+
+  test 'should return deploys grouped by month' do
+    project = create_project
+    deploy1 = create_deploy(:project =&gt; project, :created_at =&gt; '2009-01-01')
+    deploy2 = create_deploy(:project =&gt; project, :created_at =&gt; '2009-01-02')
+    deploy3 = create_deploy(:project =&gt; project, :created_at =&gt; '2009-02-02')
+
+    grouped_deploys = project.all_deploys_grouped_by_date
+    assert_equal 2, grouped_deploys.keys.size
+    assert_equal [deploy2, deploy1], grouped_deploys['2009-01']
+    assert_equal [deploy3], grouped_deploys['2009-02']
+  end
+
+  test 'should find all deploys in a specific month' do
+    project = create_project
+    deploy1 = create_deploy(:project =&gt; project, :created_at =&gt; '2009-01-01')
+    deploy2 = create_deploy(:project =&gt; project, :created_at =&gt; '2009-01-31')
+    deploy3 = create_deploy(:project =&gt; project, :created_at =&gt; '2009-02-28')
+
+    assert_equal [deploy2, deploy1], Deploy.in_month('2009-01')
+    assert_equal [deploy3], Deploy.in_month('2009-02')
+    assert_equal [], Deploy.in_month('2009-03')
+  end
+
   test 'should create multiple subscriptions' do
     user = create_user
     project1 = create_project(:name =&gt; 'project_1')</diff>
      <filename>test/test_models.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,32 @@
+&lt;div class=&quot;span-22&quot;&gt;
+  &lt;% for year in @years %&gt;
+  &lt;div class=&quot;span-6 append-bottom&quot;&gt;
+    &lt;h2&gt;&lt;%= year %&gt;&lt;/h2&gt;
+    &lt;ul class=&quot;archive&quot;&gt;
+      &lt;li&gt;&lt;%= link_to_month('December',  &quot;#{year}-12&quot;, @project, @grouped_deploys) %&gt;&lt;/li&gt;
+      &lt;li&gt;&lt;%= link_to_month('November',  &quot;#{year}-11&quot;, @project, @grouped_deploys) %&gt;&lt;/li&gt;
+      &lt;li&gt;&lt;%= link_to_month('October',   &quot;#{year}-10&quot;, @project, @grouped_deploys) %&gt;&lt;/li&gt;
+      &lt;li&gt;&lt;%= link_to_month('September', &quot;#{year}-09&quot;, @project, @grouped_deploys) %&gt;&lt;/li&gt;
+      &lt;li&gt;&lt;%= link_to_month('August',    &quot;#{year}-08&quot;, @project, @grouped_deploys) %&gt;&lt;/li&gt;
+      &lt;li&gt;&lt;%= link_to_month('July',      &quot;#{year}-07&quot;, @project, @grouped_deploys) %&gt;&lt;/li&gt;
+    &lt;/ul&gt;
+
+    &lt;ul class=&quot;archive&quot;&gt;
+      &lt;li&gt;&lt;%= link_to_month('June',     &quot;#{year}-06&quot;, @project, @grouped_deploys) %&gt;&lt;/li&gt;
+      &lt;li&gt;&lt;%= link_to_month('May',      &quot;#{year}-05&quot;, @project, @grouped_deploys) %&gt;&lt;/li&gt;
+      &lt;li&gt;&lt;%= link_to_month('April',    &quot;#{year}-04&quot;, @project, @grouped_deploys) %&gt;&lt;/li&gt;
+      &lt;li&gt;&lt;%= link_to_month('March',    &quot;#{year}-03&quot;, @project, @grouped_deploys) %&gt;&lt;/li&gt;
+      &lt;li&gt;&lt;%= link_to_month('February', &quot;#{year}-02&quot;, @project, @grouped_deploys) %&gt;&lt;/li&gt;
+      &lt;li&gt;&lt;%= link_to_month('January',  &quot;#{year}-01&quot;, @project, @grouped_deploys) %&gt;&lt;/li&gt;
+    &lt;/ul&gt;
+  &lt;/div&gt;
+  &lt;% end %&gt;
+&lt;/div&gt;
+
+&lt;hr /&gt;
+
 &lt;table&gt;
-  &lt;% @deploys.each_with_index do |deploy, i| %&gt;
+  &lt;% @last_deploys.each_with_index do |deploy, i| %&gt;
   &lt;tr class=&quot;large &lt;%= i % 2 == 0 ? 'even' : '' %&gt;&quot;&gt;
     &lt;td&gt;&lt;a href=&quot;/deploys/&lt;%= deploy.id %&gt;&quot;&gt;&lt;%= deploy.title %&gt;&lt;/a&gt; &lt;span class=&quot;small&quot;&gt;(&lt;%= deploy.changes %&gt; changes)&lt;/span&gt;&lt;/td&gt;
     &lt;td&gt;by &lt;%= deploy.user %&gt;&lt;/td&gt;</diff>
      <filename>views/deploys_list.erb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>c848fdb8733cf19e11882cba372fef8c45afc1a3</id>
    </parent>
  </parents>
  <author>
    <name>Florian Munz</name>
    <email>surf@theflow.de</email>
  </author>
  <url>http://github.com/theflow/deployed_at/commit/8738c149f0f2ac7825fa2d9b05883b2b58198acd</url>
  <id>8738c149f0f2ac7825fa2d9b05883b2b58198acd</id>
  <committed-date>2009-10-02T09:55:04-07:00</committed-date>
  <authored-date>2009-10-02T09:55:04-07:00</authored-date>
  <message>added an archive view for projects.

Since the list of deploys can get long very fast,
show a list of months and filter deploys by month</message>
  <tree>45fb2ce445504c9cb3f25d6fb21336f05ba0c060</tree>
  <committer>
    <name>Florian Munz</name>
    <email>surf@theflow.de</email>
  </committer>
</commit>
