diff options
Diffstat (limited to 'app/models/commit.rb')
-rw-r--r-- | app/models/commit.rb | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/app/models/commit.rb b/app/models/commit.rb new file mode 100644 index 0000000..665f136 --- /dev/null +++ b/app/models/commit.rb @@ -0,0 +1,97 @@ +# == Schema Information +# +# Table name: commits +# +# id :integer not null, primary key +# project_id :integer +# ref :string(255) +# sha :string(255) +# before_sha :string(255) +# push_data :text +# created_at :datetime +# updated_at :datetime +# + +class Commit < ActiveRecord::Base + belongs_to :project + has_many :builds + + serialize :push_data + + validates_presence_of :ref, :sha, :before_sha, :push_data + validate :valid_commit_sha + + def last_build + builds.last + end + + def valid_commit_sha + if self.sha =~ /\A00000000/ + self.errors.add(:sha, " cant be 00000000 (branch removal)") + end + end + + def compare? + gitlab? && before_sha + end + + def gitlab? + project.gitlab? + end + + def ci_skip? + !!(git_commit_message =~ /(\[ci skip\])/) + end + + def git_author_name + commit_data[:author][:name] if commit_data && commit_data[:author] + end + + def git_author_email + commit_data[:author][:email] if commit_data && commit_data[:author] + end + + def git_commit_message + commit_data[:message] if commit_data + end + + def short_before_sha + before_sha[0..8] + end + + def short_sha + sha[0..8] + end + + def commit_data + push_data[:commits].each do |commit| + return commit if commit[:id] == sha + end + rescue + nil + end + + # Build a clone-able repo url + # using http and basic auth + def repo_url + auth = "gitlab-ci-token:#{project.token}@" + url = project.gitlab_url + ".git" + url.sub(/^https?:\/\//) do |prefix| + prefix + auth + end + end + + def allow_git_fetch + project.allow_git_fetch + end + + def project_name + project.name + end + + def project_recipients + recipients = project.email_recipients.split(' ') + recipients << git_author_email if project.email_add_committer? + recipients.uniq + end +end |