Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 71 additions & 34 deletions .husky/check-cdocs-gitignore.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,73 +13,110 @@
GITIGNORE_PATH = Path("content/.gitignore")


def get_gitignored_paths():
"""Parse content/.gitignore and return .md file paths."""
def get_gitignore_patterns():
"""Parse content/.gitignore and return .md file patterns."""
if not GITIGNORE_PATH.exists():
return []

paths = []
patterns = []
for line in GITIGNORE_PATH.read_text().splitlines():
stripped = line.strip()
if not stripped or stripped.startswith("#"):
continue
if stripped.endswith(".md"):
# Paths in the gitignore are relative to content/, e.g. /en/foo/bar.md
# Convert to repo-relative paths: content/en/foo/bar.md
repo_path = "content" + stripped
paths.append(repo_path)
return paths
# Convert to repo-relative patterns: content/en/foo/bar.md
repo_pattern = "content" + stripped
patterns.append(repo_pattern)
return patterns


def is_tracked(file_path):
"""Check if a file is currently tracked by git."""
def get_tracked_files(pattern):
"""Return list of tracked files matching a pattern (may contain globs)."""
result = subprocess.run(
["git", "ls-files", "--error-unmatch", file_path],
["git", "ls-files", pattern],
capture_output=True,
text=True,
)
return result.returncode == 0
if result.returncode != 0 or not result.stdout.strip():
return []
return result.stdout.strip().splitlines()


def has_mdoc_source(file_path):
"""Check if a .mdoc.md source file exists alongside the compiled .md file."""
mdoc_path = Path(file_path).with_suffix("").with_suffix(".mdoc.md")
return mdoc_path.exists()


def classify_tracked_files(tracked):
"""Split tracked files into compiled output (has local mdoc) vs orphaned translations."""
compiled = []
orphaned = []
for path in tracked:
if has_mdoc_source(path):
compiled.append(path)
else:
orphaned.append(path)
return compiled, orphaned


def main():
paths = get_gitignored_paths()
if not paths:
patterns = get_gitignore_patterns()
if not patterns:
print("✅ No Cdocs paths found in content/.gitignore to check.")
sys.exit(0)

tracked = []
for path in paths:
if is_tracked(path):
tracked.append(path)

if tracked:
err = sys.stderr
print("\n❌ Tracked Cdocs files found!", file=err)
print("=" * 50, file=err)
for pattern in patterns:
tracked.extend(get_tracked_files(pattern))

if not tracked:
print("✅ No tracked Cdocs files found. All gitignored files are untracked.")
sys.exit(0)

compiled, orphaned = classify_tracked_files(tracked)
err = sys.stderr

print("\n❌ Tracked Cdocs files found!", file=err)
print("=" * 50, file=err)

if compiled:
print(
"\nThe following files are listed in content/.gitignore"
" but are still tracked by git:\n",
"\nThe following compiled Cdocs files are tracked but should not be.\n"
"They have a .mdoc.md source and the compiled output should be untracked:\n",
file=err,
)
for path in tracked:
for path in compiled:
print(f" - {path}", file=err)

print("\nTo fix this, run the following commands:\n", file=err)
for path in tracked:
print("\nTo fix, run:\n", file=err)
for path in compiled:
print(f" git rm --cached {path}", file=err)

print(
"\nThen commit the result. The files will remain on disk"
" but will no longer be tracked by git.\n",
"\nThe files will remain on disk but will no longer be tracked by git.",
file=err,
)
print("=" * 50, file=err)

if orphaned:
print(
f"\nFound {len(tracked)} tracked file(s) that should be untracked."
" Please fix before committing.\n",
"\nThe following files are orphaned translations with no .mdoc.md source.\n"
"The English version is a Cdocs page, so these outdated files should be deleted:\n",
file=err,
)
sys.exit(1)
for path in orphaned:
print(f" - {path}", file=err)
print("\nTo fix, run:\n", file=err)
for path in orphaned:
print(f" git rm {path}", file=err)

print("\n" + "=" * 50, file=err)
total = len(compiled) + len(orphaned)
print(
f"\nFound {total} tracked file(s) that should be untracked or deleted."
" Please fix before committing.\n",
file=err,
)
sys.exit(1)

print("✅ No tracked Cdocs files found. All gitignored files are untracked.")
sys.exit(0)
Expand Down
186 changes: 93 additions & 93 deletions content/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,100 +5,100 @@

