diff --git a/app/models/changeset.rb b/app/models/changeset.rb index b14b46bc44..c7e7691d9f 100644 --- a/app/models/changeset.rb +++ b/app/models/changeset.rb @@ -191,12 +191,26 @@ class Changeset < ApplicationRecord # Returns the previous changeset def previous - @previous ||= Changeset.where(["id < ? AND repository_id = ?", id, repository_id]).order(id: :desc).first + @previous ||= + Changeset.where( + [ + "repository_id = ? AND "\ + "(committed_on < ? OR (committed_on = ? AND id < ?))", + repository_id, committed_on, committed_on, id + ] + ).order(committed_on: :desc, id: :desc).first end # Returns the next changeset def next - @next ||= Changeset.where(["id > ? AND repository_id = ?", id, repository_id]).order(:id).first + @next ||= + Changeset.where( + [ + "repository_id = ? AND "\ + "(committed_on > ? OR (committed_on = ? AND id > ?))", + repository_id, committed_on, committed_on, id + ] + ).order(committed_on: :asc, id: :asc).first end # Creates a new Change from it's common parameters diff --git a/test/unit/changeset_test.rb b/test/unit/changeset_test.rb index 8a753046ef..7a814fe344 100644 --- a/test/unit/changeset_test.rb +++ b/test/unit/changeset_test.rb @@ -468,6 +468,30 @@ class ChangesetTest < ActiveSupport::TestCase assert_equal Changeset.find_by_revision('2'), changeset.previous end + def test_previous_uses_same_order_as_changeset_list + repository = + Repository::Subversion.create!( + :project => Project.find(3), + :url => 'svn://localhost/test/previous-order' + ) + newer_changeset = + Changeset.create!( + :repository => repository, + :committed_on => Time.utc(2025, 4, 8, 10, 0, 0), + :comments => 'Newer changeset', + :revision => 'previous-order-newer' + ) + older_changeset = + Changeset.create!( + :repository => repository, + :committed_on => Time.utc(2025, 4, 7, 10, 0, 0), + :comments => 'Older changeset', + :revision => 'previous-order-older' + ) + + assert_equal older_changeset, newer_changeset.previous + end + def test_previous_nil changeset = Changeset.find_by_revision('1') assert_nil changeset.previous @@ -478,6 +502,30 @@ class ChangesetTest < ActiveSupport::TestCase assert_equal Changeset.find_by_revision('3'), changeset.next end + def test_next_uses_same_order_as_changeset_list + repository = + Repository::Subversion.create!( + :project => Project.find(3), + :url => 'svn://localhost/test/next-order' + ) + newer_changeset = + Changeset.create!( + :repository => repository, + :committed_on => Time.utc(2025, 4, 8, 10, 0, 0), + :comments => 'Newer changeset', + :revision => 'next-order-newer' + ) + older_changeset = + Changeset.create!( + :repository => repository, + :committed_on => Time.utc(2025, 4, 7, 10, 0, 0), + :comments => 'Older changeset', + :revision => 'next-order-older' + ) + + assert_equal newer_changeset, older_changeset.next + end + def test_next_nil changeset = Changeset.find_by_revision('11') assert_nil changeset.next