Skip to content
Open
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
6 changes: 6 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
48 changes: 48 additions & 0 deletions .github/scripts/format-check.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#!/bin/bash
##===----------------------------------------------------------------------===##
##
## This source file is part of the Swift open source project
##
## Copyright (c) 2025 Apple Inc. and the Swift project authors
## Licensed under Apache License v2.0 with Runtime Library Exception
##
## See http://swift.org/LICENSE.txt for license information
## See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
##
##===----------------------------------------------------------------------===##

set -euo pipefail

fail=0

while IFS= read -r file; do
# Skip empty or binary files
if [ ! -s "$file" ] || [[ "$file" == *png ]] || [[ "$file" == *mlmodel ]] || [[ "$file" == *mlpackage* ]] ; then
continue
fi

# --- Check for trailing whitespace (spaces or tabs before end of line) ---
# Using POSIX-compatible regex; no -P flag needed.
if grep -nE '[[:space:]]+$' "$file" >/dev/null; then
echo "❌ Trailing whitespace in: $file"
# Print offending lines (indent for readability)
grep -nE '[[:space:]]+$' "$file" | sed 's/^/ /'
fail=1
fi

# --- Check for final newline ---
# tail -c handles both GNU and BSD variants
lastchar=$(tail -c 1 "$file" | od -An -tx1 | tr -d ' \n')
if [[ "$lastchar" != "0a" ]]; then
echo "❌ Missing final newline: $file"
fail=1
fi

done < <(git ls-files)

if [[ $fail -eq 0 ]]; then
echo "✅ All tracked files are clean (no trailing whitespace, final newline present)."
else
echo "⚠️ Some files failed checks."
exit 1
fi
40 changes: 40 additions & 0 deletions .github/scripts/prebuild.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
##===----------------------------------------------------------------------===##
##
## This source file is part of the Swift open source project
##
## Copyright (c) 2025 Apple Inc. and the Swift project authors
## Licensed under Apache License v2.0 with Runtime Library Exception
##
## See http://swift.org/LICENSE.txt for license information
## See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
##
##===----------------------------------------------------------------------===##

param (
[switch]$SkipAndroid,
[switch]$InstallCMake
)

# winget isn't easily made available in containers, so use chocolatey
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

if ($InstallCMake) {
choco install -y cmake --installargs 'ADD_CMAKE_TO_PATH=System' --apply-install-arguments-to-dependencies
choco install -y ninja

Import-Module $env:ChocolateyInstall\helpers\chocolateyProfile.psm1
refreshenv

# Let swiftc find the path to link.exe in the CMake smoke test
$env:Path += ";$(Split-Path -Path "$(& "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" "-latest" -products Microsoft.VisualStudio.Product.BuildTools -find VC\Tools\MSVC\*\bin\HostX64\x64\link.exe)" -Parent)"
}

if (-not $SkipAndroid) {
choco install -y android-ndk

Import-Module $env:ChocolateyInstall\helpers\chocolateyProfile.psm1
refreshenv

# Work around a bug in the package causing the env var to be set incorrectly
$env:ANDROID_NDK_ROOT = $env:ANDROID_NDK_ROOT.replace('-windows.zip','')
}
85 changes: 85 additions & 0 deletions .github/scripts/prebuild.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
#!/bin/bash
##===----------------------------------------------------------------------===##
##
## This source file is part of the Swift open source project
##
## Copyright (c) 2025 Apple Inc. and the Swift project authors
## Licensed under Apache License v2.0 with Runtime Library Exception
##
## See http://swift.org/LICENSE.txt for license information
## See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
##
##===----------------------------------------------------------------------===##

set -e

if [[ $(uname) == Darwin ]] ; then
if [[ "$INSTALL_CMAKE" == "1" ]] ; then
mkdir -p "$RUNNER_TOOL_CACHE"
if ! command -v cmake >/dev/null 2>&1 ; then
curl -fsSLO https://github.com/Kitware/CMake/releases/download/v4.1.2/cmake-4.1.2-macos-universal.tar.gz
echo '3be85f5b999e327b1ac7d804cbc9acd767059e9f603c42ec2765f6ab68fbd367 cmake-4.1.2-macos-universal.tar.gz' > cmake-4.1.2-macos-universal.tar.gz.sha256
sha256sum -c cmake-4.1.2-macos-universal.tar.gz.sha256
tar -xf cmake-4.1.2-macos-universal.tar.gz
ln -s "$PWD/cmake-4.1.2-macos-universal/CMake.app/Contents/bin/cmake" "$RUNNER_TOOL_CACHE/cmake"
fi
if ! command -v ninja >/dev/null 2>&1 ; then
curl -fsSLO https://github.com/ninja-build/ninja/releases/download/v1.13.1/ninja-mac.zip
echo 'da7797794153629aca5570ef7c813342d0be214ba84632af886856e8f0063dd9 ninja-mac.zip' > ninja-mac.zip.sha256
sha256sum -c ninja-mac.zip.sha256
unzip ninja-mac.zip
rm -f ninja-mac.zip
mv ninja "$RUNNER_TOOL_CACHE/ninja"
fi
fi
elif command -v apt-get >/dev/null 2>&1 ; then # bookworm, noble, jammy
export DEBIAN_FRONTEND=noninteractive

