Class: Release

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/release.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#commit_not_found_error_messageObject (readonly)

Returns the value of attribute commit_not_found_error_message.



137
138
139
# File 'app/models/release.rb', line 137

def commit_not_found_error_message
  @commit_not_found_error_message
end

Class Method Details

.after(time) ⇒ Object



54
55
56
57
# File 'app/models/release.rb', line 54

def after(time)
  return all if time.nil?
  where(arel_table[:created_at].gt(time))
end

.before(time) ⇒ Object



49
50
51
52
# File 'app/models/release.rb', line 49

def before(time)
  return all if time.nil?
  where(arel_table[:created_at].lt(time))
end

.earliestObject



63
64
65
# File 'app/models/release.rb', line 63

def earliest
  last
end

.for_deploy(deploy) ⇒ Object



40
41
42
# File 'app/models/release.rb', line 40

def for_deploy(deploy)
  where(deploy_id: deploy.id)
end

.for_projects(*projects) ⇒ Object



35
36
37
38
# File 'app/models/release.rb', line 35

def for_projects(*projects)
  ids = projects.flatten.map { |project| project.is_a?(Project) ? project.id : project }
  where(project_id: ids)
end

.latestObject



59
60
61
# File 'app/models/release.rb', line 59

def latest
  first
end

.most_recentObject



71
72
73
74
75
76
77
78
79
80
81
82
# File 'app/models/release.rb', line 71

def most_recent
  joins <<-SQL
    INNER JOIN (
      SELECT project_id, environment_name, MAX(created_at) AS created_at
      FROM releases
      GROUP BY project_id, environment_name
    ) AS most_recent_releases
    ON releases.project_id=most_recent_releases.project_id
    AND releases.environment_name=most_recent_releases.environment_name
    AND releases.created_at=most_recent_releases.created_at
  SQL
end

.most_recent_commitObject



44
45
46
47
# File 'app/models/release.rb', line 44

def most_recent_commit
  release = where(arel_table[:commit1].not_eq("")).first
  release ? release.commit1 : Houston::NULL_GIT_COMMIT
end

.reindex!Object



84
85
86
# File 'app/models/release.rb', line 84

def reindex!
  update_all "search_vector = to_tsvector('english', release_changes)"
end

.search(query_string) ⇒ Object



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'app/models/release.rb', line 88

def search(query_string)
  config = PgSearch::Configuration.new({against: "plain_text"}, self)
  normalizer = PgSearch::Normalizer.new(config)
  options = { dictionary: "english", tsvector_column: "search_vector" }
  query = PgSearch::Features::TSearch.new(query_string, options, config.columns, self, normalizer)

  excerpt = ts_headline(:release_changes, query,
    start_sel: "<em>",
    stop_sel: "</em>",

    # Hack: show the entire value of `release_changes`
    min_words: 65534,
    max_words: 65535,
    max_fragments: 0)

  columns = (column_names - %w{release_changes search_vector}).map { |column| "releases.\"#{column}\"" }
  columns.push excerpt.as("release_changes")
  where(query.conditions).select(*columns)
end

.to_environment(environment_name) ⇒ Object Also known as: to



30
31
32
# File 'app/models/release.rb', line 30

def to_environment(environment_name)
  where(environment_name: environment_name)
end

.with_messageObject



67
68
69
# File 'app/models/release.rb', line 67

def with_message
  where arel_table[:message].not_eq("")
end

Instance Method Details

#antecedentsObject



192
193
194
195
196
197
# File 'app/models/release.rb', line 192

def antecedents
  @antecedents ||= (tickets.map(&:antecedents) + commits.map(&:antecedents))
    .flatten
    .uniq
    .sort
end

#build_changes_from_commitsObject



176
177
178
179
180
# File 'app/models/release.rb', line 176

def build_changes_from_commits
  self.release_changes = commits
    .map { |commit| ReleaseChange.from_commit(self, commit) }
    .reject { |change| change.tag.nil? }
end

#can_read_commits?Boolean

Returns:

  • (Boolean)


127
128
129
# File 'app/models/release.rb', line 127

def can_read_commits?
  (commit_before.present? || commit0 == Houston::NULL_GIT_COMMIT) && commit_after.present?
end

#commit0Object



111
112
113
# File 'app/models/release.rb', line 111

def commit0
  super || commit_before.try(:sha)
end

#commit0=(sha) ⇒ Object



115
116
117
# File 'app/models/release.rb', line 115

def commit0=(sha)
  super; self.commit_before = identify_commit(sha)
end

#commit1Object



119
120
121
# File 'app/models/release.rb', line 119

def commit1
  super || commit_after.try(:sha)
end

#commit1=(sha) ⇒ Object



123
124
125
# File 'app/models/release.rb', line 123

def commit1=(sha)
  super; self.commit_after = identify_commit(sha)
end

#environment_name=(value) ⇒ Object



131
132
133
# File 'app/models/release.rb', line 131

def environment_name=(value)
  super value.downcase
end

#ignore?Boolean

Returns:

  • (Boolean)


201
202
203
# File 'app/models/release.rb', line 201

def ignore?
  !project.show_release_notes_for?(environment_name)
end

#load_commits!Object



182
183
184
# File 'app/models/release.rb', line 182

def load_commits!
  self.commits = project.commits.between(commit_before, commit_after)
end

#load_tickets!Object



186
187
188
# File 'app/models/release.rb', line 186

def load_tickets!
  self.tickets = project.tickets.mentioned_by_commits(commits)
end

#message=(value) ⇒ Object



156
157
158
# File 'app/models/release.rb', line 156

def message=(value)
  super value.to_s.strip
end

#nameObject



152
153
154
# File 'app/models/release.rb', line 152

def name
  release_date.strftime("%A, %b %e, %Y")
end

#notification_recipientsObject



205
206
207
# File 'app/models/release.rb', line 205

def notification_recipients
  @notification_recipients ||= project.followers.unretired
end

#release_changesObject



160
161
162
# File 'app/models/release.rb', line 160

def release_changes
  super.lines.map { |s| ReleaseChange.from_s(self, s) }
end

#release_changes=(changes) ⇒ Object



164
165
166
# File 'app/models/release.rb', line 164

def release_changes=(changes)
  super changes.map(&:to_s).join("\n")
end

#release_changes_attributes=(params) ⇒ Object



168
169
170
171
172
# File 'app/models/release.rb', line 168

def release_changes_attributes=(params)
  self.release_changes = params.values
    .reject { |attrs| attrs["_destroy"] == "1" }
    .map { |attrs| ReleaseChange.new(self, attrs["tag_slug"], attrs["description"]) }
end

#release_dateObject Also known as: date



145
146
147
# File 'app/models/release.rb', line 145

def release_date
  released_at.to_date
end

#released_atObject



141
142
143
# File 'app/models/release.rb', line 141

def released_at
  deploy ? deploy.completed_at : created_at
end

#search_vector_should_change?Boolean

Returns:

  • (Boolean)


215
216
217
# File 'app/models/release.rb', line 215

def search_vector_should_change?
  (changed & %w{release_changes}).any?
end

#update_search_vectorObject



211
212
213
# File 'app/models/release.rb', line 211

def update_search_vector
  self.class.where(id: id).reindex!
end