Project

General

Profile

Defect #43965 ยป fix-changeset-previous-next-order.patch

Takenori TAKAKI, 2026-04-17 06:55

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 ||=
195
      Changeset.where(
196
        [
197
          "repository_id = ? AND "\
198
          "(committed_on < ? OR (committed_on = ? AND id < ?))",
199
          repository_id, committed_on, committed_on, id
200
        ]
201
      ).order(committed_on: :desc, id: :desc).first
195 202
  end
196 203

  
197 204
  # Returns the next changeset
198 205
  def next
199
    @next ||= Changeset.where(["id > ? AND repository_id = ?", id, repository_id]).order(:id).first
206
    @next ||=
207
      Changeset.where(
208
        [
209
          "repository_id = ? AND "\
210
          "(committed_on > ? OR (committed_on = ? AND id > ?))",
211
          repository_id, committed_on, committed_on, id
212
        ]
213
      ).order(committed_on: :asc, id: :asc).first
200 214
  end
201 215

  
202 216
  # Creates a new Change from it's common parameters
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
    (1-1/1)