使用issue_closing_pattern变量来关闭gitlab中的多个问题

wul*_*lxz 5 ruby regex gitlab

我希望能够通过引用默认模式的多个问题来解决一个提交的多个问题^([Cc]loses|[Ff]ixes) +#\d+a.我知道这只会影响fixes #number行开头的模式,这就是我想要的.
但我还没有能够让它发挥作用.
我目前正在使用Gitlab 6.1,根据github上的安装自述文件安装它,除了下面的代码片段之外没有更改任何其他内容.
这是我试过的:

首先我更改{gitlab-directory}/app/models/commit.rb 了以下内容(原始代码已注释掉):

def closes_issues project
    md = safe_message.scan(/(?i)((\[)\s*(close|fix)(s|es|d|ed)*\s*#\d+\s*(\])|(\()\s*(close|fix)(s|es|d|ed)*\s*#\d+\s*(\)))/)
    #md = issue_closing_regex.match(safe_message)
    if md
      extractor = Gitlab::ReferenceExtractor.new
      md.each do |n|
       extractor.analyze(n[0])
      end
      extractor.issues_for(project)
      #extractor = Gitlab::ReferenceExtractor.new
      #extractor.analyze(md[0])
      #extractor.issues_for(project)
    else
      []
    end
  end
Run Code Online (Sandbox Code Playgroud)

但是这段代码中使用的正则表达式不符合我的需要,并且不是很正确(例如:(fixs #123)并且(closees #123)两者都有效).
在测试了这个代码片段并确认这个代码片段与代码片段中使用的正则表达式匹配的模式后,我尝试更改正则表达式.起初,我尝试在第二行中执行此操作:

md  safe_message.scan(/#{Gitlab.config.gitlab.issue_closing_pattern}/)
Run Code Online (Sandbox Code Playgroud)

这个没用.我没有发现任何错误消息,log/unicorn.stderr.log所以我尝试直接使用配置文件中的默认正则表达而没有变量:

md safe_message.scan(/^([Cc]loses|[Ff]ixes) +#\d+a/)
Run Code Online (Sandbox Code Playgroud)

但是这个也不起作用.再次,没有错误消息log/unicorn.stderr.log.

如何issue_closing_pattern在此代码段中将配置文件中的变量用作正则表达式?

Ash*_*son 4

如果您提供给String#scan方法的正则表达式包含捕获组,它将返回一个数组数组,其中包含每个组匹配的模式:

irb(main):014:0> regex = "^([Cc]loses|[Ff]ixes) +#\\d+"
=> "^([Cc]loses|[Ff]ixes) +#\\d+"
irb(main):017:0> safe_message = "foo\ncloses #1\nfixes #2\nbar"
=> "foo\ncloses #1\nfixes #2\nbar"
irb(main):018:0> safe_message.scan(/#{regex}/)
=> [["closes"], ["fixes"]]
Run Code Online (Sandbox Code Playgroud)

因为默认的正则表达式有一个仅用于“关闭/修复”位的捕获组,所以这就是循环看到的所有内容,并且这些字符串不包含问题引用!要修复它,只需在整个模式周围添加一个捕获组:

irb(main):019:0> regex = "^(([Cc]loses|[Ff]ixes) +#\\d+)"
=> "^(([Cc]loses|[Ff]ixes) +#\\d+)"
irb(main):020:0> safe_message.scan(/#{regex}/)
=> [["closes #1", "closes"], ["fixes #2", "fixes"]]
Run Code Online (Sandbox Code Playgroud)