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 |