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_annotate?, #supports_cat?, #supports_history?, #url=, #valid_name?
#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
68
69
70
|
# File 'app/models/repository/git.rb', line 68
def self.changeset_identifier(changeset)
changeset.scmid
end
|
Returns the readable identifier for the given git changeset
73
74
75
|
# File 'app/models/repository/git.rb', line 73
def self.format_changeset_identifier(changeset)
changeset.revision[0, 8]
end
|
.human_attribute_name(attribute_key_name, *args) ⇒ Object
28
29
30
31
32
|
# File 'app/models/repository/git.rb', line 28
def self.human_attribute_name(attribute_key_name, *args)
attr_name = attribute_key_name.to_s
attr_name = 'path_to_repository' if attr_name == 'url'
super(attr_name, *args)
end
|
.scm_adapter_class ⇒ Object
.scm_name ⇒ Object
38
39
40
|
# File 'app/models/repository/git.rb', line 38
def self.scm_name
'Git'
end
|
Instance Method Details
#branches ⇒ Object
77
78
79
|
# File 'app/models/repository/git.rb', line 77
def branches
scm.branches
end
|
#default_branch ⇒ Object
85
86
87
88
89
90
|
# File 'app/models/repository/git.rb', line 85
def default_branch
scm.default_branch
rescue => 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)
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
# File 'app/models/repository/git.rb', line 132
def fetch_changesets
scm_brs = branches
return if scm_brs.blank?
h = .dup || {}
repo_heads = scm_brs.map(&:scmid)
prev_db_heads = h["heads"].dup || []
prev_db_heads += heads_from_branches_hash if prev_db_heads.empty?
return if prev_db_heads.sort == repo_heads.sort
h["db_consistent"] ||= {}
if ! changesets.exists?
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
92
93
94
95
96
97
|
# File 'app/models/repository/git.rb', line 92
def find_changeset_by_name(name)
return if name.blank?
changesets.find_by(:revision => name.to_s) ||
changesets.where('scmid LIKE ?', "#{name}%").first
end
|
#heads_from_branches_hash ⇒ Object
232
233
234
235
236
|
# File 'app/models/repository/git.rb', line 232
def heads_from_branches_hash
h = .dup || {}
h["branches"] ||= {}
h['branches'].map{|br, hs| hs['last_scmid']}
end
|
#latest_changesets(path, rev, limit = 10) ⇒ Object
238
239
240
241
242
243
|
# File 'app/models/repository/git.rb', line 238
def latest_changesets(path, rev, limit=10)
revisions = scm.revisions(path, nil, rev, :limit => limit, :all => false)
return [] if revisions.blank?
changesets.where(:scmid => revisions.map(&:scmid)).to_a
end
|
#repo_log_encoding ⇒ Object
63
64
65
|
# File 'app/models/repository/git.rb', line 63
def repo_log_encoding
'UTF-8'
end
|
#report_last_commit ⇒ Object
42
43
44
45
46
47
48
49
|
# File 'app/models/repository/git.rb', line 42
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
51
52
53
|
# File 'app/models/repository/git.rb', line 51
def report_last_commit=(arg)
"extra_report_last_commit" => arg
end
|
#supports_directory_revisions? ⇒ Boolean
55
56
57
|
# File 'app/models/repository/git.rb', line 55
def supports_directory_revisions?
true
end
|
#supports_revision_graph? ⇒ Boolean
59
60
61
|
# File 'app/models/repository/git.rb', line 59
def supports_revision_graph?
true
end
|
81
82
83
|
# File 'app/models/repository/git.rb', line 81
def tags
scm.tags
end
|