OSDN Git Service

Refactor post-receive worker
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Mon, 29 Apr 2013 06:43:18 +0000 (09:43 +0300)
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Mon, 29 Apr 2013 06:43:18 +0000 (09:43 +0300)
app/workers/post_receive.rb
lib/gitlab/identifier.rb [new file with mode: 0644]

index 132f1a6..6416aa6 100644 (file)
@@ -1,5 +1,6 @@
 class PostReceive
   include Sidekiq::Worker
+  include Gitlab::Identifier
 
   sidekiq_options queue: :post_receive
 
@@ -8,7 +9,7 @@ class PostReceive
     if repo_path.start_with?(Gitlab.config.gitlab_shell.repos_path.to_s)
       repo_path.gsub!(Gitlab.config.gitlab_shell.repos_path.to_s, "")
     else
-      Gitlab::GitLogger.error("POST-RECEIVE: Check gitlab.yml config for correct gitlab_shell.repos_path variable. \"#{Gitlab.config.gitlab_shell.repos_path}\" does not match \"#{repo_path}\"")
+      log("Check gitlab.yml config for correct gitlab_shell.repos_path variable. \"#{Gitlab.config.gitlab_shell.repos_path}\" does not match \"#{repo_path}\"")
     end
 
     repo_path.gsub!(/.git$/, "")
@@ -17,31 +18,21 @@ class PostReceive
     project = Project.find_with_namespace(repo_path)
 
     if project.nil?
-      Gitlab::GitLogger.error("POST-RECEIVE: Triggered hook for non-existing project with full path \"#{repo_path} \"")
+      log("Triggered hook for non-existing project with full path \"#{repo_path} \"")
       return false
     end
 
-    user = if identifier.blank?
-             # Local push from gitlab
-             email = project.repository.commit(newrev).author_email rescue nil
-             User.find_by_email(email) if email
-
-           elsif identifier =~ /\Auser-\d+\Z/
-             # git push over http
-             user_id = identifier.gsub("user-", "")
-             User.find_by_id(user_id)
-
-           elsif identifier =~ /\Akey-\d+\Z/
-             # git push over ssh
-             key_id = identifier.gsub("key-", "")
-             Key.find_by_id(key_id).try(:user)
-           end
+    user = identify(identifier, project, newrev)
 
     unless user
-      Gitlab::GitLogger.error("POST-RECEIVE: Triggered hook for non-existing user \"#{identifier} \"")
+      log("Triggered hook for non-existing user \"#{identifier} \"")
       return false
     end
 
     GitPushService.new.execute(project, user, oldrev, newrev, ref)
   end
+
+  def log(message)
+    Gitlab::GitLogger.error("POST-RECEIVE: #{message}")
+  end
 end
diff --git a/lib/gitlab/identifier.rb b/lib/gitlab/identifier.rb
new file mode 100644 (file)
index 0000000..19cb5c3
--- /dev/null
@@ -0,0 +1,23 @@
+# Detect user based on identifier like
+# key-13 or user-36 or last commit
+module Gitlab
+  module Indentifier
+    def identify(identifier, project, newrev)
+      if identifier.blank?
+        # Local push from gitlab
+        email = project.repository.commit(newrev).author_email rescue nil
+        User.find_by_email(email) if email
+
+      elsif identifier =~ /\Auser-\d+\Z/
+        # git push over http
+        user_id = identifier.gsub("user-", "")
+        User.find_by_id(user_id)
+
+      elsif identifier =~ /\Akey-\d+\Z/
+        # git push over ssh
+        key_id = identifier.gsub("key-", "")
+        Key.find_by_id(key_id).try(:user)
+      end
+    end
+  end
+end