2013-10-28 17 views
5

我希望能够通过引用具有默认模式^([Cc]loses|[Ff]ixes) +#\d+a的多个问题的一个提交来关闭多个问题。我知道这只会影响fixes #number-模式的开始行,这就是我想要的。
但我还没有得到它的工作。
我目前正在使用Gitlab 6.1,根据github上的安装自述安装它,并没有改变任何其他下面的codesnippet。
这里是我的尝试:使用issue_closing_pattern变量来关闭gitlab中的多个问题

首先,我在{gitlab-directory}/app/models/commit.rbthe following(注释掉原代码)改为:

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)都可以)。
在测试了这个codesnippet并确认它可以处理与片段中使用的正则表达式匹配的模式之后,我试着改变正则表达式。起初,我试图在第二行做到这一点:

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作为正则表达式模式?

+2

为什么downvote ???我有一个代码的特定问题(来自gitlab),根据常见问题,这是一个属于这里的问题。 – wullxz

+0

我不确定这是否是您的整个问题,但您的正则表达式中有一个额外的“a”。默认的是'/([Cc]丢失| [Ff] ixes)+#\ d + /'ref:https://github.com/gitlabhq/gitlabhq/blob/master/config/gitlab.yml.example#L62 –

+0

oops ...当我使用vim检查配置文件时,一定会发生这种情况。我会尝试没有a。但仍然:我在'config/gitlab.yml'中注释了设置变量的行。因此,使用配置文件中的变量[...](/#{Gitlab。[...]} /)'仍然不起作用。那里有什么错误? – wullxz

回答

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

你对捕捉小组的暗示是正确的。我还将正则表达式更改为关于es/ed结尾的更加灵活:'^(([Cc] lose(s | d)?| [Ff] ix(ed | es)?)+#\ d +)' – wullxz