<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>redmine/config/environments/development_oracle.rb</filename>
    </added>
    <added>
      <filename>redmine/config/environments/development_sqlserver.rb</filename>
    </added>
    <added>
      <filename>redmine/config/environments/test_oracle.rb</filename>
    </added>
    <added>
      <filename>redmine/config/environments/test_pgsql.rb</filename>
    </added>
    <added>
      <filename>redmine/config/environments/test_sqlserver.rb</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/ch01.html</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/ch01s01.html</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/ch01s02.html</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/ch01s03.html</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/ch01s04.html</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/ch01s05.html</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/ch01s06.html</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/ch01s07.html</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/ch01s08.html</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/ch01s09.html</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/ch02.html</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/ch02s01.html</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/ch02s02.html</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/ch02s03.html</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/ch02s04.html</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/ch02s05.html</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/ch02s06.html</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/ch02s07.html</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/ch02s08.html</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/html.css</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/index.html</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/resources/issues_list.png</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/resources/users_list.png</filename>
    </added>
    <added>
      <filename>redmine/public/manual/fr/resources/workflow.png</filename>
    </added>
    <added>
      <filename>redmine/test/integration/account_test.rb</filename>
    </added>
    <added>
      <filename>redmine/test/integration/admin_test.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -16,31 +16,30 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 class AccountController &lt; ApplicationController
-	layout 'base'	
+  layout 'base'	
+  
   # prevents login action to be filtered by check_if_login_required application scope filter
   skip_before_filter :check_if_login_required, :only =&gt; :login
-	before_filter :require_login, :except =&gt; [:show, :login]
+  before_filter :require_login, :except =&gt; [:show, :login]
 
-	def show
-		@user = User.find(params[:id])
-	end
-  
-	# Login request and validation
-	def login
-		if request.get?
-			session[:user] = nil
-			@user = User.new
-		else
-			@user = User.new(params[:user])
-			logged_in_user = @user.try_to_login
-			if logged_in_user
-				session[:user] = logged_in_user
-				redirect_back_or_default :controller =&gt; 'account', :action =&gt; 'my_page'
-			else
-				flash[:notice] = _('Invalid user/password')
-			end
-		end
-	end
+  def show
+    @user = User.find(params[:id])
+  end
+
+  # Login request and validation
+  def login
+    if request.get?
+      session[:user] = nil
+    else
+      logged_in_user = User.try_to_login(params[:login], params[:password])
+      if logged_in_user
+        session[:user] = logged_in_user
+        redirect_back_or_default :controller =&gt; 'account', :action =&gt; 'my_page'
+      else
+        flash[:notice] = _('Invalid user/password')
+      end
+    end
+  end
 	
 	# Log out current user and redirect to welcome page
 	def logout
@@ -64,20 +63,15 @@ class AccountController &lt; ApplicationController
 		end
 	end
 	
-	# Change current user's password
-	def change_password
-		@user = User.find(session[:user].id)		
-		if @user.check_password?(@params[:old_password])		
-			if @params[:new_password] == @params[:new_password_confirmation]
-				if @user.change_password(@params[:old_password], @params[:new_password])
-					flash[:notice] = 'Password was successfully updated.'
-				end
-			else
-				flash[:notice] = 'Password confirmation doesn\'t match!'
-			end
-		else
-			flash[:notice] = 'Wrong password'
-		end
-		render :action =&gt; 'my_account'
-	end
+  # Change current user's password
+  def change_password
+    @user = User.find(session[:user].id)
+    if @user.check_password?(@params[:password])
+      @user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation]
+      flash[:notice] = 'Password was successfully updated.' if @user.save
+    else
+      flash[:notice] = 'Wrong password'
+    end
+    render :action =&gt; 'my_account'
+  end
 end</diff>
      <filename>redmine/app/controllers/account_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -16,26 +16,32 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 class AdminController &lt; ApplicationController
-	layout 'base'	
-	before_filter :require_admin
-  
-	helper :sort
-	include SortHelper	
+  layout 'base'	
+  before_filter :require_admin
+
+  helper :sort
+  include SortHelper	
 
-	def index	
-	end
+  def index	
+  end
 	
   def projects
-		sort_init 'projects.name', 'asc'
-		sort_update		
-    @project_pages, @projects = paginate :projects, :per_page =&gt; 15, :order =&gt; sort_clause
+    sort_init 'name', 'asc'
+    sort_update		
+    @project_count = Project.count		
+    @project_pages = Paginator.new self, @project_count,
+								15,
+								@params['page']								
+    @projects = Project.find :all, :order =&gt; sort_clause,
+						:limit  =&gt;  @project_pages.items_per_page,
+						:offset =&gt;  @project_pages.current.offset		
   end
-  
+
   def mail_options
-    @actions = Permission.find(:all, :conditions =&gt; [&quot;mail_option=?&quot;, true])  || []
+    @actions = Permission.find(:all, :conditions =&gt; [&quot;mail_option=?&quot;, true]) || []
     if request.post?
       @actions.each { |a|
-        a.mail_enabled = params[:action_ids].include? a.id.to_s 
+        a.mail_enabled = (params[:action_ids] || []).include? a.id.to_s 
         a.save
       }
       flash[:notice] = &quot;Mail options were successfully updated.&quot;
@@ -44,6 +50,5 @@ class AdminController &lt; ApplicationController
   
   def info
     @adapter_name = ActiveRecord::Base.connection.adapter_name
-  end
-  
+  end  
 end</diff>
      <filename>redmine/app/controllers/admin_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -24,63 +24,73 @@ class ApplicationController &lt; ActionController::Base
   end 
   
   def set_localization
-    Localization.lang = session[:user].nil? ? RDM_DEFAULT_LANG : (session[:user].language || RDM_DEFAULT_LANG)
+    Localization.lang = begin
+      if session[:user]
+        session[:user].language
+      elsif request.env['HTTP_ACCEPT_LANGUAGE']
+        accept_lang = HTTPUtils.parse_qvalues(request.env['HTTP_ACCEPT_LANGUAGE']).first.split('-').first
+        if Localization.langs.collect{ |l| l[1] }.include? accept_lang
+          accept_lang
+        end
+      end
+    rescue
+      nil
+    end || RDM_DEFAULT_LANG
   end
   
-	def require_login
-		unless session[:user]
-			store_location
-			redirect_to(:controller =&gt; &quot;account&quot;, :action =&gt; &quot;login&quot;)
-		end
-	end
+  def require_login
+    unless session[:user]
+      store_location
+      redirect_to(:controller =&gt; &quot;account&quot;, :action =&gt; &quot;login&quot;)
+    end
+  end
 
-	def require_admin
-		if session[:user].nil?
-			store_location
-			redirect_to(:controller =&gt; &quot;account&quot;, :action =&gt; &quot;login&quot;)
-		else
-			unless session[:user].admin?
-				flash[:notice] = &quot;Acces not allowed&quot;
-				redirect_to(:controller =&gt; &quot;projects&quot;, :action =&gt; &quot;list&quot;)
-			end
-		end
-	end
+  def require_admin
+    if session[:user].nil?
+      store_location
+      redirect_to(:controller =&gt; &quot;account&quot;, :action =&gt; &quot;login&quot;)
+    else
+      unless session[:user].admin?
+        flash[:notice] = &quot;Acces not allowed&quot;
+        redirect_to(:controller =&gt; &quot;projects&quot;, :action =&gt; &quot;list&quot;)
+      end
+    end
+  end
 
-	# authorizes the user for the requested action.
-	def authorize
+  # authorizes the user for the requested action.
+  def authorize
     # check if action is allowed on public projects
-    if @project.public? and Permission.allowed_to_public &quot;%s/%s&quot; % [ @params[:controller], @params[:action] ]
+    if @project.is_public? and Permission.allowed_to_public &quot;%s/%s&quot; % [ @params[:controller], @params[:action] ]
       return true
     end  
-    # if user is not logged in, he is redirect to login form
-		unless session[:user]
-			store_location
-			redirect_to(:controller =&gt; &quot;account&quot;, :action =&gt; &quot;login&quot;)
-			return false
-		end
-    # check if user is authorized    
+    # if user not logged in, redirect to login form
+    unless session[:user]
+      store_location
+      redirect_to(:controller =&gt; &quot;account&quot;, :action =&gt; &quot;login&quot;)
+      return false
+    end
+    # if logged in, check if authorized    
     if session[:user].admin? or Permission.allowed_to_role( &quot;%s/%s&quot; % [ @params[:controller], @params[:action] ], session[:user].role_for_project(@project.id)  )    
       return true		
-		end		
+    end		
     flash[:notice] = &quot;Acces denied&quot;
     redirect_to(:controller =&gt; &quot;&quot;)
-    return false
-	end
+    false
+  end
 	
-	# store current uri in  the session.
-	# we can return to this location by calling redirect_back_or_default
-	def store_location
-		session[:return_to] = @request.request_uri
-	end
-	
-	# move to the last store_location call or to the passed default one
-	def redirect_back_or_default(default)
-		if session[:return_to].nil?
-			redirect_to default
-		else
-			redirect_to_url session[:return_to]
-			session[:return_to] = nil
-		end
-	end
-  
+  # store current uri in session.
+  # return to this location by calling redirect_back_or_default
+  def store_location
+    session[:return_to] = @request.request_uri
+  end
+
+  # move to the last store_location call or to the passed default one
+  def redirect_back_or_default(default)
+    if session[:return_to].nil?
+      redirect_to default
+    else
+      redirect_to_url session[:return_to]
+      session[:return_to] = nil
+    end
+  end
 end
\ No newline at end of file</diff>
      <filename>redmine/app/controllers/application.rb</filename>
    </modified>
    <modified>
      <diff>@@ -16,28 +16,32 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 class HelpController &lt; ApplicationController
-	
+
   skip_before_filter :check_if_login_required
-	before_filter :load_help_config
+  before_filter :load_help_config
 
-	def index	
-		if @params[:ctrl] and @help_config[@params[:ctrl]]
-			if @params[:page] and @help_config[@params[:ctrl]][@params[:page]]
-				template = @help_config[@params[:ctrl]][@params[:page]]
-			else
-				template = @help_config[@params[:ctrl]]['index']
-			end
-		end
-		
+  # displays help page for the requested controller/action
+  def index	
+    # select help page to display
+    if @params[:ctrl] and @help_config['pages'][@params[:ctrl]]
+      if @params[:page] and @help_config['pages'][@params[:ctrl]][@params[:page]]
+        template = @help_config['pages'][@params[:ctrl]][@params[:page]]
+      else
+        template = @help_config['pages'][@params[:ctrl]]['index']
+      end
+    end
+    # choose language according to available help translations
+    lang = (@help_config['langs'].include? Localization.lang) ? Localization.lang : @help_config['langs'].first
+	
     if template
-      redirect_to &quot;/manual/#{template}&quot;
+      redirect_to &quot;/manual/#{lang}/#{template}&quot;
     else
-      redirect_to &quot;/manual/&quot;
+      redirect_to &quot;/manual/#{lang}/&quot;
     end
-	end
+  end
 
 private
