5

我希望能够通过使用默认模式引用多个问题来通过一次提交来关闭多个问题^([Cc]loses|[Ff]ixes) +#\d+a。我知道这只会影响fixes #number行首的 -patterns ,这就是我想要的。
但我还不能让它工作。
我目前正在使用 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

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

md  safe_message.scan(/#{Gitlab.config.gitlab.issue_closing_pattern}/)

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

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

但是这个也没有用。同样,在log/unicorn.stderr.log.

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

4

1 回答 1

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"]]

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

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"]]
于 2013-10-28T15:31:35.697 回答