File: app/models/repository/bazaar.rb

Overview
Module Structure
Class Hierarchy
Code

Overview

Module Structure

  module: <Toplevel Module>
  class: Repository
  class: Bazaar#20
inherits from
  Repository   
has properties
class method: human_attribute_name / 2 #24
class method: scm_adapter_class #32
class method: scm_name #36
method: entries / 2 #40
method: fetch_changesets #68

Class Hierarchy

Object ( Builtin-Module )
Base ( ActiveRecord )
Repository
  Bazaar ( Repository ) #20

Code

   1  # Redmine - project management software
   2  # Copyright (C) 2006-2011  Jean-Philippe Lang
   3  #
   4  # This program is free software; you can redistribute it and/or
   5  # modify it under the terms of the GNU General Public License
   6  # as published by the Free Software Foundation; either version 2
   7  # of the License, or (at your option) any later version.
   8  #
   9  # This program is distributed in the hope that it will be useful,
  10  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  # GNU General Public License for more details.
  13  #
  14  # You should have received a copy of the GNU General Public License
  15  # along with this program; if not, write to the Free Software
  16  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  17 
  18  require 'redmine/scm/adapters/bazaar_adapter'
  19 
  20  class Repository::Bazaar < Repository
  21    attr_protected :root_url
  22    validates_presence_of :url, :log_encoding
  23 
  24    def self.human_attribute_name(attribute_key_name, *args)
  25      attr_name = attribute_key_name.to_s
  26      if attr_name == "url"
  27        attr_name = "path_to_repository"
  28      end
  29      super(attr_name, *args)
  30    end
  31 
  32    def self.scm_adapter_class
  33      Redmine::Scm::Adapters::BazaarAdapter
  34    end
  35 
  36    def self.scm_name
  37      'Bazaar'
  38    end
  39 
  40    def entries(path=nil, identifier=nil)
  41      entries = scm.entries(path, identifier)
  42      if entries
  43        entries.each do |e|
  44          next if e.lastrev.revision.blank?
  45          # Set the filesize unless browsing a specific revision
  46          if identifier.nil? && e.is_file?
  47            full_path = File.join(root_url, e.path)
  48            e.size = File.stat(full_path).size if File.file?(full_path)
  49          end
  50          c = Change.find(
  51                 :first,
  52                 :include    => :changeset,
  53                 :conditions => [
  54                     "#{Change.table_name}.revision = ? and #{Changeset.table_name}.repository_id = ?",
  55                     e.lastrev.revision,
  56                     id
  57                     ],
  58                 :order => "#{Changeset.table_name}.revision DESC")
  59          if c
  60            e.lastrev.identifier = c.changeset.revision
  61            e.lastrev.name       = c.changeset.revision
  62            e.lastrev.author     = c.changeset.committer
  63          end
  64        end
  65      end
  66    end
  67 
  68    def fetch_changesets
  69      scm_info = scm.info
  70      if scm_info
  71        # latest revision found in database
  72        db_revision = latest_changeset ? latest_changeset.revision.to_i : 0
  73        # latest revision in the repository
  74        scm_revision = scm_info.lastrev.identifier.to_i
  75        if db_revision < scm_revision
  76          logger.debug "Fetching changesets for repository #{url}" if logger && logger.debug?
  77          identifier_from = db_revision + 1
  78          while (identifier_from <= scm_revision)
  79            # loads changesets by batches of 200
  80            identifier_to = [identifier_from + 199, scm_revision].min
  81            revisions = scm.revisions('', identifier_to, identifier_from, :with_paths => true)
  82            transaction do
  83              revisions.reverse_each do |revision|
  84                changeset = Changeset.create(:repository   => self,
  85                                             :revision     => revision.identifier,
  86                                             :committer    => revision.author,
  87                                             :committed_on => revision.time,
  88                                             :scmid        => revision.scmid,
  89                                             :comments     => revision.message)
  90 
  91                revision.paths.each do |change|
  92                  Change.create(:changeset => changeset,
  93                                :action    => change[:action],
  94                                :path      => change[:path],
  95                                :revision  => change[:revision])
  96                end
  97              end
  98            end unless revisions.nil?
  99            identifier_from = identifier_to + 1
 100          end
 101        end
 102      end
 103    end
 104  end