builds.html: add builds oldest first

So new builds being created appear left or top.
This commit is contained in:
Stéphane Bidoul 2021-11-20 17:17:35 +01:00
parent 4e9872bfed
commit 7a4e188a7e
No known key found for this signature in database
GPG key ID: BCAB2555446B5B92
4 changed files with 54 additions and 7 deletions

View file

@ -11,6 +11,7 @@ from starlette.status import HTTP_404_NOT_FOUND
from . import github, models from . import github, models
from .controller import Controller, controller from .controller import Controller, controller
from .db import SortOrder
from .deps import authenticated from .deps import authenticated
router = APIRouter() router = APIRouter()
@ -239,6 +240,7 @@ class BuildEventSource:
branch=self.branch, branch=self.branch,
pr=self.pr, pr=self.pr,
name=self.build_name, name=self.build_name,
sort=SortOrder.asc,
): ):
yield self._serialize(models.BuildEvent.modified, build) yield self._serialize(models.BuildEvent.modified, build)
while True: while True:

View file

@ -1,5 +1,6 @@
import logging import logging
import sqlite3 import sqlite3
from enum import Enum
from typing import Iterator, Protocol, cast from typing import Iterator, Protocol, cast
from weakref import WeakSet from weakref import WeakSet
@ -8,6 +9,13 @@ from .models import Build, BuildEvent, BuildInitStatus, BuildStatus, Repo
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
class SortOrder(Enum):
# commits of pr, then commits of branches, oldest first
asc = 1
# commit os branches, then commits of prs, newest first
desc = 2
class BuildListener(Protocol): class BuildListener(Protocol):
def on_build_event(self, event: BuildEvent, build: Build) -> None: def on_build_event(self, event: BuildEvent, build: Build) -> None:
... ...
@ -195,6 +203,7 @@ class BuildsDb:
branch: str | None = None, branch: str | None = None,
pr: int | None = None, pr: int | None = None,
name: str | None = None, name: str | None = None,
sort: SortOrder = SortOrder.desc,
) -> Iterator[Build]: ) -> Iterator[Build]:
query = "SELECT * FROM builds " query = "SELECT * FROM builds "
where = [] where = []
@ -217,10 +226,22 @@ class BuildsDb:
params.append(name) params.append(name)
if where: if where:
query += "WHERE " + " AND ".join(where) query += "WHERE " + " AND ".join(where)
query += ( if sort == SortOrder.desc:
" ORDER BY" query += (
" repo, target_branch DESC, COALESCE(pr, 999999) DESC, created DESC" " ORDER BY"
) " repo DESC,"
" COALESCE(pr, 999999) DESC,"
" target_branch DESC,"
" created DESC"
)
elif sort == SortOrder.asc:
query += (
" ORDER BY"
" repo ASC,"
" COALESCE(pr, 999999) ASC,"
" target_branch ASC,"
" created ASC"
)
rows = self._con.execute(query, params).fetchall() rows = self._con.execute(query, params).fetchall()
for row in rows: for row in rows:
yield self._build_from_row(row) yield self._build_from_row(row)

View file

@ -43,13 +43,14 @@
rowElement = document.createElement("div"); rowElement = document.createElement("div");
rowElement.classList.add("row"); rowElement.classList.add("row");
rowElement.id = rowId; rowElement.id = rowId;
document.getElementById("builds").appendChild(rowElement); const buildsElement = document.getElementById("builds");
buildsElement.insertBefore(rowElement, buildsElement.firstChild);
} }
// add build element to row // add build element to row
buildElement = document.createElement("runboat-build"); buildElement = document.createElement("runboat-build");
buildElement.id = oEvent.build.name; buildElement.id = oEvent.build.name;
buildElement.build = oEvent.build; buildElement.build = oEvent.build;
rowElement.appendChild(buildElement); rowElement.insertBefore(buildElement, rowElement.firstChild);
} }
} else if (oEvent.event == "del") { } else if (oEvent.event == "del") {
const buildElement = document.getElementById(oEvent.build.name); const buildElement = document.getElementById(oEvent.build.name);

View file

@ -1,7 +1,7 @@
import datetime import datetime
from unittest.mock import MagicMock from unittest.mock import MagicMock
from runboat.db import BuildsDb from runboat.db import BuildsDb, SortOrder
from runboat.models import Build, BuildInitStatus, BuildStatus, Repo from runboat.models import Build, BuildInitStatus, BuildStatus, Repo
@ -94,6 +94,29 @@ def test_search_by_branch_and_pr() -> None:
assert list(db.search(pr=1)) == [build2] assert list(db.search(pr=1)) == [build2]
def test_search_sort() -> None:
db = BuildsDb()
db.add(build1 := _make_build(name="b1", target_branch="15.0", pr=None))
db.add(build2 := _make_build(name="b2", target_branch="15.0", pr=1))
db.add(build3 := _make_build(name="b3", target_branch="14.0", pr=None))
db.add(build4 := _make_build(name="b4", target_branch="14.0", pr=2))
db.add(build5 := _make_build(name="b5", target_branch="10.0", pr=3))
assert [b.name for b in db.search(sort=SortOrder.asc)] == [
build2.name,
build4.name,
build5.name,
build3.name,
build1.name,
]
assert [b.name for b in db.search()] == [
build1.name,
build3.name,
build5.name,
build4.name,
build2.name,
]
def test_count_by_status() -> None: def test_count_by_status() -> None:
db = BuildsDb() db = BuildsDb()
db.add(_make_build(name="b1", status=BuildStatus.started)) db.add(_make_build(name="b1", status=BuildStatus.started))