diff options
author | Kestred <kestred@riotcave.com> | 2014-08-23 22:27:52 -0700 |
---|---|---|
committer | Kestred <kestred@riotcave.com> | 2014-08-23 22:27:52 -0700 |
commit | 18f954b31c242822b6c7430a50ca99a93adc6ea6 (patch) | |
tree | b7ee4acac738d5b64b6fcfaf909756f784dd2d61 /app/models/commit.rb | |
parent | 2eb3d91e1a6e51d3ca0be2fe0a5df750708b366d (diff) | |
download | gitlab-ci-18f954b31c242822b6c7430a50ca99a93adc6ea6.tar.gz |
Separate Commit model and logic from Build model|etc...
This is an entirely non-user facing change which prepares GitLab CI for future support of Parallel Builds.
See https://about.gitlab.com/2013/12/19/gitlab-ci-with-parallel-builds-and-deployments/.
These changes specifically avoid changing the supported API or changing any of the website views.
Changes to the website views will come in tandem with future features like "Multiple build scripts".
The supported API won't change as part of any future changes on this vein, to maintain support for the unofficial GitLab CI runners.
This closes the following implementation step:
1. A commit has many builds
Signed-off-by: Kestred <kestred@riotcave.com>
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 |