From 16f9f50f50dbac49b1f791c7c2892420a354bc43 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 25 Mar 2007 12:12:15 +0000 Subject: [PATCH] SVN commits are now stored in the database, and added to the activity view and the search engine. New commits are automatically retrieved and stored when consulting the repository in the app. This behaviour can be disabled by unchecking 'Autofecth commits' in configuration settings. Commits can be fetched offline by running (recommanded at least for the initial import of past commits): ruby script/runner "Repository.fetch_changesets" It will load commits for all of the repositories. git-svn-id: http://redmine.rubyforge.org/svn/trunk@377 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/projects_controller.rb | 22 ++++++-- app/controllers/repositories_controller.rb | 24 ++++++--- app/models/change.rb | 22 ++++++++ app/models/changeset.rb | 25 +++++++++ app/models/repository.rb | 60 ++++++++++++++++++++-- app/models/svn_repos.rb | 42 +++++++++++---- app/views/projects/_form.rhtml | 2 +- app/views/projects/activity.rhtml | 4 ++ app/views/projects/search.rhtml | 7 +++ app/views/repositories/_revisions.rhtml | 20 ++++++++ app/views/repositories/revision.rhtml | 16 +++--- app/views/repositories/revisions.rhtml | 27 ++-------- app/views/repositories/show.rhtml | 15 +++--- app/views/settings/edit.rhtml | 3 ++ config/settings.yml | 2 + db/migrate/034_create_changesets.rb | 16 ++++++ db/migrate/035_create_changes.rb | 16 ++++++ lang/de.yml | 2 + lang/en.yml | 2 + lang/es.yml | 2 + lang/fr.yml | 2 + lang/it.yml | 2 + lang/ja.yml | 2 + 23 files changed, 267 insertions(+), 68 deletions(-) create mode 100644 app/models/change.rb create mode 100644 app/models/changeset.rb create mode 100644 app/views/repositories/_revisions.rhtml create mode 100644 db/migrate/034_create_changesets.rb create mode 100644 db/migrate/035_create_changes.rb diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 129355851..410e24847 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -519,6 +519,17 @@ class ProjectsController < ApplicationController @show_wiki_edits = 1 end + unless @project.repository.nil? || params[:show_changesets] == "0" + @project.repository.changesets.find(:all, :conditions => ["#{Changeset.table_name}.committed_on BETWEEN ? AND ?", @date_from, @date_to]).each { |i| + def i.created_on + self.committed_on + end + @events_by_day[i.created_on.to_date] ||= [] + @events_by_day[i.created_on.to_date] << i + } + @show_changesets = 1 + end + render :layout => false if request.xhr? end @@ -581,10 +592,10 @@ class ProjectsController < ApplicationController @question = params[:q] || "" @question.strip! @all_words = params[:all_words] || (params[:submit] ? false : true) - @scope = params[:scope] || (params[:submit] ? [] : %w(issues news documents wiki) ) - if !@question.empty? - # tokens must be at least 3 character long - @tokens = @question.split.uniq.select {|w| w.length > 2 } + @scope = params[:scope] || (params[:submit] ? [] : %w(issues changesets news documents wiki) ) + # tokens must be at least 3 character long + @tokens = @question.split.uniq.select {|w| w.length > 2 } + if !@tokens.empty? # no more than 5 tokens to search for @tokens.slice! 5..-1 if @tokens.size > 5 # strings used in sql like statement @@ -596,7 +607,10 @@ class ProjectsController < ApplicationController @results += @project.news.find(:all, :limit => limit, :conditions => [ (["(LOWER(title) like ? OR LOWER(description) like ?)"] * like_tokens.size).join(operator), * (like_tokens * 2).sort], :include => :author ) if @scope.include? 'news' @results += @project.documents.find(:all, :limit => limit, :conditions => [ (["(LOWER(title) like ? OR LOWER(description) like ?)"] * like_tokens.size).join(operator), * (like_tokens * 2).sort] ) if @scope.include? 'documents' @results += @project.wiki.pages.find(:all, :limit => limit, :include => :content, :conditions => [ (["(LOWER(title) like ? OR LOWER(text) like ?)"] * like_tokens.size).join(operator), * (like_tokens * 2).sort] ) if @project.wiki && @scope.include?('wiki') + @results += @project.repository.changesets.find(:all, :limit => limit, :conditions => [ (["(LOWER(comment) like ?)"] * like_tokens.size).join(operator), * (like_tokens).sort] ) if @project.repository && @scope.include?('changesets') @question = @tokens.join(" ") + else + @question = "" end end diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index acf03eb7b..94b81080f 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -1,5 +1,5 @@ # redMine - project management software -# Copyright (C) 2006 Jean-Philippe Lang +# Copyright (C) 2006-2007 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 @@ -20,9 +20,16 @@ class RepositoriesController < ApplicationController before_filter :find_project, :authorize def show + # get entries for the browse frame @entries = @repository.scm.entries('') show_error and return unless @entries - @latest_revision = @entries.revisions.latest + # check if new revisions have been committed in the repository + scm_latestrev = @entries.revisions.latest + if Setting.autofetch_changesets? && scm_latestrev && ((@repository.latest_changeset.nil?) || (@repository.latest_changeset.revision < scm_latestrev.identifier.to_i)) + @repository.fetch_changesets + @repository.reload + end + @changesets = @repository.changesets.find(:all, :limit => 5, :order => "committed_on DESC") end def browse @@ -31,9 +38,11 @@ class RepositoriesController < ApplicationController end def revisions - @entry = @repository.scm.entry(@path, @rev) - @revisions = @repository.scm.revisions(@path, @rev) - show_error and return unless @entry && @revisions + unless @path == '' + @entry = @repository.scm.entry(@path, @rev) + show_error and return unless @entry + end + @changesets = @repository.changesets_for_path(@path) end def entry @@ -45,9 +54,8 @@ class RepositoriesController < ApplicationController end def revision - @revisions = @repository.scm.revisions '', @rev, @rev, :with_paths => true - show_error and return unless @revisions - @revision = @revisions.first + @changeset = @repository.changesets.find_by_revision(@rev) + show_error and return unless @changeset end def diff diff --git a/app/models/change.rb b/app/models/change.rb new file mode 100644 index 000000000..d14f435a4 --- /dev/null +++ b/app/models/change.rb @@ -0,0 +1,22 @@ +# redMine - project management software +# Copyright (C) 2006-2007 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 Change < ActiveRecord::Base + belongs_to :changeset + + validates_presence_of :changeset_id, :action, :path +end diff --git a/app/models/changeset.rb b/app/models/changeset.rb new file mode 100644 index 000000000..fa60f1db8 --- /dev/null +++ b/app/models/changeset.rb @@ -0,0 +1,25 @@ +# redMine - project management software +# Copyright (C) 2006-2007 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 Changeset < ActiveRecord::Base + belongs_to :repository + has_many :changes, :dependent => :delete_all + + validates_presence_of :repository_id, :revision, :committed_on + validates_numericality_of :revision, :only_integer => true + validates_uniqueness_of :revision, :scope => :repository_id +end diff --git a/app/models/repository.rb b/app/models/repository.rb index 16bee25a7..19b12f372 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -1,5 +1,5 @@ # redMine - project management software -# Copyright (C) 2006 Jean-Philippe Lang +# Copyright (C) 2006-2007 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 @@ -17,6 +17,11 @@ class Repository < ActiveRecord::Base belongs_to :project + has_many :changesets, :dependent => :destroy, :order => 'revision DESC' + has_one :latest_changeset, :class_name => 'Changeset', :foreign_key => :repository_id, :order => 'revision DESC' + + attr_protected :root_url + validates_presence_of :url validates_format_of :url, :with => /^(http|https|svn|file):\/\/.+/i @@ -27,10 +32,55 @@ class Repository < ActiveRecord::Base end def url=(str) - unless str == self.url - self.attributes = {:root_url => nil } - @scm = nil + super if root_url.blank? + end + + def changesets_for_path(path="") + path = "/#{path}%" + path = url.gsub(/^#{root_url}/, '') + path if root_url && root_url != url + path.squeeze!("/") + changesets.find(:all, :include => :changes, + :conditions => ["#{Change.table_name}.path LIKE ?", path]) + end + + def fetch_changesets + scm_info = scm.info + if scm_info + lastrev_identifier = scm_info.lastrev.identifier.to_i + if latest_changeset.nil? || latest_changeset.revision < lastrev_identifier + logger.debug "Fetching changesets for repository #{url}" if logger && logger.debug? + identifier_from = latest_changeset ? latest_changeset.revision + 1 : 1 + while (identifier_from <= lastrev_identifier) + # loads changesets by batches of 200 + identifier_to = [identifier_from + 199, lastrev_identifier].min + revisions = scm.revisions('', identifier_to, identifier_from, :with_paths => true) + transaction do + revisions.reverse_each do |revision| + changeset = Changeset.create(:repository => self, + :revision => revision.identifier, + :committer => revision.author, + :committed_on => revision.time, + :comment => revision.message) + + revision.paths.each do |change| + Change.create(:changeset => changeset, + :action => change[:action], + :path => change[:path], + :from_path => change[:from_path], + :from_revision => change[:from_revision]) + end + end + end + identifier_from = identifier_to + 1 + end + end end - super + end + + # fetch new changesets for all repositories + # can be called periodically by an external script + # eg. ruby script/runner "Repository.fetch_changesets" + def self.fetch_changesets + find(:all).each(&:fetch_changesets) end end diff --git a/app/models/svn_repos.rb b/app/models/svn_repos.rb index 2fd907319..610b67a20 100644 --- a/app/models/svn_repos.rb +++ b/app/models/svn_repos.rb @@ -1,5 +1,5 @@ # redMine - project management software -# Copyright (C) 2006 Jean-Philippe Lang +# Copyright (C) 2006-2007 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 @@ -39,20 +39,27 @@ module SvnRepos @url end - # finds the root url of the svn repository - def retrieve_root_url + # get info about the svn repository + def info cmd = "svn info --xml #{target('')}" cmd << " --username #{@login} --password #{@password}" if @login - root_url = nil + info = nil shellout(cmd) do |io| begin doc = REXML::Document.new(io) - root_url = doc.elements["info/entry/repository/root"].text + #root_url = doc.elements["info/entry/repository/root"].text + info = Info.new({:root_url => doc.elements["info/entry/repository/root"].text, + :lastrev => Revision.new({ + :identifier => doc.elements["info/entry/commit"].attributes['revision'], + :time => Time.parse(doc.elements["info/entry/commit/date"].text), + :author => (doc.elements["info/entry/commit/author"] ? doc.elements["info/entry/commit/author"].text : "") + }) + }) rescue end end return nil if $? && $?.exitstatus != 0 - root_url + info rescue Errno::ENOENT => e return nil end @@ -83,7 +90,7 @@ module SvnRepos :lastrev => Revision.new({ :identifier => entry.elements['commit'].attributes['revision'], :time => Time.parse(entry.elements['commit'].elements['date'].text), - :author => (entry.elements['commit'].elements['author'] ? entry.elements['commit'].elements['author'].text : "anonymous") + :author => (entry.elements['commit'].elements['author'] ? entry.elements['commit'].elements['author'].text : "") }) }) end @@ -112,13 +119,15 @@ module SvnRepos paths = [] logentry.elements.each("paths/path") do |path| paths << {:action => path.attributes['action'], - :path => path.text + :path => path.text, + :from_path => path.attributes['copyfrom-path'], + :from_revision => path.attributes['copyfrom-rev'] } end paths.sort! { |x,y| x[:path] <=> y[:path] } revisions << Revision.new({:identifier => logentry.attributes['revision'], - :author => (logentry.elements['author'] ? logentry.elements['author'].text : "anonymous"), + :author => (logentry.elements['author'] ? logentry.elements['author'].text : ""), :time => Time.parse(logentry.elements['date'].text), :message => logentry.elements['msg'].text, :paths => paths @@ -171,7 +180,12 @@ module SvnRepos raise CommandFailed end - private + private + def retrieve_root_url + info = self.info + info ? info.root_url : nil + end + def target(path) path ||= "" base = path.match(/^\//) ? root_url : url @@ -207,6 +221,14 @@ module SvnRepos end end + class Info + attr_accessor :root_url, :lastrev + def initialize(attributes={}) + self.root_url = attributes[:root_url] if attributes[:root_url] + self.lastrev = attributes[:lastrev] + end + end + class Entry attr_accessor :name, :path, :kind, :size, :lastrev def initialize(attributes={}) diff --git a/app/views/projects/_form.rhtml b/app/views/projects/_form.rhtml index 85f3f2966..ded227197 100644 --- a/app/views/projects/_form.rhtml +++ b/app/views/projects/_form.rhtml @@ -30,7 +30,7 @@ <%= hidden_field_tag "repository_enabled", 0 %>
<% fields_for :repository, @project.repository, { :builder => TabularFormBuilder, :lang => current_language} do |repository| %> -

