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=, #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
70
71
72
|
# File 'app/models/repository/git.rb', line 70
def self.changeset_identifier(changeset)
changeset.scmid
end
|
Returns the readable identifier for the given git changeset
75
76
77
|
# File 'app/models/repository/git.rb', line 75
def self.format_changeset_identifier(changeset)
changeset.revision[0, 8]
end
|
.human_attribute_name(attribute_key_name, *args) ⇒ Object
28
29
30
31
32
33
34
|
# File 'app/models/repository/git.rb', line 28
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
.scm_name ⇒ Object
40
41
42
|
# File 'app/models/repository/git.rb', line 40
def self.scm_name
'Git'
end
|
Instance Method Details
#branches ⇒ Object
79
80
81
|
# File 'app/models/repository/git.rb', line 79
def branches
scm.branches
end
|
#default_branch ⇒ Object
87
88
89
90
91
92
|
# File 'app/models/repository/git.rb', line 87
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)
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
# File 'app/models/repository/git.rb', line 134
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.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
94
95
96
97
98
99
|
# File 'app/models/repository/git.rb', line 94
def find_changeset_by_name(name)
if name.present?
changesets.find_by(:revision => name.to_s) ||
changesets.where('scmid LIKE ?', "#{name}%").first
end
end
|
#heads_from_branches_hash ⇒ Object
240
241
242
243
244
245
|
# File 'app/models/repository/git.rb', line 240
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
247
248
249
250
251
252
|
# File 'app/models/repository/git.rb', line 247
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
65
66
67
|
# File 'app/models/repository/git.rb', line 65
def repo_log_encoding
'UTF-8'
end
|
#report_last_commit ⇒ Object
44
45
46
47
48
49
50
51
|
# File 'app/models/repository/git.rb', line 44
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
53
54
55
|
# File 'app/models/repository/git.rb', line 53
def report_last_commit=(arg)
"extra_report_last_commit" => arg
end
|
#supports_directory_revisions? ⇒ Boolean
57
58
59
|
# File 'app/models/repository/git.rb', line 57
def supports_directory_revisions?
true
end
|
#supports_revision_graph? ⇒ Boolean
61
62
63
|
# File 'app/models/repository/git.rb', line 61
def supports_revision_graph?
true
end
|
83
84
85
|
# File 'app/models/repository/git.rb', line 83
def tags
scm.tags
end
|