This is an automated email from the ASF dual-hosted git repository.

kaxilnaik pushed a commit to branch fix/registry-blank-lines
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 62e4fe1ebe7b03e25e9314e5a3042ebad736ba8a
Author: Kaxil Naik <[email protected]>
AuthorDate: Thu Mar 19 14:50:17 2026 +0000

    Fix 299 blank lines in registry homepage HTML
    
    The Nunjucks loop that filters providers with first_released dates
    emits blank lines for each iteration (~99 providers x 3 lines).
    Use whitespace-trimming delimiters ({%- -%}) on the data-processing
    loop to eliminate blank lines from the rendered HTML.
---
 .../versions/head/test_task_instances.py           | 41 ++++++++++++++++++++++
 registry/src/index.njk                             | 14 ++++----
 2 files changed, 48 insertions(+), 7 deletions(-)

diff --git 
a/airflow-core/tests/unit/api_fastapi/execution_api/versions/head/test_task_instances.py
 
b/airflow-core/tests/unit/api_fastapi/execution_api/versions/head/test_task_instances.py
index 7cc7aa85594..217f34847d2 100644
--- 
a/airflow-core/tests/unit/api_fastapi/execution_api/versions/head/test_task_instances.py
+++ 
b/airflow-core/tests/unit/api_fastapi/execution_api/versions/head/test_task_instances.py
@@ -1632,6 +1632,47 @@ class TestTISkipDownstream:
         assert response.status_code == 204
         assert ti1.state == State.SKIPPED
 
+    @pytest.mark.parametrize(
+        ("initial_state", "expected_state"),
+        [
+            pytest.param(State.RUNNING, State.RUNNING, id="running_preserved"),
+            pytest.param(State.SUCCESS, State.SUCCESS, id="success_preserved"),
+            pytest.param(State.FAILED, State.FAILED, id="failed_preserved"),
+            pytest.param(State.QUEUED, State.SKIPPED, id="queued_skipped"),
+            pytest.param(None, State.SKIPPED, id="none_skipped"),
+        ],
+    )
+    def test_ti_skip_downstream_state_guard(
+        self, client, session, create_task_instance, dag_maker, initial_state, 
expected_state
+    ):
+        """State guard prevents overwriting RUNNING/SUCCESS/FAILED with 
SKIPPED (HA race condition)."""
+        with dag_maker("skip_downstream_guard_dag", session=session):
+            t0 = EmptyOperator(task_id="t0")
+            t1 = EmptyOperator(task_id="t1")
+            t0 >> t1
+        dr = dag_maker.create_dagrun(run_id="run")
+
+        ti0 = dr.get_task_instance("t0")
+        ti0.set_state(State.SUCCESS)
+
+        ti1 = dr.get_task_instance("t1")
+        if initial_state is not None:
+            ti1.set_state(initial_state)
+        else:
+            ti1.state = None
+            session.merge(ti1)
+            session.commit()
+
+        response = client.patch(
+            f"/execution/task-instances/{ti0.id}/skip-downstream",
+            json={"tasks": ["t1"]},
+        )
+
+        assert response.status_code == 204
+        session.expire_all()
+        ti1 = dr.get_task_instance("t1")
+        assert ti1.state == expected_state
+
 
 class TestTISkipDownstreamRaceCondition:
     """Regression tests for #59378: state guard in ti_skip_downstream()."""
diff --git a/registry/src/index.njk b/registry/src/index.njk
index e8d6a475c7c..a57b5177fb1 100644
--- a/registry/src/index.njk
+++ b/registry/src/index.njk
@@ -99,13 +99,13 @@ title: Discover Providers, Operators & Hooks for Apache 
Airflow
 </section>
 
 <!-- New Providers -->
-{% set allWithDate = [] %}
-{% for provider in providers.providers %}
-  {% if provider.first_released %}
-    {% set allWithDate = (allWithDate.push(provider), allWithDate) %}
-  {% endif %}
-{% endfor %}
-{% set newProviders = allWithDate | sort(false, false, 'first_released') | 
reverse | slice(0, 4) %}
+{%- set allWithDate = [] -%}
+{%- for provider in providers.providers -%}
+  {%- if provider.first_released -%}
+    {%- set allWithDate = (allWithDate.push(provider), allWithDate) -%}
+  {%- endif -%}
+{%- endfor -%}
+{%- set newProviders = allWithDate | sort(false, false, 'first_released') | 
reverse | slice(0, 4) -%}
 {% if newProviders.length > 0 %}
 <section id="new-providers">
   <div class="container">

Reply via email to