<%= repository.text_field :url, :size => 60, :required => true %>
(http://, https://, svn://, file:///)

+

<%= repository.text_field :url, :size => 60, :required => true, :disabled => (@project.repository && !@project.repository.root_url.blank?) %>
(http://, https://, svn://, file:///)

<%= repository.text_field :login, :size => 30 %>

<%= repository.password_field :password, :size => 30 %>

<% end %> diff --git a/app/views/projects/activity.rhtml b/app/views/projects/activity.rhtml index b1d131aa9..69bfa6028 100644 --- a/app/views/projects/activity.rhtml +++ b/app/views/projects/activity.rhtml @@ -7,6 +7,7 @@ <%= select_year(@year, :prefix => "year", :discard_type => true) %>

<%= check_box_tag 'show_issues', 1, @show_issues %><%= hidden_field_tag 'show_issues', 0, :id => nil %> <%=l(:label_issue_plural)%>
+ <% if @project.repository %><%= check_box_tag 'show_changesets', 1, @show_changesets %><%= hidden_field_tag 'show_changesets', 0, :id => nil %> <%=l(:label_revision_plural)%>
<% end %> <%= check_box_tag 'show_news', 1, @show_news %><%= hidden_field_tag 'show_news', 0, :id => nil %> <%=l(:label_news_plural)%>
<%= check_box_tag 'show_files', 1, @show_files %><%= hidden_field_tag 'show_files', 0, :id => nil %> <%=l(:label_attachment_plural)%>
<%= check_box_tag 'show_documents', 1, @show_documents %><%= hidden_field_tag 'show_documents', 0, :id => nil %> <%=l(:label_document_plural)%>
@@ -39,6 +40,9 @@ <% elsif e.is_a? WikiContent.versioned_class %> <%= e.created_on.strftime("%H:%M") %> <%=l(:label_wiki_edit)%>: <%= link_to h(WikiPage.pretty_title(e.title)), :controller => 'wiki', :page => e.title %> (<%= link_to '#' + e.version.to_s, :controller => 'wiki', :page => e.title, :version => e.version %>)
<% unless e.comment.blank? %><%=h e.comment %><% end %> + <% elsif e.is_a? Changeset %> + <%= e.created_on.strftime("%H:%M") %> <%=l(:label_revision)%> <%= link_to h(e.revision), :controller => 'repositories', :action => 'revision', :id => @project, :rev => e.revision %>
+ <%=h e.committer %><%= h(": #{e.comment}") unless e.comment.blank? %> <% end %>

diff --git a/app/views/projects/search.rhtml b/app/views/projects/search.rhtml index 056effd47..8b35dce3b 100644 --- a/app/views/projects/search.rhtml +++ b/app/views/projects/search.rhtml @@ -4,6 +4,9 @@ <% form_tag({:action => 'search', :id => @project}, :method => :get) do %>

<%= text_field_tag 'q', @question, :size => 30 %> <%= check_box_tag 'scope[]', 'issues', (@scope.include? 'issues') %> +<% if @project.repository %> +<%= check_box_tag 'scope[]', 'changesets', (@scope.include? 'changesets') %> +<% end %> <%= check_box_tag 'scope[]', 'news', (@scope.include? 'news') %> <%= check_box_tag 'scope[]', 'documents', (@scope.include? 'documents') %> <% if @project.wiki %> @@ -36,6 +39,10 @@ <%=l(:label_wiki)%>: <%= link_to highlight_tokens(h(e.pretty_title), @tokens), :controller => 'wiki', :action => 'index', :id => @project, :page => e.title %>
<%= highlight_tokens(e.content.text, @tokens) %>
<%= e.content.author ? e.content.author.name : "Anonymous" %>, <%= format_time(e.content.updated_on) %> + <% elsif e.is_a? Changeset %> + <%=l(:label_revision)%> <%= link_to h(e.revision), :controller => 'repositories', :action => 'revision', :id => @project, :rev => e.revision %>
+ <%= highlight_tokens(e.comment, @tokens) %>
+ <%= e.committer.blank? ? e.committer : "Anonymous" %>, <%= format_time(e.committed_on) %> <% end %>

<% end %> diff --git a/app/views/repositories/_revisions.rhtml b/app/views/repositories/_revisions.rhtml new file mode 100644 index 000000000..d9bf7cc7c --- /dev/null +++ b/app/views/repositories/_revisions.rhtml @@ -0,0 +1,20 @@ + + + + + + + + + +<% changesets.each do |changeset| %> + + + + + + + +<% end %> + +
#<%= l(:field_author) %><%= l(:label_date) %><%= l(:field_comment) %>
<%= link_to changeset.revision, :action => 'revision', :id => project, :rev => changeset.revision %><%=h changeset.committer %><%= format_time(changeset.committed_on) %><%= textilizable(changeset.comment) %><%= link_to 'Diff', :action => 'diff', :id => project, :path => path, :rev => changeset.revision if entry && entry.is_file? && changeset != changesets.last %>
\ No newline at end of file diff --git a/app/views/repositories/revision.rhtml b/app/views/repositories/revision.rhtml index 22e965090..3f28f3a9c 100644 --- a/app/views/repositories/revision.rhtml +++ b/app/views/repositories/revision.rhtml @@ -5,10 +5,10 @@ <% end %>
-

<%= l(:label_revision) %> <%= @revision.identifier %>

+

<%= l(:label_revision) %> <%= @changeset.revision %>

-

<%= @revision.author %>, <%= format_time(@revision.time) %>

-<%= textilizable @revision.message %> +

<%= @changeset.committer %>, <%= format_time(@changeset.committed_on) %>

+<%= textilizable @changeset.comment %>
<%= l(:label_added) %> 
@@ -19,19 +19,19 @@

<%= l(:label_attachment_plural) %>

-<% @revision.paths.each do |path| %> +<% @changeset.changes.each do |change| %> - + <% end %>
<%= path[:path] %>
<%= change.path %>
-<% if path[:action] == "M" %> -<%= link_to 'View diff', :action => 'diff', :id => @project, :path => path[:path], :rev => @revision.identifier %> +<% if change.action == "M" %> +<%= link_to 'View diff', :action => 'diff', :id => @project, :path => change.path, :rev => @changeset.revision %> <% end %>
-

<%= lwr(:label_modification, @revision.paths.length) %>

+

<%= lwr(:label_modification, @changeset.changes.length) %>

<% content_for :header_tags do %> <%= stylesheet_link_tag "scm" %> diff --git a/app/views/repositories/revisions.rhtml b/app/views/repositories/revisions.rhtml index 8e300a9da..52564472d 100644 --- a/app/views/repositories/revisions.rhtml +++ b/app/views/repositories/revisions.rhtml @@ -5,36 +5,17 @@ <% end %>
-

<%= render :partial => 'navigation', :locals => { :path => @path, :kind => @entry.kind, :revision => @rev } %>

+

<%= render :partial => 'navigation', :locals => { :path => @path, :kind => (@entry ? @entry.kind : nil), :revision => @rev } %>

-<% if @entry.is_file? %> +<% if @entry && @entry.is_file? %>

<%=h @entry.name %>

<%= link_to 'Download', {:action => 'entry', :id => @project, :path => @path, :rev => @rev, :format => 'raw' }, :class => "icon file" %> (<%= number_to_human_size @entry.size %>)

<% end %>

Revisions

- - - - - - - - - -<% @revisions.each do |revision| %> - - - - - - - -<% end %> - -
#<%= l(:field_author) %><%= l(:label_date) %><%= l(:field_description) %>
<%= link_to revision.identifier, :action => 'revision', :id => @project, :rev => revision.identifier %><%=h revision.author %><%= format_time(revision.time) %><%= textilizable(revision.message) %><%= link_to 'Diff', :action => 'diff', :id => @project, :path => @path, :rev => revision.identifier if @entry.is_file? && revision != @revisions.last %>
-

<%= lwr(:label_modification, @revisions.length) %>

+<%= render :partial => 'revisions', :locals => {:project => @project, :path => @path, :changesets => @changesets, :entry => @entry }%> +

<%= lwr(:label_modification, @changesets.length) %>

<% content_for :header_tags do %> <%= stylesheet_link_tag "scm" %> diff --git a/app/views/repositories/show.rhtml b/app/views/repositories/show.rhtml index 9c2adc929..e7d71cb79 100644 --- a/app/views/repositories/show.rhtml +++ b/app/views/repositories/show.rhtml @@ -1,17 +1,14 @@

<%= l(:label_repository) %>

-

<%= l(:label_revision_plural) %>

-<% if @latest_revision %> -

<%= l(:label_latest_revision) %>: - <%= link_to @latest_revision.identifier, :action => 'revision', :id => @project, :rev => @latest_revision.identifier %>
- <%= @latest_revision.author %>, <%= format_time(@latest_revision.time) %>

-<% end %> -

<%= link_to l(:label_view_revisions), :action => 'revisions', :id => @project %>

- -

<%= l(:label_browse) %>

<%= render :partial => 'dir_list' %> +<% unless @changesets.empty? %> +

<%= l(:label_latest_revision_plural) %>

+<%= render :partial => 'revisions', :locals => {:project => @project, :path => '', :changesets => @changesets, :entry => nil }%> +

<%= link_to l(:label_view_revisions), :action => 'revisions', :id => @project %>

+<% end %> + <% content_for :header_tags do %> <%= stylesheet_link_tag "scm" %> <% end %> \ No newline at end of file diff --git a/app/views/settings/edit.rhtml b/app/views/settings/edit.rhtml index 4bdea07b9..223df7a9d 100644 --- a/app/views/settings/edit.rhtml +++ b/app/views/settings/edit.rhtml @@ -45,6 +45,9 @@

<%= text_field_tag 'settings[feeds_limit]', Setting.feeds_limit, :size => 6 %>

+

+<%= check_box_tag 'settings[autofetch_changesets]', 1, Setting.autofetch_changesets? %><%= hidden_field_tag 'settings[autofetch_changesets]', 0 %>

+ <%= submit_tag l(:button_save) %> diff --git a/config/settings.yml b/config/settings.yml index c3292e516..5942f499b 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -50,3 +50,5 @@ host_name: feeds_limit: format: int default: 15 +autofetch_changesets: + default: 1 diff --git a/db/migrate/034_create_changesets.rb b/db/migrate/034_create_changesets.rb new file mode 100644 index 000000000..a78c8e36f --- /dev/null +++ b/db/migrate/034_create_changesets.rb @@ -0,0 +1,16 @@ +class CreateChangesets < ActiveRecord::Migration + def self.up + create_table :changesets do |t| + t.column :repository_id, :integer, :null => false + t.column :revision, :integer, :null => false + t.column :committer, :string, :limit => 30 + t.column :committed_on, :datetime, :null => false + t.column :comment, :text + end + add_index :changesets, [:repository_id, :revision], :unique => true, :name => :changesets_repos_rev + end + + def self.down + drop_table :changesets + end +end diff --git a/db/migrate/035_create_changes.rb b/db/migrate/035_create_changes.rb new file mode 100644 index 000000000..fa0cfac3f --- /dev/null +++ b/db/migrate/035_create_changes.rb @@ -0,0 +1,16 @@ +class CreateChanges < ActiveRecord::Migration + def self.up + create_table :changes do |t| + t.column :changeset_id, :integer, :null => false + t.column :action, :string, :limit => 1, :default => "", :null => false + t.column :path, :string, :default => "", :null => false + t.column :from_path, :string + t.column :from_revision, :integer + end + add_index :changes, [:changeset_id], :name => :changesets_changeset_id + end + + def self.down + drop_table :changes + end +end diff --git a/lang/de.yml b/lang/de.yml index 9bd293559..3046dceb6 100644 --- a/lang/de.yml +++ b/lang/de.yml @@ -160,6 +160,7 @@ setting_host_name: Host Name setting_text_formatting: Textformatierung setting_wiki_compression: Wiki Historie komprimieren setting_feeds_limit: Limit Feed Inhalt +setting_autofetch_changesets: Autofetch SVN commits label_user: Benutzer label_user_plural: Benutzer @@ -315,6 +316,7 @@ label_added: hinzugefügt label_modified: geändert label_deleted: gelöscht label_latest_revision: Aktuelleste Revision +label_latest_revision_plural: Aktuelleste Revisionen label_view_revisions: Revisionen anzeigen label_max_size: Maximale Größe label_on: von diff --git a/lang/en.yml b/lang/en.yml index 72f75597b..6ed10aa88 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -160,6 +160,7 @@ setting_host_name: Host name setting_text_formatting: Text formatting setting_wiki_compression: Wiki history compression setting_feeds_limit: Feed content limit +setting_autofetch_changesets: Autofetch SVN commits label_user: User label_user_plural: Users @@ -315,6 +316,7 @@ label_added: added label_modified: modified label_deleted: deleted label_latest_revision: Latest revision +label_latest_revision_plural: Latest revisions label_view_revisions: View revisions label_max_size: Maximum size label_on: 'on' diff --git a/lang/es.yml b/lang/es.yml index a8eb1d0d3..a0a04562e 100644 --- a/lang/es.yml +++ b/lang/es.yml @@ -160,6 +160,7 @@ setting_host_name: Nombre de anfitrión setting_text_formatting: Formato de texto setting_wiki_compression: Compresión de la historia de Wiki setting_feeds_limit: Feed content limit +setting_autofetch_changesets: Autofetch SVN commits label_user: Usuario label_user_plural: Usuarios @@ -315,6 +316,7 @@ label_added: agregado label_modified: modificado label_deleted: suprimido label_latest_revision: La revisión más última +label_latest_revision_plural: Latest revisions label_view_revisions: Ver las revisiones label_max_size: Tamaño máximo label_on: en diff --git a/lang/fr.yml b/lang/fr.yml index dbce4b0c7..9a2195b11 100644 --- a/lang/fr.yml +++ b/lang/fr.yml @@ -160,6 +160,7 @@ setting_host_name: Nom d'hôte setting_text_formatting: Formatage du texte setting_wiki_compression: Compression historique wiki setting_feeds_limit: Limite du contenu des flux RSS +setting_autofetch_changesets: Récupération auto. des commits SVN label_user: Utilisateur label_user_plural: Utilisateurs @@ -315,6 +316,7 @@ label_added: ajouté label_modified: modifié label_deleted: supprimé label_latest_revision: Dernière révision +label_latest_revision_plural: Dernières révisions label_view_revisions: Voir les révisions label_max_size: Taille maximale label_on: sur diff --git a/lang/it.yml b/lang/it.yml index e6316e0dd..df89120ff 100644 --- a/lang/it.yml +++ b/lang/it.yml @@ -160,6 +160,7 @@ setting_host_name: Nome host setting_text_formatting: Formattazione testo setting_wiki_compression: Compressione di storia di Wiki setting_feeds_limit: Feed content limit +setting_autofetch_changesets: Autofetch SVN commits label_user: Utente label_user_plural: Utenti @@ -315,6 +316,7 @@ label_added: aggiunto label_modified: modificato label_deleted: eliminato label_latest_revision: Ultima versione +label_latest_revision_plural: Latest revisions label_view_revisions: Mostra versioni label_max_size: Dimensione massima label_on: 'on' diff --git a/lang/ja.yml b/lang/ja.yml index 83e681c0d..57d3df41b 100644 --- a/lang/ja.yml +++ b/lang/ja.yml @@ -161,6 +161,7 @@ setting_host_name: ホスト名 setting_text_formatting: テキストの書式 setting_wiki_compression: Wiki history compression setting_feeds_limit: Feed content limit +setting_autofetch_changesets: Autofetch SVN commits label_user: ユーザ label_user_plural: ユーザ @@ -316,6 +317,7 @@ label_added: 追加された label_modified: 変更された label_deleted: 削除された label_latest_revision: 最新リビジョン +label_latest_revision_plural: Latest revisions label_view_revisions: リビジョンを見る label_max_size: 最大サイズ label_on: 他 -- 2.39.5