apt-get update -y

# Build dependencies
apt-get install -y libsqlite3-dev libncurses-dev

# Debug symbols
apt-get install -y libc6-dbg

if [[ "$INSTALL_CMAKE" == "1" ]] ; then
apt-get install -y cmake ninja-build
fi

# Android NDK
dpkg_architecture="$(dpkg --print-architecture)"
if [[ "$SKIP_ANDROID" != "1" ]] && [[ "$dpkg_architecture" == amd64 ]] ; then
eval "$(cat /etc/os-release)"
case "$VERSION_CODENAME" in
bookworm|jammy)
: # Not available
;;
noble)
apt-get install -y google-android-ndk-r26c-installer
;;
*)
echo "Unable to fetch Android NDK for unknown Linux distribution: $VERSION_CODENAME" >&2
exit 1
esac
else
echo "Skipping Android NDK installation on $dpkg_architecture" >&2
fi
elif command -v dnf >/dev/null 2>&1 ; then # rhel-ubi9
dnf update -y

# Build dependencies
dnf install -y sqlite-devel ncurses-devel

# Debug symbols
dnf debuginfo-install -y glibc
elif command -v yum >/dev/null 2>&1 ; then # amazonlinux2
yum update -y

# Build dependencies
yum install -y sqlite-devel ncurses-devel

# Debug symbols
yum install -y yum-utils
debuginfo-install -y glibc
fi
27 changes: 27 additions & 0 deletions .github/workflows/pull_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: Pull request

permissions:
contents: read

on:
pull_request:
types: [opened, reopened, synchronize]

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
tests:
name: Test
uses: swiftlang/github-workflows/.github/workflows/[email protected]
with:
linux_host_archs: '["x86_64", "aarch64"]'
linux_swift_versions: '["nightly-main", "nightly-6.3"]'
windows_swift_versions: '["nightly-main", "nightly-6.3"]'
enable_macos_checks: true
soundness:
name: Soundness
uses: swiftlang/github-workflows/.github/workflows/[email protected]
with:
license_header_check_project_name: "Swift"
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
FROM swift:5.9-focal

# Set up the current build user in the same way done in the Swift.org CI system:
# https://github.com/apple/swift-docker/blob/main/swift-ci/master/ubuntu/20.04/Dockerfile.
# https://github.com/apple/swift-docker/blob/main/swift-ci/main/ubuntu/20.04/Dockerfile.

