2013-10-28 5 views
5

デフォルトパターン^([Cc]loses|[Ff]ixes) +#\d+aで複数の問題を参照することで、1回のコミットで複数の問題を閉じることができます。私はこれが行の先頭にあるfixes #numberパターンにしか影響しないと知っています。それが私が望むものです。
しかし、私はまだそれを動作させることができませんでした。
私は現在Gitlab 6.1を使用していますが、githubのインストールのreadmeに従ってインストールし、以下のコードニップ以外は変更しませんでした。gitlabの複数の問題を閉じるにはissue_closing_pattern変数を使用してください

まず、私は{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)は両方とも動作します)。
このコードニットをテストし、スニペットで使用されている正規表現と一致するパターンで動作することを確認した後、正規表現を変更しようとしました。最初は、2行目でこれを実行しようとしました。

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

この1つは機能しませんでした。私はlog/unicorn.stderr.logにおけるすべてのエラーメッセージが私は直接変数せずに設定ファイルからデフォルトの正規表現を使用しようとしましたが見つかりませんでした:

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

しかし、これはあまりにも、動作しませんでした。再び、log/unicorn.stderr.logにエラーメッセージはありません。

このコードスニペットのconfigファイルから変数issue_closing_patternを正規表現パターンとして使用するにはどうすればよいですか?

+2

なぜdownvote ???私はコード(gitlabから)に特有の問題があり、faqによれば、これはここに属する質問です。 – wullxz

+0

これがあなたの問題全体であるかどうかは分かりませんが、あなたの正規表現には余分な "a"があります。デフォルトは '/([Cc] loses | [Ff] ixes)+#\ d + /' ref:https://github.com/gitlabhq/gitlabhq/blob/master/config/gitlab.yml.example#L62です。 –

+0

おっと...私はvimで設定ファイルを調べたときにそれが起こったに違いありません。私はそれなしで試してみる。しかし、まだ:私は変数を設定する '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-endingについてもう少しフレキシブルに変更しました: '^(([Cc] lose(s | d)?| [Ff] ix(ed | es)?)+#\ d +)' – wullxz

関連する問題