commit

in lib/gitlab_git/blob.rb [126:199]


        def commit(repository, options, action = :add)
          file = options[:file]
          update = file[:update].nil? ? true : file[:update]
          author = options[:author]
          committer = options[:committer]
          commit = options[:commit]
          repo = repository.rugged
          ref = commit[:branch]
          update_ref = commit[:update_ref].nil? ? true : commit[:update_ref]
          parents = []
          mode = 0o100644

          unless ref.start_with?('refs/')
            ref = 'refs/heads/' + ref
          end

          path_name = PathHelper.normalize_path(file[:path])
          
          raise Repository::InvalidBlobName.new("Invalid path") if path_name.each_filename.to_a.include?('..')

          filename = path_name.to_s
          index = repo.index

          unless repo.empty?
            rugged_ref = repo.references[ref]
            raise Repository::InvalidRef.new("Invalid branch name") unless rugged_ref
            last_commit = rugged_ref.target
            index.read_tree(last_commit.tree)
            parents = [last_commit]
          end

          if action == :remove
            index.remove(filename)
          else
            file_entry = index.get(filename)

            if action == :rename
              old_path_name = PathHelper.normalize_path(file[:previous_path])
              old_filename = old_path_name.to_s
              file_entry = index.get(old_filename)
              index.remove(old_filename) unless file_entry.blank?
            end

            if file_entry
              raise Repository::InvalidBlobName.new("Filename already exists; update not allowed") unless update

              
              mode = file_entry[:mode] if file_entry[:mode]
            end

            content = file[:content]
            detect = CharlockHolmes::EncodingDetector.new.detect(content) if content

            unless detect && detect[:type] == :binary
              
              
              content.gsub!("\r\n", "\n") if repository.autocrlf
            end

            oid = repo.write(content, :blob)
            index.add(path: filename, oid: oid, mode: mode)
          end

          opts = {}
          opts[:tree] = index.write_tree(repo)
          opts[:author] = author
          opts[:committer] = committer
          opts[:message] = commit[:message]
          opts[:parents] = parents
          opts[:update_ref] = ref if update_ref

          Rugged::Commit.create(repo, opts)
        end