RUN groupadd -g 998 build-user && \
useradd -m -r -u 42 -g build-user build-user
Expand Down
2 changes: 1 addition & 1 deletion Sources/DocCCommandLine/Action/Actions/PreviewAction.swift
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ public final class PreviewAction: AsyncAction {
#if !os(Linux) && !os(Android)
try watch()
#endif
// This will wait until the server is manually killed.
// This will wait until the server is manually terminated.
try servers[serverIdentifier]!.start()
previewResult = ActionResult(didEncounterError: false)
} catch {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -168,13 +168,13 @@ fileprivate let builtinExcludedTerms: [NonInclusiveLanguageChecker.Term] = [
replacement: "deny list"
),
NonInclusiveLanguageChecker.Term(
expression: #"master\w{0,2}"#,
message: #"Don't use "master" to describe the relationship between two devices, processes, or other things. Use an alternative that's appropriate to the context, such as "main" and "secondary" or "host" and "client"."#,
expression: #"master\w{0,2}"#, // ignore-unacceptable-language
message: #"Don't use "master" to describe the relationship between two devices, processes, or other things. Use an alternative that's appropriate to the context, such as "main" and "secondary" or "host" and "client"."#, // ignore-unacceptable-language
replacement: "primary"
),
NonInclusiveLanguageChecker.Term(
expression: #"slave\w{0,2}"#,
message: #"Don't use "slave" to describe the relationship between two devices, processes, or other things. Use an alternative that's appropriate to the context, such as "main" and "secondary" or "host" and "client"."#,
expression: #"slave\w{0,2}"#, // ignore-unacceptable-language
message: #"Don't use "slave" to describe the relationship between two devices, processes, or other things. Use an alternative that's appropriate to the context, such as "main" and "secondary" or "host" and "client"."#, // ignore-unacceptable-language
replacement: "secondary"
),
NonInclusiveLanguageChecker.Term(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Displays an image in a tutorial.
The `Image` directive displays an image in your tutorial. Provide the name of an image and alternative text that describes the image in sufficient detail so screen readers can read that text aloud for people who are blind or have low-vision.

```
@Image(source: overview-hero, alt: "An illustration of a sleeping sloth, hanging from a tree branch.”)
@Image(source: overview-hero, alt: "An illustration of a sleeping sloth, dangling from a tree branch.”)
````

Images can exist anywhere in your documentation catalog ('.docc' directory). but it's good practice to use subdirectories to organize the content and assets in your documentation.
Expand Down
2 changes: 1 addition & 1 deletion Sources/docc/DocCDocumentation.docc/adding-images.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ display scale, and file extension components. Don't include the path to the
image.

```markdown
![A sloth hanging off a tree.](sloth)
![A sloth dangling off a tree.](sloth)
```

<!-- Copyright (c) 2023-2025 Apple Inc and the Swift Project authors. All Rights Reserved. -->
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ For example, to add a section about the sleeping habits of sloths to the `Sloth`

## Sleeping Habits

Sloths sleep in trees by curling into a ball and hanging by their claws.
Sloths sleep in trees by curling into a ball and dangling by their claws.
```

If the symbol's existing source documentation focuses on implementation and isn't appropriate for external documentation, you can completely replace the documentation comment's content with the extension file's content by adding a ``DocumentationExtension`` directive.
Expand Down
2 changes: 1 addition & 1 deletion Tests/DocCCommandLineTests/SignalTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class SignalTests: XCTestCase {

/// Runs `signal-test-app` and confirms that it exits with code 99.
///
/// `signal-test-app` sends a kill signal to itself and uses ``Signal`` to intercept that signal
/// `signal-test-app` sends a terminate signal to itself and uses ``Signal`` to intercept that signal
/// and set the exit code to 99.
func testTrappingSignal() throws {
let signalTestAppPath = productDirectory.appendingPathComponent("signal-test-app").path
Expand Down
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This checker is explicitly trying to find these invalid words in these cases, so I don't think we want them changed. Not 100% sure how to say "this is acceptable" for the soundness checking in a multi-line Swift string here though

Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ struct NonInclusiveLanguageCheckerTests {
@Test
func matchesTermsInTitle() throws {
let source = """
# A Whitelisted title
# A Allowlisted title
"""
let document = Document(parsing: source)
var checker = NonInclusiveLanguageChecker(sourceFile: nil)
Expand Down Expand Up @@ -71,7 +71,7 @@ struct NonInclusiveLanguageCheckerTests {
let source = """
# Title

The blacklist is in the abstract.
The denylist is in the abstract.
"""
let document = Document(parsing: source)
var checker = NonInclusiveLanguageChecker(sourceFile: nil)
Expand All @@ -96,7 +96,7 @@ The abstract.
## Overview

The
master branch is the default.
main branch is the default.
"""
let document = Document(parsing: source)
var checker = NonInclusiveLanguageChecker(sourceFile: nil)
Expand Down Expand Up @@ -176,7 +176,7 @@ func aBlackListedFunc() {
private let nonInclusiveContent = """
# Some root page

Some custom root page. And here is a ~~whitelist~~:
Some custom root page. And here is a ~~allowlist~~:

- item one
- item two
Expand Down
4 changes: 2 additions & 2 deletions Tests/SwiftDocCTests/Indexing/NavigatorIndexTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2142,9 +2142,9 @@ Root

// Verify that beta status was captured in the render index
XCTAssertEqual(betaNodes.map(\.title), ["MyClass"])
XCTAssert(betaNodes.allSatisfy(\.isBeta)) // Sanity check
XCTAssert(betaNodes.allSatisfy(\.isBeta)) // Consistency check
XCTAssertEqual(nonBetaNodes.map(\.title).sorted(), ["Classes", "MyOtherClass", "MyThirdClass"])
XCTAssert(nonBetaNodes.allSatisfy { $0.isBeta == false }) // Sanity check
XCTAssert(nonBetaNodes.allSatisfy { $0.isBeta == false }) // Consistency check
}

private func findNodesWithBetaStatus(in nodes: [RenderIndex.Node], isBeta: Bool) -> [RenderIndex.Node] {
Expand Down
2 changes: 1 addition & 1 deletion Tests/signal-test-app/main.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ Signal.on(Signal.all) { _ in
}

DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
kill(getpid(), SIGABRT)
kill(getpid(), SIGABRT) # ignore-unacceptable-language
}

print("Signal test app running.")
Expand Down
Loading