summaryrefslogtreecommitdiff
path: root/app/models
diff options
context:
space:
mode:
Diffstat (limited to 'app/models')
-rw-r--r--app/models/commit.rb15
-rw-r--r--app/models/commit_range.rb11
-rw-r--r--app/models/concerns/referable.rb19
-rw-r--r--app/models/issue.rb11
-rw-r--r--app/models/merge_request.rb11
-rw-r--r--app/models/snippet.rb11
6 files changed, 66 insertions, 12 deletions
diff --git a/app/models/commit.rb b/app/models/commit.rb
index 492f6be1ce3..fc03d2580d7 100644
--- a/app/models/commit.rb
+++ b/app/models/commit.rb
@@ -73,16 +73,23 @@ class Commit
# This pattern supports cross-project references.
def self.reference_pattern
%r{
- (?:#{Project.reference_pattern}#{reference_prefix})?
- (?<commit>\h{6,40})
+ #{link_reference_pattern} |
+ (?:
+ (?:#{Project.reference_pattern}#{reference_prefix})?
+ (?<commit>\h{6,40})
+ )
}x
end
+ def self.link_reference_pattern
+ super("commit", /(?<commit>\h{6,40})/)
+ end
+
def to_reference(from_project = nil)
if cross_project_reference?(from_project)
- "#{project.to_reference}@#{id}"
+ project.to_reference + self.class.reference_prefix + self.short_id
else
- id
+ self.short_id
end
end
diff --git a/app/models/commit_range.rb b/app/models/commit_range.rb
index fd23e24aff6..98067771b71 100644
--- a/app/models/commit_range.rb
+++ b/app/models/commit_range.rb
@@ -42,11 +42,18 @@ class CommitRange
# This pattern supports cross-project references.
def self.reference_pattern
%r{
- (?:#{Project.reference_pattern}#{reference_prefix})?
- (?<commit_range>#{PATTERN})
+ #{link_reference_pattern} |
+ (?:
+ (?:#{Project.reference_pattern}#{reference_prefix})?
+ (?<commit_range>#{PATTERN})
+ )
}x
end
+ def self.link_reference_pattern
+ super("compare", /(?<commit_range>#{PATTERN})/)
+ end
+
# Initialize a CommitRange
#
# range_string - The String commit range.
diff --git a/app/models/concerns/referable.rb b/app/models/concerns/referable.rb
index cced66cc1e4..16e4d054869 100644
--- a/app/models/concerns/referable.rb
+++ b/app/models/concerns/referable.rb
@@ -44,6 +44,25 @@ module Referable
def reference_pattern
raise NotImplementedError, "#{self} does not implement #{__method__}"
end
+
+ def link_reference_pattern(route, pattern)
+ %r{
+ (?<url>
+ #{Regexp.escape(Gitlab.config.gitlab.url)}
+ \/#{Project.reference_pattern}
+ \/#{Regexp.escape(route)}
+ \/#{pattern}
+ (?<path>
+ (\/[a-z0-9_=-]+)*
+ )?
+ (?<query>
+ \?[a-z0-9_=-]+
+ (&[a-z0-9_=-]+)*
+ )?
+ (?<anchor>\#[a-z0-9_-]+)?
+ )
+ }x
+ end
end
private
diff --git a/app/models/issue.rb b/app/models/issue.rb
index 72183108033..e62acfdfd91 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -64,11 +64,18 @@ class Issue < ActiveRecord::Base
# This pattern supports cross-project references.
def self.reference_pattern
%r{
- (#{Project.reference_pattern})?
- #{Regexp.escape(reference_prefix)}(?<issue>\d+)
+ #{link_reference_pattern} |
+ (?:
+ (#{Project.reference_pattern})?
+ #{Regexp.escape(reference_prefix)}(?<issue>\d+)
+ )
}x
end
+ def self.link_reference_pattern
+ super("issues", /(?<issue>\d+)/)
+ end
+
def to_reference(from_project = nil)
reference = "#{self.class.reference_prefix}#{iid}"
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 939df8cd8d1..c1d3874adee 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -146,11 +146,18 @@ class MergeRequest < ActiveRecord::Base
# This pattern supports cross-project references.
def self.reference_pattern
%r{
- (#{Project.reference_pattern})?
- #{Regexp.escape(reference_prefix)}(?<merge_request>\d+)
+ #{link_reference_pattern} |
+ (?:
+ (#{Project.reference_pattern})?
+ #{Regexp.escape(reference_prefix)}(?<merge_request>\d+)
+ )
}x
end
+ def self.link_reference_pattern
+ super("merge_requests", /(?<merge_request>\d+)/)
+ end
+
def to_reference(from_project = nil)
reference = "#{self.class.reference_prefix}#{iid}"
diff --git a/app/models/snippet.rb b/app/models/snippet.rb
index b0831982aa7..8ec12ddf6ef 100644
--- a/app/models/snippet.rb
+++ b/app/models/snippet.rb
@@ -60,11 +60,18 @@ class Snippet < ActiveRecord::Base
# This pattern supports cross-project references.
def self.reference_pattern
%r{
- (#{Project.reference_pattern})?
- #{Regexp.escape(reference_prefix)}(?<snippet>\d+)
+ #{link_reference_pattern} |
+ (?:
+ (#{Project.reference_pattern})?
+ #{Regexp.escape(reference_prefix)}(?<snippet>\d+)
+ )
}x
end
+ def self.link_reference_pattern
+ super("snippets", /(?<snippet>\d+)/)
+ end
+
def to_reference(from_project = nil)
reference = "#{self.class.reference_prefix}#{id}"