Class: Repository::Git
Constant Summary
Constants inherited
from Repository
IDENTIFIER_MAX_LENGTH
Class Method Summary
collapse
Instance Method Summary
collapse
Methods inherited from Repository
#<=>, available_scm, #cat, #committer_ids=, #committers, #diff, #diff_format_revisions, #entries, #entry, #extra_info, factory, fetch_changesets, find_by_identifier_param, #find_committer_user, #identifier=, #identifier_frozen?, #identifier_param, #latest_changeset, #merge_extra_info, #name, #password, #password=, #properties, #relative_path, #repo_create_validation, repository_class, #root_url=, #same_commits_in_scope, #scan_changesets_for_issue_ids, scan_changesets_for_issue_ids, #scm, #scm_adapter, scm_available, scm_command, #scm_name, scm_version_string, #set_as_default?, #stats_by_author, #supports_all_revisions?, #supports_annotate?, #supports_cat?, #url=
#delete_unsafe_attributes, included, #safe_attribute?, #safe_attribute_names, #safe_attributes=
cipher_key, decrypt_text, encrypt_text, included, logger
Class Method Details
.changeset_identifier(changeset) ⇒ Object
Returns the identifier for the given git changeset
67
68
69
|
# File 'app/models/repository/git.rb', line 67
def self.changeset_identifier(changeset)
changeset.scmid
end
|
Returns the readable identifier for the given git changeset
72
73
74
|
# File 'app/models/repository/git.rb', line 72
def self.format_changeset_identifier(changeset)
changeset.revision[0, 8]
end
|
.human_attribute_name(attribute_key_name, *args) ⇒ Object
27
28
29
30
31
32
33
|
# File 'app/models/repository/git.rb', line 27
def self.human_attribute_name(attribute_key_name, *args)
attr_name = attribute_key_name.to_s
if attr_name == "url"
attr_name = "path_to_repository"
end
super(attr_name, *args)
end
|
.scm_adapter_class ⇒ Object
35
36
37
|
# File 'app/models/repository/git.rb', line 35
def self.scm_adapter_class
Redmine::Scm::Adapters::GitAdapter
end
|
.scm_name ⇒ Object
39
40
41
|
# File 'app/models/repository/git.rb', line 39
def self.scm_name
'Git'
end
|
Instance Method Details
#branches ⇒ Object
76
77
78
|
# File 'app/models/repository/git.rb', line 76
def branches
scm.branches
end
|
#default_branch ⇒ Object
84
85
86
87
88
89
|
# File 'app/models/repository/git.rb', line 84
def default_branch
scm.default_branch
rescue Exception => e
logger.error "git: error during get default branch: #{e.message}"
nil
end
|
#fetch_changesets ⇒ Object
With SCMs that have a sequential commit numbering, such as Subversion and
Mercurial, Redmine is able to be clever and only fetch changesets going
forward from the most recent one it knows about.
However, Git does not have a sequential commit numbering.
In order to fetch only new adding revisions, Redmine needs to save “heads”.
In Git and Mercurial, revisions are not in date order. Redmine Mercurial
fixed issues.
* Redmine Takes Too Long On Large Mercurial Repository
http://www.redmine.org/issues/3449
* Sorting for changesets might go wrong on Mercurial repos
http://www.redmine.org/issues/3567
Database revision column is text, so Redmine can not sort by revision.
Mercurial has revision number, and revision number guarantees revision
order. Redmine Mercurial model stored revisions ordered by database id to
database. So, Redmine Mercurial model can use correct ordering revisions.
Redmine Mercurial adapter uses “hg log -r 0:tip –limit 10” to get limited
revisions from old to new. But, Git 1.7.3.4 does not support –reverse with
-n or –skip.
The repository can still be fully reloaded by calling #clear_changesets
before fetching changesets (eg. for offline resync)
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
# File 'app/models/repository/git.rb', line 131
def fetch_changesets
scm_brs = branches
return if scm_brs.nil? || scm_brs.empty?
h1 = || {}
h = h1.dup
repo_heads = scm_brs.map{ |br| br.scmid }
h["heads"] ||= []
prev_db_heads = h["heads"].dup
if prev_db_heads.empty?
prev_db_heads += heads_from_branches_hash
end
return if prev_db_heads.sort == repo_heads.sort
h["db_consistent"] ||= {}
if changesets.count == 0
h["db_consistent"]["ordering"] = 1
(h)
self.save
elsif ! h["db_consistent"].has_key?("ordering")
h["db_consistent"]["ordering"] = 0
(h)
self.save
end
save_revisions(prev_db_heads, repo_heads)
end
|
#find_changeset_by_name(name) ⇒ Object
91
92
93
94
95
96
|
# File 'app/models/repository/git.rb', line 91
def find_changeset_by_name(name)
if name.present?
changesets.where(:revision => name.to_s).first ||
changesets.where('scmid LIKE ?', "#{name}%").first
end
end
|
#heads_from_branches_hash ⇒ Object
236
237
238
239
240
241
|
# File 'app/models/repository/git.rb', line 236
def heads_from_branches_hash
h1 = || {}
h = h1.dup
h["branches"] ||= {}
h['branches'].map{|br, hs| hs['last_scmid']}
end
|
#latest_changesets(path, rev, limit = 10) ⇒ Object
243
244
245
246
247
|
# File 'app/models/repository/git.rb', line 243
def latest_changesets(path,rev,limit=10)
revisions = scm.revisions(path, nil, rev, :limit => limit, :all => false)
return [] if revisions.nil? || revisions.empty?
changesets.where(:scmid => revisions.map {|c| c.scmid}).to_a
end
|
#repo_log_encoding ⇒ Object
62
63
64
|
# File 'app/models/repository/git.rb', line 62
def repo_log_encoding
'UTF-8'
end
|
#report_last_commit ⇒ Object
43
44
45
46
47
48
|
# File 'app/models/repository/git.rb', line 43
def report_last_commit
return false if .nil?
v = ["extra_report_last_commit"]
return false if v.nil?
v.to_s != '0'
end
|
#report_last_commit=(arg) ⇒ Object
50
51
52
|
# File 'app/models/repository/git.rb', line 50
def report_last_commit=(arg)
"extra_report_last_commit" => arg
end
|
#supports_directory_revisions? ⇒ Boolean
54
55
56
|
# File 'app/models/repository/git.rb', line 54
def supports_directory_revisions?
true
end
|
#supports_revision_graph? ⇒ Boolean
58
59
60
|
# File 'app/models/repository/git.rb', line 58
def supports_revision_graph?
true
end
|
80
81
82
|
# File 'app/models/repository/git.rb', line 80
def tags
scm.tags
end
|