Project

General

Profile

Defect #43965 » fix-changeset-previous-next-order-v2.patch

Takenori TAKAKI, 2026-04-21 10:33

View differences:

app/models/changeset.rb
191 191

  
192 192
  # Returns the previous changeset
193 193
  def previous
194
    @previous ||= Changeset.where(["id < ? AND repository_id = ?", id, repository_id]).order(id: :desc).first
194
    @previous ||= repository&.previous_changeset(self)
195 195
  end
196 196

  
197 197
  # Returns the next changeset
198 198
  def next
199
    @next ||= Changeset.where(["id > ? AND repository_id = ?", id, repository_id]).order(:id).first
199
    @next ||= repository&.next_changeset(self)
200 200
  end
201 201

  
202 202
  # Creates a new Change from it's common parameters
app/models/repository.rb
265 265
    @latest_changeset ||= changesets.first
266 266
  end
267 267

  
268
  def previous_changeset(changeset)
269
    changesets.
270
      reorder(nil).
271
      where(
272
        [
273
          "(#{Changeset.table_name}.committed_on < ? OR " \
274
          "(#{Changeset.table_name}.committed_on = ? AND #{Changeset.table_name}.id < ?))",
275
          changeset.committed_on, changeset.committed_on, changeset.id
276
        ]
277
      ).
278
      order(committed_on: :desc, id: :desc).
279
      first
280
  end
281

  
282
  def next_changeset(changeset)
283
    changesets.
284
      reorder(nil).
285
      where(
286
        [
287
          "(#{Changeset.table_name}.committed_on > ? OR " \
288
          "(#{Changeset.table_name}.committed_on = ? AND #{Changeset.table_name}.id > ?))",
289
          changeset.committed_on, changeset.committed_on, changeset.id
290
        ]
291
      ).
292
      order(committed_on: :asc, id: :asc).
293
      first
294
  end
295

  
268 296
  # Returns the latest changesets for +path+
269 297
  # Default behaviour is to search in cached changesets
270 298
  def latest_changesets(path, rev, limit=10)
app/models/repository/mercurial.rb
128 128
      to_a
129 129
  end
130 130

  
131
  def previous_changeset(changeset)
132
    changesets.
133
      where("#{Changeset.table_name}.id < ?", changeset.id).
134
      reorder(id: :desc).
135
      first
136
  end
137

  
138
  def next_changeset(changeset)
139
    changesets.
140
      where("#{Changeset.table_name}.id > ?", changeset.id).
141
      reorder(id: :asc).
142
      first
143
  end
144

  
131 145
  def is_short_id_in_db?
132 146
    return @is_short_id_in_db unless @is_short_id_in_db.nil?
133 147

  
test/unit/changeset_test.rb
468 468
    assert_equal Changeset.find_by_revision('2'), changeset.previous
469 469
  end
470 470

  
471
  def test_previous_uses_same_order_as_changeset_list
472
    repository =
473
      Repository::Subversion.create!(
474
        :project => Project.find(3),
475
        :url => 'svn://localhost/test/previous-order'
476
      )
477
    newer_changeset =
478
      Changeset.create!(
479
        :repository => repository,
480
        :committed_on => Time.utc(2025, 4, 8, 10, 0, 0),
481
        :comments => 'Newer changeset',
482
        :revision => 'previous-order-newer'
483
      )
484
    older_changeset =
485
      Changeset.create!(
486
        :repository => repository,
487
        :committed_on => Time.utc(2025, 4, 7, 10, 0, 0),
488
        :comments => 'Older changeset',
489
        :revision => 'previous-order-older'
490
      )
491

  
492
    assert_equal older_changeset, newer_changeset.previous
493
  end
494

  
471 495
  def test_previous_nil
472 496
    changeset = Changeset.find_by_revision('1')
473 497
    assert_nil changeset.previous
......
478 502
    assert_equal Changeset.find_by_revision('3'), changeset.next
479 503
  end
480 504

  
505
  def test_next_uses_same_order_as_changeset_list
506
    repository =
507
      Repository::Subversion.create!(
508
        :project => Project.find(3),
509
        :url => 'svn://localhost/test/next-order'
510
      )
511
    newer_changeset =
512
      Changeset.create!(
513
        :repository => repository,
514
        :committed_on => Time.utc(2025, 4, 8, 10, 0, 0),
515
        :comments => 'Newer changeset',
516
        :revision => 'next-order-newer'
517
      )
518
    older_changeset =
519
      Changeset.create!(
520
        :repository => repository,
521
        :committed_on => Time.utc(2025, 4, 7, 10, 0, 0),
522
        :comments => 'Older changeset',
523
        :revision => 'next-order-older'
524
      )
525

  
526
    assert_equal newer_changeset, older_changeset.next
527
  end
528

  
481 529
  def test_next_nil
482 530
    changeset = Changeset.find_by_revision('11')
483 531
    assert_nil changeset.next
(2-2/2)