[Xfce4-commits] <moka:nick/maintainer-improvements> Port to haml and various other changes.

Nick Schermer noreply at xfce.org
Sat May 28 20:06:01 CEST 2011


Updating branch refs/heads/nick/maintainer-improvements
         to ca866704c8b17d5565bec84f407eb82795f5d323 (commit)
       from 5b0da3339341f4fa5b473125b742c34904841eea (commit)

commit ca866704c8b17d5565bec84f407eb82795f5d323
Author: Nick Schermer <nick at xfce.org>
Date:   Sat May 28 20:03:37 2011 +0200

    Port to haml and various other changes.

 TODO                                               |    3 +
 examples/one-man-one-project/config.ru             |   59 +++++++++++++++++++-
 .../templates/collection_feed_entry.erb            |   20 +++++++
 .../templates/collection_release_mail.erb          |   20 +++++++
 .../templates/login_password_canceled              |   14 +++++
 .../templates/login_password_request               |   13 ++++
 .../templates/project_feed_entry.erb               |   25 ++++++++
 .../templates/project_release_mail.erb             |   24 ++++++++
 lib/controllers/authentication.rb                  |   26 ++++++++-
 lib/controllers/projects.rb                        |   24 ++++----
 lib/controllers/request.rb                         |   24 --------
 lib/helpers/general.rb                             |   31 +++++------
 lib/models/project.rb                              |    5 ++
 lib/moka.rb                                        |   31 ++++------
 lib/views/announcements.erb                        |   15 -----
 lib/views/announcements.haml                       |   14 +++++
 lib/views/auth_login.erb                           |    9 ---
 lib/views/collection.erb                           |   23 --------
 lib/views/collection.haml                          |   21 +++++++
 lib/views/collection_delete.erb                    |   10 ---
 lib/views/collection_delete.haml                   |    6 ++
 lib/views/collection_new_release.erb               |   47 ----------------
 lib/views/collection_new_release.haml              |   34 +++++++++++
 lib/views/collection_release.erb                   |   26 ---------
 lib/views/collection_release.haml                  |   22 +++++++
 lib/views/foot.erb                                 |    2 -
 lib/views/head.erb                                 |   29 ----------
 lib/views/index.erb                                |   12 ----
 lib/views/index.haml                               |    1 +
 lib/views/index_login.haml                         |   23 ++++++++
 lib/views/layout.haml                              |   29 ++++++++++
 lib/views/login.haml                               |   12 ++++
 lib/views/login_forgot.haml                        |    1 +
 lib/views/login_request.haml                       |   39 +++++++++++++
 lib/views/login_request_finished.haml              |    8 +++
 lib/views/login_request_sshinfo.haml               |   35 ++++++++++++
 lib/views/login_unauthenticated.haml               |    5 ++
 lib/views/maintainer.erb                           |   26 ---------
 lib/views/maintainer.haml                          |   17 ++++++
 lib/views/maintainer_profile.erb                   |   35 ------------
 lib/views/maintainer_profile.haml                  |   32 +++++++++++
 lib/views/manage_releases.erb                      |   26 ---------
 lib/views/permission_denied.erb                    |   15 -----
 lib/views/permission_denied.haml                   |   14 +++++
 lib/views/project.erb                              |   42 --------------
 lib/views/project.haml                             |   39 +++++++++++++
 .../project_branch_new_release_announcement.erb    |   24 --------
 .../project_branch_new_release_announcement.haml   |   24 ++++++++
 lib/views/project_branch_new_release_confirm.erb   |   36 ------------
 lib/views/project_branch_new_release_confirm.haml  |   30 ++++++++++
 lib/views/project_new_release.erb                  |    9 ---
 lib/views/project_new_release.haml                 |   19 ++++++
 lib/views/project_new_release_tarball.erb          |   16 -----
 lib/views/project_new_release_tarball.haml         |   14 +++++
 lib/views/project_release_delete.erb               |   11 ----
 lib/views/project_release_delete.haml              |    6 ++
 lib/views/project_release_update.erb               |   17 ------
 lib/views/project_release_update.haml              |   16 +++++
 lib/views/request.erb                              |   35 ------------
 lib/views/request_finished.erb                     |    9 ---
 lib/views/request_sshinfo.erb                      |   31 ----------
 61 files changed, 708 insertions(+), 577 deletions(-)

diff --git a/TODO b/TODO
new file mode 100644
index 0000000..ccb69bd
--- /dev/null
+++ b/TODO
@@ -0,0 +1,3 @@
+Register: Almost finished...
+
+A token for changing your password has been emailed to you. Follow the instructions in that email to change your password. 
diff --git a/examples/one-man-one-project/config.ru b/examples/one-man-one-project/config.ru
index f55e53c..e47cd1d 100755
--- a/examples/one-man-one-project/config.ru
+++ b/examples/one-man-one-project/config.ru
@@ -7,18 +7,75 @@ require 'digest/sha1'
 
 require '../../lib/moka'
 
+# Connect to the database
 directory = File.expand_path(File.dirname(__FILE__))
 db = File.join(directory, 'example.db')
 
 DataMapper::Logger.new($stdout, :debug)
 DataMapper.setup(:default, 'sqlite://' + db)
 