-	def load_help_config
-		@help_config = YAML::load(File.open(&quot;#{RAILS_ROOT}/config/help.yml&quot;))
-	end	
+  def load_help_config
+    @help_config = YAML::load(File.open(&quot;#{RAILS_ROOT}/config/help.yml&quot;))
+  end	
 end</diff>
      <filename>redmine/app/controllers/help_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -32,58 +32,62 @@ class ProjectsController &lt; ApplicationController
     render :action =&gt; 'list'
   end
 
-	# Lists public projects
-	def list
-		sort_init 'projects.name', 'asc'
-		sort_update		
-		@project_count = Project.count([&quot;public=?&quot;, true])		
-		@project_pages = Paginator.new self, @project_count,
+  # Lists public projects
+  def list
+    sort_init 'name', 'asc'
+    sort_update		
+    @project_count = Project.count([&quot;is_public=?&quot;, true])		
+    @project_pages = Paginator.new self, @project_count,
 								15,
 								@params['page']								
-		@projects = Project.find :all, :order =&gt; sort_clause,
-						:conditions =&gt; [&quot;public=?&quot;, true],
+    @projects = Project.find :all, :order =&gt; sort_clause,
+						:conditions =&gt; [&quot;is_public=?&quot;, true],
 						:limit  =&gt;  @project_pages.items_per_page,
 						:offset =&gt;  @project_pages.current.offset		
   end
           
   # Add a new project
-	def add
-		@custom_fields = CustomField::find_all
-		@project = Project.new(params[:project])
-		if request.post?
-			@project.custom_fields = CustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids]
-			if @project.save
-				flash[:notice] = 'Project was successfully created.'
-				redirect_to :controller =&gt; 'admin', :action =&gt; 'projects'
-			end		
-		end	
-	end
+  def add
+    @custom_fields = CustomField::find_all
+    @root_projects = Project::find(:all, :conditions =&gt; &quot;parent_id is null&quot;)
+    @project = Project.new(params[:project])
+    if request.post?
+      @project.custom_fields = CustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids]
+      if @project.save
+        flash[:notice] = 'Project was successfully created.'
+        redirect_to :controller =&gt; 'admin', :action =&gt; 'projects'
+	  end		
+    end	
+  end
 	
-	# Show @project
-	def show
-    @members = @project.members.find(:all, :include =&gt; [:user, :role])
-	end
+	# Show @project
+  def show
+    @members = @project.members.find(:all, :include =&gt; [:user, :role])
+    @subprojects = @project.children if @project.children_count &gt; 0
+    @news = @project.news.find(:all, :limit =&gt; 5, :include =&gt; [ :author, :project ], :order =&gt; &quot;news.created_on DESC&quot;)
+  end
 
   def settings
-		@custom_fields = CustomField::find_all
-		@issue_category ||= IssueCategory.new
+    @root_projects = Project::find(:all, :conditions =&gt; [&quot;parent_id is null and id &lt;&gt; ?&quot;, @project.id])
+    @custom_fields = CustomField::find_all
+    @issue_category ||= IssueCategory.new
     @member ||= @project.members.new
     @roles = Role.find_all
     @users = User.find_all - @project.members.find(:all, :include =&gt; :user).collect{|m| m.user }
   end
   
-	# Edit @project
-	def edit
-		if request.post?
-			@project.custom_fields = CustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids]
-			if @project.update_attributes(params[:project])
-				flash[:notice] = 'Project was successfully updated.'
-				redirect_to :action =&gt; 'settings', :id =&gt; @project
+  # Edit @project
+  def edit
+    if request.post?
+      @project.custom_fields = CustomField.find(@params[:custom_field_ids]) if @params[:custom_field_ids]
+      if @project.update_attributes(params[:project])
+        flash[:notice] = 'Project was successfully updated.'
+        redirect_to :action =&gt; 'settings', :id =&gt; @project
       else
         settings
         render :action =&gt; 'settings'
-			end
-		end
+      end
+    end
   end
   
 	# Delete @project
@@ -181,7 +185,7 @@ class ProjectsController &lt; ApplicationController
 		end	
 	end
 	
-  # Show issues list of @project
+  # Show filtered/sorted issues list of @project
   def list_issues
     sort_init 'issues.id', 'desc'
     sort_update
@@ -189,10 +193,10 @@ class ProjectsController &lt; ApplicationController
     search_filter_init_list_issues
     search_filter_update if params[:set_filter] or request.post?
 
-    @issue_count = Issue.count(:include =&gt; :status, :conditions =&gt; search_filter_clause)		
+    @issue_count = Issue.count(:include =&gt; [:status, :project], :conditions =&gt; search_filter_clause)		
     @issue_pages = Paginator.new self, @issue_count, 15, @params['page']								
     @issues =  Issue.find :all, :order =&gt; sort_clause,
-						:include =&gt; [ :author, :status, :tracker ],
+						:include =&gt; [ :author, :status, :tracker, :project ],
 						:conditions =&gt; search_filter_clause,
 						:limit  =&gt;  @issue_pages.items_per_page,
 						:offset =&gt;  @issue_pages.current.offset								
@@ -206,7 +210,7 @@ class ProjectsController &lt; ApplicationController
     search_filter_init_list_issues
 					
     @issues =  Issue.find :all, :order =&gt; sort_clause,
-						:include =&gt; [ :author, :status, :tracker ],
+						:include =&gt; [ :author, :status, :tracker, :project ],
 						:conditions =&gt; search_filter_clause							
 
     export = StringIO.new</diff>
      <filename>redmine/app/controllers/projects_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -62,9 +62,6 @@ class RolesController &lt; ApplicationController
   end
   
   def workflow
-    @roles = Role.find_all
-    @trackers = Tracker.find_all
-    @statuses = IssueStatus.find_all
     
     @role = Role.find_by_id(params[:role_id])
     @tracker = Tracker.find_by_id(params[:tracker_id])    
@@ -80,5 +77,8 @@ class RolesController &lt; ApplicationController
         flash[:notice] = 'Workflow was successfully updated.'
       end
     end
+    @roles = Role.find_all
+    @trackers = Tracker.find_all
+    @statuses = IssueStatus.find(:all, :include =&gt; :workflows)
   end
 end</diff>
      <filename>redmine/app/controllers/roles_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -16,58 +16,62 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 class UsersController &lt; ApplicationController
-	layout 'base'	
-	before_filter :require_admin
-  
-	helper :sort
-	include SortHelper
-	
-	def index
-		list
-		render :action =&gt; 'list'
-	end
+  layout 'base'	
+  before_filter :require_admin
+
+  helper :sort
+  include SortHelper
+
+  def index
+    list
+    render :action =&gt; 'list'
+  end
 
-	def list
-		sort_init 'users.login', 'asc'
-		sort_update
-		@user_count = User.count		
-		@user_pages = Paginator.new self, @user_count,
+  def list
+    sort_init 'login', 'asc'
+    sort_update
+    @user_count = User.count		
+    @user_pages = Paginator.new self, @user_count,
 								15,
 								@params['page']								
-		@users =  User.find :all, :order =&gt; sort_clause,
+    @users =  User.find :all,:order =&gt; sort_clause,
 						:limit  =&gt;  @user_pages.items_per_page,
 						:offset =&gt;  @user_pages.current.offset		
-	end
+  end
 
-	def add
-		if request.get?
-			@user = User.new
-		else
-			@user = User.new(params[:user])
-			@user.admin = params[:user][:admin]
-			if @user.save
-				flash[:notice] = 'User was successfully created.'
-				redirect_to :action =&gt; 'list'
-			end
-		end
-	end
+  def add
+    if request.get?
+      @user = User.new
+    else
+      @user = User.new(params[:user])
+      @user.admin = params[:user][:admin] || false
+      @user.login = params[:user][:login]
+      @user.password, @user.password_confirmation = params[:password], params[:password_confirmation]
+      if @user.save
+        flash[:notice] = 'User was successfully created.'
+        redirect_to :action =&gt; 'list'
+      end
+    end
+  end
 
-	def edit
-		@user = User.find(params[:id])
-		if request.post?
-			@user.admin = params[:user][:admin] if params[:user][:admin]
-			if @user.update_attributes(params[:user])
-				flash[:notice] = 'User was successfully updated.'
-				redirect_to :action =&gt; 'list'
-			end
-		end
-	end
+  def edit
+    @user = User.find(params[:id])
+    if request.post?
+      @user.admin = params[:user][:admin] if params[:user][:admin]
+      @user.login = params[:user][:login] if params[:user][:login]
+      @user.password, @user.password_confirmation = params[:password], params[:password_confirmation] unless params[:password].nil? or params[:password].empty?
+      if @user.update_attributes(params[:user])
+        flash[:notice] = 'User was successfully updated.'
+        redirect_to :action =&gt; 'list'
+      end
+    end
+  end
 
-	def destroy
-		User.find(params[:id]).destroy
-		redirect_to :action =&gt; 'list'
+  def destroy
+    User.find(params[:id]).destroy
+    redirect_to :action =&gt; 'list'
   rescue
     flash[:notice] = &quot;Unable to delete user&quot;
     redirect_to :action =&gt; 'list'
-	end  
+  end  
 end</diff>
      <filename>redmine/app/controllers/users_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -38,6 +38,9 @@ class VersionsController &lt; ApplicationController
     @attachment = @version.attachments.find(params[:attachment_id])
     @attachment.increment_download
     send_file @attachment.diskfile, :filename =&gt; @attachment.filename
+  rescue
+    flash[:notice]=&quot;Requested file doesn't exist or has been deleted.&quot;
+    redirect_to :controller =&gt; 'projects', :action =&gt; 'list_files', :id =&gt; @project
   end 
   
   def destroy_file</diff>
      <filename>redmine/app/controllers/versions_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -27,7 +27,7 @@ module ApplicationHelper
 	
 	def authorize_for(controller, action)  
     # check if action is allowed on public projects
-    if @project.public? and Permission.allowed_to_public &quot;%s/%s&quot; % [ controller, action ]
+    if @project.is_public? and Permission.allowed_to_public &quot;%s/%s&quot; % [ controller, action ]
       return true
     end  
     # check if user is authorized    </diff>
      <filename>redmine/app/helpers/application_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -18,68 +18,73 @@
 module SearchFilterHelper
 
   def search_filter_criteria(name, options = {})
-    session[:search_filter] ||= {}
-    session[:search_filter][name] ||= {}
-    unless session[:search_filter][name][:options] and session[:search_filter][name][:conditions]
-      session[:search_filter][name][:options] = []
-      session[:search_filter][name][:conditions] = {}
-      yield.each { |c|
-        session[:search_filter][name][:options] &lt;&lt; [c[0], c[1].to_s]
-        session[:search_filter][name][:conditions].store(c[1].to_s, c[2])
-      }
-    end
+    @search_filter ||= {}
+    @search_filter[name] ||= {}
+    @search_filter[name][:options] = []
+    @search_filter[name][:conditions] = {}
+    yield.each { |c|
+      @search_filter[name][:options] &lt;&lt; [c[0], c[1].to_s]
+      @search_filter[name][:conditions].store(c[1].to_s, c[2])
+    }
   end
 
   def search_filter_update
-    session[:search_filter].each_key {|field| session[:search_filter][field][:value] = params[field]  }
+    @search_filter.each_key {|field| session[:search_filter][field] = params[field]  }
   end
 	
   def search_filter_clause
-    clause = [&quot;issues.project_id=?&quot;, @project.id]
-    session[:search_filter].each { |k, v|
-      v[:value] ||= v[:options][0][1]
-      if (!v[:conditions][v[:value]][0].empty?)
-        clause[0] = clause[0] + &quot; AND &quot; + v[:conditions][v[:value]][0]
-        clause &lt;&lt; v[:conditions][v[:value]][1] if !v[:conditions][v[:value]][1].nil?
+    clause = [&quot;1=1&quot;]
+    @search_filter.each { |k, v|
+      filter_value = session[:search_filter][k] || v[:options][0][1]
+      if v[:conditions][filter_value]
+        clause[0] = clause[0] + &quot; AND &quot; + v[:conditions][filter_value].first
+        clause += v[:conditions][filter_value][1..-1]
       end    
     }
     clause
   end
 	
-  def search_filter_tag(criteria)
+  def search_filter_tag(criteria, options = {})
+    options[:name] = criteria
     content_tag(&quot;select&quot;, 
-				options_for_select(session[:search_filter][criteria][:options], session[:search_filter][criteria][:value]),
-				:name =&gt; criteria
+				options_for_select(@search_filter[criteria][:options], session[:search_filter][criteria]),
+				options
 				)
   end
 	
   def search_filter_init_list_issues
 	search_filter_criteria('status_id') { 
-    [ [&quot;[Open]&quot;, &quot;O&quot;, [&quot;issue_statuses.is_closed=?&quot;, false]],
-      [&quot;[All]&quot;, &quot;A&quot;, [&quot;&quot;, false]]
+    [ [_('[Open]'), &quot;O&quot;, [&quot;issue_statuses.is_closed=?&quot;, false]],
+      [_('[All]'), &quot;A&quot;, nil]
     ] + IssueStatus.find(:all).collect {|s| [s.name, s.id, [&quot;issues.status_id=?&quot;, s.id]] }                                                      
     }
     
     search_filter_criteria('tracker_id') { 
-    [ [&quot;[All]&quot;, &quot;A&quot;, [&quot;&quot;, false]]
+    [ [_('[All]'), &quot;A&quot;, nil]
     ] + Tracker.find(:all).collect {|s| [s.name, s.id, [&quot;issues.tracker_id=?&quot;, s.id]] }                                                      
     }
 	
     search_filter_criteria('priority_id') { 
-    [ [&quot;[All]&quot;, &quot;A&quot;, [&quot;&quot;, false]]
+    [ [_('[All]'), &quot;A&quot;, nil]
     ] + Enumeration.find(:all, :conditions =&gt; ['opt=?','IPRI']).collect {|s| [s.name, s.id, [&quot;issues.priority_id=?&quot;, s.id]] }                                                      
     }
     
     search_filter_criteria('category_id') { 
-    [ [&quot;[All]&quot;, &quot;A&quot;, [&quot;&quot;, false]],
-      [&quot;[None]&quot;, &quot;N&quot;, [&quot;issues.category_id is null&quot;]]
+    [ [_('[All]'), &quot;A&quot;, nil],
+      [_('[None]'), &quot;N&quot;, [&quot;issues.category_id is null&quot;]]
     ] + @project.issue_categories.find(:all).collect {|s| [s.name, s.id, [&quot;issues.category_id=?&quot;, s.id]] }                                                      
     }    
 
     search_filter_criteria('assigned_to_id') { 
-    [ [&quot;[All]&quot;, &quot;A&quot;, [&quot;&quot;, false]],
-      [&quot;[Nobody]&quot;, &quot;N&quot;, [&quot;issues.assigned_to_id is null&quot;]]
-    ] + User.find(:all).collect {|s| [s.display_name, s.id, [&quot;issues.assigned_to_id=?&quot;, s.id]] }                                                      
-    }   	
+    [ [_('[All]'), &quot;A&quot;, nil],
+      [_('[None]'), &quot;N&quot;, [&quot;issues.assigned_to_id is null&quot;]]
+    ] + @project.users.collect {|s| [s.display_name, s.id, [&quot;issues.assigned_to_id=?&quot;, s.id]] }                                                      
+    }
+
+    search_filter_criteria('subproject_id') { 
+    [ [_('[None]'), &quot;N&quot;, [&quot;issues.project_id=?&quot;, @project.id]],
+      [_('[All]'), &quot;A&quot;, [&quot;(issues.project_id=? or projects.parent_id=?)&quot;, @project.id, @project.id]]
+    ]                                                     
+    }  
   end
 end
\ No newline at end of file</diff>
      <filename>redmine/app/helpers/search_filter_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -30,7 +30,7 @@ class Attachment &lt; ActiveRecord::Base
 				self.filename = sanitize_filename(@temp_file.original_filename)
 				self.disk_filename = DateTime.now.strftime(&quot;%y%m%d%H%M%S&quot;) + &quot;_&quot; + self.filename
 				self.content_type = @temp_file.content_type
-				self.size = @temp_file.size
+				self.filesize = @temp_file.size
 			end
 		end
 	end</diff>
      <filename>redmine/app/models/attachment.rb</filename>
    </modified>
    <modified>
      <diff>@@ -19,6 +19,7 @@ class Enumeration &lt; ActiveRecord::Base
   before_destroy :check_integrity
   
 	validates_presence_of :opt, :name
+	validates_uniqueness_of :name, :scope =&gt; [:opt]
 	
 	OPTIONS = [
 		[&quot;Issue priorities&quot;, &quot;IPRI&quot;],</diff>
      <filename>redmine/app/models/enumeration.rb</filename>
    </modified>
    <modified>
      <diff>@@ -17,9 +17,10 @@
 
 class IssueCategory &lt; ActiveRecord::Base
   before_destroy :check_integrity  
-	belongs_to :project
-  
+  belongs_to :project
+
   validates_presence_of :name
+  validates_uniqueness_of :name, :scope =&gt; [:project_id]
   
 private
   def check_integrity</diff>
      <filename>redmine/app/models/issue_category.rb</filename>
    </modified>
    <modified>
      <diff>@@ -17,24 +17,26 @@
 
 class IssueStatus &lt; ActiveRecord::Base
   before_destroy :check_integrity  
-	has_many :workflows, :foreign_key =&gt; &quot;old_status_id&quot;
-	
-	validates_presence_of :name
-	validates_uniqueness_of :name
+  has_many :workflows, :foreign_key =&gt; &quot;old_status_id&quot;
 
-	# Returns the default status for new issues
-	def self.default
-		find(:first, :conditions =&gt;[&quot;is_default=?&quot;, true])
-	end
-	
-	# Returns an array of all statuses the given role can switch to
-	def new_statuses_allowed_to(role, tracker)
-		statuses = []
-		for workflow in self.workflows.find(:all, :include =&gt; :new_status)
-			statuses &lt;&lt; workflow.new_status if workflow.role_id == role.id and workflow.tracker_id == tracker.id
-		end unless role.nil?
-		statuses
-	end
+  validates_presence_of :name
+  validates_uniqueness_of :name
+  validates_length_of :html_color, :is=&gt;6
+  validates_format_of :html_color, :with =&gt; /^[a-f0-9]*$/i
+
+  # Returns the default status for new issues
+  def self.default
+    find(:first, :conditions =&gt;[&quot;is_default=?&quot;, true])
+  end
+
+  # Returns an array of all statuses the given role can switch to
+  def new_statuses_allowed_to(role, tracker)
+    statuses = []
+    for workflow in self.workflows
+      statuses &lt;&lt; workflow.new_status if workflow.role_id == role.id and workflow.tracker_id == tracker.id
+    end unless role.nil? or tracker.nil?
+    statuses
+  end
   
   def name
     _ self.attributes['name']</diff>
      <filename>redmine/app/models/issue_status.rb</filename>
    </modified>
    <modified>
      <diff>@@ -43,7 +43,7 @@ class Permission &lt; ActiveRecord::Base
   end
   
   def self.allowed_to_public(action)
-    @@cached_perms_for_public ||= find(:all, :conditions =&gt; [&quot;public=?&quot;, true]).collect {|p| &quot;#{p.controller}/#{p.action}&quot;}
+    @@cached_perms_for_public ||= find(:all, :conditions =&gt; [&quot;is_public=?&quot;, true]).collect {|p| &quot;#{p.controller}/#{p.action}&quot;}
     @@cached_perms_for_public.include? action
   end
   </diff>
      <filename>redmine/app/models/permission.rb</filename>
    </modified>
    <modified>
      <diff>@@ -16,29 +16,33 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 class Project &lt; ActiveRecord::Base
-	has_many :versions, :dependent =&gt; true, :order =&gt; &quot;versions.date DESC&quot;
+	has_many :versions, :dependent =&gt; true, :order =&gt; &quot;versions.effective_date DESC&quot;
 	has_many :members, :dependent =&gt; true
+	has_many :users, :through =&gt; :members
 	has_many :issues, :dependent =&gt; true, :order =&gt; &quot;issues.created_on DESC&quot;, :include =&gt; :status
 	has_many :documents, :dependent =&gt; true
-	has_many :news, :dependent =&gt; true, :order =&gt; &quot;news.created_on DESC&quot;, :include =&gt; :author
+	has_many :news, :dependent =&gt; true, :include =&gt; :author
 	has_many :issue_categories, :dependent =&gt; true
 	has_and_belongs_to_many :custom_fields
+	acts_as_tree :order =&gt; &quot;name&quot;, :counter_cache =&gt; true
 	
 	validates_presence_of :name, :descr
+	validates_uniqueness_of :name
 	
 	# returns 5 last created projects
 	def self.latest
 		find(:all, :limit =&gt; 5, :order =&gt; &quot;created_on DESC&quot;)	
 	end	
 	
-	# Returns current version of the project
-	def current_version
-		versions.find(:first, :conditions =&gt; [ &quot;date &lt;= ?&quot;, Date.today ], :order =&gt; &quot;date DESC, id DESC&quot;)
-	end
-	
 	# Returns an array of all custom fields enabled for project issues
 	# (explictly associated custom fields and custom fields enabled for all projects)
 	def custom_fields_for_issues
 		(CustomField.for_all + custom_fields).uniq
-	end
+	end
+	
+protected
+  def validate
+    errors.add(parent_id, &quot; must be a root project&quot;) if parent and parent.parent
+    errors.add_to_base(&quot;A project with subprojects can't be a subproject&quot;) if parent and projects_count &gt; 0
+  end
 end</diff>
      <filename>redmine/app/models/project.rb</filename>
    </modified>
    <modified>
      <diff>@@ -20,6 +20,9 @@ class Tracker &lt; ActiveRecord::Base
   has_many :issues
   has_many :workflows, :dependent =&gt; true
   
+  validates_presence_of :name
+  validates_uniqueness_of :name
+  
   def name
     _ self.attributes['name']
   end</diff>
      <filename>redmine/app/models/tracker.rb</filename>
    </modified>
    <modified>
      <diff>@@ -18,58 +18,46 @@
 require &quot;digest/sha1&quot;
 
 class User &lt; ActiveRecord::Base
-	has_many :memberships, :class_name =&gt; 'Member', :include =&gt; [ :project, :role ], :dependent =&gt; true
+  has_many :memberships, :class_name =&gt; 'Member', :include =&gt; [ :project, :role ], :dependent =&gt; true
 	
-	attr_accessor :password
-	attr_accessor :last_before_login_on
-	# Prevents unauthorized assignments
-	attr_protected :admin
+  attr_accessor :password, :password_confirmation
+  attr_accessor :last_before_login_on
+  # Prevents unauthorized assignments
+  attr_protected :login, :admin, :password, :password_confirmation, :hashed_password
 	
-	validates_presence_of :login, :firstname, :lastname, :mail
-	validates_uniqueness_of :login, :mail
-	
-	# Login must contain lettres, numbers, underscores only
-	validates_format_of :login, :with =&gt; /^[a-z0-9_]+$/i
-	validates_format_of :mail, :with =&gt; /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
+  validates_presence_of :login, :firstname, :lastname, :mail
+  validates_uniqueness_of :login, :mail	
+  # Login must contain lettres, numbers, underscores only
+  validates_format_of :login, :with =&gt; /^[a-z0-9_]+$/i
+  validates_format_of :mail, :with =&gt; /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
+  # Password length between 4 and 12
+  validates_length_of :password, :in =&gt; 4..12, :allow_nil =&gt; true
+  validates_confirmation_of :password, :allow_nil =&gt; true
+
+  def before_save
+    # update hashed_password if password was set
+    self.hashed_password = User.hash_password(self.password) if self.password
+  end
 	
-	def before_create
-		self.hashed_password = User.hash_password(self.password)
-	end
+  # Returns the user that matches provided login and password, or nil
+  def self.try_to_login(login, password)
+    user = find(:first, :conditions =&gt; [&quot;login=? and hashed_password=? and locked=?&quot;, login, User.hash_password(password), false])
+    if user
+      user.last_before_login_on = user.last_login_on
+      user.update_attribute(:last_login_on, Time.now)
+    end
+    user
+  end
 	
-	def after_create
-		@password = nil
-	end
+  # Return user's full name for display
+  def display_name
+    firstname + &quot; &quot; + lastname
+  end
 
-	# Returns the user that matches user's login and password
-	def try_to_login
-		@user = User.login(self.login, self.password)
-		unless @user.nil? 
-			@user.last_before_login_on = @user.last_login_on
-			@user.update_attribute(:last_login_on, DateTime.now)
-		end
-		@user
-	end
-	
-	# Return user's full name for display
-	def display_name
-		firstname + &quot; &quot; + lastname #+ (self.admin ? &quot; (Admin)&quot; : &quot;&quot; )
-	end
+  def check_password?(clear_password)
+    User.hash_password(clear_password) == self.hashed_password
+  end
 
-	# Returns the user that matches the given login and password
-	def self.login(login, password)
-		hashed_password = hash_password(password || &quot;&quot;)
-		find(:first,
-			:conditions =&gt; [&quot;login = ? and hashed_password = ? and locked = ?&quot;, login, hashed_password, false])
-	end
-	
-	def check_password?(clear_password)
-		User.hash_password(clear_password) == self.hashed_password
-	end
-	
-	def change_password(current_password, new_password)
-		self.hashed_password = User.hash_password(new_password)
-		save
-	end
   
   def role_for_project(project_id)
     @role_for_projects ||=
@@ -82,8 +70,8 @@ class User &lt; ActiveRecord::Base
   end
 	
 private
-	# Return password digest
-	def self.hash_password(clear_password)
-		Digest::SHA1.hexdigest(clear_password)
-	end
+  # Return password digest
+  def self.hash_password(clear_password)
+    Digest::SHA1.hexdigest(clear_password || &quot;&quot;)
+  end
 end</diff>
      <filename>redmine/app/models/user.rb</filename>
    </modified>
    <modified>
      <diff>@@ -16,12 +16,13 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 class Version &lt; ActiveRecord::Base
-  before_destroy :check_integrity  
-	belongs_to :project
-	has_many :fixed_issues, :class_name =&gt; 'Issue', :foreign_key =&gt; 'fixed_version_id'
+  before_destroy :check_integrity
+  belongs_to :project
+  has_many :fixed_issues, :class_name =&gt; 'Issue', :foreign_key =&gt; 'fixed_version_id'
   has_many :attachments, :as =&gt; :container, :dependent =&gt; true
-	
-	validates_presence_of :name, :descr
+
+  validates_presence_of :name
+  validates_uniqueness_of :name, :scope =&gt; [:project_id]
   
 private
   def check_integrity</diff>
      <filename>redmine/app/models/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -16,10 +16,9 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 class Workflow &lt; ActiveRecord::Base
+  belongs_to :role
+  belongs_to :old_status, :class_name =&gt; 'IssueStatus', :foreign_key =&gt; 'old_status_id'
+  belongs_to :new_status, :class_name =&gt; 'IssueStatus', :foreign_key =&gt; 'new_status_id'
 
-	belongs_to :role
-	belongs_to :old_status, :class_name =&gt; 'IssueStatus', :foreign_key =&gt; 'old_status_id'
-	belongs_to :new_status, :class_name =&gt; 'IssueStatus', :foreign_key =&gt; 'new_status_id'
-
-	validates_presence_of :role, :old_status, :new_status
+  validates_presence_of :role, :old_status, :new_status
 end</diff>
      <filename>redmine/app/models/workflow.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,12 +1,12 @@
 &lt;div class=&quot;box&quot;&gt;
-&lt;h2&gt;&lt;%=_ 'Please login' %&gt;&lt;/h2&gt;
+&lt;h2&gt;&lt;%=_('Please login') %&gt;&lt;/h2&gt;
 
 &lt;%= start_form_tag :action=&gt; &quot;login&quot; %&gt;
-&lt;p&gt;&lt;label for=&quot;user_login&quot;&gt;&lt;%=_ 'Login' %&gt;:&lt;/label&gt;&lt;br/&gt;
-&lt;input type=&quot;text&quot; name=&quot;user[login]&quot; id=&quot;user_login&quot; size=&quot;30&quot; /&gt;&lt;/p&gt;
+&lt;p&gt;&lt;label for=&quot;login&quot;&gt;&lt;%=_ 'Login' %&gt;:&lt;/label&gt;&lt;br/&gt;
+&lt;%= text_field_tag 'login', nil, :size =&gt; 25 %&gt;&lt;/p&gt;
 
 &lt;p&gt;&lt;label for=&quot;user_password&quot;&gt;&lt;%=_ 'Password' %&gt;:&lt;/label&gt;&lt;br/&gt;
-&lt;input type=&quot;password&quot; name=&quot;user[password]&quot; id=&quot;user_password&quot; size=&quot;30&quot;/&gt;&lt;/p&gt;
+&lt;%= password_field_tag 'password', nil, :size =&gt; 25 %&gt;&lt;/p&gt;
 
 &lt;p&gt;&lt;input type=&quot;submit&quot; name=&quot;login&quot; value=&quot;&lt;%=_ 'Log in' %&gt; &amp;#187;&quot; class=&quot;primary&quot; /&gt;&lt;/p&gt;
 &lt;%= end_form_tag %&gt;</diff>
      <filename>redmine/app/views/account/login.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -3,13 +3,14 @@
 &lt;p&gt;&lt;%=_('Login')%&gt;: &lt;strong&gt;&lt;%= @user.login %&gt;&lt;/strong&gt;&lt;br /&gt;
 &lt;%=_('Created on')%&gt;: &lt;%= format_time(@user.created_on) %&gt;,
 &lt;%=_('Last update')%&gt;: &lt;%= format_time(@user.updated_on) %&gt;&lt;/p&gt;
+
+&lt;%= error_messages_for 'user' %&gt;
 
 &lt;div class=&quot;splitcontentleft&quot;&gt;
   &lt;div class=&quot;box&quot;&gt;
   &lt;h3&gt;&lt;%=_('Information')%&gt;&lt;/h3&gt;
   &amp;nbsp;
   &lt;%= start_form_tag :action =&gt; 'my_account' %&gt;
-  &lt;%= error_messages_for 'user' %&gt;
 
   &lt;!--[form:user]--&gt;
   &lt;p&gt;&lt;label for=&quot;user_firstname&quot;&gt;&lt;%=_('Firstname')%&gt; &lt;span class=&quot;required&quot;&gt;*&lt;/span&gt;&lt;/label&gt;&lt;br/&gt;
@@ -39,14 +40,14 @@
   &amp;nbsp;
   &lt;%= start_form_tag :action =&gt; 'change_password' %&gt;
 
-  &lt;p&gt;&lt;label for=&quot;old_password&quot;&gt;&lt;%=_('Password')%&gt; &lt;span class=&quot;required&quot;&gt;*&lt;/span&gt;&lt;/label&gt;&lt;br/&gt;
-  &lt;%= password_field_tag 'old_password' %&gt;&lt;/p&gt;
+  &lt;p&gt;&lt;label for=&quot;password&quot;&gt;&lt;%=_('Password')%&gt; &lt;span class=&quot;required&quot;&gt;*&lt;/span&gt;&lt;/label&gt;&lt;br/&gt;
+  &lt;%= password_field_tag 'password', nil, :size =&gt; 25 %&gt;&lt;/p&gt;
 
   &lt;p&gt;&lt;label for=&quot;new_password&quot;&gt;&lt;%=_('New password')%&gt; &lt;span class=&quot;required&quot;&gt;*&lt;/span&gt;&lt;/label&gt;&lt;br/&gt;
-  &lt;%= password_field_tag 'new_password' %&gt;&lt;/p&gt;
+  &lt;%= password_field_tag 'new_password', nil, :size =&gt; 25 %&gt;&lt;/p&gt;
 
   &lt;p&gt;&lt;label for=&quot;new_password_confirmation&quot;&gt;&lt;%=_('Confirmation')%&gt; &lt;span class=&quot;required&quot;&gt;*&lt;/span&gt;&lt;/label&gt;&lt;br/&gt;
-  &lt;%= password_field_tag 'new_password_confirmation' %&gt;&lt;/p&gt;
+  &lt;%= password_field_tag 'new_password_confirmation', nil, :size =&gt; 25 %&gt;&lt;/p&gt;
 
   &lt;center&gt;&lt;%= submit_tag _('Save') %&gt;&lt;/center&gt;
   &lt;%= end_form_tag %&gt;</diff>
      <filename>redmine/app/views/account/my_account.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,10 @@
 &lt;h2&gt;&lt;%=_('Information')%&gt;&lt;/h2&gt;
 
-&lt;%=_('Version')%&gt;: &lt;%= RDM_APP_NAME %&gt; &lt;%= RDM_APP_VERSION %&gt;&lt;br /&gt;
-&lt;%=_('Database')%&gt;: &lt;%= @adapter_name %&gt;
\ No newline at end of file
+&lt;p&gt;&lt;%=_('Version')%&gt;: &lt;strong&gt;&lt;%= RDM_APP_NAME %&gt; &lt;%= RDM_APP_VERSION %&gt;&lt;/strong&gt;&lt;/p&gt;
+
+Environment:
+&lt;ul&gt;
+&lt;% Rails::Info.properties.each do |name, value| %&gt;
+&lt;li&gt;&lt;%= name %&gt;: &lt;%= value %&gt;&lt;/li&gt;
+&lt;% end %&gt;
+&lt;/ul&gt;
\ No newline at end of file</diff>
      <filename>redmine/app/views/admin/info.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -2,20 +2,20 @@
 
 &lt;table width=&quot;100%&quot; cellspacing=&quot;1&quot; cellpadding=&quot;2&quot; class=&quot;listTableContent&quot;&gt;
   &lt;tr class=&quot;ListHead&quot;&gt;
-	&lt;%= sort_header_tag('projects.name', :caption =&gt; _('Project')) %&gt;
+	&lt;%= sort_header_tag('name', :caption =&gt; _('Project')) %&gt;
 	&lt;th&gt;&lt;%=_('Description')%&gt;&lt;/th&gt;
-	&lt;th&gt;&lt;%=_('Public')%&gt;&lt;/th&gt;
-	&lt;%= sort_header_tag('projects.created_on', :caption =&gt; _('Created on')) %&gt;
+	&lt;th&gt;&lt;%=_('Public')%&gt;&lt;/th&gt;
+	&lt;th&gt;&lt;%=_('Subprojects')%&gt;&lt;/th&gt;
+	&lt;%= sort_header_tag('created_on', :caption =&gt; _('Created on')) %&gt;
   &lt;th&gt;&lt;/th&gt;
   &lt;/tr&gt;
   
-&lt;% odd_or_even = 1
-	for project in @projects
-	odd_or_even = 1 - odd_or_even %&gt;
-  &lt;tr class=&quot;ListLine&lt;%= odd_or_even %&gt;&quot;&gt;
+&lt;% for project in @projects %&gt;
+  &lt;tr class=&quot;&lt;%= cycle(&quot;odd&quot;, &quot;even&quot;) %&gt;&quot;&gt;
 	&lt;td&gt;&lt;%= link_to project.name, :controller =&gt; 'projects', :action =&gt; 'settings', :id =&gt; project %&gt;
 	&lt;td&gt;&lt;%= project.descr %&gt;
-	&lt;td align=&quot;center&quot;&gt;&lt;%= image_tag 'true' if project.public? %&gt;
+	&lt;td align=&quot;center&quot;&gt;&lt;%= image_tag 'true' if project.is_public? %&gt;
+	&lt;td align=&quot;center&quot;&gt;&lt;%= project.projects_count %&gt;
 	&lt;td align=&quot;center&quot;&gt;&lt;%= format_date(project.created_on) %&gt;
   &lt;td align=&quot;center&quot;&gt;
     &lt;%= start_form_tag({:controller =&gt; 'projects', :action =&gt; 'destroy', :id =&gt; project}) %&gt;
@@ -26,10 +26,7 @@
 &lt;% end %&gt;
 &lt;/table&gt;
 
-&lt;%= link_to ('&amp;#171; ' + _('Previous')), { :page =&gt; @project_pages.current.previous } if @project_pages.current.previous %&gt;
-&lt;%= pagination_links(@project_pages) %&gt;
-&lt;%= link_to (_('Next') + ' &amp;#187;'), { :page =&gt; @project_pages.current.next } if @project_pages.current.next %&gt;
-
-&lt;br /&gt;
-
-&lt;%= link_to ('&amp;#187; ' + _('New project')), :controller =&gt; 'projects', :action =&gt; 'add' %&gt;
\ No newline at end of file
+&lt;p&gt;&lt;%= pagination_links_full @project_pages %&gt;
+[ &lt;%= @project_pages.current.first_item %&gt; - &lt;%= @project_pages.current.last_item %&gt; / &lt;%= @project_count %&gt; ]&lt;/p&gt;
+
+&lt;p&gt;&lt;%= link_to ('&amp;#187; ' + _('New project')), :controller =&gt; 'projects', :action =&gt; 'add' %&gt;&lt;/p&gt;
\ No newline at end of file</diff>
      <filename>redmine/app/views/admin/projects.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -10,7 +10,7 @@
 	&lt;th&gt;&lt;/th&gt;
 &lt;/tr&gt;  
 &lt;% for custom_field in @custom_fields %&gt;
-  &lt;tr style=&quot;background-color:#CEE1ED&quot;&gt;
+  &lt;tr class=&quot;&lt;%= cycle(&quot;odd&quot;, &quot;even&quot;) %&gt;&quot;&gt;
 	&lt;td&gt;&lt;%= link_to custom_field.name, :action =&gt; 'edit', :id =&gt; custom_field %&gt;&lt;/td&gt;
 	&lt;td align=&quot;center&quot;&gt;&lt;%= CustomField::TYPES[custom_field.typ][0] %&gt;&lt;/td&gt;
 	&lt;td align=&quot;center&quot;&gt;&lt;%= image_tag 'true' if custom_field.is_required? %&gt;&lt;/td&gt;</diff>
      <filename>redmine/app/views/custom_fields/list.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -24,14 +24,16 @@
   &lt;td&gt;&lt;%= link_to attachment.filename, :action =&gt; 'download', :id =&gt; @document, :attachment_id =&gt; attachment %&gt;&lt;/td&gt;
   &lt;td align=&quot;center&quot;&gt;&lt;%= format_date(attachment.created_on) %&gt;&lt;/td&gt;
   &lt;td align=&quot;center&quot;&gt;&lt;%= attachment.author.display_name %&gt;&lt;/td&gt;
-  &lt;td&gt;&lt;%= human_size(attachment.size) %&gt;&lt;br /&gt;&lt;%= attachment.downloads %&gt; &lt;%=_('download')%&gt;(s)&lt;/td&gt;
+  &lt;td&gt;&lt;%= human_size(attachment.filesize) %&gt;&lt;br /&gt;&lt;%= attachment.downloads %&gt; &lt;%=_('download')%&gt;(s)&lt;/td&gt;
+  
   &lt;% if authorize_for('documents', 'destroy_attachment') %&gt;
   &lt;td align=&quot;center&quot;&gt;
     &lt;%= start_form_tag :action =&gt; 'destroy_attachment', :id =&gt; @document, :attachment_id =&gt; attachment %&gt;
     &lt;%= submit_tag _('Delete'), :class =&gt; &quot;button-small&quot; %&gt;
     &lt;%= end_form_tag %&gt;
   &lt;/tr&gt;
-  &lt;% end %&gt;
+  &lt;% end %&gt;
+  
 &lt;% end %&gt;
 &lt;/table&gt;
 &lt;br /&gt;</diff>
      <filename>redmine/app/views/documents/show.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,7 @@
 &lt;%= error_messages_for 'issue_status' %&gt;
 
 &lt;!--[form:issue_status]--&gt;
-&lt;p&gt;&lt;label for=&quot;issue_status_name&quot;&gt;&lt;%=_('Name')%&gt;&lt;/label&gt;&lt;br/&gt;
+&lt;p&gt;&lt;label for=&quot;issue_status_name&quot;&gt;&lt;%=_('Name')%&gt;&lt;/label&gt; &lt;span class=&quot;required&quot;&gt;*&lt;/span&gt;&lt;br/&gt;
 &lt;%= text_field 'issue_status', 'name'  %&gt;&lt;/p&gt;
 
 &lt;p&gt;&lt;%= check_box 'issue_status', 'is_closed' %&gt;
@@ -11,7 +11,7 @@
 &lt;label for=&quot;issue_status_is_default&quot;&gt;&lt;%=_('Default status')%&gt;&lt;/label&gt;&lt;/p&gt;
 
 &lt;p&gt;&lt;label for=&quot;issue_status_html_color&quot;&gt;&lt;%=_('Color')%&gt;&lt;/label&gt;
-#&lt;%= text_field 'issue_status', 'html_color', :size =&gt; 6 %&gt;&lt;/p&gt;
+#&lt;%= text_field 'issue_status', 'html_color', :maxlength =&gt; 6 %&gt; &lt;span class=&quot;required&quot;&gt;*&lt;/span&gt;&lt;/p&gt;
 
 &lt;!--[eoform:issue_status]--&gt;
 </diff>
      <filename>redmine/app/views/issue_statuses/_form.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -10,10 +10,10 @@
   &lt;/tr&gt;
   
 &lt;% for status in @issue_statuses %&gt;
-  &lt;tr style=&quot;background-color:#CEE1ED&quot;&gt;
+  &lt;tr class=&quot;&lt;%= cycle(&quot;odd&quot;, &quot;even&quot;) %&gt;&quot;&gt;
   &lt;td&gt;&lt;%= link_to status.name, :action =&gt; 'edit', :id =&gt; status %&gt;&lt;/td&gt;
-  &lt;td align=&quot;center&quot;&gt;&lt;%= image_tag 'true' if status.is_default %&gt;&lt;/td&gt;
-  &lt;td align=&quot;center&quot;&gt;&lt;%= image_tag 'true' if status.is_closed %&gt;&lt;/td&gt;  
+  &lt;td align=&quot;center&quot;&gt;&lt;%= image_tag 'true' if status.is_default? %&gt;&lt;/td&gt;
+  &lt;td align=&quot;center&quot;&gt;&lt;%= image_tag 'true' if status.is_closed? %&gt;&lt;/td&gt;  
   &lt;td bgcolor=&quot;#&lt;%= status.html_color %&gt;&quot;&gt;&amp;nbsp&lt;/td&gt;  
   &lt;td align=&quot;center&quot;&gt;
     &lt;%= start_form_tag :action =&gt; 'destroy', :id =&gt; status %&gt;</diff>
      <filename>redmine/app/views/issue_statuses/list.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -10,7 +10,7 @@
 &lt;p&gt;&lt;b&gt;&lt;%=_('Assigned to')%&gt;:&lt;/b&gt; &lt;%= @issue.assigned_to.display_name unless @issue.assigned_to.nil? %&gt;&lt;/p&gt;
 
 &lt;p&gt;&lt;b&gt;&lt;%=_('Subject')%&gt;:&lt;/b&gt; &lt;%= @issue.subject %&gt;&lt;/p&gt;
-&lt;p&gt;&lt;b&gt;&lt;%=_('Description')%&gt;:&lt;/b&gt; &lt;%= @issue.descr %&gt;&lt;/p&gt;
+&lt;p&gt;&lt;b&gt;&lt;%=_('Description')%&gt;:&lt;/b&gt; &lt;%= simple_format auto_link @issue.descr %&gt;&lt;/p&gt;
 &lt;p&gt;&lt;b&gt;&lt;%=_('Created on')%&gt;:&lt;/b&gt; &lt;%= format_date(@issue.created_on) %&gt;&lt;/p&gt;
 
 &lt;% if authorize_for('issues', 'edit') %&gt;
@@ -65,7 +65,7 @@
 &lt;table width=&quot;100%&quot;&gt;
 &lt;% for attachment in @issue.attachments %&gt;
 &lt;tr&gt;
-&lt;td&gt;&lt;%= link_to attachment.filename, :action =&gt; 'download', :id =&gt; @issue, :attachment_id =&gt; attachment %&gt; (&lt;%= human_size(attachment.size) %&gt;)&lt;/td&gt;
+&lt;td&gt;&lt;%= link_to attachment.filename, :action =&gt; 'download', :id =&gt; @issue, :attachment_id =&gt; attachment %&gt; (&lt;%= human_size(attachment.filesize) %&gt;)&lt;/td&gt;
 &lt;td&gt;&lt;%= format_date(attachment.created_on) %&gt;&lt;/td&gt;
 &lt;td&gt;&lt;%= attachment.author.display_name %&gt;&lt;/td&gt;
 &lt;% if authorize_for('issues', 'destroy_attachment') %&gt;</diff>
      <filename>redmine/app/views/issues/show.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -81,7 +81,7 @@
 	&lt;/div&gt;
 	
 	&lt;div id=&quot;footer&quot;&gt;
-		&lt;p&gt;&lt;a href=&quot;http://redmine.sourceforge.net/&quot; target=&quot;_new&quot;&gt;&lt;%= RDM_APP_NAME %&gt;&lt;/a&gt; &lt;%= RDM_APP_VERSION %&gt;&lt;/p&gt;
+		&lt;p&gt;&lt;a href=&quot;http://redmine.org/&quot; target=&quot;_new&quot;&gt;&lt;%= RDM_APP_NAME %&gt;&lt;/a&gt; &lt;%= RDM_APP_VERSION %&gt;&lt;/p&gt;
 	&lt;/div&gt;
 
 &lt;/div&gt;</diff>
      <filename>redmine/app/views/layouts/base.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -6,5 +6,5 @@
 &lt;b&gt;&lt;%=_('Date')%&gt;&lt;/b&gt;: &lt;%= format_time(@news.created_on) %&gt;
 &lt;/p&gt;
 
-&lt;%= @news.descr %&gt;
+&lt;%= simple_format auto_link @news.descr %&gt;
 </diff>
      <filename>redmine/app/views/news/show.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -4,15 +4,23 @@
 &lt;p&gt;&lt;label for=&quot;project_name&quot;&gt;&lt;%=_('Name')%&gt; &lt;span class=&quot;required&quot;&gt;*&lt;/span&gt;&lt;/label&gt;&lt;br/&gt;
 &lt;%= text_field 'project', 'name'  %&gt;&lt;/p&gt;
 
+&lt;% if session[:user].admin %&gt;
+&lt;p&gt;&lt;label for=&quot;project_parent_id&quot;&gt;&lt;%=_('Subproject of')%&gt;&lt;/label&gt;&lt;br/&gt;
+&lt;select name=&quot;project[parent_id]&quot;&gt;
+&lt;option value=&quot;&quot;&gt;&lt;/option&gt;
+&lt;%= options_from_collection_for_select @root_projects, &quot;id&quot;, &quot;name&quot;, @project.parent_id %&gt;
+&lt;/select&gt;&lt;/p&gt;
+&lt;% end %&gt;
+
 &lt;p&gt;&lt;label for=&quot;project_descr&quot;&gt;&lt;%=_('Description')%&gt; &lt;span class=&quot;required&quot;&gt;*&lt;/span&gt;&lt;/label&gt;&lt;br/&gt;
-&lt;%= text_field 'project', 'descr', :size =&gt; 60 %&gt;&lt;/p&gt;
+&lt;%= text_area 'project', 'descr', :cols =&gt; 60, :rows =&gt; 3 %&gt;&lt;/p&gt;
 
 &lt;p&gt;&lt;label for=&quot;project_homepage&quot;&gt;&lt;%=_('Homepage')%&gt;&lt;/label&gt;&lt;br/&gt;
 &lt;%= text_field 'project', 'homepage', :size =&gt; 40 %&gt;&lt;/p&gt;
 
-&lt;p&gt;&lt;%= check_box 'project', 'public' %&gt;
-&lt;label for=&quot;project_public&quot;&gt;&lt;%=_('Public')%&gt;&lt;/label&gt;&lt;/p&gt;
-
+&lt;p&gt;&lt;%= check_box 'project', 'is_public' %&gt;
+&lt;label for=&quot;project_is_public&quot;&gt;&lt;%=_('Public')%&gt;&lt;/label&gt;&lt;/p&gt;
+
 &lt;fieldset&gt;&lt;legend&gt;&lt;%=_('Custom fields')%&gt;&lt;/legend&gt;
 &lt;% for custom_field in @custom_fields %&gt;
 	&lt;input type=&quot;checkbox&quot;</diff>
      <filename>redmine/app/views/projects/_form.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -2,7 +2,7 @@
 
 &lt;% fixed_issues = @fixed_issues.group_by {|i| i.fixed_version } %&gt;
 &lt;% fixed_issues.each do |version, issues| %&gt;
-  &lt;p&gt;&lt;strong&gt;&lt;%= version.name %&gt;&lt;/strong&gt; - &lt;%= format_date(version.date) %&gt;&lt;br /&gt;
+  &lt;p&gt;&lt;strong&gt;&lt;%= version.name %&gt;&lt;/strong&gt; - &lt;%= format_date(version.effective_date) %&gt;&lt;br /&gt;
   &lt;%=h version.descr %&gt;&lt;/p&gt;
   &lt;ul&gt;  
     &lt;% issues.each do |i| %&gt;</diff>
      <filename>redmine/app/views/projects/changelog.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -2,15 +2,13 @@
 
 &lt;table width=&quot;100%&quot; cellspacing=&quot;1&quot; cellpadding=&quot;2&quot; class=&quot;listTableContent&quot;&gt;
   &lt;tr class=&quot;ListHead&quot;&gt;
-	&lt;%= sort_header_tag('projects.name', :caption =&gt; _('Project')) %&gt;
+	&lt;%= sort_header_tag('name', :caption =&gt; _('Project')) %&gt;
 	&lt;th&gt;Description&lt;/th&gt;
-	&lt;%= sort_header_tag('projects.created_on', :caption =&gt; _('Created on')) %&gt;
+	&lt;%= sort_header_tag('created_on', :caption =&gt; _('Created on')) %&gt;
   &lt;/tr&gt;
   
-&lt;% odd_or_even = 1
-	for project in @projects
-	odd_or_even = 1 - odd_or_even %&gt;
-  &lt;tr class=&quot;ListLine&lt;%= odd_or_even %&gt;&quot;&gt;
+&lt;% for project in @projects %&gt;
+  &lt;tr class=&quot;&lt;%= cycle(&quot;odd&quot;, &quot;even&quot;) %&gt;&quot;&gt;
 	&lt;td&gt;&lt;%= link_to project.name, :action =&gt; 'show', :id =&gt; project %&gt;
 	&lt;td&gt;&lt;%= project.descr %&gt;
 	&lt;td align=&quot;center&quot;&gt;&lt;%= format_date(project.created_on) %&gt;</diff>
      <filename>redmine/app/views/projects/list.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -17,14 +17,12 @@
   &lt;tr&gt;
     &lt;td colspan=&quot;7&quot;&gt;&lt;%= image_tag 'package' %&gt; &lt;b&gt;&lt;%= version.name %&gt;&lt;/b&gt;&lt;/td&gt;
   &lt;/tr&gt;
-  &lt;%  odd_or_even = 1
-        for file in version.attachments
-        odd_or_even = 1 - odd_or_even %&gt;		
-  &lt;tr class=&quot;ListLine&lt;%= odd_or_even %&gt;&quot;&gt;
+  &lt;% for file in version.attachments %&gt;		
+  &lt;tr class=&quot;&lt;%= cycle(&quot;odd&quot;, &quot;even&quot;) %&gt;&quot;&gt;
     &lt;td&gt;&lt;/td&gt;
     &lt;td&gt;&lt;%= link_to file.filename, :controller =&gt; 'versions', :action =&gt; 'download', :id =&gt; version, :attachment_id =&gt; file %&gt;&lt;/td&gt;
     &lt;td align=&quot;center&quot;&gt;&lt;%= format_date(file.created_on) %&gt;&lt;/td&gt;
-    &lt;td align=&quot;center&quot;&gt;&lt;%= human_size(file.size) %&gt;&lt;/td&gt;
+    &lt;td align=&quot;center&quot;&gt;&lt;%= human_size(file.filesize) %&gt;&lt;/td&gt;
     &lt;td align=&quot;center&quot;&gt;&lt;%= file.downloads %&gt;&lt;/td&gt;
     &lt;td align=&quot;center&quot;&gt;&lt;small&gt;&lt;%= file.digest %&gt;&lt;/small&gt;&lt;/td&gt;
     &lt;% if delete_allowed %&gt;
@@ -35,7 +33,8 @@
     &lt;/td&gt;
     &lt;% end %&gt;
   &lt;/tr&gt;		
-  &lt;% end %&gt;
+  &lt;% end
+  reset_cycle %&gt;
 &lt;% end %&gt;
 &lt;/table&gt;
 </diff>
      <filename>redmine/app/views/projects/list_files.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -3,17 +3,19 @@
 &lt;form method=&quot;post&quot; class=&quot;noborder&quot;&gt;
 	&lt;table cellpadding=2&gt;
   &lt;tr&gt;
-    &lt;td&gt;&lt;%=_('Status')%&gt;:&lt;br /&gt;&lt;%= search_filter_tag(&quot;status_id&quot;) %&gt;&lt;/td&gt;
-    &lt;td&gt;&lt;%=_('Tracker')%&gt;:&lt;br /&gt;&lt;%= search_filter_tag(&quot;tracker_id&quot;) %&gt;&lt;/td&gt;
-    &lt;td&gt;&lt;%=_('Priority')%&gt;:&lt;br /&gt;&lt;%= search_filter_tag(&quot;priority_id&quot;) %&gt;&lt;/td&gt;
-    &lt;td&gt;&lt;%=_('Category')%&gt;:&lt;br /&gt;&lt;%= search_filter_tag(&quot;category_id&quot;) %&gt;&lt;/td&gt;
-    &lt;td&gt;&lt;%=_('Assigned to')%&gt;:&lt;br /&gt;&lt;%= search_filter_tag(&quot;assigned_to_id&quot;) %&gt;&lt;/td&gt;
+    &lt;td&gt;&lt;small&gt;&lt;%=_('Status')%&gt;:&lt;/small&gt;&lt;br /&gt;&lt;%= search_filter_tag 'status_id', :class =&gt; 'select-small' %&gt;&lt;/td&gt;
+    &lt;td&gt;&lt;small&gt;&lt;%=_('Tracker')%&gt;:&lt;/small&gt;&lt;br /&gt;&lt;%= search_filter_tag 'tracker_id', :class =&gt; 'select-small' %&gt;&lt;/td&gt;
+    &lt;td&gt;&lt;small&gt;&lt;%=_('Priority')%&gt;:&lt;/small&gt;&lt;br /&gt;&lt;%= search_filter_tag 'priority_id', :class =&gt; 'select-small' %&gt;&lt;/td&gt;
+    &lt;td&gt;&lt;small&gt;&lt;%=_('Category')%&gt;:&lt;/small&gt;&lt;br /&gt;&lt;%= search_filter_tag 'category_id', :class =&gt; 'select-small' %&gt;&lt;/td&gt;
+    &lt;td&gt;&lt;small&gt;&lt;%=_('Assigned to')%&gt;:&lt;/small&gt;&lt;br /&gt;&lt;%= search_filter_tag 'assigned_to_id', :class =&gt; 'select-small' %&gt;&lt;/td&gt;
+    &lt;td&gt;&lt;small&gt;&lt;%=_('Subprojects')%&gt;:&lt;/small&gt;&lt;br /&gt;&lt;%= search_filter_tag 'subproject_id', :class =&gt; 'select-small' %&gt;&lt;/td&gt;
+
     &lt;td valign=&quot;bottom&quot;&gt;
-      &lt;%= submit_tag _('Apply filter') %&gt;
+      &lt;%= submit_tag _('Apply filter'), :class =&gt; 'button-small' %&gt;
       &lt;%= end_form_tag %&gt;
       
       &lt;%= start_form_tag %&gt;
-      &lt;%= submit_tag _('Reset') %&gt;
+      &lt;%= submit_tag _('Reset'), :class =&gt; 'button-small' %&gt;
       &lt;%= end_form_tag %&gt;
     &lt;/td&gt;
   &lt;/tr&gt;</diff>
      <filename>redmine/app/views/projects/list_issues.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -13,8 +13,8 @@
     &lt;% for tracker in Tracker.find_all %&gt;    
       &lt;li&gt;&lt;%= link_to tracker.name, :controller =&gt; 'projects', :action =&gt; 'list_issues', :id =&gt; @project, 
                                                 :set_filter =&gt; 1, 
-                                                &quot;issues.tracker_id&quot; =&gt; tracker.id %&gt;:
-      &lt;%= tracker.issues.count([&quot;project_id=?&quot;, @project.id]) %&gt; &lt;%=_('open')%&gt;
+                                                &quot;tracker_id&quot; =&gt; tracker.id %&gt;:
+      &lt;%= Issue.count(:conditions =&gt; [&quot;project_id=? and tracker_id=? and issue_statuses.is_closed=?&quot;, @project.id, tracker.id, false], :include =&gt; :status) %&gt; &lt;%=_('open')%&gt;
       &lt;/li&gt;
     &lt;% end %&gt;
     &lt;/ul&gt;
@@ -32,9 +32,18 @@
 		&lt;% end %&gt;		
 	&lt;/div&gt;
   
+  &lt;% if @subprojects %&gt;
+ 	&lt;div class=&quot;box&quot;&gt;
+		&lt;h3&gt;&lt;%= image_tag &quot;projects&quot; %&gt; &lt;%=_('Subprojects')%&gt;&lt;/h3&gt;	
+		&lt;% for subproject in @subprojects %&gt;
+		&lt;%= link_to subproject.name, :action =&gt; 'show', :id =&gt; subproject %&gt;&lt;br /&gt;		
+		&lt;% end %&gt;		
+	&lt;/div&gt;
+  &lt;% end %&gt;
+  
   &lt;div class=&quot;box&quot;&gt;
     &lt;h3&gt;&lt;%=_('Latest news')%&gt;&lt;/h3&gt;  
-    &lt;% for news in @project.news %&gt;
+    &lt;% for news in @news %&gt;
       &lt;p&gt;
       &lt;b&gt;&lt;%= news.title %&gt;&lt;/b&gt; &lt;small&gt;(&lt;%= link_to_user news.author %&gt; &lt;%= format_time(news.created_on) %&gt;)&lt;/small&gt;&lt;br /&gt;
       &lt;%= news.shortdescr %&gt;</diff>
      <filename>redmine/app/views/projects/show.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -7,7 +7,7 @@
   &lt;/tr&gt;
   
 &lt;% for role in @roles %&gt;
-  &lt;tr style=&quot;background-color:#CEE1ED&quot;&gt;
+  &lt;tr class=&quot;&lt;%= cycle(&quot;odd&quot;, &quot;even&quot;) %&gt;&quot;&gt;
   &lt;td&gt;&lt;%= link_to role.name, :action =&gt; 'edit', :id =&gt; role %&gt;&lt;/td&gt;
   &lt;td align=&quot;center&quot;&gt;
     &lt;%= start_form_tag :action =&gt; 'destroy', :id =&gt; role %&gt;</diff>
      <filename>redmine/app/views/roles/list.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -7,7 +7,7 @@
   &lt;/tr&gt;
   
 &lt;% for tracker in @trackers %&gt;
-  &lt;tr style=&quot;background-color:#CEE1ED&quot;&gt;
+  &lt;tr class=&quot;&lt;%= cycle(&quot;odd&quot;, &quot;even&quot;) %&gt;&quot;&gt;
   &lt;td&gt;&lt;%= link_to tracker.name, :action =&gt; 'edit', :id =&gt; tracker %&gt;&lt;/td&gt;
   &lt;td align=&quot;center&quot;&gt;
     &lt;%= start_form_tag :action =&gt; 'destroy', :id =&gt; tracker %&gt;</diff>
      <filename>redmine/app/views/trackers/list.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -2,10 +2,13 @@
 
 &lt;!--[form:user]--&gt;
 &lt;p&gt;&lt;label for=&quot;user_login&quot;&gt;&lt;%=_('Login')%&gt;&lt;/label&gt;&lt;br/&gt;
-&lt;%= text_field 'user', 'login'  %&gt;&lt;/p&gt;
+&lt;%= text_field 'user', 'login', :size =&gt; 25  %&gt;&lt;/p&gt;
 
-&lt;p&gt;&lt;label for=&quot;user_password&quot;&gt;&lt;%=_('Password')%&gt;&lt;/label&gt;&lt;br/&gt;
-&lt;%= password_field 'user', 'password'  %&gt;&lt;/p&gt;
+&lt;p&gt;&lt;label for=&quot;password&quot;&gt;&lt;%=_('Password')%&gt;&lt;/label&gt;&lt;br/&gt;
+&lt;%= password_field_tag 'password', nil, :size =&gt; 25  %&gt;&lt;/p&gt;
+
+&lt;p&gt;&lt;label for=&quot;password_confirmation&quot;&gt;&lt;%=_('Confirmation')%&gt;&lt;/label&gt;&lt;br/&gt;
+&lt;%= password_field_tag 'password_confirmation', nil, :size =&gt; 25  %&gt;&lt;/p&gt;
 
 &lt;p&gt;&lt;label for=&quot;user_firstname&quot;&gt;&lt;%=_('Firstname')%&gt;&lt;/label&gt;&lt;br/&gt;
 &lt;%= text_field 'user', 'firstname'  %&gt;&lt;/p&gt;</diff>
      <filename>redmine/app/views/users/_form.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -2,18 +2,18 @@
 
 &lt;table border=&quot;0&quot; cellspacing=&quot;1&quot; cellpadding=&quot;2&quot; class=&quot;listTableContent&quot;&gt;		
 &lt;tr class=&quot;ListHead&quot;&gt;
-	&lt;%= sort_header_tag('users.login', :caption =&gt; _('Login')) %&gt;
-	&lt;%= sort_header_tag('users.firstname', :caption =&gt; _('Firstname')) %&gt;
-	&lt;%= sort_header_tag('users.lastname', :caption =&gt; _('Lastname')) %&gt;
+	&lt;%= sort_header_tag('login', :caption =&gt; _('Login')) %&gt;
+	&lt;%= sort_header_tag('firstname', :caption =&gt; _('Firstname')) %&gt;
+	&lt;%= sort_header_tag('lastname', :caption =&gt; _('Lastname')) %&gt;
 	&lt;th&gt;&lt;%=_('Mail')%&gt;&lt;/th&gt;
-	&lt;%= sort_header_tag('users.admin', :caption =&gt; _('Admin')) %&gt;
-	&lt;%= sort_header_tag('users.locked', :caption =&gt; _('Locked')) %&gt;
-	&lt;%= sort_header_tag('users.created_on', :caption =&gt; _('Created on')) %&gt;
-	&lt;%= sort_header_tag('users.last_login_on', :caption =&gt; _('Last login')) %&gt;
+	&lt;%= sort_header_tag('admin', :caption =&gt; _('Admin')) %&gt;
+	&lt;%= sort_header_tag('locked', :caption =&gt; _('Locked')) %&gt;
+	&lt;%= sort_header_tag('created_on', :caption =&gt; _('Created on')) %&gt;
+	&lt;%= sort_header_tag('last_login_on', :caption =&gt; _('Last login')) %&gt;
   &lt;th&gt;&lt;/th&gt;
 &lt;/tr&gt;  
 &lt;% for user in @users %&gt;
-  &lt;tr style=&quot;background-color:#CEE1ED&quot;&gt;
+  &lt;tr class=&quot;&lt;%= cycle(&quot;odd&quot;, &quot;even&quot;) %&gt;&quot;&gt;
 	&lt;td&gt;&lt;%= link_to user.login, :action =&gt; 'edit', :id =&gt; user %&gt;&lt;/td&gt;
 	&lt;td&gt;&lt;%= user.firstname %&gt;&lt;/td&gt;
 	&lt;td&gt;&lt;%= user.lastname %&gt;&lt;/td&gt;
@@ -25,10 +25,10 @@
   &lt;td align=&quot;center&quot;&gt;
     &lt;%= start_form_tag :action =&gt; 'edit', :id =&gt; user %&gt;
     &lt;% if user.locked? %&gt;
-      &lt;%= hidden_field_tag 'user[locked]', false %&gt;
+      &lt;%= hidden_field_tag 'user[locked]', 0 %&gt;
       &lt;%= submit_tag _('Unlock'), :class =&gt; &quot;button-small&quot;  %&gt;
     &lt;% else %&gt;
-      &lt;%= hidden_field_tag 'user[locked]', true %&gt;
+      &lt;%= hidden_field_tag 'user[locked]', 1 %&gt;
       &lt;%= submit_tag _('Lock'), :class =&gt; &quot;button-small&quot;  %&gt;
     &lt;% end %&gt;
     &lt;%= end_form_tag %&gt;  </diff>
      <filename>redmine/app/views/users/list.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -1,13 +1,13 @@
 &lt;%= error_messages_for 'version' %&gt;
 
 &lt;!--[form:version]--&gt;
-&lt;p&gt;&lt;label for=&quot;version_name&quot;&gt;&lt;%=_('Version')%&gt;&lt;/label&gt;&lt;br/&gt;
+&lt;p&gt;&lt;label for=&quot;version_name&quot;&gt;&lt;%=_('Version')%&gt;&lt;/label&gt; &lt;span class=&quot;required&quot;&gt;*&lt;/span&gt;&lt;br/&gt;
 &lt;%= text_field 'version', 'name', :size =&gt; 20  %&gt;&lt;/p&gt;
 
 &lt;p&gt;&lt;label for=&quot;version_descr&quot;&gt;&lt;%=_('Description')%&gt;&lt;/label&gt;&lt;br/&gt;
 &lt;%= text_field 'version', 'descr', :size =&gt; 60  %&gt;&lt;/p&gt;
 
-&lt;p&gt;&lt;label for=&quot;version_date&quot;&gt;&lt;%=_('Date')%&gt;&lt;/label&gt;&lt;br/&gt;
-&lt;%= date_select 'version', 'date'  %&gt;&lt;/p&gt;
+&lt;p&gt;&lt;label for=&quot;version_effective_date&quot;&gt;&lt;%=_('Date')%&gt;&lt;/label&gt;&lt;br/&gt;
+&lt;%= date_select 'version', 'effective_date'  %&gt;&lt;/p&gt;
 &lt;!--[eoform:version]--&gt;
 </diff>
      <filename>redmine/app/views/versions/_form.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -2,7 +2,7 @@
 	&lt;h2&gt;&lt;%=_('Welcome')%&gt; !&lt;/h2&gt;
 
   &lt;div class=&quot;box&quot;&gt;
-	&lt;h3&gt;Latest news&lt;/h3&gt;
+	&lt;h3&gt;&lt;%=_('Latest news')%&gt;&lt;/h3&gt;
 		&lt;% for news in @news %&gt;
 			&lt;p&gt;
 			&lt;b&gt;&lt;%= news.title %&gt;&lt;/b&gt; (&lt;%= link_to_user news.author %&gt; &lt;%= format_time(news.created_on) %&gt; - &lt;%= news.project.name %&gt;)&lt;br /&gt;
@@ -16,7 +16,7 @@
 
 &lt;div class=&quot;splitcontentright&quot;&gt;
 	&lt;div class=&quot;box&quot;&gt;
-	&lt;h3&gt;Latest projects&lt;/h3&gt;
+	&lt;h3&gt;&lt;%=_('Latest projects')%&gt;&lt;/h3&gt;
 		&lt;ul&gt;
 		&lt;% for project in @projects %&gt;
 			&lt;li&gt;</diff>
      <filename>redmine/app/views/welcome/index.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -5,6 +5,14 @@
 #   (on OS X: gem install mysql -- --include=/usr/local/lib)
 # And be sure to use new-style password hashing:
 #   http://dev.mysql.com/doc/refman/5.0/en/old-client.html
+
+production:
+  adapter: mysql
+  database: redmine
+  host: localhost
+  username: root
+  password:
+ 
 development:
   adapter: mysql
   database: redmine_development
@@ -18,6 +26,17 @@ development_pgsql:
   host: localhost
   username: postgres
   password: &quot;postgres&quot;
+
+development_oracle:
+  adapter: oci
+  host: 192.168.0.14
+  username: rails
+  password: &quot;rails&quot;
+
+development_sqlserver:
+  adapter: sqlserver
+  host: localhost,1157
+  database: redmine
 
 test:
   adapter: mysql
@@ -25,15 +44,26 @@ test:
   host: localhost
   username: root
   password:
-
+
+test_pgsql:
+  adapter: postgresql
+  database: redmine
+  host: localhost
+  username: postgres
+  password: &quot;postgres&quot;
+
+test_oracle:
+  adapter: oci
+  host: 192.168.0.14
+  username: rails_test
+  password: &quot;rails&quot;
+  
+test_sqlserver:
+  adapter: sqlserver
+  host: localhost,1157
+  database: redmine_test
+  
 demo:
   adapter: sqlite3
   dbfile: db/redmine_demo.db
   
-production:
-  adapter: mysql
-  database: redmine
-  host: localhost
-  username: root
-  password:
- 
\ No newline at end of file</diff>
      <filename>redmine/config/database.yml</filename>
    </modified>
    <modified>
      <diff>@@ -73,7 +73,7 @@ end
 # application name
 RDM_APP_NAME = &quot;redMine&quot; 
 # application version
-RDM_APP_VERSION = &quot;0.1.0&quot; 
+RDM_APP_VERSION = &quot;0.2.0&quot; 
 # application host name
 RDM_HOST_NAME = &quot;somenet.foo&quot;
 # file storage path</diff>
      <filename>redmine/config/environment.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,21 +1,62 @@
-# administration
-admin:
-  index:    administration.html
-  mail_options: administration.html#mail_notifications
-  info:       administration.html#app_info
-users:
-  index:    administration.html#users
-roles:
-  index:    administration.html#roles
-  workflow: administration.html#workflow
-trackers:
-  index:    administration.html#trackers
-issue_statuses:
-  index:    administration.html#issue_statuses  
+# redMine - project management software
+# Copyright (C) 2006  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-# projects
-projects:
-  add:        projects.html#settings
+# available languages for help pages
+langs:
+  - fr
 
-
-# issues
\ No newline at end of file
+# mapping between controller/action and help pages
+# if action is not defined here, 'index' page will be displayed
+pages:
+  # administration
+  admin:
+    index:          ch01.html
+    mail_options:   ch01s08.html
+    info:           ch01s09.html
+  users:
+    index:          ch01s01.html
+  roles:
+    index:          ch01s02.html
+    workflow:       ch01s06.html
+  trackers:
+    index:          ch01s03.html
+  issue_statuses:
+    index:          ch01s05.html
+  # projects
+  projects:
+    index:          ch02.html
+    add:            ch02s08.html
+    show:           ch02s01.html
+    add_document:   ch02s06.html
+    list_documents: ch02s06.html
+    add_issue:      ch02s02.html
+    list_issues:    ch02s02.html
+    add_news:       ch02s05.html
+    list_news:      ch02s05.html
+    add_file:       ch02s07.html
+    list_files:     ch02s07.html
+    changelog:      ch02s04.html
+  issues:
+    index:          ch02s02.html
+  documents:
+    index:          ch02s06.html
+  news:
+    index:          ch02s05.html
+  versions:
+    index:          ch02s08.html
+  reports:
+    index:          ch02s03.html
\ No newline at end of file</diff>
      <filename>redmine/config/help.yml</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,20 @@
+# redMine - project management software
+# Copyright (C) 2006  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
 class Setup &lt; ActiveRecord::Migration
   def self.up
     create_table &quot;attachments&quot;, :force =&gt; true do |t|
@@ -5,8 +22,8 @@ class Setup &lt; ActiveRecord::Migration
       t.column &quot;container_type&quot;, :string, :limit =&gt; 30, :default =&gt; &quot;&quot;, :null =&gt; false
       t.column &quot;filename&quot;, :string, :default =&gt; &quot;&quot;, :null =&gt; false
       t.column &quot;disk_filename&quot;, :string, :default =&gt; &quot;&quot;, :null =&gt; false
-      t.column &quot;size&quot;, :integer, :default =&gt; 0, :null =&gt; false
-      t.column &quot;content_type&quot;, :string, :limit =&gt; 60, :default =&gt; &quot;&quot;, :null =&gt; false
+      t.column &quot;filesize&quot;, :integer, :default =&gt; 0, :null =&gt; false
+      t.column &quot;content_type&quot;, :string, :limit =&gt; 60, :default =&gt; &quot;&quot;
       t.column &quot;digest&quot;, :string, :limit =&gt; 40, :default =&gt; &quot;&quot;, :null =&gt; false
       t.column &quot;downloads&quot;, :integer, :default =&gt; 0, :null =&gt; false
       t.column &quot;author_id&quot;, :integer, :default =&gt; 0, :null =&gt; false
@@ -18,8 +35,8 @@ class Setup &lt; ActiveRecord::Migration
       t.column &quot;typ&quot;, :integer, :default =&gt; 0, :null =&gt; false
       t.column &quot;is_required&quot;, :boolean, :default =&gt; false, :null =&gt; false
       t.column &quot;is_for_all&quot;, :boolean, :default =&gt; false, :null =&gt; false
-      t.column &quot;possible_values&quot;, :text, :default =&gt; &quot;&quot;, :null =&gt; false
-      t.column &quot;regexp&quot;, :string, :default =&gt; &quot;&quot;, :null =&gt; false
+      t.column &quot;possible_values&quot;, :text, :default =&gt; &quot;&quot;
+      t.column &quot;regexp&quot;, :string, :default =&gt; &quot;&quot;
       t.column &quot;min_length&quot;, :integer, :default =&gt; 0, :null =&gt; false
       t.column &quot;max_length&quot;, :integer, :default =&gt; 0, :null =&gt; false
     end
@@ -59,7 +76,7 @@ class Setup &lt; ActiveRecord::Migration
       t.column &quot;issue_id&quot;, :integer, :default =&gt; 0, :null =&gt; false
       t.column &quot;status_id&quot;, :integer, :default =&gt; 0, :null =&gt; false
       t.column &quot;author_id&quot;, :integer, :default =&gt; 0, :null =&gt; false
-      t.column &quot;notes&quot;, :text, :default =&gt; &quot;&quot;, :null =&gt; false
+      t.column &quot;notes&quot;, :text, :default =&gt; &quot;&quot;
       t.column &quot;created_on&quot;, :timestamp
     end
   
@@ -99,7 +116,7 @@ class Setup &lt; ActiveRecord::Migration
     create_table &quot;news&quot;, :force =&gt; true do |t|
       t.column &quot;project_id&quot;, :integer
       t.column &quot;title&quot;, :string, :limit =&gt; 60, :default =&gt; &quot;&quot;, :null =&gt; false
-      t.column &quot;shortdescr&quot;, :string, :default =&gt; &quot;&quot;, :null =&gt; false
+      t.column &quot;shortdescr&quot;, :string, :default =&gt; &quot;&quot;
       t.column &quot;descr&quot;, :text, :default =&gt; &quot;&quot;, :null =&gt; false
       t.column &quot;author_id&quot;, :integer, :default =&gt; 0, :null =&gt; false
       t.column &quot;created_on&quot;, :timestamp
@@ -109,7 +126,7 @@ class Setup &lt; ActiveRecord::Migration
       t.column &quot;controller&quot;, :string, :limit =&gt; 30, :default =&gt; &quot;&quot;, :null =&gt; false
       t.column &quot;action&quot;, :string, :limit =&gt; 30, :default =&gt; &quot;&quot;, :null =&gt; false
       t.column &quot;descr&quot;, :string, :limit =&gt; 60, :default =&gt; &quot;&quot;, :null =&gt; false
-      t.column &quot;public&quot;, :boolean, :default =&gt; false, :null =&gt; false
+      t.column &quot;is_public&quot;, :boolean, :default =&gt; false, :null =&gt; false
       t.column &quot;sort&quot;, :integer, :default =&gt; 0, :null =&gt; false
       t.column &quot;mail_option&quot;, :boolean, :default =&gt; false, :null =&gt; false
       t.column &quot;mail_enabled&quot;, :boolean, :default =&gt; false, :null =&gt; false
@@ -125,8 +142,10 @@ class Setup &lt; ActiveRecord::Migration
     create_table &quot;projects&quot;, :force =&gt; true do |t|
       t.column &quot;name&quot;, :string, :limit =&gt; 30, :default =&gt; &quot;&quot;, :null =&gt; false
       t.column &quot;descr&quot;, :string, :default =&gt; &quot;&quot;, :null =&gt; false
-      t.column &quot;homepage&quot;, :string, :limit =&gt; 60, :default =&gt; &quot;&quot;, :null =&gt; false
-      t.column &quot;public&quot;, :boolean, :default =&gt; true, :null =&gt; false
+      t.column &quot;homepage&quot;, :string, :limit =&gt; 60, :default =&gt; &quot;&quot;
+      t.column &quot;is_public&quot;, :boolean, :default =&gt; true, :null =&gt; false
+      t.column &quot;parent_id&quot;, :integer
+      t.column &quot;projects_count&quot;, :integer, :default =&gt; 0
       t.column &quot;created_on&quot;, :timestamp
       t.column &quot;updated_on&quot;, :timestamp
     end
@@ -158,8 +177,8 @@ class Setup &lt; ActiveRecord::Migration
     create_table &quot;versions&quot;, :force =&gt; true do |t|
       t.column &quot;project_id&quot;, :integer, :default =&gt; 0, :null =&gt; false
       t.column &quot;name&quot;, :string, :limit =&gt; 30, :default =&gt; &quot;&quot;, :null =&gt; false
-      t.column &quot;descr&quot;, :string, :default =&gt; &quot;&quot;, :null =&gt; false
-      t.column &quot;date&quot;, :date, :null =&gt; false
+      t.column &quot;descr&quot;, :string, :default =&gt; &quot;&quot;
+      t.column &quot;effective_date&quot;, :date, :null =&gt; false
       t.column &quot;created_on&quot;, :timestamp
       t.column &quot;updated_on&quot;, :timestamp
     end
@@ -172,13 +191,13 @@ class Setup &lt; ActiveRecord::Migration
     end
   
     # project
-    Permission.create :controller =&gt; &quot;projects&quot;, :action =&gt; &quot;show&quot;, :descr =&gt; &quot;Overview&quot;, :sort =&gt; 100, :public =&gt; true
-    Permission.create :controller =&gt; &quot;projects&quot;, :action =&gt; &quot;changelog&quot;, :descr =&gt; &quot;View change log&quot;, :sort =&gt; 105, :public =&gt; true
-    Permission.create :controller =&gt; &quot;reports&quot;, :action =&gt; &quot;issue_report&quot;, :descr =&gt; &quot;View reports&quot;, :sort =&gt; 110, :public =&gt; true
+    Permission.create :controller =&gt; &quot;projects&quot;, :action =&gt; &quot;show&quot;, :descr =&gt; &quot;Overview&quot;, :sort =&gt; 100, :is_public =&gt; true
+    Permission.create :controller =&gt; &quot;projects&quot;, :action =&gt; &quot;changelog&quot;, :descr =&gt; &quot;View change log&quot;, :sort =&gt; 105, :is_public =&gt; true
+    Permission.create :controller =&gt; &quot;reports&quot;, :action =&gt; &quot;issue_report&quot;, :descr =&gt; &quot;View reports&quot;, :sort =&gt; 110, :is_public =&gt; true
     Permission.create :controller =&gt; &quot;projects&quot;, :action =&gt; &quot;settings&quot;, :descr =&gt; &quot;Settings&quot;, :sort =&gt; 150
     Permission.create :controller =&gt; &quot;projects&quot;, :action =&gt; &quot;edit&quot;, :descr =&gt; &quot;Edit&quot;, :sort =&gt; 151
     # members
-    Permission.create :controller =&gt; &quot;projects&quot;, :action =&gt; &quot;list_members&quot;, :descr =&gt; &quot;View list&quot;, :sort =&gt; 200, :public =&gt; true
+    Permission.create :controller =&gt; &quot;projects&quot;, :action =&gt; &quot;list_members&quot;, :descr =&gt; &quot;View list&quot;, :sort =&gt; 200, :is_public =&gt; true
     Permission.create :controller =&gt; &quot;projects&quot;, :action =&gt; &quot;add_member&quot;, :descr =&gt; &quot;New member&quot;, :sort =&gt; 220
     Permission.create :controller =&gt; &quot;members&quot;, :action =&gt; &quot;edit&quot;, :descr =&gt; &quot;Edit&quot;, :sort =&gt; 221
     Permission.create :controller =&gt; &quot;members&quot;, :action =&gt; &quot;destroy&quot;, :descr =&gt; &quot;Delete&quot;, :sort =&gt; 222
@@ -191,9 +210,9 @@ class Setup &lt; ActiveRecord::Migration
     Permission.create :controller =&gt; &quot;issue_categories&quot;, :action =&gt; &quot;edit&quot;, :descr =&gt; &quot;Edit&quot;, :sort =&gt; 421
     Permission.create :controller =&gt; &quot;issue_categories&quot;, :action =&gt; &quot;destroy&quot;, :descr =&gt; &quot;Delete&quot;, :sort =&gt; 422
     # issues
-    Permission.create :controller =&gt; &quot;projects&quot;, :action =&gt; &quot;list_issues&quot;, :descr =&gt; &quot;View list&quot;, :sort =&gt; 1000, :public =&gt; true
-    Permission.create :controller =&gt; &quot;issues&quot;, :action =&gt; &quot;show&quot;, :descr =&gt; &quot;View&quot;, :sort =&gt; 1005, :public =&gt; true
-    Permission.create :controller =&gt; &quot;issues&quot;, :action =&gt; &quot;download&quot;, :descr =&gt; &quot;Download file&quot;, :sort =&gt; 1010, :public =&gt; true
+    Permission.create :controller =&gt; &quot;projects&quot;, :action =&gt; &quot;list_issues&quot;, :descr =&gt; &quot;View list&quot;, :sort =&gt; 1000, :is_public =&gt; true
+    Permission.create :controller =&gt; &quot;issues&quot;, :action =&gt; &quot;show&quot;, :descr =&gt; &quot;View&quot;, :sort =&gt; 1005, :is_public =&gt; true
+    Permission.create :controller =&gt; &quot;issues&quot;, :action =&gt; &quot;download&quot;, :descr =&gt; &quot;Download file&quot;, :sort =&gt; 1010, :is_public =&gt; true
     Permission.create :controller =&gt; &quot;projects&quot;, :action =&gt; &quot;add_issue&quot;, :descr =&gt; &quot;Report an issue&quot;, :sort =&gt; 1050, :mail_option =&gt; 1, :mail_enabled =&gt; 1
     Permission.create :controller =&gt; &quot;issues&quot;, :action =&gt; &quot;edit&quot;, :descr =&gt; &quot;Edit&quot;, :sort =&gt; 1055
     Permission.create :controller =&gt; &quot;issues&quot;, :action =&gt; &quot;change_status&quot;, :descr =&gt; &quot;Change status&quot;, :sort =&gt; 1060, :mail_option =&gt; 1, :mail_enabled =&gt; 1
@@ -201,28 +220,30 @@ class Setup &lt; ActiveRecord::Migration
     Permission.create :controller =&gt; &quot;issues&quot;, :action =&gt; &quot;add_attachment&quot;, :descr =&gt; &quot;Add file&quot;, :sort =&gt; 1070
     Permission.create :controller =&gt; &quot;issues&quot;, :action =&gt; &quot;destroy_attachment&quot;, :descr =&gt; &quot;Delete file&quot;, :sort =&gt; 1075
     # news
-    Permission.create :controller =&gt; &quot;projects&quot;, :action =&gt; &quot;list_news&quot;, :descr =&gt; &quot;View list&quot;, :sort =&gt; 1100, :public =&gt; true
-    Permission.create :controller =&gt; &quot;news&quot;, :action =&gt; &quot;show&quot;, :descr =&gt; &quot;View&quot;, :sort =&gt; 1101, :public =&gt; true
+    Permission.create :controller =&gt; &quot;projects&quot;, :action =&gt; &quot;list_news&quot;, :descr =&gt; &quot;View list&quot;, :sort =&gt; 1100, :is_public =&gt; true
+    Permission.create :controller =&gt; &quot;news&quot;, :action =&gt; &quot;show&quot;, :descr =&gt; &quot;View&quot;, :sort =&gt; 1101, :is_public =&gt; true
     Permission.create :controller =&gt; &quot;projects&quot;, :action =&gt; &quot;add_news&quot;, :descr =&gt; &quot;Add&quot;, :sort =&gt; 1120
     Permission.create :controller =&gt; &quot;news&quot;, :action =&gt; &quot;edit&quot;, :descr =&gt; &quot;Edit&quot;, :sort =&gt; 1121
     Permission.create :controller =&gt; &quot;news&quot;, :action =&gt; &quot;destroy&quot;, :descr =&gt; &quot;Delete&quot;, :sort =&gt; 1122
     # documents
-    Permission.create :controller =&gt; &quot;projects&quot;, :action =&gt; &quot;list_documents&quot;, :descr =&gt; &quot;View list&quot;, :sort =&gt; 1200, :public =&gt; true
-    Permission.create :controller =&gt; &quot;documents&quot;, :action =&gt; &quot;show&quot;, :descr =&gt; &quot;View&quot;, :sort =&gt; 1201, :public =&gt; true
-    Permission.create :controller =&gt; &quot;documents&quot;, :action =&gt; &quot;download&quot;, :descr =&gt; &quot;Download&quot;, :sort =&gt; 1202, :public =&gt; true
+    Permission.create :controller =&gt; &quot;projects&quot;, :action =&gt; &quot;list_documents&quot;, :descr =&gt; &quot;View list&quot;, :sort =&gt; 1200, :is_public =&gt; true
+    Permission.create :controller =&gt; &quot;documents&quot;, :action =&gt; &quot;show&quot;, :descr =&gt; &quot;View&quot;, :sort =&gt; 1201, :is_public =&gt; true
+    Permission.create :controller =&gt; &quot;documents&quot;, :action =&gt; &quot;download&quot;, :descr =&gt; &quot;Download&quot;, :sort =&gt; 1202, :is_public =&gt; true
     Permission.create :controller =&gt; &quot;projects&quot;, :action =&gt; &quot;add_document&quot;, :descr =&gt; &quot;Add&quot;, :sort =&gt; 1220
     Permission.create :controller =&gt; &quot;documents&quot;, :action =&gt; &quot;edit&quot;, :descr =&gt; &quot;Edit&quot;, :sort =&gt; 1221
     Permission.create :controller =&gt; &quot;documents&quot;, :action =&gt; &quot;destroy&quot;, :descr =&gt; &quot;Delete&quot;, :sort =&gt; 1222
     Permission.create :controller =&gt; &quot;documents&quot;, :action =&gt; &quot;add_attachment&quot;, :descr =&gt; &quot;Add file&quot;, :sort =&gt; 1223
     Permission.create :controller =&gt; &quot;documents&quot;, :action =&gt; &quot;destroy_attachment&quot;, :descr =&gt; &quot;Delete file&quot;, :sort =&gt; 1224
     # files
-    Permission.create :controller =&gt; &quot;projects&quot;, :action =&gt; &quot;list_files&quot;, :descr =&gt; &quot;View list&quot;, :sort =&gt; 1300, :public =&gt; true
-    Permission.create :controller =&gt; &quot;versions&quot;, :action =&gt; &quot;download&quot;, :descr =&gt; &quot;Download&quot;, :sort =&gt; 1301, :public =&gt; true
+    Permission.create :controller =&gt; &quot;projects&quot;, :action =&gt; &quot;list_files&quot;, :descr =&gt; &quot;View list&quot;, :sort =&gt; 1300, :is_public =&gt; true
+    Permission.create :controller =&gt; &quot;versions&quot;, :action =&gt; &quot;download&quot;, :descr =&gt; &quot;Download&quot;, :sort =&gt; 1301, :is_public =&gt; true
     Permission.create :controller =&gt; &quot;projects&quot;, :action =&gt; &quot;add_file&quot;, :descr =&gt; &quot;Add&quot;, :sort =&gt; 1320
     Permission.create :controller =&gt; &quot;versions&quot;, :action =&gt; &quot;destroy_file&quot;, :descr =&gt; &quot;Delete&quot;, :sort =&gt; 1322
     
     # create default administrator account
-    user = User.create :login =&gt; &quot;admin&quot;, :password =&gt; &quot;admin&quot;, :firstname =&gt; &quot;redMine&quot;, :lastname =&gt; &quot;Admin&quot;, :mail =&gt; &quot;admin@somenet.foo&quot;, :mail_notification =&gt; true, :language =&gt; &quot;en&quot;
+    user = User.create :firstname =&gt; &quot;redMine&quot;, :lastname =&gt; &quot;Admin&quot;, :mail =&gt; &quot;admin@somenet.foo&quot;, :mail_notification =&gt; true, :language =&gt; &quot;en&quot;
+    user.login = &quot;admin&quot;
+    user.password = &quot;admin&quot;
     user.admin = true
     user.save
     </diff>
      <filename>redmine/db/migrate/001_setup.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,12 +1,29 @@
+# redMine - project management software
+# Copyright (C) 2006  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
 class DefaultConfiguration &lt; ActiveRecord::Migration
   def self.up
     # roles
     r = Role.create(:name =&gt; &quot;Manager&quot;)
     r.permissions = Permission.find(:all)
     r = Role.create :name =&gt; &quot;Developer&quot;
-    r.permissions = Permission.find([1, 2, 3, 6, 10, 11, 12, 16, 17, 18, 19, 20, 21, 23, 25, 26, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41])
+    r.permissions = Permission.find(:all)
     r = Role.create :name =&gt; &quot;Reporter&quot;
-    r.permissions = Permission.find([1, 2, 3, 6, 16, 17, 18, 19, 20, 21, 23, 25, 26, 30, 31, 32, 38, 39])
+    r.permissions = Permission.find(:all)
     # trackers
     Tracker.create(:name =&gt; &quot;Bug&quot;, :is_in_chlog =&gt; true)
     Tracker.create(:name =&gt; &quot;Feature request&quot;, :is_in_chlog =&gt; true)</diff>
      <filename>redmine/db/migrate/002_default_configuration.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,13 +2,22 @@
 
 redMine - project management software
 Copyright (C) 2006  Jean-Philippe Lang
-http://redmine.sourceforge.net/
+http://redmine.org/
 
 
-== xx/xx/2006
+== 07/09/2006 - v0.2.0
 
-* More filter options in issues list
-* Issues list exportable to CSV
+* new databases supported: Oracle, PostgreSQL, SQL Server
+* projects/subprojects hierarchy (1 level of subprojects only)
+* environment information display in admin/info
+* more filter options in issues list (rev6)
+* default language based on browser settings (Accept-Language HTTP header)
+* issues list exportable to CSV (rev6)
+* simple_format and auto_link on long text fields
+* more data validations
+* Fixed: error when all mail notifications are unchecked in admin/mail_options
+* Fixed: all project news are displayed on project summary
+* Fixed: Can't change user password in users/edit
 * Fixed: Error on tables creation with PostgreSQL (rev5)
 * Fixed: SQL error in &quot;issue reports&quot; view with PostgreSQL (rev5)
 </diff>
      <filename>redmine/doc/CHANGELOG</filename>
    </modified>
    <modified>
      <diff>@@ -2,15 +2,23 @@
 
 redMine - project management software
 Copyright (C) 2006  Jean-Philippe Lang
-http://redmine.sourceforge.net/
+http://redmine.org/
 
 
 == Requirements
 
 * Ruby on Rails 1.1
-* Any database supported by Rails (developped using MySQL 5)
+* a database (see compatibility below)
 * (recommended) Apache/Lighttpd with FCGI support 
 
+Supported databases:
+
+* MySQL (tested with MySQL 5)
+* PostgreSQL (tested with PostgreSQL 8.1)
+* Oracle (tested with Oracle 10g)
+* SQL Server (tested with SQL Server 2005)
+* SQLite (tested with SQLite 3)
+
 
 == Installation
 
@@ -20,9 +28,9 @@ http://redmine.sourceforge.net/
 2. Create an empty database: &quot;redmine&quot; for example
 
 3. Configure database parameters in config/database.yml
-   for &quot;production&quot; environment
+   for &quot;production&quot; environment (default database is MySQL)
 
-4. Create database structure. Under application main directory:
+4. Create the database structure. Under application main directory:
    rake migrate RAILS_ENV=&quot;production&quot;
    It will create tables and default configuration data
 </diff>
      <filename>redmine/doc/INSTALL</filename>
    </modified>
    <modified>
      <diff>@@ -2,7 +2,7 @@
 
 redMine - project management software
 Copyright (C) 2006  Jean-Philippe Lang
-http://redmine.sourceforge.net/
+http://redmine.org/
 
 == License
 
@@ -34,6 +34,12 @@ redMine is a project management software written using Ruby on Rails.
 * multilanguage support
 
 
+== User documentation
+
+User documentation for redMine is written using DocBook XML format.
+It's also avaible as HTML files in /public/manual (contextual help)
+
+
 == Versioning
 
 redMine versioning scheme is major.minor.revision</diff>
      <filename>redmine/doc/README</filename>
    </modified>
    <modified>
      <diff>@@ -10,7 +10,11 @@ Localization.define('fr', 'Fran&#231;ais') do |l|
   l.store 'Resolved', 'R&#233;solue'
   l.store 'Closed', 'Ferm&#233;e'
   l.store 'Rejected', 'Rejet&#233;e'
-  l.store 'Feedback', 'Commentaire'  
+  l.store 'Feedback', 'Commentaire' 
+  # filters
+  l.store '[All]', '[Tous]'
+  l.store '[Open]', '[Ouvert]'
+  l.store '[None]', '[Aucun]'
 
   # issue priorities
   l.store 'Issue priorities', 'Priorit&#233;s des demandes'
@@ -53,6 +57,9 @@ Localization.define('fr', 'Fran&#231;ais') do |l|
   l.store 'Reported issues', 'Demandes soumises'
   l.store 'Assigned to me', 'Demandes qui me sont assign&#233;es'
 
+  # ./script/../config/../app/views/account/login.rhtml
+  l.store 'Please login', 'Identification'
+
   # ./script/../config/../app/views/account/show.rhtml
   l.store 'Registered on', 'Inscrit le'
   l.store 'Projects', 'Projets'
@@ -231,6 +238,7 @@ Localization.define('fr', 'Fran&#231;ais') do |l|
   l.store 'New file', 'Nouveau fichier'
   
   # ./script/../config/../app/views/projects/list_issues.rhtml
+  l.store 'Subprojects', 'Sous-projets'
   l.store 'Apply filter', 'Appliquer'
   l.store 'Reset', 'Annuler'
   l.store 'Report an issue', 'Nouvelle demande'
@@ -311,6 +319,6 @@ Localization.define('fr', 'Fran&#231;ais') do |l|
   # ./script/../config/../app/views/versions/_form.rhtml
 
   # ./script/../config/../app/views/welcome/index.rhtml
-  
+  l.store 'Latest projects', 'Derniers projets'
 
 end </diff>
      <filename>redmine/lang/fr_FR.rb</filename>
    </modified>
    <modified>
      <diff>@@ -189,11 +189,20 @@ input.button-small
     font-size: 0.8em;
 }
 
+select.select-small 
+{
+    font-size: 0.8em;
+}
+
 label {
 	font-weight: bold;
 	font-size: 1em;
 }
 
+fieldset {
+    border:1px solid #7F9DB9;
+}
+
 .required {
 	color: #bb0000;
 }
@@ -220,10 +229,10 @@ tr.ListHead a {
 	text-decoration:underline;
 }
 
-tr.ListLine0 {
+tr.odd {
 	background-color: #C1E2F7;
 }
-tr.ListLine1 {
+tr.even {
 	background-color:#CEE1ED;
 }
 </diff>
      <filename>redmine/public/stylesheets/application.css</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,26 @@
 # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
-first:
+ecookbook:
   id: 1
-another:
+  name: eCookbook
+  descr: Recipes management application
+  homepage: http://ecookbook.somenet.foo/
+  projects_count: 1
+  created_on: 2005-01-01 01:00:00
+  updated_on: 2005-01-01 01:00:00
+onlinestore:
   id: 2
+  name: OnlineStore
+  descr: E-commerce web site
+  is_public: false
+  projects_count: 0
+  created_on: 2005-01-01 01:00:00
+  updated_on: 2005-01-01 01:00:00
+tracker:
+  id: 3
+  name: tracker
+  descr: bug tracker
+  is_public: true
+  projects_count: 0
+  parent_id: 1
+  created_on: 2005-01-01 01:00:00
+  updated_on: 2005-01-01 01:00:00
\ No newline at end of file</diff>
      <filename>redmine/test/fixtures/projects.yml</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,10 @@
 # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
-first:
+manager:
   id: 1
-another:
+  name: manager
+developer:
   id: 2
+  name: developer
+reporter:
+  id: 3
+  name: reporter</diff>
      <filename>redmine/test/fixtures/roles.yml</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,19 @@
 # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
-first:
+admin:
   id: 1
-another:
+  login: admin
+  firstname: admin
+  lastname: admin
+  mail: admin@somenet.foo
+  hashed_password: d033e22ae348aeb5660fc2140aec35850c4da997
+  admin: true
+  language: en
+paulochon:
   id: 2
+  login: plochon
+  firstname: Paul
+  lastname: Ochon
+  mail: plochon@somenet.foo
+  hashed_password: d033e22ae348aeb5660fc2140aec35850c4da997
+  admin: false
+  language: en
\ No newline at end of file</diff>
      <filename>redmine/test/fixtures/users.yml</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,20 @@
+# redMine - project management software
+# Copyright (C) 2006  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
 require File.dirname(__FILE__) + '/../test_helper'
 require 'projects_controller'
 
@@ -27,62 +44,4 @@ class ProjectsControllerTest &lt; Test::Unit::TestCase
 
     assert_not_nil assigns(:projects)
   end
-
-  def test_show
-    get :show, :id =&gt; 1
-
-    assert_response :success
-    assert_template 'show'
-
-    assert_not_nil assigns(:project)
-    assert assigns(:project).valid?
-  end
-
-  def test_new
-    get :new
-
-    assert_response :success
-    assert_template 'new'
-
-    assert_not_nil assigns(:project)
-  end
-
-  def test_create
-    num_projects = Project.count
-
-    post :create, :project =&gt; {}
-
-    assert_response :redirect
-    assert_redirected_to :action =&gt; 'list'
-
-    assert_equal num_projects + 1, Project.count
-  end
-
-  def test_edit
-    get :edit, :id =&gt; 1
-
-    assert_response :success
-    assert_template 'edit'
-
-    assert_not_nil assigns(:project)
-    assert assigns(:project).valid?
-  end
-
-  def test_update
-    post :update, :id =&gt; 1
-    assert_response :redirect
-    assert_redirected_to :action =&gt; 'show', :id =&gt; 1
-  end
-
-  def test_destroy
-    assert_not_nil Project.find(1)
-
-    post :destroy, :id =&gt; 1
-    assert_response :redirect
-    assert_redirected_to :action =&gt; 'list'
-
-    assert_raise(ActiveRecord::RecordNotFound) {
-      Project.find(1)
-    }
-  end
 end</diff>
      <filename>redmine/test/functional/projects_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,21 @@
-ENV[&quot;RAILS_ENV&quot;] = &quot;test&quot;
+# redMine - project management software
+# Copyright (C) 2006  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+ENV[&quot;RAILS_ENV&quot;] ||= &quot;test&quot;
 require File.expand_path(File.dirname(__FILE__) + &quot;/../config/environment&quot;)
 require 'test_help'
 
@@ -25,4 +42,14 @@ class Test::Unit::TestCase
   self.use_instantiated_fixtures  = false
 
   # Add more helper methods to be used by all tests here...
+  
+  def log_user(login, password)
+    get &quot;/account/login&quot;
+    assert_equal nil, session[:user]
+    assert_response :success
+    assert_template &quot;account/login&quot;
+    post &quot;/account/login&quot;, :login =&gt; login, :password =&gt; password
+    assert_redirected_to &quot;account/my_page&quot;
+    assert_equal login, session[:user].login
+  end
 end</diff>
      <filename>redmine/test/test_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,77 @@
+# redMine - project management software
+# Copyright (C) 2006  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
 require File.dirname(__FILE__) + '/../test_helper'
 
 class ProjectTest &lt; Test::Unit::TestCase
   fixtures :projects
 
-  # Replace this with your real tests.
+  def setup
+    @project = projects(:ecookbook)
+  end
+  
   def test_truth
-    assert_kind_of Project, projects(:first)
+    assert_kind_of Project, @project
+    assert_equal &quot;eCookbook&quot;, @project.name
+  end
+  
+  def test_update
+    assert_equal &quot;eCookbook&quot;, @project.name
+    @project.name = &quot;eCook&quot;
+    assert @project.save, @project.errors.full_messages.join(&quot;; &quot;)
+    @project.reload
+    assert_equal &quot;eCook&quot;, @project.name
+  end
+  
+  def test_validate
+    @project.name = &quot;&quot;
+    assert !@project.save
+    assert_equal 1, @project.errors.count
+    assert_equal &quot;can't be blank&quot;, @project.errors.on(:name)
+  end
+  
+  def test_public_projects
+    public_projects = Project.find(:all, :conditions =&gt; [&quot;is_public=?&quot;, true])
+    assert_equal 2, public_projects.length
+    assert_equal true, public_projects[0].is_public?
+  end
+  
+  def test_destroy
+    @project.destroy
+    assert_raise(ActiveRecord::RecordNotFound) { Project.find(@project.id) }
+  end
+  
+  def test_subproject_ok
+    sub = Project.find(2)
+    sub.parent = Project.find(1)
+    assert sub.save
+    assert_equal 1, sub.parent.id
+    assert_equal 2, Project.find(1).projects_count
+  end
+  
+  def test_subproject_invalid
+    sub = Project.find(2)
+    sub.parent = projects(:tracker)
+    assert !sub.save
+  end
+  
+  def test_subproject_invalid_2
+    sub = Project.find(1)
+    sub.parent = projects(:onlinestore)
+    assert !sub.save
   end
 end</diff>
      <filename>redmine/test/unit/project_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,64 @@
+# redMine - project management software
+# Copyright (C) 2006  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
 require File.dirname(__FILE__) + '/../test_helper'
 
 class UserTest &lt; Test::Unit::TestCase
   fixtures :users
 
-  # Replace this with your real tests.
   def test_truth
-    assert_kind_of User, users(:first)
+    assert_kind_of User, users(:paulochon)
+  end
+  
+  def test_update
+    user = User.find(1)
+    assert_equal &quot;admin&quot;, user.login
+    user.login = &quot;john&quot;
+    assert user.save, user.errors.full_messages.join(&quot;; &quot;)
+    user.reload
+    assert_equal &quot;john&quot;, user.login
+  end
+  
+  def test_validate
+    user = User.find(1)
+    user.login = &quot;&quot;
+    assert !user.save
+    assert_equal 2, user.errors.count
+  end
+  
+  def test_password
+    user = User.try_to_login(&quot;admin&quot;, &quot;admin&quot;)
+    assert_kind_of User, user
+    assert_equal &quot;admin&quot;, user.login
+    user.password = &quot;hello&quot;
+    assert user.save
+    
+    user = User.try_to_login(&quot;admin&quot;, &quot;hello&quot;)
+    assert_kind_of User, user
+    assert_equal &quot;admin&quot;, user.login
+    assert_equal User.hash_password(&quot;hello&quot;), user.hashed_password    
+  end
+  
+  def test_lock
+    user = User.find(1)
+    user.locked = true
+    assert user.save
+    
+    user = User.try_to_login(&quot;admin&quot;, &quot;admin&quot;)
+    assert_equal nil, user  
   end
 end</diff>
      <filename>redmine/test/unit/user_test.rb</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>redmine/public/manual/administration.html</filename>
    </removed>
    <removed>
      <filename>redmine/public/manual/images/issues_list.png</filename>
    </removed>
    <removed>
      <filename>redmine/public/manual/images/users_edit.png</filename>
    </removed>
    <removed>
      <filename>redmine/public/manual/images/users_list.png</filename>
    </removed>
    <removed>
      <filename>redmine/public/manual/images/workflow.png</filename>
    </removed>
    <removed>
      <filename>redmine/public/manual/index.html</filename>
    </removed>
    <removed>
      <filename>redmine/public/manual/projects.html</filename>
    </removed>
    <removed>
      <filename>redmine/public/manual/stylesheets/help.css</filename>
    </removed>
    <removed>
      <filename>redmine/test/fixtures/attachments.yml</filename>
    </removed>
    <removed>
      <filename>redmine/test/fixtures/custom_fields.yml</filename>
    </removed>
    <removed>
      <filename>redmine/test/fixtures/documents.yml</filename>
    </removed>
    <removed>
      <filename>redmine/test/fixtures/enumerations.yml</filename>
    </removed>
    <removed>
      <filename>redmine/test/fixtures/issue_categories.yml</filename>
    </removed>
    <removed>
      <filename>redmine/test/fixtures/issue_custom_fields.yml</filename>
    </removed>
    <removed>
      <filename>redmine/test/fixtures/issue_custom_values.yml</filename>
    </removed>
    <removed>
      <filename>redmine/test/fixtures/issue_histories.yml</filename>
    </removed>
    <removed>
      <filename>redmine/test/fixtures/issue_statuses.yml</filename>
    </removed>
    <removed>
      <filename>redmine/test/fixtures/issues.yml</filename>
    </removed>
    <removed>
      <filename>redmine/test/fixtures/mailer/issue_closed</filename>
    </removed>
    <removed>
      <filename>redmine/test/fixtures/members.yml</filename>
    </removed>
    <removed>
      <filename>redmine/test/fixtures/news.yml</filename>
    </removed>
    <removed>
      <filename>redmine/test/fixtures/permissions.yml</filename>
    </removed>
    <removed>
      <filename>redmine/test/fixtures/trackers.yml</filename>
    </removed>
    <removed>
      <filename>redmine/test/fixtures/versions.yml</filename>
    </removed>
    <removed>
      <filename>redmine/test/fixtures/workflow.yml</filename>
    </removed>
    <removed>
      <filename>redmine/test/functional/account_controller_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/functional/admin_controller_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/functional/custom_fields_controller_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/functional/documents_controller_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/functional/enumerations_controller_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/functional/help_controller_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/functional/issue_categories_controller_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/functional/issue_statuses_controller_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/functional/issues_controller_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/functional/members_controller_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/functional/news_controller_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/functional/reports_controller_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/functional/roles_controller_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/functional/trackers_controller_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/functional/users_controller_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/functional/versions_controller_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/functional/welcome_controller_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/unit/attachment_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/unit/custom_field_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/unit/document_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/unit/enumeration_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/unit/issue_category_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/unit/issue_custom_field_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/unit/issue_custom_value_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/unit/issue_history_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/unit/issue_status_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/unit/issue_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/unit/mailer_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/unit/member_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/unit/news_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/unit/packages_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/unit/permission_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/unit/role_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/unit/tracker_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/unit/version_test.rb</filename>
    </removed>
    <removed>
      <filename>redmine/test/unit/workflow_test.rb</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>366ca57c36df8e85f903304e0ab0364d4a5ea006</id>
    </parent>
  </parents>
  <author>
    <name>Jean-Philippe Lang</name>
    <email>jp_lang@yahoo.fr</email>
  </author>
  <url>http://github.com/edavis10/redmine/commit/f37089f54784da4b457ed19d588e137078977089</url>
  <id>f37089f54784da4b457ed19d588e137078977089</id>
  <committed-date>2006-07-09T09:30:01-07:00</committed-date>
  <authored-date>2006-07-09T09:30:01-07:00</authored-date>
  <message>v0.2.0

git-svn-id: http://redmine.rubyforge.org/svn/trunk@7 e93f8b46-1217-0410-a6f0-8f06a7374b81</message>
  <tree>af47c6b6557c18e9a707fae269bb1f356328da28</tree>
  <committer>
    <name>Jean-Philippe Lang</name>
    <email>jp_lang@yahoo.fr</email>
  </committer>
</commit>
