repository.rb 2.15 KB
Newer Older
1 2 3 4 5
class Repository
  attr_accessor :raw_repository

  def initialize(path_with_namespace, default_branch)
    @raw_repository = Gitlab::Git::Repository.new(path_with_namespace, default_branch)
6 7 8 9 10 11 12 13 14 15
  rescue Gitlab::Git::Repository::NoRepository
    nil
  end

  def exists?
    raw_repository
  end

  def empty?
    raw_repository.empty?
16 17 18 19 20 21 22 23 24 25
  end

  def commit(id = nil)
    commit = raw_repository.commit(id)
    commit = Commit.new(commit) if commit
    commit
  end

  def commits(ref, path = nil, limit = nil, offset = nil)
    commits = raw_repository.commits(ref, path, limit, offset)
26
    commits = Commit.decorate(commits) if commits.present?
27 28 29 30 31
    commits
  end

  def commits_between(target, source)
    commits = raw_repository.commits_between(target, source)
32
    commits = Commit.decorate(commits) if commits.present?
33 34 35
    commits
  end

36 37 38 39 40 41 42 43 44 45 46 47
  def round_commit_count
    if commit_count > 10000
      '10000+'
    elsif commit_count > 5000
      '5000+'
    elsif commit_count > 1000
      '1000+'
    else
      commit_count
    end
  end

48 49 50 51 52 53 54 55 56 57 58 59
  def branch_names
    Rails.cache.fetch(cache_key(:branch_names)) do
      raw_repository.branch_names
    end
  end

  def tag_names
    Rails.cache.fetch(cache_key(:tag_names)) do
      raw_repository.tag_names
    end
  end

60 61 62 63
  def commit_count
    Rails.cache.fetch(cache_key(:commit_count)) do
      raw_repository.raw.commit_count
    end
64 65
  end

66 67 68 69 70 71 72 73 74 75
  # Return repo size in megabytes
  # Cached in redis
  def size
    Rails.cache.fetch(cache_key(:size)) do
      raw_repository.size
    end
  end

  def expire_cache
    Rails.cache.delete(cache_key(:size))
76 77
    Rails.cache.delete(cache_key(:branch_names))
    Rails.cache.delete(cache_key(:tag_names))
78
    Rails.cache.delete(cache_key(:commit_count))
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
79 80 81 82
    Rails.cache.delete(cache_key(:graph_log))
  end

  def graph_log
83
    Rails.cache.fetch(cache_key(:graph_log)) do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
84 85 86
      stats = Gitlab::Git::GitStats.new(raw, root_ref)
      stats.parsed_log
    end
87 88 89 90 91 92
  end

  def cache_key(type)
    "#{type}:#{path_with_namespace}"
  end

93 94 95 96
  def method_missing(m, *args, &block)
    raw_repository.send(m, *args, &block)
  end

97
  def respond_to?(method)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
98
    return true if raw_repository.respond_to?(method)
99 100 101 102

    super
  end
end