2013-10-28 15 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