🚀 Explore the new frontiers with Tuleap 16.0! Enhance your project insights with advanced Cross-Tracker Search capabilities, now featuring ORDER BY in TQL. Don’t miss out—watch the replay to see these features in action!

Cross-Tracker Search complete

This is a major milestone for Tuleap, the ability to search across Trackers and across projects is now complete. Tuleap 16.0 closes the circle with the support of ORDER BY in Tuleap Query Language (TQL) to… well, sort data.

A Tuleap project dashboard with a cross tracker search widget and a complete TQL query
Cross tracker search with a complete TQL query

Let’s take the 16.0 landmark opportunity to recap what we’ve been cooking for you since the beginning of 2024.

How ducks figure out how to compare apples to oranges

Long time users of Tuleap already know that Cross-Tracker Search. It’s been there for a while but was limited due to the lowest common element between Trackers. Tuleap Trackers are highly configurable. For example, on the same project, you might find « User stories », « Bugs », « Requirements », « Vendors » or even « Cake recipes ».

It’s all fun and games until someone wants to « see everything that is open in my project » or « who worked on what last week ». The challenge is determining how to compare different types of items.

In order to address this need, we first focused on compare, search and display elements that are always present in trackers: the artifact id, who created it, the last updated date, etc.

Then, we leveraged equivalence relations defined with Semantics. For instance « Recipe title » (for Cake recipes) and « Company name » (for Vendors) can be compared if tracker admins defined « Title » semantic on them. But defining semantics for everything is too much of a hurdle.

So the third step was to provide a lightweight way to have those equivalence relations. The concept is known as « Duck-typing ». Let’s take an example with our Cake Recipes and Vendors. They share a date field named « Last review date ». Same name, same type, even if there is no « last review date » semantic, we can assume it’s the same thing. This is called duck-typing: when fields share the same name and compatible types, they can be compared.

Full Tuleap Query Language syntax

Those three concept (always there fields, semantics and duck-typed fields) can be used in the three parts of the query:

  • SELECT: list the fields you want to see
  • WHERE: filter what you want to see
  • ORDER BY: sort the result

In those three parts, you can use @name syntax to make reference to semantic or an always there field and name (without @) for a duck-typed fields. For instance:

SELECT @title, @status, last_review_date FROM @project = 'self' WHERE @status = OPEN() ORDER BY @last_update_date DESC
  • @title and @status are semantics
  • last_review_date is a duck typed field
  • @last_update_date is an always there field

In addition to fields, TQL allows to define which trackers should be taken into account with FROM part. You can specify project wide constraints like FROM @project.name IN (...) or FROM @project.category = '...' and you can specify which tracker you want to see.

Example of queries

A project wants to show everything that is currently open within the workspace

SELECT @pretty_title, @status, @last_update_date FROM @project = "self" WHERE @status = OPEN() ORDER BY @last_update_date DESC

A team wants a dashboard with all tickets assigned to the user who see the page:

SELECT @pretty_title, @status, @last_update_by FROM @project = "self" WHERE @status = OPEN() AND @assigned_to = MYSELF() ORDER BY @last_update_date DESC

An organization that does help desk ticketing with Tuleap, each customer has its own dedicated project (tagged « Type::HelpDesk »). The support team want to see which ticket has not been acknowledged yet.

SELECT @pretty_title, @status, @last_update_by, category, severity FROM @project.category = 'Type::HelpDesk' AND @tracker.name = "request" WHERE @status = OPEN() AND ack_time = "" ORDER BY @last_update_date DESC

You can find more examples in the documentation.

Built from the trenches

Thanks to our monthly deliveries, we received meaningful feedback from early adopters. This allowed to fine-tune the search behavior. One of the most requested features was to get better indications when something goes wrong with a query. You now have more precise error messages:

Cross tracker search query displays the error message
Message showing where the error is located in the query

Documentation was completely rebuilt to clearly separate the various TQL flavors:

TQL page in Tuleap documentation
TQL page in Tuleap documentation

And we even published a flavor of Prism JS library for syntax highlighting of TQL language. Of course this lib is used internally so tql queries are properly highlighted everywhere you can write markdown.

Is that all ?

When Cross-Tracker Search was bootstrapped and even when we resumed the work on it at the beginning of the year, the goal was to provide a way for advanced users to build complex dashboards. Along the way we discovered that way more users have needs related to Cross-Tracker searches. Writing TQL from scratch for those users might too difficult so we are going to work on easing access to queries, on templates and graphical selection of fields.

Cross-Tracker Search is complete, it’s only the beginning for SuperTableau !

Bugs and requests

During the 16.0 release cycle, 45 requests implemented. Bugs and security fixes were already back-ported on Tuleap Enterprise builds. You will find below a detailed list of fixes. The most notable ones are in bold.

Security

  • #39736 Permissions are incorrectly verified for project administrators in the cross tracker search widget – CVE-2024-47766 – Moderate
  • #39728 Trackers are listed in the quick add actions of the backlog without any permissions check – CVE-2024-47767 – Moderate
  • #39686 Permissions are not properly checked for email notifications in trackers – CVE-2024-46988 – Moderate
  • #39689 XSS in the HTML mail content of the cross reference field – CVE-2024-46980 – Moderate

Tracker

  • #39695 Inconsistent display of last update date
  • #39701 Broken artifact creation from artifact modal link field

Kanban

  • #39735 kanban card fields sould respect artifact display

Program management

  • #39352 Program add to top backlog post-action should ignore Teams

Document generator

  • #39730 tables width in ttm docx generation

Git & Pull Requests

  • #39719 Lack of whitespace between date and Created by in PR homepage
  • #39699 Support for windows-1250 encoding in git view
  • #39691 Cannot merge PR via the web UI
  • #39690 Git: 2.46.0 -> 2.46.1

Jira

  • #39707 [JIRA Import] Can’t import next gen ticket
  • #39694 Jira import leads to missing changesets when change are within the same second
  • #39709 Jira issues should be imported in the same order of their creation

Performances

  • #39752 Lazy loading of avatars

Project administration

  • #31559 Accentuated characters count 2 in project name

Docker images

  • #39717 Create /var/lib/codendi symlink in containers

Receive once a month the latest Tuleap updates