diff options
author | Douwe Maan <douwe@gitlab.com> | 2016-03-17 17:16:55 +0300 |
---|---|---|
committer | Douwe Maan <douwe@gitlab.com> | 2016-03-17 17:16:55 +0300 |
commit | 69e966d9a5df198c24ac46b7a8ba6b5a0e16e7bc (patch) | |
tree | bae25dffb903686dd24c75a97c7a241910470df0 /lib | |
parent | 21af7459ab6f3049a98cfdaa6dda8dc2336098d8 (diff) | |
parent | f54bf00309e310cabb2fec55d860f0670f3b79ac (diff) |
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.rb | 60 |
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 |