+# From http://blog.macromates.com/2006/wrapping-text-with-regular-expressions/
+def wrap_text(txt, col = 72)
+  txt.gsub(/(.{1,#{col}})( +|$)\n?|(.{#{col}})/, "\\1\\3\n")
+end
+
+# Identica configuration
 use Moka::Middleware::Identica do |identica|
   identica.username = 'username'
   identica.password = 'password'
   identica.group    = 'group'
 end
 
+# Feed configuration and template handling
+use Moka::Middleware::Feeds do |feeds|
+  feeds.base_url = 'http://archive.xfce.org/feeds/'
+
+  feeds.project_feed_url do |project|
+    URI.join(feeds.base_url, 'project/', project.name).to_s
+  end
+
+  feeds.project_feed_filename do |project|
+    "/home/nick/websites/archive.xfce.org/feeds/project/#{project.name}"
+  end
+
+  feeds.collection_feed_url do |collection|
+    URI.join(feeds.base_url, 'collection/', collection.name).to_s
+  end
+
+  feeds.collection_feed_filename do |collection|
+    "/home/nick/websites/archive.xfce.org/feeds/collection/#{collection.name}"
+  end
+
+  feeds.project_body do |release, message, sender|
+    ERB.new(File.read('templates/project_feed_entry.erb')).result(binding)
+  end
+
+  feeds.collection_body do |release, message, sender|
+    ERB.new(File.read('templates/collection_feed_entry.erb')).result(binding)
+  end
+end
+
+# Mailinglist configuration and template handling
+use Moka::Middleware::Mailinglists do |mailer|
+  mailer.lists = ['xfce-announce at xfce.org', 'xfce at xfce.org', 'thunar-dev at xfce.org', 'nickschermer at gmail.com']
+  
+  mailer.project_subject do |release, message, sender|
+    "ANNOUNCE: #{release.project.name} #{release.version} released"
+  end
+
+  mailer.project_body do |release, message, sender| 
+    ERB.new(File.read('templates/project_release_mail.erb')).result(binding)
+  end
+  
+  mailer.collection_subject do |release, message, sender|
+    "ANNOUNCE: #{release.collection.display_name} #{release.version} released"
+  end
+
+  mailer.collection_body do |release, message, sender|
+    ERB.new(File.read('templates/collection_release_mail.erb')).result(binding)
+  end
+end
+
 # global configuration
 Moka::Models::Configuration.load do |conf|
   conf.set :moka_url, 'https://releases.xfce.org'
@@ -28,7 +85,7 @@ Moka::Models::Configuration.load do |conf|
 end
 
 # Uncheck for production environment
-DataMapper.auto_migrate!
+DataMapper.auto_upgrade!
 DataMapper.finalize
 
 # create dummy roles
diff --git a/examples/one-man-one-project/templates/collection_feed_entry.erb b/examples/one-man-one-project/templates/collection_feed_entry.erb
new file mode 100644
index 0000000..9d11516
--- /dev/null
+++ b/examples/one-man-one-project/templates/collection_feed_entry.erb
@@ -0,0 +1,20 @@
+<pre><a href="<%= release.collection.website %>"><%= release.collection.display_name %></a> <%= release.version %> is now available for download.
+
+It includes the following releases of Xfce core components:
+<% for project in (Moka::Models::Project.find_all.sort.select do |project| release.included_project_release(project) != nil end) %>
+  <a href="<%= project.website %>"><%= project.name %></a> <%= release.included_project_release(project).version %><% end %>
+
+Release tarballs can be retrieved from the following mirrors (please
+note that it may take a few hours for the mirrors to catch up):
+<% for mirror in Moka::Models::Mirror.find_all %>
+  <a href="<%= mirror.download_url(release) %>"><%= mirror.download_url(release) %></a><% end %>
+
+A tarball including all individual releases can be downloaded here:
+<% for mirror in Moka::Models::Mirror.find_all %>
+  <a href="<%= mirror.fat_tarball_url(release) %>"><%= mirror.fat_tarball_url(release) %></a><% end %>
+
+
+Release notes for <%= release.version %>
+==================<%= Array.new(release.version.size, '=').join %>
+
+<%= wrap_text(message).strip %></pre>
diff --git a/examples/one-man-one-project/templates/collection_release_mail.erb b/examples/one-man-one-project/templates/collection_release_mail.erb
new file mode 100644
index 0000000..f7f7b22
--- /dev/null
+++ b/examples/one-man-one-project/templates/collection_release_mail.erb
@@ -0,0 +1,20 @@
+<%= release.collection.display_name %> <%= release.version %> is now available for download.
+
+It includes the following releases of Xfce core components:
+<% for project in (Moka::Models::Project.find_all.sort.select do |project| release.included_project_release(project) != nil end) %>
+  <%= project.name %> <%= release.included_project_release(project).version %><% end %>
+
+Release tarballs can be retrieved from the following mirrors (please
+note that it may take a few hours for the mirrors to catch up):
+<% for mirror in Moka::Models::Mirror.find_all %>
+  <%= mirror.download_url(release) %><% end %>
+
+A tarball including all individual releases can be downloaded here:
+<% for mirror in Moka::Models::Mirror.find_all %>
+  <%= mirror.fat_tarball_url(release) %><% end %>
+
+
+Release notes for <%= release.version %>
+==================<%= Array.new(release.version.size, '=').join %>
+
+<%= wrap_text(message).strip %>
diff --git a/examples/one-man-one-project/templates/login_password_canceled b/examples/one-man-one-project/templates/login_password_canceled
new file mode 100644
index 0000000..29c7c8f
--- /dev/null
+++ b/examples/one-man-one-project/templates/login_password_canceled
@@ -0,0 +1,14 @@
+A request was canceled from 84.107.218.238.
+
+If you did not request this, it could be either an honest
+mistake or someone attempting to break into your Bugzilla account.
+
+Take a look at the information below and forward this email
+to bugzilla-maintainer at xfce.org if you suspect foul play.
+
+           Token: vgBxX6jqV2
+      Token Type: password
+            User: nick at xfce.org
+      Issue Date: 2011-04-04 23:31:10 CEST
+      Event Data: 84.107.218.238
+Canceled Because: You have logged in.
diff --git a/examples/one-man-one-project/templates/login_password_request b/examples/one-man-one-project/templates/login_password_request
new file mode 100644
index 0000000..ef23ad0
--- /dev/null
+++ b/examples/one-man-one-project/templates/login_password_request
@@ -0,0 +1,13 @@
+You have (or someone impersonating you has) requested to change your
+Bugzilla password. To complete the change, visit the following link:
+
+https://bugzilla.xfce.org/token.cgi?t=vgBxX6jqV2&a=cfmpw
+
+If you are not the person who made this request, or you wish to cancel
+this request, visit the following link:
+
+https://bugzilla.xfce.org/token.cgi?t=vgBxX6jqV2&a=cxlpw
+
+If you do nothing, the request will lapse after 3 days
+(on April  7, 2011 at 23:31 CEST) or when you
+log in successfully.
diff --git a/examples/one-man-one-project/templates/project_feed_entry.erb b/examples/one-man-one-project/templates/project_feed_entry.erb
new file mode 100644
index 0000000..a06cc14
--- /dev/null
+++ b/examples/one-man-one-project/templates/project_feed_entry.erb
@@ -0,0 +1,25 @@
+<pre><a href="<%= release.project.website %>"><%= release.project.name %></a> <%= release.version %> is now available for download from
+
+  <a href="<%= Moka::Models::Mirror.find_all.first.download_url(release) %>/<%= release.tarball_basename %>"><%= Moka::Models::Mirror.find_all.first.download_url(release) %>/<%= release.tarball_basename %></a>
+  <a href="<%= Moka::Models::Mirror.find_all.first.download_url(release) %>/<%= release.tarball_basename %>.md5"><%= Moka::Models::Mirror.find_all.first.download_url(release) %>/<%= release.tarball_basename %>.md5</a>
+  <a href="<%= Moka::Models::Mirror.find_all.first.download_url(release) %>/<%= release.tarball_basename %>.sha1"><%= Moka::Models::Mirror.find_all.first.download_url(release) %>/<%= release.tarball_basename %>.sha1</a>
+
+  SHA1 checksum: <%= release.checksum(Digest::SHA1) %>
+   MD5 checksum: <%= release.checksum(Digest::MD5) %>
+
+
+What is <%= release.project.name %>?
+========<%= Array.new(release.project.name.size, '=').join %>=
+
+<%= wrap_text(release.project.description).strip %>
+
+Website:
+  <a href="<%= release.project.website %>"><%= release.project.website %></a>
+
+
+Release notes for <%= release.version %>
+==================<%= Array.new(release.version.size, '=').join %>
+<% if (release.version.split('.')[1].to_i % 2) > 0 %>[Please note that this is a development release.]
+<% end %>
+<%= wrap_text(message).strip %>
+
diff --git a/examples/one-man-one-project/templates/project_release_mail.erb b/examples/one-man-one-project/templates/project_release_mail.erb
new file mode 100644
index 0000000..26e67b2
--- /dev/null
+++ b/examples/one-man-one-project/templates/project_release_mail.erb
@@ -0,0 +1,24 @@
+<%= release.project.name %> <%= release.version %> is now available for download from
+  
+  <%= release.download_url %>/<%= release.tarball_basename %>
+  <%= release.download_url %>/<%= release.tarball_basename %>.md5
+  <%= release.download_url %>/<%= release.tarball_basename %>.sha1
+
+  SHA1 checksum: <%= release.checksum(Digest::SHA1) %>
+   MD5 checksum: <%= release.checksum(Digest::MD5) %>
+
+
+What is <%= release.project.name %>?
+========<%= Array.new(release.project.name.size, '=').join %>=
+
+<%= wrap_text(release.project.description).strip %>
+
+Website: 
+  <%= release.project.website %>
+
+
+Release notes for <%= release.version %>
+==================<%= Array.new(release.version.size, '=').join %>
+<% if (release.version.split('.')[1].to_i % 2) > 0 %>[Please note that this is a development release.]
+<% end %>
+<%= wrap_text(message).strip %>
diff --git a/lib/controllers/authentication.rb b/lib/controllers/authentication.rb
index b9f9522..150e1c6 100755
--- a/lib/controllers/authentication.rb
+++ b/lib/controllers/authentication.rb
@@ -92,7 +92,7 @@ module Moka
         app.helpers Helpers
 
         app.get '/login/?' do
-          view :auth_login
+          view :login
         end
 
         app.post '/login/?' do
@@ -108,11 +108,35 @@ module Moka
           env['warden'].authenticate!
           redirect '/'
         end
+        
+        app.post '/unauthenticated' do
+          view :login_unauthenticated
+        end
     
         app.get '/logout/?' do
           env['warden'].logout
           redirect '/'
         end
+        
+        app.get '/login/forgot' do
+          
+          view :login_forgot
+        end
+        
+        app.get '/login/request' do
+          
+          view :login_request
+        end
+
+        app.get '/login/request/sshinfo' do
+          
+          view :login_request_sshinfo
+        end
+
+        app.post '/login/request' do
+
+          view :login_request_finished
+        end
       end
     end
   end
diff --git a/lib/controllers/projects.rb b/lib/controllers/projects.rb
index d6e6b6e..14d7757 100755
--- a/lib/controllers/projects.rb
+++ b/lib/controllers/projects.rb
@@ -106,7 +106,7 @@ module Moka
 
           @release.delete
 
-          redirect "/project/#{@project.id}"
+          redirect "/project/#{@project.name}"
         end
 
         app.get '/project/:name/new-release' do
@@ -190,18 +190,20 @@ module Moka
           @branch = Project::Branch.new(@project, params[:branch])
           @release = Project::Release.new(@project, @branch, params[:version])
 
-          if env['identica'] and params[:identica]
-            url = env['feeds'].get_project_feed_url(@project)
-
-            if env['identica'].group.nil?
-              @announcement_status = "#{@project.name} #{@release.version} released: #{url}"
-            else
-              @announcement_status = "#{@project.name} #{@release.version} released: #{url} !#{env['identica'].group}"
+          if env['feeds']
+            if env['identica'] and params[:identica]
+              url = env['feeds'].get_project_feed_url(@project)
+            
+              if env['identica'].group.nil?
+                @announcement_status = "#{@project.name} #{@release.version} released: #{url}"
+              else
+                @announcement_status = "#{@project.name} #{@release.version} released: #{url} !#{env['identica'].group}"
+              end
             end
-          end
 
-          if env['feeds'] and params[:feeds]
-             # TODO
+            if params[:feeds]
+              # TODO
+            end
           end
 
           if env['mailinglists'] and params[:mailinglists]
diff --git a/lib/controllers/request.rb b/lib/controllers/request.rb
deleted file mode 100644
index 0971830..0000000
--- a/lib/controllers/request.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-module Moka
-  module Controllers
-    module Request
-      include Moka::Models
-
-      def self.registered(app)
-        app.get '/request' do
-          
-          view :request
-        end
-
-        app.get '/request/sshinfo' do
-          
-          view :request_sshinfo
-        end
-
-        app.post '/request' do
-
-          view :request_finished
-        end
-      end
-    end
-  end
-end
diff --git a/lib/helpers/general.rb b/lib/helpers/general.rb
index 18449cb..02bab1f 100755
--- a/lib/helpers/general.rb
+++ b/lib/helpers/general.rb
@@ -1,3 +1,5 @@
+require 'haml'
+
 module Moka
   module Helpers
     module General
@@ -12,27 +14,22 @@ module Moka
       module Helpers
         include Moka::Models
 
-        def header(args={})
-          custom_binding = binding.clone
-          eval 'params = ' + args.inspect, custom_binding
-          import('head', custom_binding)
-        end
-  
-        def footer
-          import('foot')
-        end
-  
-        def import(template, custom_binding=nil)
+        def render_layout(custom_binding, &block)
           directory = File.expand_path(File.dirname(__FILE__))
-          filename = File.join(directory, '..', 'views', "#{template}.erb")
-          erb = open(filename) do |file|
-            ERB.new(file.read)
+          filename = File.join(directory, '..', 'views', 'layout.haml')
+          engine = open(filename) do |file| Haml::Engine.new(file.read) end
+          engine.render(if custom_binding.nil? then binding else custom_binding end) do
+            block.call(self)
           end
-          erb.result(if custom_binding.nil? then binding else custom_binding end)
         end
 
-        def view(*args)
-          import(*args)
+        def view(template, custom_binding = nil)
+          render_layout(custom_binding) do 
+            directory = File.expand_path(File.dirname(__FILE__))
+            filename = File.join(directory, '..', 'views', "#{template}.haml")
+            engine = open(filename) do |file| Haml::Engine.new(file.read) end
+            engine.render(if custom_binding.nil? then binding else custom_binding end)
+          end
         end
 
         def error_set(key, value)
diff --git a/lib/models/project.rb b/lib/models/project.rb
index a3d790d..6ea3a6b 100755
--- a/lib/models/project.rb
+++ b/lib/models/project.rb
@@ -55,6 +55,11 @@ module Moka
             and other.branch == branch \
             and other.version == version
         end
+        
+        def <=>(other)
+          return 0 unless other.is_a?(self.class)
+          version <=> other.version
+        end
 
         def checksum(type)
           Archive.instance.project_release_checksum(self, type)
diff --git a/lib/moka.rb b/lib/moka.rb
index 593d956..e1c4247 100755
--- a/lib/moka.rb
+++ b/lib/moka.rb
@@ -8,26 +8,22 @@ require 'sass'
 
 directory = File.expand_path(File.dirname(__FILE__))
 
-require File.join(directory, 'models', 'configuration')
-require File.join(directory, 'models', 'classification')
-require File.join(directory, 'models', 'role')
-require File.join(directory, 'models', 'maintainer')
-require File.join(directory, 'models', 'collection')
-require File.join(directory, 'models', 'project')
-require File.join(directory, 'models', 'archive')
+models = ['configuration', 'classification', 'role', 'maintainer', 'collection', 'project', 'archive']
+for model in models
+  require File.join(directory, 'models', model)
+end
 
 require File.join(directory, 'helpers', 'general')
 
-require File.join(directory, 'controllers', 'announcements')
-require File.join(directory, 'controllers', 'authentication')
-require File.join(directory, 'controllers', 'collections')
-require File.join(directory, 'controllers', 'projects')
-require File.join(directory, 'controllers', 'maintainers')
-require File.join(directory, 'controllers', 'request')
+helpers = ['announcements', 'authentication', 'collections', 'projects', 'maintainers']
+for helper in helpers
+  require File.join(directory, 'controllers', helper)
+end
 
-require File.join(directory, 'middleware', 'feeds')
-require File.join(directory, 'middleware', 'identica')
-require File.join(directory, 'middleware', 'mailinglists')
+middlewares = ['feeds', 'identica', 'mailinglists']
+for middleware in middlewares
+  require File.join(directory, 'middleware', middleware)
+end
 
 module Moka
   class Application < Sinatra::Base
@@ -41,7 +37,6 @@ module Moka
     register Moka::Controllers::Projects
     register Moka::Controllers::Collections
     register Moka::Controllers::Maintainers
-    register Moka::Controllers::Request
 
     authentication_initialize
   
@@ -57,7 +52,7 @@ module Moka
   
     get '/' do
       if authentication_finished?
-        view :manage_releases
+        view :index_login
       else
         view :index
       end
diff --git a/lib/views/announcements.erb b/lib/views/announcements.erb
deleted file mode 100644
index 987315d..0000000
--- a/lib/views/announcements.erb
+++ /dev/null
@@ -1,15 +0,0 @@
-<%= header :title => "Announcements" %>
-<h2>Publish an announcement on identi.ca</h2>
-<% if error(:identica) %>
-  <p class="error"><%= error(:identica) %></p>
-<% end %>
-<form method="post" action="/announcements/identica">
-  <fieldset>
-    <p><label for="text">Text:</label> <textarea id="text" name="text" class="message" style="height:5em;"><%= params[:text] %></textarea></p>
-    <% if error(:text) %>
-      <p class="error quote"><%= error(:text) %></p>
-    <% end %>
-    <p class="quote"><input type="submit" value="Publish"/></p>
-  </fieldset>
-</form>
-<%= footer %>
diff --git a/lib/views/announcements.haml b/lib/views/announcements.haml
new file mode 100644
index 0000000..a2577e5
--- /dev/null
+++ b/lib/views/announcements.haml
@@ -0,0 +1,14 @@
+%h2 Announcement
+%p Publish an announcement on identi.ca.
+
+- if error(:identica)
+  %p.error.quote #{error(:identica)}
+
+%form{:method => "post", :action => "/announcements/identica"}
+  %p
+    %label{:for => "test"} Text:
+    %textarea{:name => "test", :rows => "5", :wrap => "off", :value => params[:text]}
+  - if error(:text)
+    %p.error.quote #{error(:text)}
+  %p
+    %input{:type => "submit", :value => "Publish"}
diff --git a/lib/views/auth_login.erb b/lib/views/auth_login.erb
deleted file mode 100755
index 99ce703..0000000
--- a/lib/views/auth_login.erb
+++ /dev/null
@@ -1,9 +0,0 @@
-<%= header :title => 'Login' %>
-<form method="post" action="/login">
-  <fieldset>
-    <p><label for="username">Username:</label> <input type="text" id="username" name="username"/></p>
-    <p><label for="password">Password:</label> <input type="password" id="password" name="password"/></p>
-    <p class="quote"><input type="submit" value="Log in"/></p>
-  </fieldset>
-</form>
-<%= footer %>
diff --git a/lib/views/collection.erb b/lib/views/collection.erb
deleted file mode 100755
index 2808a2e..0000000
--- a/lib/views/collection.erb
+++ /dev/null
@@ -1,23 +0,0 @@
-<%= header :title => "Manage #{@collection.display_name}" %>
-<h2>Collection information</h2>
-<form>
-  <fieldset>
-    <p><label for="website">Website:</label> <%= @collection.website %></p>
-    <p><label for="maintainers">Maintainers:</label> <%= maintainer_names(@collection) %>.</p>
-  </fieldset>
-</form>
-<p><a href="/collection/<%= @collection.name %>/new-release">Release new version</a></p>
-
-<h2>Releases</h2>
-<table cellspacing="0" cellpadding="0">
-  <% for release in @collection.releases.sort.reverse %>
-    <tr>
-      <th><a href="<%= release.release_url %>"><%= release.version %></a></th>
-      <td>
-        <a href="/collection/<%= @collection.name %>/release/<%= release.version %>">Update</a>
-        <a href="/collection/<%= @collection.name %>/release/<%= release.version %>/delete">Delete</a>
-      </td>
-    </tr>
-  <% end %>
-</table>
-<%= footer %>
diff --git a/lib/views/collection.haml b/lib/views/collection.haml
new file mode 100755
index 0000000..21b26c2
--- /dev/null
+++ b/lib/views/collection.haml
@@ -0,0 +1,21 @@
+%h2 Collection information</h2>
+%form
+  %p
+    %label{:for => "website"} Website:
+    %input{:name => "website", :disabled => true, :value => "#{@collection.website}"}
+  %p
+    %label{:for => "maintainers"} Maintainers:
+    %input{:name => "maintainers", :disabled => true, :value => "#{maintainer_names(@collection)}"}
+
+%p
+  %a{:href => "/collection/#{@collection.name}/new-release"} Release new version
+
+%h2 Releases
+%table
+  - for release in @collection.releases.sort.reverse
+    %tr
+      %th
+        %a{:href => "#{release.release_url}"} #{release.version}
+      %td
+        %a{:href => "/collection/#{@collection.name}/release/#{release.version}"} Update
+        %a{:href => "/collection/#{@collection.name}/release/#{release.version}/delete"} Delete
diff --git a/lib/views/collection_delete.erb b/lib/views/collection_delete.erb
deleted file mode 100755
index 6ca0367..0000000
--- a/lib/views/collection_delete.erb
+++ /dev/null
@@ -1,10 +0,0 @@
-<%= header :title => "Delete #{@collection.display_name} #{params[:release]}" %>
-<h2>Do you really want to delete this release?</h2>
-<form method="post">
-  <fieldset>
-    <p>
-    <input type="button" onclick="history.back()" value="No, I came here by mistake!"/>
-    <input type="submit" value="Yes, please delete!"/>
-    </p>
-</form>
-<%= footer %>
diff --git a/lib/views/collection_delete.haml b/lib/views/collection_delete.haml
new file mode 100755
index 0000000..78718ad
--- /dev/null
+++ b/lib/views/collection_delete.haml
@@ -0,0 +1,6 @@
+%h2 Delete #{@collection.display_name} #{params[:release]}
+%p Do you really want to delete this release?
+%form
+  %p
+    %input{:type => "button", onclick => "history.back()", :value => "No, I came here by mistake!"}
+    %input{:type => "submit", :value => "Yes, please delete!""}
diff --git a/lib/views/collection_new_release.erb b/lib/views/collection_new_release.erb
deleted file mode 100755
index a8acb39..0000000
--- a/lib/views/collection_new_release.erb
+++ /dev/null
@@ -1,47 +0,0 @@
-<%= header :title => "Release new version of #{@collection.display_name}" %>
-<form method="post">
-  <h2>Release information</h2>
-  <fieldset>
-    <p>
-      <label for="version">Version:</label>
-      <input type="text" id="version" name="version" value="<%= params[:version] %>" style="width:5em"/>
-    </p>
-    <% if error_set? :version %>
-      <p class="error quote"><%= error :version %></p>
-    <% end %>
-    <p>
-      <label for="message">Message:</label>
-      <textarea id="message" name="message" style="height:20em"><%= params[:message] %></textarea>
-    </p>
-    <% if env['identica'] %>
-      <p class="quote"><input type="checkbox" id="identica" name="identica" value="announce" checked="checked"/> Announce on <a href="http://identi.ca/xfce">identi.ca/xfce</a></p>
-    <% end %>
-    <% if env['mailinglists'] %>
-      <% for list in env['mailinglists'].lists %>
-        <p class="quote"><input type="checkbox" name="mailinglists[<%= list %>]" value="announce" <%= 'checked="checked"' if @collection.mailinglists.include?(list) %>/> Announce on <%= list %></p>
-      <% end %>
-      <p class="quote"><strong>Make sure to be subscribed to these mailinglists with <%= authentication_user.email %>. You can <a href="/maintainer/profile/<%= authentication_user.username %>">change your email address here</a>.</strong></p>
-    <% end %>
-  </fieldset>
-  <h2>Projects</h2>
-  <fieldset>
-    <table cellspacing="0" cellpadding="0">
-      <% for project in Project.find_all %>
-        <tr>
-          <th><%= project.name %></th>
-          <td>
-            <label class="inline">Version to include:</label>
-            <select name="project_version[<%= project.name %>]">
-              <option name="nil" value="nil" <%= 'selected="selected"' if (params['project_version'] and params['project_version'][project.name] == 'nil') %>>None</option>
-              <% for release in project.releases %>
-                <option value="<%= release.version %>" <%= 'selected="selected"' if (params['project_version'] and params['project_version'][project.name] == release.version) %>><%= release.version %></option>
-              <% end %>
-            </select>
-          </td>
-        </tr>
-      <% end %>
-    </table>
-  </fieldset>
-  <p><input type="submit" value="Release and celebrate!"/></p>
-</form>
-<%= footer %>
diff --git a/lib/views/collection_new_release.haml b/lib/views/collection_new_release.haml
new file mode 100755
index 0000000..bf587a9
--- /dev/null
+++ b/lib/views/collection_new_release.haml
@@ -0,0 +1,34 @@
+
+%form
+  %h2 Release information
+  %p
+    %label{:for => "version"} Version:
+    %input{:type => "text", :name => "version", :value => "#{params[:version]}", :style => "width: 5em"}
+  - if error_set? :version
+    %p #{error :version}
+  %p
+    %label{:for => "message"} Message:
+    %textarea{:name => "message"} #{params[:message]}
+  - if env['identica']
+    %p.quote
+      %input{:type => "checkbox", :name => "identica", :value => "announce", :checked => true} Announce on identi.ca/xfce
+  - if env['mailinglists']
+    - for list in env['mailinglists'].lists
+      %p.quote 
+        %input{:type => "checkbox", :name => "mailinglists[#{list}]", :value => "announce"} Announce on #{list}
+    %p.quote Make sure to be subscribed to these mailinglists with #{authentication_user.email}. You can change your email address in your profile.
+
+  %h2 Projects to include in the release
+  %table
+    - for project in Project.find_all.sort
+      %tr
+        %th #{project.name}
+        %td
+          %label{:for => ""} Included version:
+          %select{:name => "project_version[#{project.name}]"}
+            - included_release = params['project_version'][project.name] if params['project_version']
+            %option{:selected => included_release.nil?} None
+            - for release in project.releases
+              %option{:value => "#{release.version}", :selected => (release.version == included_release)} #{release.version}
+  %p
+    %input{:type => "submit", :value => "Release and celebrate!"}
diff --git a/lib/views/collection_release.erb b/lib/views/collection_release.erb
deleted file mode 100755
index f86974a..0000000
--- a/lib/views/collection_release.erb
+++ /dev/null
@@ -1,26 +0,0 @@
-<%= header :title => "Update #{@collection.display_name} #{@release.version}" %>
-<h2>Administrative Tasks</h2>
-<p><a href="/collection/<%= @collection.name %>/release/<%= @release.version %>/update_fat_tarball">Regenerate fat tarball</a></p>
-<p><a href="/collection/<%= @collection.name %>/release/<%= @release.version %>/update_fat_tarball_checksums">Update fat tarball checksums</a></p>
-<h2>Projects to include in the release</h2>
-<form method="post">
-  <table cellspacing="0" cellpadding="0">
-    <% for project in Project.find_all.sort %>
-      <tr>
-        <th><%= project.name %></th>
-        <td>
-          <label class="inline">Included version:</label>
-          <select name="version[<%= project.name %>]">
-            <% included_release = @release.included_project_release(project) %>
-            <option name="nil" value="nil" <%= 'selected="selected"' if included_release.nil? %>>None</option>
-            <% for release in project.releases %>
-              <option value="<%= release.branch.name %>:<%= release.version %>" <%= 'selected="selected"' if release == included_release %>><%= release.version %></option>
-            <% end %>
-          </select>
-        </td>
-      </tr>
-    <% end %>
-  </table>
-  <p><input type="submit" value="Save"/></p>
-</form>
-<%= footer %>
diff --git a/lib/views/collection_release.haml b/lib/views/collection_release.haml
new file mode 100755
index 0000000..2b94f51
--- /dev/null
+++ b/lib/views/collection_release.haml
@@ -0,0 +1,22 @@
+%h2 Administrative Tasks
+%p
+  %a{:href => "/collection/#{@collection.name}/release/#{@release.version}/update_fat_tarball"} Regenerate fat tarball
+%p
+  %a{:href => "/collection/#{@collection.name}/release/#{@release.version}/update_fat_tarball_checksums"} Update fat tarball checksums
+
+%h2 Projects to include in the release
+%form
+  %table
+    - for project in Project.find_all.sort
+      %tr
+        %th #{project.name}
+        %td
+          %label{:for => ""} Included version:
+          %select{:name => "version[#{project.name}]"}
+            - included_release = @release.included_project_release(project)
+            %option{:selected => included_release.nil?} None
+            - for release in project.releases
+              %option{:value => "#{release.branch.name}:#{release.version}", :selected => (release == included_release)} #{release.version}
+  %p
+    %input{:type => "submit", :value => "Save"}
+
diff --git a/lib/views/foot.erb b/lib/views/foot.erb
deleted file mode 100644
index b605728..0000000
--- a/lib/views/foot.erb
+++ /dev/null
@@ -1,2 +0,0 @@
-  </body>
-</html>
diff --git a/lib/views/head.erb b/lib/views/head.erb
deleted file mode 100755
index dc858e9..0000000
--- a/lib/views/head.erb
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-    <title>Xfce Release Manager<%= if params.has_key?(:title) then " | #{params[:title]}" end %></title>
-    <link rel="stylesheet" href="/stylesheet.css" media="all" type="text/css"/>
-  </head>
-  <body>
-    <h1><%= if params.has_key?(:title) then params[:title] else 'Xfce Release Manager' end %></h1>
-    <p id="main-toolbar">
-      <% if authentication_finished? %>
-        <a href="/">Manage Releases</a>
-      <% else %>
-        <a href="/login">Login</a>
-        <a href="/request">Request Account</a>
-      <% end %>
-      <% if authentication_finished? and authentication_user %>
-        <% if authentication_user.is_admin %>
-          <a href="/maintainer">Maintainers</a>
-        <% end %>
-        <a href="/maintainer/<%= authentication_user.username %>">My Profile</a>
-        <a href="/logout">Logout</a>
-      <% end %>
-      <br />
-      <% if env['feeds'] %>
-        <a href="<%= env['feeds'].base_url %>">News Feeds</a>
-      <% end %>
-      <a href="http://identi.ca/xfce">identi.ca Channel</a>
-    </p>
diff --git a/lib/views/index.erb b/lib/views/index.erb
deleted file mode 100755
index 22d3b96..0000000
--- a/lib/views/index.erb
+++ /dev/null
@@ -1,12 +0,0 @@
-<%= header %>
-<h2>What would you like to do?</h2>
-<ul>
-  <li><a href="/feed">View the release news feed</a></li>
-  <li><a href="http://identi.ca/xfce">Visit the identi.ca release news channel</a></li>
-  <% if authentication_finished? %>
-    <li><a href="/">Manage releases of your projects</a></li>
-  <% else %>
-    <li><a href="/login">Manage releases of your projects</a></li>
-  <% end %>
-</ul>
-<%= footer %>
diff --git a/lib/views/index.haml b/lib/views/index.haml
new file mode 100644
index 0000000..6057c5b
--- /dev/null
+++ b/lib/views/index.haml
@@ -0,0 +1 @@
+%h2 Welcome
diff --git a/lib/views/index_login.haml b/lib/views/index_login.haml
new file mode 100644
index 0000000..156a9a2
--- /dev/null
+++ b/lib/views/index_login.haml
@@ -0,0 +1,23 @@
+%h2 Utilities
+%p
+  %a{:href => "/announcements"} Publish announcements
+
+%h2 Collections
+%table
+  %tr
+  - for collection in authentication_user.collections.sort
+    %tr
+      %th
+        %a{:href => "/collection/#{collection.name}"} #{collection.display_name}
+      %td
+        %a{:href => "/collection/#{collection.name}/new-release"} Release new version
+
+%h2 Projects
+%table
+  %tr
+  - for project in authentication_user.projects.sort
+    %tr
+      %th
+        %a{:href => "/project/#{project.name}"} #{project.name}
+      %td
+        %a{:href => "/project/#{project.name}/new-release"} Release new version
diff --git a/lib/views/layout.haml b/lib/views/layout.haml
new file mode 100644
index 0000000..8d4bd10
--- /dev/null
+++ b/lib/views/layout.haml
@@ -0,0 +1,29 @@
+!!! Strict
+%html
+  %head
+    %meta{"http-equiv" => "Content-Type", :content => "text/html; charset=utf-8"}/
+    %title Xfce Release Manager
+    %link{:rel => "stylesheet", :href => "/stylesheet.css", :media => "all", :type => "text/css"}/
+  %body
+    %h1 Xfce Release Manager
+    %ul
+      %li
+        %a{:href => "/"} Home
+      - if authentication_finished? and authentication_user
+        %li
+          %a{:href => "/maintainer/#{authentication_user.username}"} Profile
+        %li
+          %a{:href => "/maintainer"} Maintainers
+        %li
+          %a{:href => "/project"} Projects
+        %li
+          %a{:href => "/logout"} Logout
+      - else
+        %li
+          %a{:href => "/login"} Log in
+        %li
+          %a{:href => "/login/request"} New Account
+        %li
+          %a{:href => "/login/forgot"} Forgot Password
+
+    =yield
diff --git a/lib/views/login.haml b/lib/views/login.haml
new file mode 100755
index 0000000..a4ae8bc
--- /dev/null
+++ b/lib/views/login.haml
@@ -0,0 +1,12 @@
+%h2 Login
+%form{:method => "post", :action => "/login"}
+  - if error(:unauthenticated)
+    %p.error The username or password you entered is not valid. 
+  %p
+    %label{:for => "username"} username:
+    %input{:type => "text", :name => "username"}
+  %p
+    %label{:for => "password"} Password:
+    %input{:type => "password", :name => "password"}
+  %p
+    %input{:type => "submit", :value => "Log in"}
diff --git a/lib/views/login_forgot.haml b/lib/views/login_forgot.haml
new file mode 100755
index 0000000..813f8bc
--- /dev/null
+++ b/lib/views/login_forgot.haml
@@ -0,0 +1 @@
+%h2 Recover Login
diff --git a/lib/views/login_request.haml b/lib/views/login_request.haml
new file mode 100644
index 0000000..9e2934a
--- /dev/null
+++ b/lib/views/login_request.haml
@@ -0,0 +1,39 @@
+%h2 Introduction
+%p 
+  The following form allows you to submit your user info to request an 
+  Xfce developers account. This account needs to be approved by one of 
+  the Xfce developers, so it is wise to introduce yourself on the 
+  %a{:href => "http://www.xfce.org/community"} Xfce4-dev
+  mailing list first, else the request will be rejected. Translators 
+  don't need a developer account, they can sign up at the
+  %a{:href => "https://translations.xfce.org/"} translation
+  page and request to join a translation team after registration.
+
+%h2 Account Information
+%form{:method => "post"}
+  %p
+    %label{:for => "username"} Login Name:
+    %input{:type => "text", :name => "username", :value => params[:username]}
+  %p
+    %label{:for => "realname"} Real Name:
+    %input{:type => "text", :name => "realname", :value => params[:realname]}
+  %p
+    %label{:for => "email"} Email address:
+    %input{:type => "text", :name => "email", :value => params[:email]}
+  %hr
+  %p
+    %label{:for => "password"} Password:
+    %input{:type => "password", :name => "password"}
+  %p
+    %label{:for => "password2"} Confirm password:
+    %input{:type => "password", :name => "password2"}
+  %hr
+  %p.quote
+    The public key is required to push git commits over ssh. Make sure you provide the publickey and 
+    not the fingerprint... Read more about how to generate and use SSH keys 
+    %a{:href => "/login/request/sshinfo"} here.
+  %p
+    %label{:for => "pubkeys"} SSH public-keys:
+    %textarea{:name => "pubkeys", :rows => "5", :wrap => "off"} #{params[:pubkeys]}
+  %p
+    %input{:type => "submit", :value => "Submit"}
diff --git a/lib/views/login_request_finished.haml b/lib/views/login_request_finished.haml
new file mode 100644
index 0000000..6fc83ee
--- /dev/null
+++ b/lib/views/login_request_finished.haml
@@ -0,0 +1,8 @@
+%h2 Done
+%p 
+  Thank you for submitting your account information. We will process the
+  account as soon as possible and you will receive and email once the
+  account has been activated.
+
+%p
+  %a{:href => "/"} Take me back
diff --git a/lib/views/login_request_sshinfo.haml b/lib/views/login_request_sshinfo.haml
new file mode 100644
index 0000000..bb57617
--- /dev/null
+++ b/lib/views/login_request_sshinfo.haml
@@ -0,0 +1,35 @@
+%h2 Introduction
+%p 
+  For a secure connection to push git commits, the Xfce project uses
+  SSH keys to authorize on the server. This has the advantage a secure
+  connection is established between the server with simple passwords.
+
+%h2 Generating SSH keys
+%p
+  SSH keys are stored in your home directory in the <em>~/.ssh</em>
+  directory. To generate a key pair use the following command:</p>
+
+%pre
+  :plain
+        <strong>cd ~/.ssh</strong>
+    .ssh <strong> ssh-keygen -t dsa -f id_dsa</strong>
+    Generating public/private dsa key pair.
+    Enter passphrase (empty for no passphrase): <strong>[ENTER]</strong>
+    Enter same passphrase again: <strong>[ENTER]</strong>
+    Your identification has been saved in id_dsa.
+    Your public key has been saved in id_dsa.pub.
+    The key fingerprint is:
+    e7:c3:bd:c9:33:2e:19:33:b2:62:75:74:b3:99:b1:99 user at localhost
+
+%p 
+  After you have created the key files, you should submit the
+  <em>id_dsa.pub</em> file to us in the text field. This string looks
+  like <em>ssh-dss ... user at localhost</em>. Afterwards you can maintain
+  the keys through this website. We will add the pubkey to your 
+  <em>~/.ssh/authorized_keys</em> file on the Xfce server and 
+  you can then log onto our server without a password.
+
+%h2 Using SSH keys with GIT
+%p 
+  You can read about this in the 
+  %a{:href => "http://wiki.xfce.org/dev/howto/git#committers"} Xfce Wiki.
diff --git a/lib/views/login_unauthenticated.haml b/lib/views/login_unauthenticated.haml
new file mode 100755
index 0000000..53909bb
--- /dev/null
+++ b/lib/views/login_unauthenticated.haml
@@ -0,0 +1,5 @@
+%h2 Invalid Username or Password
+%p.error The username or password you entered is not valid.
+%p 
+  Try 
+  %a{:href => "/login"} again
diff --git a/lib/views/maintainer.erb b/lib/views/maintainer.erb
deleted file mode 100644
index 3e69acf..0000000
--- a/lib/views/maintainer.erb
+++ /dev/null
@@ -1,26 +0,0 @@
-<%= header :title => "Maintainers" %>
-<h2>Pending Accounts</h2>
-<p>Account added by the request account page</p> 
-
-<h2>Active Maintainers</h2>
-<table cellspacing="0" cellpadding="0">
-  <tr>
-    <th>Username</th>
-    <th>Real Name</th>
-    <th>Email</th>
-  </tr>
-  <% for maintainer in Maintainer.all.sort %>
-    <tr>
-      <td>
-        <a href="/maintainer/<%= maintainer.username %>"><%= maintainer.username %></a>
-      </td>
-      <td>
-        <%= maintainer.realname %>
-      </td>
-      <td>
-        <%= maintainer.email %>
-      </td>
-    </tr>
-  <% end %>
-</table>
-<%= footer %>
diff --git a/lib/views/maintainer.haml b/lib/views/maintainer.haml
new file mode 100644
index 0000000..1a97438
--- /dev/null
+++ b/lib/views/maintainer.haml
@@ -0,0 +1,17 @@
+%h2 Inactive Maintainers
+%p Account for maintainers that have not been activated yet.
+
+%h2 Active Maintainers
+%p Accounts of the maintainers that are currently using the release manager.
+
+%table
+  %tr
+    %th Username
+    %th Real Name
+    %th Email
+  - for maintainer in Maintainer.all.sort
+    %tr
+      %td
+        %a{:href => "/maintainer/#{maintainer.username}"} #{maintainer.username}
+      %td #{maintainer.realname}
+      %td #{maintainer.email}
diff --git a/lib/views/maintainer_profile.erb b/lib/views/maintainer_profile.erb
deleted file mode 100755
index 0796986..0000000
--- a/lib/views/maintainer_profile.erb
+++ /dev/null
@@ -1,35 +0,0 @@
-<%= header :title => "Update account data for #{@maintainer.realname}" %>
-<h2>Account data</h2>
-<form method="post">
-  <% if error(:succeed) %>
-      <p class="info"><%= error(:succeed) %></p>
-  <% end %>
-  <fieldset>
-    <p><label for="username">Login Name:</label> <input type="text" name="username" disabled="disabled" value="<%= @maintainer.username %>"/></p>
-    <p><label for="email">Email address:</label> <input type="text" name="email" value="<%= @maintainer.email %>"/></p>
-    <p><label for="realname">Real Name:</label> <input type="text" name="realname" value="<%= @maintainer.realname %>"/></p>
-    <p><label for="pubkeys">SSH public-keys:</label> <textarea name="pubkeys" rows="5" wrap="off"><%= @maintainer.pubkeys %></textarea></p>
-    <hr />
-    <p class="quote">Leave the password fields empty if you don't want to set a new password. The password needs to be at least 6 characters long.</p>
-    <% if error(:newpassword) %>
-    <p class="info"><%= error(:newpassword) %></p>
-    <% end %>
-    <p><label for="new_password">New password:</label> <input type="password" name="new_password" value=""/></p>
-    <p><label for="new_password2">Confirm new password:</label> <input type="password" name="new_password2" value=""/></p>
-    <hr />
-    <% if authentication_user.username == @maintainer.username %>
-    <p class="quote">Please enter your existing password to confirm account changes.</p>
-    <% else %>
-    <p class="quote">You are editing the account of someone else; enter your <strong>OWN</strong> password to confirm.</strong></p>
-    <% end %>
-    <% if error(:password) %>
-    <p class="info"><%= error(:password) %></p>
-    <% end %>
-    <p><label for="password">Password:</label> <input type="password" name="password" value=""></p>
-    <p class="quote"><input type="submit" value="Save"/></p>
-  </fieldset>
-</form>
-
-<h2>Permissions</h2>
-<p><label for="projects">Projects:</label> <%= @maintainer.project_names %>.</p>
-<%= footer %>
diff --git a/lib/views/maintainer_profile.haml b/lib/views/maintainer_profile.haml
new file mode 100644
index 0000000..beb42cc
--- /dev/null
+++ b/lib/views/maintainer_profile.haml
@@ -0,0 +1,32 @@
+%h2 Account data
+%form{:method => "post"}
+  %p
+    %label{:for => "username"} Login Name:
+    %input{:type => "text", :name => "username", :disabled => true, :value => @maintainer.username}
+  %p
+    %label{:for => "email"} Email address:
+    %input{:type => "text", :name => "email", :value => @maintainer.email}
+  %p
+    %label{:for => "realname"} Real Name:
+    %input{:type => "text", :name => "realname", :value => @maintainer.realname}
+  %p
+    %label{:for => "pubkeys"} SSH public-keys:
+    %textarea{:name => "pubkeys", :rows => "5", :wrap => "off", :value => @maintainer.pubkeys}
+  %hr
+  %p Leave the password fields empty if you don't want to set a new password. The password needs to be at least 6 characters long.
+  %p
+    %label{:for => "new_password"} New password:
+    %input{:type => "password", :name => "new_password"}
+  %p
+    %label{:for => "new_password2"} Confirm new password:
+    %input{:type => "password", :name => "new_password2"}
+  %hr
+  %p Please enter your existing password to confirm account changes.
+  %p
+    %label{:for => "password"} Password:
+    %input{:type => "password", :name => "password"}
+  %p
+    %input{:type => "submit", :value => "Save"}
+
+%h2 Permissions
+
diff --git a/lib/views/manage_releases.erb b/lib/views/manage_releases.erb
deleted file mode 100644
index 430cff7..0000000
--- a/lib/views/manage_releases.erb
+++ /dev/null
@@ -1,26 +0,0 @@
-<%= header :title => 'Manage releases' %>
-<h2>Utilities</h2>
-<p><a href="/announcements">Publish announcements</a></p>
-<h2>Collections</h2>
-<table cellspacing="0" cellpadding="0">
-  <% for collection in authentication_user.collections.sort %>
-    <tr>
-      <th><a href="/collection/<%= collection.name %>"><%= collection.display_name %></a></th>
-      <td>
-        <a href="/collection/<%= collection.name %>/new-release">Release new version</a>
-      </td>
-    </tr>
-  <% end %>
-</table>
-<h2>Projects</h2>
-<table cellspacing="0" cellpadding="0">
-  <% for project in authentication_user.projects.sort %>
-    <tr>
-      <th><a href="/project/<%= project.name %>"><%= project.name %></a></th>
-      <td>
-        <a href="/project/<%= project.name %>/new-release">Release new version</a>
-      </td>
-    </tr>
-  <% end %>
-</table>
-<%= footer %>
diff --git a/lib/views/permission_denied.erb b/lib/views/permission_denied.erb
deleted file mode 100755
index b14a37d..0000000
--- a/lib/views/permission_denied.erb
+++ /dev/null
@@ -1,15 +0,0 @@
-<%= header :title=> 'Permission denied' %>
-<p class="error">You're denied access to this page for the following reason:</p>
-<p class="error" style="text-align:center;"><strong>
-  <% if context.is_a? Moka::Models::Project %>
-    You are not listed as a maintainer of <%= context.name %> and your roles include none of <%= roles.to_s %> either.
-  <% elsif context.is_a? Moka::Models::Collection %>
-    You are not listed as a maintainer of <%= context.display_name %> and your roles include none of <%= roles.to_s %> either.
-  <% elsif context.is_a? Moka::Models::Maintainer %>
-    You are not <%= context.realname %> and your roles include none of <%= roles.to_s %> either.
-  <% else %>
-    One of the <%= roles.to_s %> roles is required for this.
-  <% end %>
-</strong></p>
-<p><a href="javascript:history.back()">Bring me back!</a></p>
-<%= footer %>
diff --git a/lib/views/permission_denied.haml b/lib/views/permission_denied.haml
new file mode 100755
index 0000000..53edb87
--- /dev/null
+++ b/lib/views/permission_denied.haml
@@ -0,0 +1,14 @@
+%h2 Permission denied
+%p.error You're denied access to this page for the following reason:
+
+- if context.is_a? Moka::Models::Project
+  %p.error You are not listed as a maintainer of #{context.name} and your roles include none of #{roles.to_s} either.
+- elsif context.is_a? Moka::Models::Collection
+  %p.error You are not listed as a maintainer of #{context.display_name} and your roles include none of #{roles.to_s} either.
+- elsif context.is_a? Moka::Models::Maintainer
+  %p.error You are not #{context.realname} and your roles include none of #{roles.to_s} either.
+- else
+  %p.error One of the #{roles.to_s} roles is required for this.
+
+%p 
+  %a{:href => "javascript:history.back()"} Bring me back!
diff --git a/lib/views/project.erb b/lib/views/project.erb
deleted file mode 100755
index affa7a6..0000000
--- a/lib/views/project.erb
+++ /dev/null
@@ -1,42 +0,0 @@
-<%= header :title => "Manage #{@project.name}" %>
-<h2>Project information</h2>
-<form method="post" action="/project/<%= @project.name %>/information">
-  <fieldset>
-    <p><label for="website">Website:</label> <input type="text" id="website" name="website" style="width:70%" value="<%= @project.website %>"/></p>
-    <p><label for="description">Description:</label> <textarea id="description" name="description" style="height:10em;"><%= @project.description %></textarea></p>
-    <p><label for="maintainers">Maintainers:</label> <%= maintainer_names(@project) %>.
-    <p class="quote"><input type="submit" value="Save"/></p>
-  </fieldset>
-</form>
-<h2>Classification</h2>
-<form method="post" action="/project/<%= @project.name %>/classify">
-  <p>
-    <select name="classification">
-      <% for classification in Classification.find_all %>
-        <% if @project.classification.name == classification.name %>
-          <option name="<%= classification.name %>" selected="selected"><%= classification.name %></option>
-        <% else %>
-          <option name="<%= classification.name %>"><%= classification.name %></option>
-        <% end %>
-      <% end %>
-    </select>
-    <input type="submit" value="Change"/>
-  </p>
-</form>
-<h2>Releases <a href="/project/<%= @project.name %>/new-release">Release new version</a></h2>
-<table cellspacing="0" cellpadding="0">
-  <% for branch in @project.branches.sort.reverse %>
-    <% releases = @project.releases(branch) %>
-    <% for release in releases %>
-      <tr>
-        <th><%= "#{branch.name} Branch" if release == releases.first %></th>
-        <th><a href="<%= release.download_url %>"><%= release.version %></a></th>
-        <td>
-          <a href="/project/<%= @project.name %>/branch/<%= branch.name %>/release/<%= release.version %>/update">Update</a>
-          <a href="/project/<%= @project.name %>/branch/<%= branch.name %>/release/<%= release.version %>/delete">Delete</a>
-        </td>
-      </tr>
-    <% end %>
-  <% end %>
-</table>
-<%= footer %>
diff --git a/lib/views/project.haml b/lib/views/project.haml
new file mode 100755
index 0000000..9e2573b
--- /dev/null
+++ b/lib/views/project.haml
@@ -0,0 +1,39 @@
+%h2 Project information
+%form{:method => "post", :action => "/project/#{@project.name}/information"}
+  %p
+    %label{:for => "website"} Website:
+    %input{:type => "text", :name => "website", :value => "#{@project.website}"}
+  %p
+    %label{:for => "description"} Description:
+    %textarea{:name => "description"} #{@project.description}
+  %p
+    %label{:for => "maintainers"} Maintainers:
+    %input{:type => "text", :name => "maintainers", :disabled => true, :value => "#{maintainer_names(@project)}"}
+  %p.quote
+    %input{:type => "submit", :value => "Save"}
+
+%h2 Classification
+%form{:method => "post", :action => "/project/#{@project.name}/classify"}
+  %p
+    %select{:name => "classification"}
+      - for classification in Classification.find_all
+        %option{:name => classification.name, :selected => @project.classification.name == classification.name} #{classification.name}
+    %input{:type => "submit", :value => "Change"}
+
+%h2 Releases
+%p
+  %a{:href => "/project/#{@project.name}/new-release"} Release new version
+
+%table
+  - for branch in @project.branches.sort.reverse
+    - releases = @project.releases(branch).sort.reverse
+    - for release in releases
+      %tr
+        %th
+          - if release == releases.first
+            #{branch.name} Branch
+        %th
+          %a{:href => "#{release.download_url}"} #{release.version}
+        %td
+          %a{:href => "/project/#{@project.name}/branch/#{branch.name}/release/#{release.version}/update"} Update
+          %a{:href => "/project/#{@project.name}/branch/#{branch.name}/release/#{release.version}/delete"} Delete
diff --git a/lib/views/project_branch_new_release_announcement.erb b/lib/views/project_branch_new_release_announcement.erb
deleted file mode 100755
index d4dab51..0000000
--- a/lib/views/project_branch_new_release_announcement.erb
+++ /dev/null
@@ -1,24 +0,0 @@
-<%= header :title => "Release new version of #{@project.name} (3/4)" %>
-<h2>Tarball uploaded</h2>
-<p>The tarball is now uploaded. You can stop here if that is all you wanted to do.</p>
-<h2>Announcement</h2>
-<form method="post">
-  <fieldset>
-    <p><label for="message">Release notes:</label> <textarea class="message" id="message" name="message" style="height:20em"></textarea></p>
-    <p class="quote"><strong>This message will appear below the download and project info, so you don't have to start it with a greeting.</strong></p>
-    <% if env['feeds'] %>
-      <p class="quote"><input type="checkbox" id="feeds" name="feeds" value="announce" checked="checked"/> Update <a href="<%= env['feeds'].get_project_feed_url(@project) %>">news feed</a></p>
-    <% end %>
-    <% if env['identica'] %>
-      <p class="quote"><input type="checkbox" id="identica" name="identica" value="announce" checked="checked"/> Announce on <a href="http://identi.ca/xfce">identi.ca/xfce</a></p>
-    <% end %>
-    <% if env['mailinglists'] %>
-      <% for list in env['mailinglists'].lists %>
-        <p class="quote"><input type="checkbox" name="mailinglists[<%= list %>]" value="announce" <%= 'checked="checked"' if @project.mailinglists.include?(list) %>/> Announce on <%= list %></p>
-      <% end %>
-      <p class="quote"><strong>Make sure to be subscribed to these mailinglists with <%= authentication_user.email %>. You can <a href="/maintainer/profile/<%= authentication_user.username %>">change your email address here</a>.</strong></p>
-    <% end %>
-    <p class="quote"><input type="submit" value="Continue"/></p>
-  </fieldset>
-</form>
-<%= footer %>
diff --git a/lib/views/project_branch_new_release_announcement.haml b/lib/views/project_branch_new_release_announcement.haml
new file mode 100755
index 0000000..0053548
--- /dev/null
+++ b/lib/views/project_branch_new_release_announcement.haml
@@ -0,0 +1,24 @@
+%h2 Tarball uploaded
+%p The tarball is now uploaded. You can stop here if that is all you wanted to do.
+
+%h2 Announcement
+%form{:method => "post"}
+  %p
+    %label{:for => "message"} Release notes:
+    %textarea{:name => "message", :class => "message"}
+    - if env['feeds']
+      %p.quote
+        %input{:type => "checkbox", :name => "feeds", :value => "announce", :checked => true} Update news feed
+    - if env['identica']
+      %p.quote
+        %input{:type => "checkbox", :name => "identica", :value => "announce", :checked => true} Announce on identi.ca
+    - if env['mailinglists']
+      - for list in env['mailinglists'].lists
+        %p.quote
+          %input{:type => "checkbox", :name => "mailinglists[#{list}]", :value => "announce"}
+            Announce on #{list}
+      %p.quote
+        Make sure to be subscribed to these mailinglists with #{authentication_user.email}.
+        You can change your email address in your profile.
+    %p.quote
+      %input{:type => "submit", :value => "Continue"}
diff --git a/lib/views/project_branch_new_release_confirm.erb b/lib/views/project_branch_new_release_confirm.erb
deleted file mode 100755
index 13d0029..0000000
--- a/lib/views/project_branch_new_release_confirm.erb
+++ /dev/null
@@ -1,36 +0,0 @@
-<%= header :title => "Release new version of #{@project.name} #{@branch.name} (4/4)" %>
-<h2>Confirmation</h2>
-<p>The following announcements will be sent.</p>
-<% if env['identica'] and params[:identica] %>
-  <h3>Identi.ca</h3>
-  <p class="preview"><%= @announcement_status %></p>
-<% end %>
-<% if env['mailinglists'] and params[:mailinglists] %>
-  <h3>Mailinglists</h3>
-  <h4>Subject</h4>
-  <p class="preview"><%= @announcement_subject %></p>
-  <h4>Body</h4>
-  <p class="preview"><%= @announcement_body %></p>
-<% end %>
-<h2>Everything alright?</h2>
-<form method="post" action="/project/<%= @project.name %>/branch/<%= @branch.name %>/new-release/<%= @release.version %>/confirm">
-  <fieldset>
-    <% if env['feeds'] %>
-      <input style="display:none" type="checkbox" id="feeds" name="feeds" value="announce" <%= 'checked="checked"' if params[:feeds] %>/>
-    <% end %>
-    <% if env['identica'] %>
-      <input style="display:none" type="checkbox" name="identica" <%= 'checked="checked"' if params[:identica] %>/>
-    <% end %>
-    <% if env['mailinglists'] %>
-      <% for list in env['mailinglists'].lists %>
-        <input style="display:none" type="checkbox" name="mailinglists[<%= list %>]" value="announce" <%= 'checked="checked"' if (params[:mailinglists] and params[:mailinglists].has_key?(list)) %>/>
-      <% end %>
-    <% end %>
-    <textarea style="display:none" name="message"><%= params[:message] %></textarea>
-    <p class="center">
-      <input type="button" onclick="history.back()" value="No, let me edit the announcement again"/>
-      <input type="submit" value="Yes, release the damn thing already!"/>
-    </p>
-  </fieldset>
-</form>
-<%= footer %>
diff --git a/lib/views/project_branch_new_release_confirm.haml b/lib/views/project_branch_new_release_confirm.haml
new file mode 100755
index 0000000..674362f
--- /dev/null
+++ b/lib/views/project_branch_new_release_confirm.haml
@@ -0,0 +1,30 @@
+%h2 Confirmation
+%p The following announcements will be sent.
+
+- if env['identica'] and params[:identica]
+  %h3 Identi.ca
+  %p.preview #{@announcement_status}
+
+- if env['mailinglists'] and params[:mailinglists]
+  %h3 Mailing Lists
+
+  %h4 Subject
+  %p.preview #{@announcement_subject}
+  
+  %h4 Body
+  %p.preview #{@announcement_body}
+  
+%h2 Everything alright?
+%form{:method => "post", :action => "/project/#{@project.name}/branch/#{@branch.name}/new-release/#{@release.version}/confirm"}
+  - if env['feeds'] and params[:feeds]
+    %input{:type => "hidden", :name => "feeds", :value => "announce"}
+  - if env['identica'] and params[:identica]
+    %input{:type => "hidden", :name => "identica", :value => "announce"}
+  - if env['mailinglists'] and params[:mailinglists]
+    - for list in env['mailinglists'].lists
+      - if params[:mailinglists].has_key?(list)
+        %input{:type => "hidden", :name => "mailinglists[#{list}]", :value => "announce"}
+  %input{:type => "hidden", :name => "message", :value => "#{params[:message]}"}
+  %p.center
+    %input{:type => "button", :onclick => "history.back()", :value => "No, let me edit the announcement again"}
+    %input{:type => "submit", :value => "Yes, release the damn thing already!"}
diff --git a/lib/views/project_new_release.erb b/lib/views/project_new_release.erb
deleted file mode 100755
index 3ffcbe4..0000000
--- a/lib/views/project_new_release.erb
+++ /dev/null
@@ -1,9 +0,0 @@
-<%= header :title => "Release new version of #{@project.name} (1/4)" %>
-<h2>Release information</h2>
-<p><strong>Before releasing, please make sure the <a href="/project/<%= @project.name %>">project information</a> is up to date. Also make sure you are subscribed to the mailing lists with <a href="/maintainer/profile/<%= authentication_user.username %>"><%= authentication_user.email %></a> else the announcement will not be posted.</strong></p>
-<form method="get" action="/project/<%= @project.name %>/new-release/tarball">
-  <fieldset>
-    <p class="quote"><input type="submit" value="I verified the information is correct"/></p>
-  </fieldset>
-</form>
-<%= footer %>
diff --git a/lib/views/project_new_release.haml b/lib/views/project_new_release.haml
new file mode 100755
index 0000000..56c9572
--- /dev/null
+++ b/lib/views/project_new_release.haml
@@ -0,0 +1,19 @@
+%h2 Release information
+%p
+  Before releasing, please make sure the project information below is
+  up to date. Also make sure you are subscribed to the mailing lists with
+  <strong>#{authentication_user.email}</strong> else the announcement will
+  not be posted!
+
+%h3 Project information
+%form
+  %p
+    %label{:for => "website"} Website:
+    %input{:type => "text", :name => "website", :disabled => true, :value => "#{@project.website}"}
+  %p
+    %label{:for => "description"} Description:
+    %textarea{:name => "description", :disabled => true} #{@project.description}
+
+%form{:method => "get", :action => "/project/#{@project.name}/new-release/tarball"}
+  %p.quote
+    %input{:type => "submit", :value => "I verified the information is correct"}
diff --git a/lib/views/project_new_release_tarball.erb b/lib/views/project_new_release_tarball.erb
deleted file mode 100755
index 9087118..0000000
--- a/lib/views/project_new_release_tarball.erb
+++ /dev/null
@@ -1,16 +0,0 @@
-<%= header :title => "Release new version of #{@project.name} (2/4)" %>
-<h2>Tarball</h2>
-<form method="post" enctype="multipart/form-data">
-  <fieldset>
-    <p><label for="tarball">Tarball:</label> <input type="file" id="tarball" name="tarball" size="30"/></p>
-    <% if error(:tarball) %>
-      <p class="error quote"><%= error(:tarball) %></p>
-    <% end %>
-    <p><label for="checksum">Checksum (SHA1):</label> <input type="text" id="checksum" name="checksum" size="40" value="<%= params[:checksum] %>"/></p>
-    <% if error(:checksum) %>
-      <p class="error quote"><%= error(:checksum) %></p>
-    <% end %>
-    <p class="quote"><input type="submit" value="Upload file and continue"/></p>
-  </fieldset>
-</form>
-<%= footer %>
diff --git a/lib/views/project_new_release_tarball.haml b/lib/views/project_new_release_tarball.haml
new file mode 100755
index 0000000..1045887
--- /dev/null
+++ b/lib/views/project_new_release_tarball.haml
@@ -0,0 +1,14 @@
+%h2 Tarball
+%form{:method => "post", :enctype => "multipart/form-data"}
+  %p
+    %label{:for => "tarball"} Tarball:
+    %input{:type => "file", :name => "tarball", :size => "30"}
+    - if error(:tarball)
+      %p.error.quote #{error(:tarball)}
+  %p
+    %label{:for => "checksum"} Checksum (SHA1):
+    %input{:type => "text", :name => "checksum", :size => "40", :value => "#{params[:checksum]}"}
+    - if error(:checksum)
+      %p.error.quote #{error(:checksum)}
+  %p.quote
+    %input{:type => "submit", :value => "Upload file and continue"}
diff --git a/lib/views/project_release_delete.erb b/lib/views/project_release_delete.erb
deleted file mode 100755
index 6acaf8c..0000000
--- a/lib/views/project_release_delete.erb
+++ /dev/null
@@ -1,11 +0,0 @@
-<%= header :title => "Delete #{@project.name} #{@release.version}" %>
-<h2>Are you sure you want to delete this version?</h2>
-<form method="post">
-  <fieldset>
-    <p class="center">
-      <input type="button" value="No, please take me back" onclick="history.back()"/> 
-      <input type="submit" value="Yes, who cares about <%= @project.name %> <%= @release.version %> anyway?"/>
-    </p>
-  </fieldset>
-</form>
-<%= footer %>
diff --git a/lib/views/project_release_delete.haml b/lib/views/project_release_delete.haml
new file mode 100755
index 0000000..ca44bd2
--- /dev/null
+++ b/lib/views/project_release_delete.haml
@@ -0,0 +1,6 @@
+%h2 Are you sure you want to delete this version?
+%form{:method => "post"}
+  %p
+    %input{:type => "button", :value => "No, please take me back", :onclick => "history.back()"}
+    %input{:type => "submit", :value => "Yes, who cares about #{@project.name} #{@release.version} anyway?"}
+
diff --git a/lib/views/project_release_update.erb b/lib/views/project_release_update.erb
deleted file mode 100755
index 01ec35b..0000000
--- a/lib/views/project_release_update.erb
+++ /dev/null
@@ -1,17 +0,0 @@
-<%= header :title => "Update #{@project.name} #{@release.version}" %>
-<h2>Tarball</h2>
-<form method="post" enctype="multipart/form-data">
-  <fieldset>
-    <p><label>Filename:</label> <tt><%= @release.tarball_basename %></tt></p>
-    <p><label for="tarball">Tarball:</label> <input type="file" id="tarball" name="tarball"/></p>
-    <% if env[:error][:tarball] %>
-      <p class="error quote"><%= env[:error][:tarball] %></p>
-    <% end %>
-    <p><label for="checksum">Checksum (SHA1):</label> <input type="text" id="checksum" name="checksum" size="40" value="<%= params[:checksum] %>"/></p>
-    <% if env[:error][:checksum] %>
-      <p class="error quote"><%= env[:error][:checksum] %></p>
-    <% end %>
-    <p class="quote"><input type="submit" value="Replace current tarball"/></p>
-  </fieldset>
-</form>
-<%= footer %>
diff --git a/lib/views/project_release_update.haml b/lib/views/project_release_update.haml
new file mode 100755
index 0000000..3c55e17
--- /dev/null
+++ b/lib/views/project_release_update.haml
@@ -0,0 +1,16 @@
+%h2 Tarball
+%form{:method => "post", :enctype => "multipart/form-data"}
+  %p
+    %label Filename: <tt>#{@release.tarball_basename}</tt>
+  %p
+    %label{:for => "tarball"} Tarball:
+    %input{:type => "file", :name => "tarball"}
+    - if env[:error][:tarball]
+      %p.error.quote #{env[:error][:tarball]}
+  %p
+    %label{:for => "checksum"} Checksum (SHA1):
+    %input{:type => "text", :name => "checksum", :size => "40", :value => "#{params[:checksum]}"}
+    - if env[:error][:checksum]
+      %p.error.quote #{env[:error][:checksum]}
+  %p.quote
+    %input{:type => "submit", :value => "Replace current tarball"}
diff --git a/lib/views/request.erb b/lib/views/request.erb
deleted file mode 100644
index a73f871..0000000
--- a/lib/views/request.erb
+++ /dev/null
@@ -1,35 +0,0 @@
-<%= header :title => "Request Developer Account" %>
-<h2>Introduction</h2>
-<p>The following form allows you to submit your user info to request an Xfce
-   developers account. This account needs to be approved by one of the Xfce developers,
-   so it is wise to introduce yourself on the 
-   <a href="http://www.xfce.org/community">Xfce4-dev</a> mailing list first, else
-   the request will be rejected.</p>
-<p>Translators don't need a developer account, they can sign up at the
-   <a href="https://translations.xfce.org/">translation</a> page and request to 
-   join a translation team after registration.</p>
-
-<h2>Account Information</h2>
-<form method="post">
-  <fieldset>
-    <p><label for="username">Login Name:</label>
-       <input type="text" name="username" value="<%= params[:username] %>"/></p>
-    <p><label for="realname">Real Name:</label>
-       <input type="text" name="realname" value="<%= params[:realname] %>"/></p>
-    <p><label for="email">Email address:</label>
-       <input type="text" name="email" value="<%= params[:email] %>"/></p>
-    <hr />
-    <p class="quote">The password needs to be at least 6 characters long.</p>
-    <p><label for="password">Password:</label>
-        <input type="password" name="password" value=""/></p>
-    <p><label for="password2">Confirm password:</label>
-        <input type="password" name="password2" value=""/></p>
-    <hr />
-    <p class="quote">The public key is required to push git commits over ssh. Make sure you provide the publickey and 
-       not the fingerprint... Read more about how to generate and use SSH keys <a href="/request/sshinfo">here</a>.</p>
-    <p><label for="pubkeys">SSH public-keys:</label>
-       <textarea id="pubkeys" name="pubkeys" rows="5" wrap="off"><%= params[:pubkeys] %></textarea></p>
-    <p class="quote"><input type="submit" value="Submit"/></p>
-  </fieldset>
-</form>
-<%= footer %>
diff --git a/lib/views/request_finished.erb b/lib/views/request_finished.erb
deleted file mode 100644
index 2af10c1..0000000
--- a/lib/views/request_finished.erb
+++ /dev/null
@@ -1,9 +0,0 @@
-<%= header :title => "Request Developer Account" %>
-<h2>Done</h2>
-<p>Thank you for submitting your account information. We will process the
-   account as soon as possible and you will receive and email once the
-   account has been activated.</p>
-
-<p><a href="/">Take me back</a></p>
-
-<%= footer %>
diff --git a/lib/views/request_sshinfo.erb b/lib/views/request_sshinfo.erb
deleted file mode 100644
index e1f6aaa..0000000
--- a/lib/views/request_sshinfo.erb
+++ /dev/null
@@ -1,31 +0,0 @@
-<%= header :title => "Use and create SSH keys" %>
-<h2>Introduction</h2>
-<p>For a secure connection to push git commits, the Xfce project uses
-   SSH keys to authorize on the server. This has the advantage a secure
-   connection is established between the server with simple passwords.</p>
-
-<h2>Generating SSh keys</h2>
-<p>SSH keys are stored in your home directory in the <em>~/.ssh</em>
-   directory. To generate a key pair use the following command:</p>
-
-<pre>~ $ <strong>cd ~/.ssh</strong>
-~/.ssh $ <strong>ssh-keygen -t dsa -f id_dsa</strong>
-Generating public/private dsa key pair.
-Enter passphrase (empty for no passphrase): <strong>[ENTER]</strong>
-Enter same passphrase again: <strong>[ENTER]</strong>
-Your identification has been saved in id_dsa.
-Your public key has been saved in id_dsa.pub.
-The key fingerprint is:
-e7:c3:bd:c9:33:2e:19:33:b2:62:75:74:b3:99:b1:99 user at localhost</pre>
-
-<p>After you have created the key files, you should submit the
-   <em>id_dsa.pub</em> file to us in the text field. This string looks
-   like <em>ssh-dss ... user at localhost</em>. Afterwards you can maintain
-   the keys through this website. We will add the pubkey to your 
-   <em>~/.ssh/authorized_keys</em> file on the Xfce server and 
-   you can then log onto our server without a password.</p>
-
-<h2>Using SSH keys with GIT</h2>
-<p>You can read about this in the <a href="http://wiki.xfce.org/dev/howto/git#committers">
-   Xfce Wiki</a></p>
-<%= footer %>



More information about the Xfce4-commits mailing list