Commit 395f3a1d20eb250992629054ddaf1b22aaa899a1

Authored by Dmitriy Zaporozhets
2 parents 4873034a e9f1c39e

Merge branch 'feature/internal_ids' of /home/git/repositories/gitlab/gitlabhq

app/assets/javascripts/gfm_auto_complete.js.coffee
@@ -44,7 +44,7 @@ GitLab.GfmAutoComplete = @@ -44,7 +44,7 @@ GitLab.GfmAutoComplete =
44 tpl: @Issues.template 44 tpl: @Issues.template
45 callbacks: 45 callbacks:
46 before_save: (issues) -> 46 before_save: (issues) ->
47 - $.map issues, (i) -> id: i.id, title: sanitize(i.title), search: "#{i.id} #{i.title}" 47 + $.map issues, (i) -> id: i.iid, title: sanitize(i.title), search: "#{i.iid} #{i.title}"
48 48
49 input.one "focus", => 49 input.one "focus", =>
50 $.getJSON(@dataSource).done (data) -> 50 $.getJSON(@dataSource).done (data) ->
app/controllers/projects/issues_controller.rb
@@ -91,7 +91,7 @@ class Projects::IssuesController < Projects::ApplicationController @@ -91,7 +91,7 @@ class Projects::IssuesController < Projects::ApplicationController
91 protected 91 protected
92 92
93 def issue 93 def issue
94 - @issue ||= @project.issues.find(params[:id]) 94 + @issue ||= @project.issues.find_by_iid!(params[:id])
95 end 95 end
96 96
97 def authorize_modify_issue! 97 def authorize_modify_issue!
app/controllers/projects/merge_requests_controller.rb
@@ -132,7 +132,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController @@ -132,7 +132,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
132 end 132 end
133 133
134 def merge_request 134 def merge_request
135 - @merge_request ||= @project.merge_requests.find(params[:id]) 135 + @merge_request ||= @project.merge_requests.find_by_iid!(params[:id])
136 end 136 end
137 137
138 def authorize_modify_merge_request! 138 def authorize_modify_merge_request!
app/controllers/projects_controller.rb
@@ -104,7 +104,7 @@ class ProjectsController < Projects::ApplicationController @@ -104,7 +104,7 @@ class ProjectsController < Projects::ApplicationController
104 def autocomplete_sources 104 def autocomplete_sources
105 @suggestions = { 105 @suggestions = {
106 emojis: Emoji.names, 106 emojis: Emoji.names,
107 - issues: @project.issues.select([:id, :title, :description]), 107 + issues: @project.issues.select([:iid, :title, :description]),
108 members: @project.team.members.sort_by(&:username).map { |user| { username: user.username, name: user.name } } 108 members: @project.team.members.sort_by(&:username).map { |user| { username: user.username, name: user.name } }
109 } 109 }
110 110
app/helpers/events_helper.rb
@@ -109,7 +109,7 @@ module EventsHelper @@ -109,7 +109,7 @@ module EventsHelper
109 else 109 else
110 link_to event_note_target_path(event) do 110 link_to event_note_target_path(event) do
111 content_tag :strong do 111 content_tag :strong do
112 - "#{event.note_target_type} ##{truncate event.note_target_id}" 112 + "#{event.note_target_type} ##{truncate event.note_target_iid}"
113 end 113 end
114 end 114 end
115 end 115 end
app/helpers/issues_helper.rb
@@ -37,23 +37,23 @@ module IssuesHelper @@ -37,23 +37,23 @@ module IssuesHelper
37 end 37 end
38 end 38 end
39 39
40 - def url_for_issue(issue_id) 40 + def url_for_issue(issue_iid)
41 return "" if @project.nil? 41 return "" if @project.nil?
42 42
43 if @project.used_default_issues_tracker? 43 if @project.used_default_issues_tracker?
44 - url = project_issue_url project_id: @project, id: issue_id 44 + url = project_issue_url project_id: @project, id: issue_iid
45 else 45 else
46 url = Gitlab.config.issues_tracker[@project.issues_tracker]["issues_url"] 46 url = Gitlab.config.issues_tracker[@project.issues_tracker]["issues_url"]
47 - url.gsub(':id', issue_id.to_s) 47 + url.gsub(':id', issue_iid.to_s)
48 .gsub(':project_id', @project.id.to_s) 48 .gsub(':project_id', @project.id.to_s)
49 .gsub(':issues_tracker_id', @project.issues_tracker_id.to_s) 49 .gsub(':issues_tracker_id', @project.issues_tracker_id.to_s)
50 end 50 end
51 end 51 end
52 52
53 - def title_for_issue(issue_id) 53 + def title_for_issue(issue_iid)
54 return "" if @project.nil? 54 return "" if @project.nil?
55 55
56 - if @project.used_default_issues_tracker? && issue = @project.issues.where(id: issue_id).first 56 + if @project.used_default_issues_tracker? && issue = @project.issues.where(iid: issue_iid).first
57 issue.title 57 issue.title
58 else 58 else
59 "" 59 ""
app/models/concerns/issuable.rb
@@ -16,6 +16,8 @@ module Issuable @@ -16,6 +16,8 @@ module Issuable
16 16
17 validates :author, presence: true 17 validates :author, presence: true
18 validates :title, presence: true, length: { within: 0..255 } 18 validates :title, presence: true, length: { within: 0..255 }
  19 + validate :set_iid, on: :create
  20 + validates :iid, presence: true, numericality: true
