Move regexp definitions from Gitlab::Regex into domain specific locations

Everyone can contribute. Help move this issue forward while earning points, leveling up and collecting rewards.

Problem

Gitlab::Regex contains a lot of regular expression definitions for cross-domain concerns.

Proposed solution

Move these definitions into related domain namespaces.

For example, Gitlab::Regex::Package could go into Packages or Packages::Regexp.

Performance note

Most regular expressions are defined in a method which caches the regex via an ivar (on module level because of extend self). However, using the uncached version or defining regexs as constants is faster.

Click to expand
# frozen_string_literal: true

require "benchmark/ips"

class A
  CONST = %r{\Aregex\z}

  def cached
    @cached ||= %r{\Aregex\z}
  end

  def normal
    %r{\Aregex\z}
  end
end

a = A.new

Benchmark.ips do |x|
  x.report "cached" do
    a.cached.match?("regex")
  end

  x.report "normal" do
    a.normal.match?("regex")
  end

  x.report "const" do
    A::CONST.match?("regex")
  end

  x.compare!
end
Warming up --------------------------------------
              cached   985.232k i/100ms
              normal     1.012M i/100ms
               const     1.139M i/100ms
Calculating -------------------------------------
              cached      9.630M (± 3.0%) i/s -     48.276M in   5.018028s
              normal      9.820M (± 6.8%) i/s -     49.586M in   5.081352s
               const     11.089M (± 3.8%) i/s -     55.797M in   5.038982s

Comparison:
               const: 11089330.2 i/s
              normal:  9820407.1 i/s - 1.13x  slower
              cached:  9629627.0 i/s - 1.15x  slower
Edited by 🤖 GitLab Bot 🤖