# This file lists compiled Cdocs files to keep them out of version control. For more information, see the internal Cdocs documentation: https://datadoghq.atlassian.net/wiki/spaces/docs4docs/pages/4898063037/Cdocs+Build

/en/opentelemetry/instrument/dd_sdks/api_support.md
/en/tracing/trace_collection/custom_instrumentation/server-side/_index.md
/en/cloud_cost_management/allocation/container_cost_allocation.md
/en/error_tracking/error_grouping.md
/en/logs/error_tracking/error_grouping.md
/en/real_user_monitoring/error_tracking/error_grouping.md
/en/tracing/error_tracking/error_grouping.md
/en/client_sdks/setup.md
/en/real_user_monitoring/application_monitoring/android/setup.md
/en/real_user_monitoring/application_monitoring/browser/setup/client.md
/en/real_user_monitoring/application_monitoring/flutter/setup.md
/en/real_user_monitoring/application_monitoring/ios/setup.md
/en/real_user_monitoring/application_monitoring/kotlin_multiplatform/setup.md
/en/real_user_monitoring/application_monitoring/react_native/setup/_index.md
/en/real_user_monitoring/application_monitoring/roku/setup.md
/en/real_user_monitoring/application_monitoring/unity/setup.md
/en/real_user_monitoring/application_monitoring/browser/advanced_configuration.md
/en/real_user_monitoring/correlate_with_other_telemetry/profiling/_index.md
/en/real_user_monitoring/guide/proxy-mobile-rum-data.md
/en/real_user_monitoring/guide/proxy-rum-data.md
/en/client_sdks/advanced_configuration.md
/en/real_user_monitoring/application_monitoring/android/advanced_configuration.md
/en/real_user_monitoring/application_monitoring/flutter/advanced_configuration.md
/en/real_user_monitoring/application_monitoring/ios/advanced_configuration.md
/en/real_user_monitoring/application_monitoring/kotlin_multiplatform/advanced_configuration.md
/en/real_user_monitoring/application_monitoring/react_native/advanced_configuration.md
/en/real_user_monitoring/application_monitoring/roku/advanced_configuration.md
/en/real_user_monitoring/application_monitoring/unity/advanced_configuration.md
/en/client_sdks/data_collected.md
/en/real_user_monitoring/application_monitoring/android/data_collected.md
/en/real_user_monitoring/application_monitoring/browser/data_collected.md
/en/real_user_monitoring/application_monitoring/flutter/data_collected.md
/en/real_user_monitoring/application_monitoring/ios/data_collected.md
/en/real_user_monitoring/application_monitoring/kotlin_multiplatform/data_collected.md
/en/real_user_monitoring/application_monitoring/react_native/data_collected.md
/en/real_user_monitoring/application_monitoring/roku/data_collected.md
/en/real_user_monitoring/application_monitoring/unity/data_collected.md
/en/client_sdks/integrated_libraries.md
/en/real_user_monitoring/application_monitoring/android/integrated_libraries.md
/en/real_user_monitoring/application_monitoring/flutter/integrated_libraries.md
/en/real_user_monitoring/application_monitoring/ios/integrated_libraries.md
/en/real_user_monitoring/application_monitoring/kotlin_multiplatform/integrated_libraries.md
/en/real_user_monitoring/application_monitoring/react_native/integrated_libraries.md
/en/client_sdks/troubleshooting.md
/en/real_user_monitoring/application_monitoring/android/troubleshooting.md
/en/real_user_monitoring/application_monitoring/browser/troubleshooting.md
/en/real_user_monitoring/application_monitoring/flutter/troubleshooting.md
/en/real_user_monitoring/application_monitoring/ios/troubleshooting.md
/en/real_user_monitoring/application_monitoring/kotlin_multiplatform/troubleshooting.md
/en/real_user_monitoring/application_monitoring/react_native/troubleshooting.md
/en/real_user_monitoring/application_monitoring/roku/troubleshooting.md
/en/real_user_monitoring/application_monitoring/unity/troubleshooting.md
/en/real_user_monitoring/application_monitoring/android/frustration_signals.md
/en/real_user_monitoring/application_monitoring/flutter/frustration_signals.md
/en/real_user_monitoring/application_monitoring/ios/frustration_signals.md
/en/real_user_monitoring/application_monitoring/kotlin_multiplatform/frustration_signals.md
/en/real_user_monitoring/application_monitoring/react_native/frustration_signals.md
/en/session_replay/mobile/privacy_options.md
/en/session_replay/mobile/setup_and_configuration.md
/en/synthetics/notifications/template_variables/browser.md
/en/synthetics/notifications/template_variables/mobile.md
/en/synthetics/notifications/template_variables/multistep.md
/en/synthetics/notifications/template_variables/api.md
/en/a_demo/stepper.md
/en/dd_e2e/cdocs/_index.md
/en/dd_e2e/cdocs/content_filtering.md
/en/dd_e2e/cdocs/components/stepper_closed.md
/en/dd_e2e/cdocs/components/stepper_open.md
/en/dd_e2e/cdocs/headings_and_toc.md
/en/dd_e2e/cdocs/components/alert_box.md
/en/dd_e2e/cdocs/components/callout.md
/en/dd_e2e/cdocs/components/check_mark.md
/en/dd_e2e/cdocs/components/code_block.md
/en/dd_e2e/cdocs/components/collapse_content.md
/en/dd_e2e/cdocs/components/definition_list.md
/en/dd_e2e/cdocs/components/image.md
/en/dd_e2e/cdocs/components/region_param.md
/en/dd_e2e/cdocs/components/site_region.md
/en/dd_e2e/cdocs/components/superscript.md
/en/dd_e2e/cdocs/components/table.md
/en/dd_e2e/cdocs/components/tabs.md
/en/dd_e2e/cdocs/components/tooltip.md
/en/dd_e2e/cdocs/components/underline.md
/en/dd_e2e/cdocs/components/video.md
/en/dd_e2e/cdocs/integration/content_filtering.md
/en/dd_e2e/cdocs/integration/headings_and_toc.md
/en/dd_e2e/cdocs/integration/sticky_data.md
/en/dd_e2e/cdocs/integration/conditionally_displayed_filters/hide_if.md
/en/dd_e2e/cdocs/integration/conditionally_displayed_filters/show_if.md
/en/dd_e2e/cdocs/integration/dynamic_options.md
/en/dd_e2e/cdocs/components/glossary_tooltip.md
/en/dd_e2e/cdocs/components/ui.md
/en/dd_e2e/cdocs/components/agent_only.md
/en/dd_e2e/cdocs/components/icon.md
/en/agent/tooltip_test.md
/en/experiments/guide/connecting_a_data_warehouse.md
/en/profiler/enabling/_index.md
/*/client_sdks/advanced_configuration.md
/*/client_sdks/data_collected.md
/*/client_sdks/integrated_libraries.md
/*/client_sdks/setup.md
/*/client_sdks/troubleshooting.md
/*/cloud_cost_management/allocation/container_cost_allocation.md
/*/dd_e2e/cdocs/_index.md
/*/dd_e2e/cdocs/components/agent_only.md
/*/dd_e2e/cdocs/components/alert_box.md
/*/dd_e2e/cdocs/components/callout.md
/*/dd_e2e/cdocs/components/check_mark.md
/*/dd_e2e/cdocs/components/code_block.md
/*/dd_e2e/cdocs/components/collapse_content.md
/*/dd_e2e/cdocs/components/definition_list.md
/*/dd_e2e/cdocs/components/glossary_tooltip.md
/*/dd_e2e/cdocs/components/icon.md
/*/dd_e2e/cdocs/components/image.md
/*/dd_e2e/cdocs/components/region_param.md
/*/dd_e2e/cdocs/components/site_region.md
/*/dd_e2e/cdocs/components/stepper_closed.md
/*/dd_e2e/cdocs/components/stepper_open.md
/*/dd_e2e/cdocs/components/superscript.md
/*/dd_e2e/cdocs/components/table.md
/*/dd_e2e/cdocs/components/tabs.md
/*/dd_e2e/cdocs/components/tooltip.md
/*/dd_e2e/cdocs/components/ui.md
/*/dd_e2e/cdocs/components/underline.md
/*/dd_e2e/cdocs/components/video.md
/*/dd_e2e/cdocs/integration/conditionally_displayed_filters/hide_if.md
/*/dd_e2e/cdocs/integration/conditionally_displayed_filters/show_if.md
/*/dd_e2e/cdocs/integration/content_filtering.md
/*/dd_e2e/cdocs/integration/dynamic_options.md
/*/dd_e2e/cdocs/integration/headings_and_toc.md
/*/dd_e2e/cdocs/integration/sticky_data.md
/*/error_tracking/error_grouping.md
/*/experiments/guide/connecting_a_data_warehouse.md
/*/logs/error_tracking/error_grouping.md
/*/opentelemetry/instrument/dd_sdks/api_support.md
/*/profiler/enabling/_index.md
/*/real_user_monitoring/application_monitoring/android/advanced_configuration.md
/*/real_user_monitoring/application_monitoring/android/data_collected.md
/*/real_user_monitoring/application_monitoring/android/frustration_signals.md
/*/real_user_monitoring/application_monitoring/android/integrated_libraries.md
/*/real_user_monitoring/application_monitoring/android/setup.md
/*/real_user_monitoring/application_monitoring/android/troubleshooting.md
/*/real_user_monitoring/application_monitoring/browser/advanced_configuration.md
/*/real_user_monitoring/application_monitoring/browser/data_collected.md
/*/real_user_monitoring/application_monitoring/browser/setup/client.md
/*/real_user_monitoring/application_monitoring/browser/troubleshooting.md
/*/real_user_monitoring/application_monitoring/flutter/advanced_configuration.md
/*/real_user_monitoring/application_monitoring/flutter/data_collected.md
/*/real_user_monitoring/application_monitoring/flutter/frustration_signals.md
/*/real_user_monitoring/application_monitoring/flutter/integrated_libraries.md
/*/real_user_monitoring/application_monitoring/flutter/setup.md
/*/real_user_monitoring/application_monitoring/flutter/troubleshooting.md
/*/real_user_monitoring/application_monitoring/ios/advanced_configuration.md
/*/real_user_monitoring/application_monitoring/ios/data_collected.md
/*/real_user_monitoring/application_monitoring/ios/frustration_signals.md
/*/real_user_monitoring/application_monitoring/ios/integrated_libraries.md
/*/real_user_monitoring/application_monitoring/ios/setup.md
/*/real_user_monitoring/application_monitoring/ios/troubleshooting.md
/*/real_user_monitoring/application_monitoring/kotlin_multiplatform/advanced_configuration.md
/*/real_user_monitoring/application_monitoring/kotlin_multiplatform/data_collected.md
/*/real_user_monitoring/application_monitoring/kotlin_multiplatform/frustration_signals.md
/*/real_user_monitoring/application_monitoring/kotlin_multiplatform/integrated_libraries.md
/*/real_user_monitoring/application_monitoring/kotlin_multiplatform/setup.md
/*/real_user_monitoring/application_monitoring/kotlin_multiplatform/troubleshooting.md
/*/real_user_monitoring/application_monitoring/react_native/advanced_configuration.md
/*/real_user_monitoring/application_monitoring/react_native/data_collected.md
/*/real_user_monitoring/application_monitoring/react_native/frustration_signals.md
/*/real_user_monitoring/application_monitoring/react_native/integrated_libraries.md
/*/real_user_monitoring/application_monitoring/react_native/setup/_index.md
/*/real_user_monitoring/application_monitoring/react_native/troubleshooting.md
/*/real_user_monitoring/application_monitoring/roku/advanced_configuration.md
/*/real_user_monitoring/application_monitoring/roku/data_collected.md
/*/real_user_monitoring/application_monitoring/roku/setup.md
/*/real_user_monitoring/application_monitoring/roku/troubleshooting.md
/*/real_user_monitoring/application_monitoring/unity/advanced_configuration.md
/*/real_user_monitoring/application_monitoring/unity/data_collected.md
/*/real_user_monitoring/application_monitoring/unity/setup.md
/*/real_user_monitoring/application_monitoring/unity/troubleshooting.md
/*/real_user_monitoring/correlate_with_other_telemetry/profiling/_index.md
/*/real_user_monitoring/error_tracking/error_grouping.md
/*/real_user_monitoring/guide/proxy-mobile-rum-data.md
/*/real_user_monitoring/guide/proxy-rum-data.md
/*/session_replay/mobile/privacy_options.md
/*/session_replay/mobile/setup_and_configuration.md
/*/synthetics/notifications/template_variables/api.md
/*/synthetics/notifications/template_variables/browser.md
/*/synthetics/notifications/template_variables/mobile.md
/*/synthetics/notifications/template_variables/multistep.md
/*/tracing/error_tracking/error_grouping.md
/*/tracing/trace_collection/custom_instrumentation/server-side/_index.md
33 changes: 0 additions & 33 deletions content/es/profiler/enabling/_index.md

This file was deleted.

Loading
Loading