summaryrefslogtreecommitdiff
path: root/app/services/ci/create_commit_service.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/ci/create_commit_service.rb')
-rw-r--r--app/services/ci/create_commit_service.rb50
1 files changed, 50 insertions, 0 deletions
diff --git a/app/services/ci/create_commit_service.rb b/app/services/ci/create_commit_service.rb
new file mode 100644
index 00000000000..0a1abf89a95
--- /dev/null
+++ b/app/services/ci/create_commit_service.rb
@@ -0,0 +1,50 @@
+module Ci
+ class CreateCommitService
+ def execute(project, params)
+ before_sha = params[:before]
+ sha = params[:checkout_sha] || params[:after]
+ origin_ref = params[:ref]
+
+ unless origin_ref && sha.present?
+ return false
+ end
+
+ ref = origin_ref.gsub(/\Arefs\/(tags|heads)\//, '')
+
+ # Skip branch removal
+ if sha == Ci::Git::BLANK_SHA
+ return false
+ end
+
+ commit = project.commits.find_by_sha_and_ref(sha, ref)
+
+ # Create commit if not exists yet
+ unless commit
+ data = {
+ ref: ref,
+ sha: sha,
+ tag: origin_ref.start_with?('refs/tags/'),
+ before_sha: before_sha,
+ push_data: {
+ before: before_sha,
+ after: sha,
+ ref: ref,
+ user_name: params[:user_name],
+ user_email: params[:user_email],
+ repository: params[:repository],
+ commits: params[:commits],
+ total_commits_count: params[:total_commits_count],
+ ci_yaml_file: params[:ci_yaml_file]
+ }
+ }
+
+ commit = project.commits.create(data)
+ end
+
+ commit.update_committed!
+ commit.create_builds unless commit.builds.any?
+
+ commit
+ end
+ end
+end