19 21
20 scope :authored, ->(user) { where(author_id: user) } 22 scope :authored, ->(user) { where(author_id: user) }
21 scope :assigned_to, ->(u) { where(assignee_id: u.id)} 23 scope :assigned_to, ->(u) { where(assignee_id: u.id)}
@@ -24,6 +26,7 @@ module Issuable @@ -24,6 +26,7 @@ module Issuable
24 scope :unassigned, -> { where("assignee_id IS NULL") } 26 scope :unassigned, -> { where("assignee_id IS NULL") }
25 scope :of_projects, ->(ids) { where(project_id: ids) } 27 scope :of_projects, ->(ids) { where(project_id: ids) }
26 28
  29 +
27 delegate :name, 30 delegate :name,
28 :email, 31 :email,
29 to: :author, 32 to: :author,
@@ -44,6 +47,15 @@ module Issuable @@ -44,6 +47,15 @@ module Issuable
44 end 47 end
45 end 48 end
46 49
  50 + def set_iid
  51 + max_iid = project.send(self.class.name.tableize).maximum(:iid)
  52 + self.iid = max_iid.to_i + 1
  53 + end
  54 +
  55 + def to_param
  56 + iid.to_s
  57 + end
  58 +
47 def today? 59 def today?
48 Date.today == created_at.to_date 60 Date.today == created_at.to_date
49 end 61 end
app/models/event.rb
@@ -256,6 +256,10 @@ class Event < ActiveRecord::Base @@ -256,6 +256,10 @@ class Event < ActiveRecord::Base
256 target.commit_id 256 target.commit_id
257 end 257 end
258 258
  259 + def target_iid
  260 + target.respond_to?(:iid) ? target.iid : target_id
  261 + end
  262 +
259 def note_short_commit_id 263 def note_short_commit_id
260 note_commit_id[0..8] 264 note_commit_id[0..8]
261 end 265 end
@@ -280,6 +284,14 @@ class Event < ActiveRecord::Base @@ -280,6 +284,14 @@ class Event < ActiveRecord::Base
280 end 284 end
281 end 285 end
282 286
  287 + def note_target_iid
  288 + if note_target.respond_to?(:iid)
  289 + note_target.iid
  290 + else
  291 + note_target_id
  292 + end.to_s
  293 + end
  294 +
283 def wall_note? 295 def wall_note?
284 target.noteable_type.blank? 296 target.noteable_type.blank?
285 end 297 end
app/models/merge_request.rb
@@ -250,6 +250,10 @@ class MergeRequest < ActiveRecord::Base @@ -250,6 +250,10 @@ class MergeRequest < ActiveRecord::Base
250 (source_project.root_ref? source_branch) || for_fork? 250 (source_project.root_ref? source_branch) || for_fork?
251 end 251 end
252 252
  253 + def project
  254 + target_project
  255 + end
  256 +
