Class: Repository::Git
Overview
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, #safe_attribute?, #safe_attribute_names, #safe_attributes=
cipher_key, decrypt_text, encrypt_text, logger
Class Method Details
.changeset_identifier(changeset) ⇒ Object
Returns the identifier for the given git changeset
65
66
67
|
# File 'app/models/repository/git.rb', line 65
def self.changeset_identifier(changeset)
changeset.scmid
end
|
Returns the readable identifier for the given git changeset
70
71
72
|
# File 'app/models/repository/git.rb', line 70
def self.format_changeset_identifier(changeset)
changeset.revision[0, 8]
end
|
.human_attribute_name(attribute_key_name, *args) ⇒ Object
25
26
27
28
29
30
31
|
# File 'app/models/repository/git.rb', line 25
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
37
38
39
|
# File 'app/models/repository/git.rb', line 37
def self.scm_name
'Git'
end
|
Instance Method Details
#branches ⇒ Object
74
75
76
|
# File 'app/models/repository/git.rb', line 74
def branches
scm.branches
end
|
#default_branch ⇒ Object
82
83
84
85
86
87
|
# File 'app/models/repository/git.rb', line 82
def default_branch
scm.default_branch
rescue Exception => e
logger.error "git: error during get default branch: #{e.message}"
nil
end
|
45
46
47
48
49
50
|
# File 'app/models/repository/git.rb', line 45
def
return false if .nil?
v = ["extra_report_last_commit"]
return false if v.nil?
v.to_s != '0'
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)
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
# File 'app/models/repository/git.rb', line 129
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
89
90
91
92
93
94
|
# File 'app/models/repository/git.rb', line 89
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
234
235
236
237
238
239
|
# File 'app/models/repository/git.rb', line 234
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
241
242
243
244
245
|
# File 'app/models/repository/git.rb', line 241
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
60
61
62
|
# File 'app/models/repository/git.rb', line 60
def repo_log_encoding
'UTF-8'
end
|
#report_last_commit ⇒ Object
41
42
43
|
# File 'app/models/repository/git.rb', line 41
def report_last_commit
end
|
#supports_directory_revisions? ⇒ Boolean
52
53
54
|
# File 'app/models/repository/git.rb', line 52
def supports_directory_revisions?
true
end
|
#supports_revision_graph? ⇒ Boolean
56
57
58
|
# File 'app/models/repository/git.rb', line 56
def supports_revision_graph?
true
end
|
78
79
80
|
# File 'app/models/repository/git.rb', line 78
def tags
scm.tags
end
|