summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDouwe Maan <douwe@gitlab.com>2016-03-17 14:16:55 +0000
committerDouwe Maan <douwe@gitlab.com>2016-03-17 14:16:55 +0000
commit69e966d9a5df198c24ac46b7a8ba6b5a0e16e7bc (patch)
treebae25dffb903686dd24c75a97c7a241910470df0 /lib
parent21af7459ab6f3049a98cfdaa6dda8dc2336098d8 (diff)
parentf54bf00309e310cabb2fec55d860f0670f3b79ac (diff)
downloadgitlab-ce-69e966d9a5df198c24ac46b7a8ba6b5a0e16e7bc.tar.gz
Merge branch 'patch/refactor-post-receive' into 'master'
PostReceive refactor Back-ported PostReceive refactor made for https://gitlab.com/gitlab-org/gitlab-ee/issues/367 in https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/267 See merge request !3264
Diffstat (limited to 'lib')
-rw-r--r--lib/gitlab/git_post_receive.rb60
1 files changed, 60 insertions, 0 deletions
diff --git a/lib/gitlab/git_post_receive.rb b/lib/gitlab/git_post_receive.rb
new file mode 100644
index 00000000000..a088e19d1e7
--- /dev/null
+++ b/lib/gitlab/git_post_receive.rb
@@ -0,0 +1,60 @@
+module Gitlab
+ class GitPostReceive
+ include Gitlab::Identifier
+ attr_reader :repo_path, :identifier, :changes, :project
+
+ def initialize(repo_path, identifier, changes)
+ repo_path.gsub!(/\.git\z/, '')
+ repo_path.gsub!(/\A\//, '')
+
+ @repo_path = repo_path
+ @identifier = identifier
+ @changes = deserialize_changes(changes)
+
+ retrieve_project_and_type
+ end
+
+ def wiki?
+ @type == :wiki
+ end
+
+ def regular_project?
+ @type == :project
+ end
+
+ def identify(revision)
+ super(identifier, project, revision)
+ end
+
+ private
+
+ def retrieve_project_and_type
+ @type = :project
+ @project = Project.find_with_namespace(@repo_path)
+
+ if @repo_path.end_with?('.wiki') && !@project
+ @type = :wiki
+ @project = Project.find_with_namespace(@repo_path.gsub(/\.wiki\z/, ''))
+ end
+ end
+
+ def deserialize_changes(changes)
+ changes = Base64.decode64(changes) unless changes.include?(' ')
+ changes = utf8_encode_changes(changes)
+ changes.lines
+ end
+
+ def utf8_encode_changes(changes)
+ changes = changes.dup
+
+ changes.force_encoding('UTF-8')
+ return changes if changes.valid_encoding?
+
+ # Convert non-UTF-8 branch/tag names to UTF-8 so they can be dumped as JSON.
+ detection = CharlockHolmes::EncodingDetector.detect(changes)
+ return changes unless detection && detection[:encoding]
+
+ CharlockHolmes::Converter.convert(changes, detection[:encoding], 'UTF-8')
+ end
+ end
+end