253 private 257 private
254 258
255 def dump_commits(commits) 259 def dump_commits(commits)
app/models/project.rb
@@ -197,7 +197,7 @@ class Project < ActiveRecord::Base @@ -197,7 +197,7 @@ class Project < ActiveRecord::Base
197 197
198 def issue_exists?(issue_id) 198 def issue_exists?(issue_id)
199 if used_default_issues_tracker? 199 if used_default_issues_tracker?
200 - self.issues.where(id: issue_id).first.present? 200 + self.issues.where(iid: issue_id).first.present?
201 else 201 else
202 true 202 true
203 end 203 end
app/views/events/event/_common.html.haml
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 %span.author_name= link_to_author event 2 %span.author_name= link_to_author event
3 %span.event_label{class: event.action_name}= event_action_name(event) 3 %span.event_label{class: event.action_name}= event_action_name(event)
4 - if event.target 4 - if event.target
5 - %strong= link_to "##{event.target_id}", [event.project, event.target] 5 + %strong= link_to "##{event.target_iid}", [event.project, event.target]
6 - else 6 - else
7 %strong= gfm event.target_title 7 %strong= gfm event.target_title
8 at 8 at
app/views/projects/issues/_issue.html.haml
@@ -4,7 +4,7 @@ @@ -4,7 +4,7 @@
4 = check_box_tag dom_id(issue,"selected"), nil, false, 'data-id' => issue.id, class: "selected_issue", disabled: !can?(current_user, :modify_issue, issue) 4 = check_box_tag dom_id(issue,"selected"), nil, false, 'data-id' => issue.id, class: "selected_issue", disabled: !can?(current_user, :modify_issue, issue)
5 5
6 .issue-title 6 .issue-title
7 - %span.light= "##{issue.id}" 7 + %span.light= "##{issue.iid}"
8 = link_to_gfm truncate(issue.title, length: 100), project_issue_path(issue.project, issue), class: "row_title" 8 = link_to_gfm truncate(issue.title, length: 100), project_issue_path(issue.project, issue), class: "row_title"
9 9
10 .issue-info 10 .issue-info
app/views/projects/issues/show.html.haml
1 %h3.page-title 1 %h3.page-title
2 - Issue ##{@issue.id} 2 + Issue ##{@issue.iid}
3 3
4 %small 4 %small
5 created at 5 created at
app/views/projects/merge_requests/_merge_request.html.haml
1 %li{ class: mr_css_classes(merge_request) } 1 %li{ class: mr_css_classes(merge_request) }
2 .merge-request-title 2 .merge-request-title
3 - %span.light= "##{merge_request.id}" 3 + %span.light= "##{merge_request.iid}"
4 = link_to_gfm truncate(merge_request.title, length: 80), project_merge_request_path(merge_request.target_project, merge_request), class: "row_title" 4 = link_to_gfm truncate(merge_request.title, length: 80), project_merge_request_path(merge_request.target_project, merge_request), class: "row_title"
5 - if merge_request.merged? 5 - if merge_request.merged?
6 %small.pull-right 6 %small.pull-right
app/views/projects/merge_requests/show/_mr_title.html.haml
1 %h3.page-title 1 %h3.page-title
2 - = "Merge Request ##{@merge_request.id}:" 2 + = "Merge Request ##{@merge_request.iid}:"
3   3  
4 -if @merge_request.for_fork? 4 -if @merge_request.for_fork?
5 %span.label-branch 5 %span.label-branch
app/views/search/_result.html.haml
@@ -23,7 +23,7 @@ @@ -23,7 +23,7 @@
23 %li 23 %li
24 merge request: 24 merge request:
25 = link_to [merge_request.target_project, merge_request] do 25 = link_to [merge_request.target_project, merge_request] do
26 - %span ##{merge_request.id} 26 + %span ##{merge_request.iid}
27 %strong.term 27 %strong.term
28 = truncate merge_request.title, length: 50 28 = truncate merge_request.title, length: 50
29 - if merge_request.for_fork? 29 - if merge_request.for_fork?
@@ -37,7 +37,7 @@ @@ -37,7 +37,7 @@
37 %li 37 %li
38 issue: 38 issue:
39 = link_to [issue.project, issue] do 39 = link_to [issue.project, issue] do
40 - %span ##{issue.id} 40 + %span ##{issue.iid}
41 %strong.term 41 %strong.term
42 = truncate issue.title, length: 50 42 = truncate issue.title, length: 50
43 %span.light (#{issue.project.name_with_namespace}) 43 %span.light (#{issue.project.name_with_namespace})
config/routes.rb
@@ -281,7 +281,7 @@ Gitlab::Application.routes.draw do @@ -281,7 +281,7 @@ Gitlab::Application.routes.draw do
281 end 281 end
282 end 282 end
283 283
284 - resources :issues, except: [:destroy] do 284 + resources :issues, constraints: {id: /\d+/}, except: [:destroy] do
285 collection do 285 collection do
286 post :bulk_update 286 post :bulk_update
287 end 287 end
db/migrate/20130819182730_add_internal_ids_to_issues_and_mr.rb 0 → 100644
@@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
  1 +class AddInternalIdsToIssuesAndMr < ActiveRecord::Migration
  2 + def change
  3 + add_column :issues, :iid, :integer
  4 + add_column :merge_requests, :iid, :integer
  5 + end
  6 +end
@@ -11,7 +11,7 @@ @@ -11,7 +11,7 @@
11 # 11 #
12 # It's strongly recommended to check this file into your version control system. 12 # It's strongly recommended to check this file into your version control system.
13 13
14 -ActiveRecord::Schema.define(:version => 20130812143708) do 14 +ActiveRecord::Schema.define(:version => 20130819182730) do
15 15
16 create_table "deploy_keys_projects", :force => true do |t| 16 create_table "deploy_keys_projects", :force => true do |t|
17 t.integer "deploy_key_id", :null => false 17 t.integer "deploy_key_id", :null => false
@@ -62,6 +62,7 @@ ActiveRecord::Schema.define(:version =&gt; 20130812143708) do @@ -62,6 +62,7 @@ ActiveRecord::Schema.define(:version =&gt; 20130812143708) do
62 t.text "description" 62 t.text "description"
63 t.integer "milestone_id" 63 t.integer "milestone_id"
64 t.string "state" 64 t.string "state"
  65 + t.integer "iid"
65 end 66 end
66 67
67 add_index "issues", ["assignee_id"], :name => "index_issues_on_assignee_id" 68 add_index "issues", ["assignee_id"], :name => "index_issues_on_assignee_id"
@@ -98,6 +99,7 @@ ActiveRecord::Schema.define(:version =&gt; 20130812143708) do @@ -98,6 +99,7 @@ ActiveRecord::Schema.define(:version =&gt; 20130812143708) do
98 t.string "state" 99 t.string "state"
99 t.string "merge_status" 100 t.string "merge_status"
100 t.integer "target_project_id", :null => false 101 t.integer "target_project_id", :null => false
  102 + t.integer "iid"
101 end 103 end
102 104
103 add_index "merge_requests", ["assignee_id"], :name => "index_merge_requests_on_assignee_id" 105 add_index "merge_requests", ["assignee_id"], :name => "index_merge_requests_on_assignee_id"
lib/gitlab/markdown.rb
@@ -181,7 +181,7 @@ module Gitlab @@ -181,7 +181,7 @@ module Gitlab
181 end 181 end
182 182
183 def reference_merge_request(identifier) 183 def reference_merge_request(identifier)
184 - if merge_request = @project.merge_requests.where(id: identifier).first 184 + if merge_request = @project.merge_requests.where(iid: identifier).first
185 link_to("!#{identifier}", project_merge_request_url(@project, merge_request), html_options.merge(title: "Merge Request: #{merge_request.title}", class: "gfm gfm-merge_request #{html_options[:class]}")) 185 link_to("!#{identifier}", project_merge_request_url(@project, merge_request), html_options.merge(title: "Merge Request: #{merge_request.title}", class: "gfm gfm-merge_request #{html_options[:class]}"))
186 end 186 end
187 end 187 end
lib/tasks/migrate/migrate_iids.rake 0 → 100644
@@ -0,0 +1,33 @@ @@ -0,0 +1,33 @@
  1 +desc "GITLAB | Build internal ids for issues and merge requests"
  2 +task migrate_iids: :environment do
  3 + puts 'Issues'.yellow
  4 + Issue.where(iid: nil).find_each(batch_size: 100) do |issue|
  5 + begin
  6 + issue.set_iid
  7 + if issue.update_attribute(:iid, mr.iid)
  8 + print '.'
  9 + else
  10 + print 'F'
  11 + end
  12 + rescue
  13 + print 'F'
  14 + end
  15 + end
  16 +
  17 + puts 'done'
  18 + puts 'Merge Requests'.yellow
  19 + MergeRequest.where(iid: nil).find_each(batch_size: 100) do |mr|
  20 + begin
  21 + mr.set_iid
  22 + if mr.update_attribute(:iid, mr.iid)
  23 + print '.'
  24 + else
  25 + print 'F'
  26 + end
  27 + rescue => ex
  28 + print 'F'
  29 + end
  30 + end
  31 +
  32 + puts 'done'
  33 +end
spec/controllers/merge_requests_controller_spec.rb
@@ -8,13 +8,13 @@ describe Projects::MergeRequestsController do @@ -8,13 +8,13 @@ describe Projects::MergeRequestsController do
8 before do 8 before do
9 sign_in(user) 9 sign_in(user)
10 project.team << [user, :master] 10 project.team << [user, :master]
11 - Projects::MergeRequestsController.any_instance.stub(validates_merge_request: true) 11 + Projects::MergeRequestsController.any_instance.stub(validates_merge_request: true, )
12 end 12 end
13 13
14 describe "#show" do 14 describe "#show" do
15 shared_examples "export merge as" do |format| 15 shared_examples "export merge as" do |format|
16 it "should generally work" do 16 it "should generally work" do
17 - get :show, project_id: project.code, id: merge_request.id, format: format 17 + get :show, project_id: project.code, id: merge_request.iid, format: format
18 18
19 expect(response).to be_success 19 expect(response).to be_success
20 end 20 end
@@ -22,11 +22,11 @@ describe Projects::MergeRequestsController do @@ -22,11 +22,11 @@ describe Projects::MergeRequestsController do
22 it "should generate it" do 22 it "should generate it" do
23 MergeRequest.any_instance.should_receive(:"to_#{format}") 23 MergeRequest.any_instance.should_receive(:"to_#{format}")
24 24
25 - get :show, project_id: project.code, id: merge_request.id, format: format 25 + get :show, project_id: project.code, id: merge_request.iid, format: format
26 end 26 end
27 27
28 it "should render it" do 28 it "should render it" do
29 - get :show, project_id: project.code, id: merge_request.id, format: format 29 + get :show, project_id: project.code, id: merge_request.iid, format: format
30 30
31 expect(response.body).to eq((merge_request.send(:"to_#{format}",user)).to_s) 31 expect(response.body).to eq((merge_request.send(:"to_#{format}",user)).to_s)
32 end 32 end
@@ -34,7 +34,7 @@ describe Projects::MergeRequestsController do @@ -34,7 +34,7 @@ describe Projects::MergeRequestsController do
34 it "should not escape Html" do 34 it "should not escape Html" do
35 MergeRequest.any_instance.stub(:"to_#{format}").and_return('HTML entities &<>" ') 35 MergeRequest.any_instance.stub(:"to_#{format}").and_return('HTML entities &<>" ')
36 36
37 - get :show, project_id: project.code, id: merge_request.id, format: format 37 + get :show, project_id: project.code, id: merge_request.iid, format: format
38 38
39 expect(response.body).to_not include('&amp;') 39 expect(response.body).to_not include('&amp;')
40 expect(response.body).to_not include('&gt;') 40 expect(response.body).to_not include('&gt;')
@@ -48,7 +48,7 @@ describe Projects::MergeRequestsController do @@ -48,7 +48,7 @@ describe Projects::MergeRequestsController do
48 let(:format) { :diff } 48 let(:format) { :diff }
49 49
50 it "should really only be a git diff" do 50 it "should really only be a git diff" do
51 - get :show, project_id: project.code, id: merge_request.id, format: format 51 + get :show, project_id: project.code, id: merge_request.iid, format: format
52 52
53 expect(response.body).to start_with("diff --git") 53 expect(response.body).to start_with("diff --git")
54 end 54 end
@@ -59,24 +59,13 @@ describe Projects::MergeRequestsController do @@ -59,24 +59,13 @@ describe Projects::MergeRequestsController do
59 let(:format) { :patch } 59 let(:format) { :patch }
60 60
61 it "should really be a git email patch with commit" do 61 it "should really be a git email patch with commit" do
62 - get :show, project_id: project.code, id: merge_request.id, format: format 62 + get :show, project_id: project.code, id: merge_request.iid, format: format
63 63
64 expect(response.body[0..100]).to start_with("From #{merge_request.commits.last.id}") 64 expect(response.body[0..100]).to start_with("From #{merge_request.commits.last.id}")
65 end 65 end
66 66
67 - # TODO: fix or remove  
68 - #it "should contain as many patches as there are commits" do  
69 - #get :show, project_id: project.code, id: merge_request.id, format: format  
70 -  
71 - #patch_count = merge_request.commits.count  
72 - #merge_request.commits.each_with_index do |commit, patch_num|  
73 - #expect(response.body).to match(/^From #{commit.id}/)  
74 - #expect(response.body).to match(/^Subject: \[PATCH #{patch_num}\/#{patch_count}\]/)  
75 - #end  
76 - #end  
77 -  
78 it "should contain git diffs" do 67 it "should contain git diffs" do
79 - get :show, project_id: project.code, id: merge_request.id, format: format 68 + get :show, project_id: project.code, id: merge_request.iid, format: format
80 69
81 expect(response.body).to match(/^diff --git/) 70 expect(response.body).to match(/^diff --git/)
82 end 71 end
spec/features/gitlab_flavored_markdown_spec.rb
@@ -11,7 +11,7 @@ describe &quot;GitLab Flavored Markdown&quot; do @@ -11,7 +11,7 @@ describe &quot;GitLab Flavored Markdown&quot; do
11 end 11 end
12 12
13 before do 13 before do
14 - Commit.any_instance.stub(title: "fix ##{issue.id}\n\nask @#{fred.username} for details") 14 + Commit.any_instance.stub(title: "fix ##{issue.iid}\n\nask @#{fred.username} for details")
15 end 15 end
16 16
17 let(:commit) { project.repository.commit } 17 let(:commit) { project.repository.commit }
@@ -25,13 +25,13 @@ describe &quot;GitLab Flavored Markdown&quot; do @@ -25,13 +25,13 @@ describe &quot;GitLab Flavored Markdown&quot; do
25 it "should render title in commits#index" do 25 it "should render title in commits#index" do
26 visit project_commits_path(project, 'master', limit: 1) 26 visit project_commits_path(project, 'master', limit: 1)
27 27
28 - page.should have_link("##{issue.id}") 28 + page.should have_link("##{issue.iid}")
29 end 29 end
30 30
31 it "should render title in commits#show" do 31 it "should render title in commits#show" do
32 visit project_commit_path(project, commit) 32 visit project_commit_path(project, commit)
33 33
34 - page.should have_link("##{issue.id}") 34 + page.should have_link("##{issue.iid}")
35 end 35 end
36 36
37 it "should render description in commits#show" do 37 it "should render description in commits#show" do
@@ -43,7 +43,7 @@ describe &quot;GitLab Flavored Markdown&quot; do @@ -43,7 +43,7 @@ describe &quot;GitLab Flavored Markdown&quot; do
43 it "should render title in repositories#branches" do 43 it "should render title in repositories#branches" do
44 visit project_branches_path(project) 44 visit project_branches_path(project)
45 45
46 - page.should have_link("##{issue.id}") 46 + page.should have_link("##{issue.iid}")
47 end 47 end
48 end 48 end
49 49
@@ -57,20 +57,20 @@ describe &quot;GitLab Flavored Markdown&quot; do @@ -57,20 +57,20 @@ describe &quot;GitLab Flavored Markdown&quot; do
57 author: @user, 57 author: @user,
58 assignee: @user, 58 assignee: @user,
59 project: project, 59 project: project,
60 - title: "fix ##{@other_issue.id}", 60 + title: "fix ##{@other_issue.iid}",
61 description: "ask @#{fred.username} for details") 61 description: "ask @#{fred.username} for details")
62 end 62 end
63 63
64 it "should render subject in issues#index" do 64 it "should render subject in issues#index" do
65 visit project_issues_path(project) 65 visit project_issues_path(project)
66 66
67 - page.should have_link("##{@other_issue.id}") 67 + page.should have_link("##{@other_issue.iid}")
68 end 68 end
69 69
70 it "should render subject in issues#show" do 70 it "should render subject in issues#show" do
71 visit project_issue_path(project, @issue) 71 visit project_issue_path(project, @issue)
72 72
73 - page.should have_link("##{@other_issue.id}") 73 + page.should have_link("##{@other_issue.iid}")
74 end 74 end
75 75
76 it "should render details in issues#show" do 76 it "should render details in issues#show" do
@@ -83,19 +83,19 @@ describe &quot;GitLab Flavored Markdown&quot; do @@ -83,19 +83,19 @@ describe &quot;GitLab Flavored Markdown&quot; do
83 83
84 describe "for merge requests" do 84 describe "for merge requests" do
85 before do 85 before do
86 - @merge_request = create(:merge_request, source_project: project, target_project: project, title: "fix ##{issue.id}") 86 + @merge_request = create(:merge_request, source_project: project, target_project: project, title: "fix ##{issue.iid}")
87 end 87 end
88 88
89 it "should render title in merge_requests#index" do 89 it "should render title in merge_requests#index" do
90 visit project_merge_requests_path(project) 90 visit project_merge_requests_path(project)
91 91
92 - page.should have_link("##{issue.id}") 92 + page.should have_link("##{issue.iid}")
93 end 93 end
94 94
95 it "should render title in merge_requests#show" do 95 it "should render title in merge_requests#show" do
96 visit project_merge_request_path(project, @merge_request) 96 visit project_merge_request_path(project, @merge_request)
97 97
98 - page.should have_link("##{issue.id}") 98 + page.should have_link("##{issue.iid}")
99 end 99 end
100 end 100 end
101 101
@@ -104,20 +104,20 @@ describe &quot;GitLab Flavored Markdown&quot; do @@ -104,20 +104,20 @@ describe &quot;GitLab Flavored Markdown&quot; do
104 before do 104 before do
105 @milestone = create(:milestone, 105 @milestone = create(:milestone,
106 project: project, 106 project: project,
107 - title: "fix ##{issue.id}", 107 + title: "fix ##{issue.iid}",
108 description: "ask @#{fred.username} for details") 108 description: "ask @#{fred.username} for details")
109 end 109 end
110 110
111 it "should render title in milestones#index" do 111 it "should render title in milestones#index" do
112 visit project_milestones_path(project) 112 visit project_milestones_path(project)
113 113
114 - page.should have_link("##{issue.id}") 114 + page.should have_link("##{issue.iid}")
115 end 115 end
116 116
117 it "should render title in milestones#show" do 117 it "should render title in milestones#show" do
118 visit project_milestone_path(project, @milestone) 118 visit project_milestone_path(project, @milestone)
119 119
120 - page.should have_link("##{issue.id}") 120 + page.should have_link("##{issue.iid}")
121 end 121 end
122 122
123 it "should render description in milestones#show" do 123 it "should render description in milestones#show" do
spec/helpers/gitlab_markdown_helper_spec.rb
@@ -20,7 +20,7 @@ describe GitlabMarkdownHelper do @@ -20,7 +20,7 @@ describe GitlabMarkdownHelper do
20 20
21 describe "#gfm" do 21 describe "#gfm" do
22 it "should return unaltered text if project is nil" do 22 it "should return unaltered text if project is nil" do
23 - actual = "Testing references: ##{issue.id}" 23 + actual = "Testing references: ##{issue.iid}"
24 24
25 gfm(actual).should_not == actual 25 gfm(actual).should_not == actual
26 26
@@ -175,14 +175,14 @@ describe GitlabMarkdownHelper do @@ -175,14 +175,14 @@ describe GitlabMarkdownHelper do
175 175
176 describe "referencing an issue" do 176 describe "referencing an issue" do
177 let(:object) { issue } 177 let(:object) { issue }
178 - let(:reference) { "##{issue.id}" } 178 + let(:reference) { "##{issue.iid}" }
179 179
180 include_examples 'referenced object' 180 include_examples 'referenced object'
181 end 181 end
182 182
183 describe "referencing a merge request" do 183 describe "referencing a merge request" do
184 let(:object) { merge_request } 184 let(:object) { merge_request }
185 - let(:reference) { "!#{merge_request.id}" } 185 + let(:reference) { "!#{merge_request.iid}" }
186 186
187 include_examples 'referenced object' 187 include_examples 'referenced object'
188 end 188 end
@@ -230,7 +230,7 @@ describe GitlabMarkdownHelper do @@ -230,7 +230,7 @@ describe GitlabMarkdownHelper do
230 end 230 end
231 231
232 describe "referencing multiple objects" do 232 describe "referencing multiple objects" do
233 - let(:actual) { "!#{merge_request.id} -> #{commit.id} -> ##{issue.id}" } 233 + let(:actual) { "!#{merge_request.iid} -> #{commit.id} -> ##{issue.iid}" }
234 234
235 it "should link to the merge request" do 235 it "should link to the merge request" do
236 expected = project_merge_request_path(project, merge_request) 236 expected = project_merge_request_path(project, merge_request)
@@ -299,7 +299,7 @@ describe GitlabMarkdownHelper do @@ -299,7 +299,7 @@ describe GitlabMarkdownHelper do
299 let(:issues) { create_list(:issue, 2, project: project) } 299 let(:issues) { create_list(:issue, 2, project: project) }
300 300
301 it "should handle references nested in links with all the text" do 301 it "should handle references nested in links with all the text" do
302 - actual = link_to_gfm("This should finally fix ##{issues[0].id} and ##{issues[1].id} for real", commit_path) 302 + actual = link_to_gfm("This should finally fix ##{issues[0].iid} and ##{issues[1].iid} for real", commit_path)
303 303
304 # Break the result into groups of links with their content, without 304 # Break the result into groups of links with their content, without
305 # closing tags 305 # closing tags
@@ -311,7 +311,7 @@ describe GitlabMarkdownHelper do @@ -311,7 +311,7 @@ describe GitlabMarkdownHelper do
311 311
312 # First issue link 312 # First issue link
313 groups[1].should match(/href="#{project_issue_url(project, issues[0])}"/) 313 groups[1].should match(/href="#{project_issue_url(project, issues[0])}"/)
314 - groups[1].should match(/##{issues[0].id}$/) 314 + groups[1].should match(/##{issues[0].iid}$/)
315 315
316 # Internal commit link 316 # Internal commit link
317 groups[2].should match(/href="#{commit_path}"/) 317 groups[2].should match(/href="#{commit_path}"/)
@@ -319,7 +319,7 @@ describe GitlabMarkdownHelper do @@ -319,7 +319,7 @@ describe GitlabMarkdownHelper do
319 319
320 # Second issue link 320 # Second issue link
321 groups[3].should match(/href="#{project_issue_url(project, issues[1])}"/) 321 groups[3].should match(/href="#{project_issue_url(project, issues[1])}"/)
322 - groups[3].should match(/##{issues[1].id}$/) 322 + groups[3].should match(/##{issues[1].iid}$/)
323 323
324 # Trailing commit link 324 # Trailing commit link
325 groups[4].should match(/href="#{commit_path}"/) 325 groups[4].should match(/href="#{commit_path}"/)
@@ -332,7 +332,7 @@ describe GitlabMarkdownHelper do @@ -332,7 +332,7 @@ describe GitlabMarkdownHelper do
332 end 332 end
333 333
334 it "escapes HTML passed in as the body" do 334 it "escapes HTML passed in as the body" do
335 - actual = "This is a <h1>test</h1> - see ##{issues[0].id}" 335 + actual = "This is a <h1>test</h1> - see ##{issues[0].iid}"
336 link_to_gfm(actual, commit_path).should match('&lt;h1&gt;test&lt;/h1&gt;') 336 link_to_gfm(actual, commit_path).should match('&lt;h1&gt;test&lt;/h1&gt;')
337 end 337 end
338 end 338 end
@@ -345,25 +345,25 @@ describe GitlabMarkdownHelper do @@ -345,25 +345,25 @@ describe GitlabMarkdownHelper do
345 end 345 end
346 346
347 it "should handle references in headers" do 347 it "should handle references in headers" do
348 - actual = "\n# Working around ##{issue.id}\n## Apply !#{merge_request.id}" 348 + actual = "\n# Working around ##{issue.iid}\n## Apply !#{merge_request.iid}"
349 349
350 - markdown(actual).should match(%r{<h1[^<]*>Working around <a.+>##{issue.id}</a></h1>})  
351 - markdown(actual).should match(%r{<h2[^<]*>Apply <a.+>!#{merge_request.id}</a></h2>}) 350 + markdown(actual).should match(%r{<h1[^<]*>Working around <a.+>##{issue.iid}</a></h1>})
  351 + markdown(actual).should match(%r{<h2[^<]*>Apply <a.+>!#{merge_request.iid}</a></h2>})
352 end 352 end
353 353
354 it "should handle references in lists" do 354 it "should handle references in lists" do
355 project.team << [user, :master] 355 project.team << [user, :master]
356 356
357 - actual = "\n* dark: ##{issue.id}\n* light by @#{member.user.username}" 357 + actual = "\n* dark: ##{issue.iid}\n* light by @#{member.user.username}"
358 358
359 - markdown(actual).should match(%r{<li>dark: <a.+>##{issue.id}</a></li>}) 359 + markdown(actual).should match(%r{<li>dark: <a.+>##{issue.iid}</a></li>})
360 markdown(actual).should match(%r{<li>light by <a.+>@#{member.user.username}</a></li>}) 360 markdown(actual).should match(%r{<li>light by <a.+>@#{member.user.username}</a></li>})
361 end 361 end
362 362
363 it "should handle references in <em>" do 363 it "should handle references in <em>" do
364 - actual = "Apply _!#{merge_request.id}_ ASAP" 364 + actual = "Apply _!#{merge_request.iid}_ ASAP"
365 365
366 - markdown(actual).should match(%r{Apply <em><a.+>!#{merge_request.id}</a></em>}) 366 + markdown(actual).should match(%r{Apply <em><a.+>!#{merge_request.iid}</a></em>})
367 end 367 end
368 368
369 it "should leave code blocks untouched" do 369 it "should leave code blocks untouched" do
@@ -379,19 +379,19 @@ describe GitlabMarkdownHelper do @@ -379,19 +379,19 @@ describe GitlabMarkdownHelper do
379 end 379 end
380 380
381 it "should leave ref-like autolinks untouched" do 381 it "should leave ref-like autolinks untouched" do
382 - markdown("look at http://example.tld/#!#{merge_request.id}").should == "<p>look at <a href=\"http://example.tld/#!#{merge_request.id}\">http://example.tld/#!#{merge_request.id}</a></p>\n" 382 + markdown("look at http://example.tld/#!#{merge_request.iid}").should == "<p>look at <a href=\"http://example.tld/#!#{merge_request.iid}\">http://example.tld/#!#{merge_request.iid}</a></p>\n"
383 end 383 end
384 384
385 it "should leave ref-like href of 'manual' links untouched" do 385 it "should leave ref-like href of 'manual' links untouched" do
386 - markdown("why not [inspect !#{merge_request.id}](http://example.tld/#!#{merge_request.id})").should == "<p>why not <a href=\"http://example.tld/#!#{merge_request.id}\">inspect </a><a href=\"#{project_merge_request_url(project, merge_request)}\" class=\"gfm gfm-merge_request \" title=\"Merge Request: #{merge_request.title}\">!#{merge_request.id}</a><a href=\"http://example.tld/#!#{merge_request.id}\"></a></p>\n" 386 + markdown("why not [inspect !#{merge_request.iid}](http://example.tld/#!#{merge_request.iid})").should == "<p>why not <a href=\"http://example.tld/#!#{merge_request.iid}\">inspect </a><a href=\"#{project_merge_request_url(project, merge_request)}\" class=\"gfm gfm-merge_request \" title=\"Merge Request: #{merge_request.title}\">!#{merge_request.iid}</a><a href=\"http://example.tld/#!#{merge_request.iid}\"></a></p>\n"
387 end 387 end
388 388
389 it "should leave ref-like src of images untouched" do 389 it "should leave ref-like src of images untouched" do
390 - markdown("screen shot: ![some image](http://example.tld/#!#{merge_request.id})").should == "<p>screen shot: <img src=\"http://example.tld/#!#{merge_request.id}\" alt=\"some image\"></p>\n" 390 + markdown("screen shot: ![some image](http://example.tld/#!#{merge_request.iid})").should == "<p>screen shot: <img src=\"http://example.tld/#!#{merge_request.iid}\" alt=\"some image\"></p>\n"
391 end 391 end
392 392
393 it "should generate absolute urls for refs" do 393 it "should generate absolute urls for refs" do
394 - markdown("##{issue.id}").should include(project_issue_url(project, issue)) 394 + markdown("##{issue.iid}").should include(project_issue_url(project, issue))
395 end 395 end
396 396
397 it "should generate absolute urls for emoji" do 397 it "should generate absolute urls for emoji" do
spec/helpers/issues_helper_spec.rb
@@ -8,7 +8,7 @@ describe IssuesHelper do @@ -8,7 +8,7 @@ describe IssuesHelper do
8 describe :title_for_issue do 8 describe :title_for_issue do
9 it "should return issue title if used internal tracker" do 9 it "should return issue title if used internal tracker" do
10 @project = project 10 @project = project
11 - title_for_issue(issue.id).should eq issue.title 11 + title_for_issue(issue.iid).should eq issue.title
12 end 12 end
13 13
14 it "should always return empty string if used external tracker" do 14 it "should always return empty string if used external tracker" do
@@ -61,7 +61,7 @@ describe IssuesHelper do @@ -61,7 +61,7 @@ describe IssuesHelper do
61 61
62 it "should return internal path if used internal tracker" do 62 it "should return internal path if used internal tracker" do
63 @project = project 63 @project = project
64 - url_for_issue(issue.id).should match(int_expected) 64 + url_for_issue(issue.iid).should match(int_expected)
65 end 65 end
66 66
67 it "should return path to external tracker" do 67 it "should return path to external tracker" do
@@ -73,7 +73,7 @@ describe IssuesHelper do @@ -73,7 +73,7 @@ describe IssuesHelper do
73 it "should return empty string if project nil" do 73 it "should return empty string if project nil" do
74 @project = nil 74 @project = nil
75 75
76 - url_for_issue(issue.id).should eq "" 76 + url_for_issue(issue.iid).should eq ""
77 end 77 end
78 end 78 end
79 79
spec/models/concerns/issuable_spec.rb
@@ -11,7 +11,9 @@ describe Issue, &quot;Issuable&quot; do @@ -11,7 +11,9 @@ describe Issue, &quot;Issuable&quot; do
11 end 11 end
12 12
13 describe "Validation" do 13 describe "Validation" do
  14 + before { subject.stub(set_iid: false) }
14 it { should validate_presence_of(:project) } 15 it { should validate_presence_of(:project) }
  16 + it { should validate_presence_of(:iid) }
15 it { should validate_presence_of(:author) } 17 it { should validate_presence_of(:author) }
16 it { should validate_presence_of(:title) } 18 it { should validate_presence_of(:title) }
17 it { should ensure_length_of(:title).is_at_least(0).is_at_most(255) } 19 it { should ensure_length_of(:title).is_at_least(0).is_at_most(255) }
spec/models/project_spec.rb
@@ -201,11 +201,11 @@ describe Project do @@ -201,11 +201,11 @@ describe Project do
201 let(:ext_project) { create(:redmine_project) } 201 let(:ext_project) { create(:redmine_project) }
202 202
203 it "should be true or if used internal tracker and issue exists" do 203 it "should be true or if used internal tracker and issue exists" do
204 - project.issue_exists?(existed_issue.id).should be_true 204 + project.issue_exists?(existed_issue.iid).should be_true
205 end 205 end
206 206
207 it "should be false or if used internal tracker and issue not exists" do 207 it "should be false or if used internal tracker and issue not exists" do
208 - project.issue_exists?(not_existed_issue.id).should be_false 208 + project.issue_exists?(not_existed_issue.iid).should be_false
209 end 209 end
210 210
211 it "should always be true if used other tracker" do 211 it "should always be true if used other tracker" do