Skip to content
Snippets Groups Projects
git_post_receive.rb 1.49 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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