Remove Zed-specific scripts
Keep only development utility scripts useful for GPUI: - clippy (linting) - linux dependency installation - crate version helpers - new-crate template - metal-debug for macOS GPU debugging Removed Zed-specific scripts for: - Release management and bundling - Collab server deployment - Extension system - Database management - GitHub automation - Theme importing
This commit is contained in:
@@ -1,69 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
This script analyzes all the highlights.scm files in our embedded languages and extensions.
|
||||
It counts the number of unique instances of @{name} and the languages in which they are used.
|
||||
|
||||
This is useful to help avoid accidentally introducing new tags when appropriate ones already exist when adding new languages.
|
||||
|
||||
Flags:
|
||||
-v, --verbose: Include a detailed list of languages for each tag found in the highlights.scm files.
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import re
|
||||
from collections import defaultdict
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
pattern = re.compile(r'@(?!_)[a-zA-Z_.]+')
|
||||
|
||||
def parse_arguments():
|
||||
parser = argparse.ArgumentParser(description='Analyze highlights.scm files for unique instances and their languages.')
|
||||
parser.add_argument('-v', '--verbose', action='store_true', help='Include a list of languages for each tag.')
|
||||
return parser.parse_args()
|
||||
|
||||
def find_highlight_files(root_dir):
|
||||
for path in Path(root_dir).rglob('highlights.scm'):
|
||||
yield path
|
||||
|
||||
def count_instances(files):
|
||||
instances: defaultdict[list[Any], dict[str, Any]] = defaultdict(lambda: {'count': 0, 'languages': set()})
|
||||
for file_path in files:
|
||||
language = file_path.parent.name
|
||||
with open(file_path, "r") as file:
|
||||
text = file.read()
|
||||
matches = pattern.findall(text)
|
||||
for match in matches:
|
||||
instances[match]['count'] += 1
|
||||
instances[match]['languages'].add(language)
|
||||
return instances
|
||||
|
||||
def print_instances(instances, verbose=False):
|
||||
for item, details in sorted(instances.items(), key=lambda x: x[0]):
|
||||
languages = ', '.join(sorted(details['languages']))
|
||||
if verbose:
|
||||
print(f"{item} ({details['count']}) - [{languages}]")
|
||||
else:
|
||||
print(f"{item} ({details['count']})")
|
||||
|
||||
def main():
|
||||
args = parse_arguments()
|
||||
|
||||
base_dir = Path(__file__).parent.parent
|
||||
core_path = base_dir / 'crates/languages/src'
|
||||
extension_path = base_dir / 'extensions/'
|
||||
|
||||
core_instances = count_instances(find_highlight_files(core_path))
|
||||
extension_instances = count_instances(find_highlight_files(extension_path))
|
||||
|
||||
unique_extension_instances = {k: v for k, v in extension_instances.items() if k not in core_instances}
|
||||
|
||||
print('Shared:\n')
|
||||
print_instances(core_instances, args.verbose)
|
||||
|
||||
if unique_extension_instances:
|
||||
print('\nExtension-only:\n')
|
||||
print_instances(unique_extension_instances, args.verbose)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -1,53 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
# if root or if sudo/unavailable, define an empty variable
|
||||
if [ "$(id -u)" -eq 0 ]
|
||||
then maysudo=''
|
||||
else maysudo="$(command -v sudo || command -v doas || true)"
|
||||
fi
|
||||
|
||||
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
||||
echo "Linux dependencies..."
|
||||
script/linux
|
||||
else
|
||||
echo "installing foreman..."
|
||||
which foreman > /dev/null || brew install foreman
|
||||
fi
|
||||
|
||||
# Install minio if needed
|
||||
if ! which minio > /dev/null; then
|
||||
if command -v brew > /dev/null; then
|
||||
echo "minio not found. Installing via brew"
|
||||
brew install minio/stable/minio
|
||||
elif command -v apt > /dev/null; then
|
||||
echo "minio not found. Installing via apt from https://dl.min.io/server/minio/release/linux-amd64/minio.deb"
|
||||
wget -q https://dl.min.io/server/minio/release/linux-amd64/minio.deb -O /tmp/minio.deb
|
||||
$maysudo apt install /tmp/minio.deb
|
||||
rm -f /tmp/minio.deb
|
||||
elif command -v dnf > /dev/null; then
|
||||
echo "minio not found. Installing via dnf from https://dl.min.io/server/minio/release/linux-amd64/minio.rpm"
|
||||
wget -q https://dl.min.io/server/minio/release/linux-amd64/minio.rpm -O /tmp/minio.rpm
|
||||
$maysudo dnf install /tmp/minio.rpm
|
||||
rm -f /tmp/minio.rpm
|
||||
else
|
||||
echo "No supported package manager found (brew, apt, or dnf)"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Install sqlx-cli if needed
|
||||
if ! [[ "$(command -v sqlx)" && "$(sqlx --version)" == "sqlx-cli 0.7.2" ]]; then
|
||||
echo "sqlx-cli not found or not the required version, installing version 0.7.2..."
|
||||
cargo install sqlx-cli --version 0.7.2
|
||||
fi
|
||||
|
||||
cd crates/collab
|
||||
|
||||
# Export contents of .env.toml
|
||||
eval "$(cargo run --bin dotenv)"
|
||||
|
||||
echo "creating databases..."
|
||||
sqlx database create --database-url "$DATABASE_URL"
|
||||
sqlx database create --database-url "$LLM_DATABASE_URL"
|
||||
@@ -1,21 +0,0 @@
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$PSNativeCommandUseErrorActionPreference = $true
|
||||
|
||||
$env:POWERSHELL = $true
|
||||
|
||||
if (!(Get-Command sqlx -ErrorAction SilentlyContinue) -or (sqlx --version) -notlike "sqlx-cli 0.7.2") {
|
||||
Write-Output "sqlx-cli not found or not the required version, installing version 0.7.2..."
|
||||
cargo install sqlx-cli --version 0.7.2
|
||||
}
|
||||
|
||||
Set-Location .\crates\collab
|
||||
|
||||
# Export contents of .env.toml
|
||||
$env = (cargo run --bin dotenv) -join "`n";
|
||||
Invoke-Expression $env
|
||||
|
||||
Set-Location ../..
|
||||
|
||||
Write-Output "creating databases..."
|
||||
sqlx database create --database-url "$env:DATABASE_URL"
|
||||
sqlx database create --database-url "$env:LLM_DATABASE_URL"
|
||||
@@ -1,25 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Use a docker BASE_IMAGE to test building Zed.
|
||||
# e.g: ./script/bundle-docker ubuntu:20.04
|
||||
#
|
||||
# Increasing resources available to podman may speed this up:
|
||||
# podman machine stop
|
||||
# podman machine set --memory 16384 --cpus 8 --disk-size 200
|
||||
# podman machine start
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
BASE_IMAGE=${BASE_IMAGE:-${1:-}}
|
||||
if [ -z "$BASE_IMAGE" ]; then
|
||||
echo "Usage: $0 BASE_IMAGE" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
export DOCKER_BUILDKIT=1
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
podman build . \
|
||||
-f Dockerfile-distros \
|
||||
-t many \
|
||||
--build-arg BASE_IMAGE="$BASE_IMAGE"
|
||||
@@ -1,7 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
git pull --ff-only origin main
|
||||
git tag -f extension-cli
|
||||
git push -f origin extension-cli
|
||||
@@ -1,7 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
git fetch origin main:tags/nightly -f
|
||||
git log --oneline -1 nightly
|
||||
git push -f origin nightly
|
||||
@@ -1,123 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -eu
|
||||
|
||||
# Ensure cargo-edit is installed
|
||||
which cargo-set-version > /dev/null || cargo install cargo-edit
|
||||
|
||||
# Ensure we're in a clean state on an up-to-date `main` branch.
|
||||
if [[ -n $(git status --short --untracked-files=no) ]]; then
|
||||
echo "can't bump versions with uncommitted changes"
|
||||
exit 1
|
||||
fi
|
||||
if [[ $(git rev-parse --abbrev-ref HEAD) != "main" ]]; then
|
||||
echo "this command must be run on main"
|
||||
exit 1
|
||||
fi
|
||||
git pull -q --ff-only origin main
|
||||
|
||||
# Parse the current version
|
||||
version=$(script/get-crate-version zed)
|
||||
major=$(echo $version | cut -d. -f1)
|
||||
minor=$(echo $version | cut -d. -f2)
|
||||
patch=$(echo $version | cut -d. -f3)
|
||||
prev_minor=$(expr $minor - 1)
|
||||
next_minor=$(expr $minor + 1)
|
||||
|
||||
minor_branch_name="v${major}.${minor}.x"
|
||||
prev_minor_branch_name="v${major}.${prev_minor}.x"
|
||||
next_minor_branch_name="v${major}.${next_minor}.x"
|
||||
preview_tag_name="v${major}.${minor}.${patch}-pre"
|
||||
bump_main_branch_name="set-minor-version-to-${major}.${next_minor}"
|
||||
|
||||
git fetch origin ${prev_minor_branch_name}:${prev_minor_branch_name}
|
||||
git fetch origin --tags
|
||||
cargo check -q
|
||||
|
||||
function cleanup {
|
||||
git checkout -q main
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
echo "Checking invariants before taking any actions..."
|
||||
if [[ $(cat crates/zed/RELEASE_CHANNEL) != dev && $(cat crates/zed/RELEASE_CHANNEL) != nightly ]]; then
|
||||
echo "release channel on main should be dev or nightly"
|
||||
exit 1
|
||||
fi
|
||||
if git show-ref --quiet refs/tags/${preview_tag_name}; then
|
||||
echo "tag ${preview_tag_name} already exists"
|
||||
exit 1
|
||||
fi
|
||||
if git show-ref --quiet refs/heads/${minor_branch_name}; then
|
||||
echo "branch ${minor_branch_name} already exists"
|
||||
exit 1
|
||||
fi
|
||||
if ! git show-ref --quiet refs/heads/${prev_minor_branch_name}; then
|
||||
echo "previous branch ${minor_branch_name} doesn't exist"
|
||||
exit 1
|
||||
fi
|
||||
if [[ $(git show ${prev_minor_branch_name}:crates/zed/RELEASE_CHANNEL) != preview ]]; then
|
||||
echo "release channel on branch ${prev_minor_branch_name} should be preview"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Promoting existing branch ${prev_minor_branch_name} to stable..."
|
||||
git checkout -q ${prev_minor_branch_name}
|
||||
git clean -q -dff
|
||||
stable_tag_name="v$(script/get-crate-version zed)"
|
||||
if git show-ref --quiet refs/tags/${stable_tag_name}; then
|
||||
echo "tag ${stable_tag_name} already exists"
|
||||
exit 1
|
||||
fi
|
||||
old_prev_minor_sha=$(git rev-parse HEAD)
|
||||
echo -n stable > crates/zed/RELEASE_CHANNEL
|
||||
git commit -q --all --message "${prev_minor_branch_name} stable"
|
||||
git tag ${stable_tag_name}
|
||||
|
||||
echo "Creating new preview branch ${minor_branch_name}..."
|
||||
git checkout -q main
|
||||
git checkout -q -b ${minor_branch_name}
|
||||
echo -n preview > crates/zed/RELEASE_CHANNEL
|
||||
git commit -q --all --message "${minor_branch_name} preview"
|
||||
git tag ${preview_tag_name}
|
||||
|
||||
echo "Preparing main for version ${next_minor_branch_name}..."
|
||||
git checkout -q main
|
||||
git clean -q -dff
|
||||
git checkout -q -b ${bump_main_branch_name}
|
||||
cargo set-version --package zed --bump minor
|
||||
cargo check -q
|
||||
|
||||
git commit -q --all --message "${next_minor_branch_name} dev"
|
||||
|
||||
git checkout -q main
|
||||
|
||||
cat <<MESSAGE
|
||||
Prepared new Zed versions locally. You will need to push the branches and open a PR for the change to main.
|
||||
|
||||
# To push and open a PR to update main:
|
||||
|
||||
git push -u origin \\
|
||||
${preview_tag_name} \\
|
||||
${stable_tag_name} \\
|
||||
${minor_branch_name} \\
|
||||
${prev_minor_branch_name} \\
|
||||
${bump_main_branch_name}
|
||||
|
||||
echo -e "Release Notes:\n\n- N/A" | gh pr create \\
|
||||
--title "Bump Zed to v${major}.${next_minor}" \\
|
||||
--body-file "-" \\
|
||||
--base main \\
|
||||
--head ${bump_main_branch_name} \\
|
||||
--web
|
||||
|
||||
# To undo this push:
|
||||
|
||||
git push -f . \\
|
||||
:${preview_tag_name} \\
|
||||
:${stable_tag_name} \\
|
||||
:${minor_branch_name} \\
|
||||
:${bump_main_branch_name} \\
|
||||
${old_prev_minor_sha}:${prev_minor_branch_name}
|
||||
|
||||
MESSAGE
|
||||
@@ -1,18 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
channel=$(cat crates/zed/RELEASE_CHANNEL)
|
||||
|
||||
tag_suffix=""
|
||||
case $channel in
|
||||
stable)
|
||||
;;
|
||||
preview)
|
||||
tag_suffix="-pre"
|
||||
;;
|
||||
*)
|
||||
echo "this must be run on either of stable|preview release branches" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
exec script/lib/bump-version.sh zed v "$tag_suffix" patch
|
||||
@@ -1,161 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euxo pipefail
|
||||
source script/lib/blob-store.sh
|
||||
|
||||
# Function for displaying help info
|
||||
help_info() {
|
||||
echo "
|
||||
Usage: ${0##*/} [options]
|
||||
Build a release .tar.gz for FreeBSD.
|
||||
|
||||
Options:
|
||||
-h Display this help and exit.
|
||||
"
|
||||
}
|
||||
|
||||
while getopts 'h' flag; do
|
||||
case "${flag}" in
|
||||
h)
|
||||
help_info
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
export ZED_BUNDLE=true
|
||||
|
||||
channel=$(<crates/zed/RELEASE_CHANNEL)
|
||||
target_dir="${CARGO_TARGET_DIR:-target}"
|
||||
|
||||
version="$(script/get-crate-version zed)"
|
||||
# Set RELEASE_VERSION so it's compiled into GPUI and it knows about the version.
|
||||
export RELEASE_VERSION="${version}"
|
||||
|
||||
commit=$(git rev-parse HEAD | cut -c 1-7)
|
||||
|
||||
version_info=$(rustc --version --verbose)
|
||||
host_line=$(echo "$version_info" | grep host)
|
||||
target_triple=${host_line#*: }
|
||||
remote_server_triple=${REMOTE_SERVER_TARGET:-"${target_triple}"}
|
||||
|
||||
# musl_triple=${target_triple%-gnu}-musl
|
||||
# rustup_installed=false
|
||||
# if command -v rustup >/dev/null 2>&1; then
|
||||
# rustup_installed=true
|
||||
# fi
|
||||
# Generate the licenses first, so they can be baked into the binaries
|
||||
# script/generate-licenses
|
||||
# if "$rustup_installed"; then
|
||||
# rustup target add "$remote_server_triple"
|
||||
# fi
|
||||
|
||||
# export CC=$(which clang)
|
||||
|
||||
# Build binary in release mode
|
||||
export RUSTFLAGS="${RUSTFLAGS:-} -C link-args=-Wl,--disable-new-dtags,-rpath,\$ORIGIN/../lib"
|
||||
# cargo build --release --target "${target_triple}" --package zed --package cli
|
||||
|
||||
# Build remote_server in separate invocation to prevent feature unification from other crates
|
||||
# from influencing dynamic libraries required by it.
|
||||
# if [[ "$remote_server_triple" == "$musl_triple" ]]; then
|
||||
# export RUSTFLAGS="${RUSTFLAGS:-} -C target-feature=+crt-static"
|
||||
# fi
|
||||
cargo build --release --target "${remote_server_triple}" --package remote_server
|
||||
|
||||
# Strip debug symbols and save them for upload to DigitalOcean
|
||||
# objcopy --only-keep-debug "${target_dir}/${target_triple}/release/zed" "${target_dir}/${target_triple}/release/zed.dbg"
|
||||
# objcopy --only-keep-debug "${target_dir}/${remote_server_triple}/release/remote_server" "${target_dir}/${remote_server_triple}/release/remote_server.dbg"
|
||||
# objcopy --strip-debug "${target_dir}/${target_triple}/release/zed"
|
||||
# objcopy --strip-debug "${target_dir}/${target_triple}/release/cli"
|
||||
# objcopy --strip-debug "${target_dir}/${remote_server_triple}/release/remote_server"
|
||||
|
||||
# gzip -f "${target_dir}/${target_triple}/release/zed.dbg"
|
||||
# gzip -f "${target_dir}/${remote_server_triple}/release/remote_server.dbg"
|
||||
|
||||
# if [[ -n "${DIGITALOCEAN_SPACES_SECRET_KEY:-}" && -n "${DIGITALOCEAN_SPACES_ACCESS_KEY:-}" ]]; then
|
||||
# upload_to_blob_store_public \
|
||||
# "zed-debug-symbols" \
|
||||
# "${target_dir}/${target_triple}/release/zed.dbg.gz" \
|
||||
# "$channel/zed-$version-${target_triple}.dbg.gz"
|
||||
# upload_to_blob_store_public \
|
||||
# "zed-debug-symbols" \
|
||||
# "${target_dir}/${remote_server_triple}/release/remote_server.dbg.gz" \
|
||||
# "$channel/remote_server-$version-${remote_server_triple}.dbg.gz"
|
||||
# fi
|
||||
|
||||
# Ensure that remote_server does not depend on libssl nor libcrypto, as we got rid of these deps.
|
||||
if ldd "${target_dir}/${remote_server_triple}/release/remote_server" | grep -q 'libcrypto\|libssl'; then
|
||||
echo "Error: remote_server still depends on libssl or libcrypto" && exit 1
|
||||
fi
|
||||
|
||||
suffix=""
|
||||
if [ "$channel" != "stable" ]; then
|
||||
suffix="-$channel"
|
||||
fi
|
||||
|
||||
# Move everything that should end up in the final package
|
||||
# into a temp directory.
|
||||
# temp_dir=$(mktemp -d)
|
||||
# zed_dir="${temp_dir}/zed$suffix.app"
|
||||
|
||||
# Binary
|
||||
# mkdir -p "${zed_dir}/bin" "${zed_dir}/libexec"
|
||||
# cp "${target_dir}/${target_triple}/release/zed" "${zed_dir}/libexec/zed-editor"
|
||||
# cp "${target_dir}/${target_triple}/release/cli" "${zed_dir}/bin/zed"
|
||||
|
||||
# Libs
|
||||
# find_libs() {
|
||||
# ldd ${target_dir}/${target_triple}/release/zed |
|
||||
# cut -d' ' -f3 |
|
||||
# grep -v '\<\(libstdc++.so\|libc.so\|libgcc_s.so\|libm.so\|libpthread.so\|libdl.so\|libasound.so\)'
|
||||
# }
|
||||
|
||||
# mkdir -p "${zed_dir}/lib"
|
||||
# rm -rf "${zed_dir}/lib/*"
|
||||
# cp $(find_libs) "${zed_dir}/lib"
|
||||
|
||||
# Icons
|
||||
# mkdir -p "${zed_dir}/share/icons/hicolor/512x512/apps"
|
||||
# cp "crates/zed/resources/app-icon$suffix.png" "${zed_dir}/share/icons/hicolor/512x512/apps/zed.png"
|
||||
# mkdir -p "${zed_dir}/share/icons/hicolor/1024x1024/apps"
|
||||
# cp "crates/zed/resources/app-icon$suffix@2x.png" "${zed_dir}/share/icons/hicolor/1024x1024/apps/zed.png"
|
||||
|
||||
# .desktop
|
||||
# export DO_STARTUP_NOTIFY="true"
|
||||
# export APP_CLI="zed"
|
||||
# export APP_ICON="zed"
|
||||
# export APP_ARGS="%U"
|
||||
# if [[ "$channel" == "preview" ]]; then
|
||||
# export APP_NAME="Zed Preview"
|
||||
# elif [[ "$channel" == "nightly" ]]; then
|
||||
# export APP_NAME="Zed Nightly"
|
||||
# elif [[ "$channel" == "dev" ]]; then
|
||||
# export APP_NAME="Zed Devel"
|
||||
# else
|
||||
# export APP_NAME="Zed"
|
||||
# fi
|
||||
|
||||
# mkdir -p "${zed_dir}/share/applications"
|
||||
# envsubst <"crates/zed/resources/zed.desktop.in" >"${zed_dir}/share/applications/zed$suffix.desktop"
|
||||
# chmod +x "${zed_dir}/share/applications/zed$suffix.desktop"
|
||||
|
||||
# Copy generated licenses so they'll end up in archive too
|
||||
# cp "assets/licenses.md" "${zed_dir}/licenses.md"
|
||||
|
||||
# Create archive out of everything that's in the temp directory
|
||||
arch=$(uname -m)
|
||||
# target="freebsd-${arch}"
|
||||
# if [[ "$channel" == "dev" ]]; then
|
||||
# archive="zed-${commit}-${target}.tar.gz"
|
||||
# else
|
||||
# archive="zed-${target}.tar.gz"
|
||||
# fi
|
||||
|
||||
# rm -rf "${archive}"
|
||||
# remove_match="zed(-[a-zA-Z0-9]+)?-linux-$(uname -m)\.tar\.gz"
|
||||
# ls "${target_dir}/release" | grep -E ${remove_match} | xargs -d "\n" -I {} rm -f "${target_dir}/release/{}" || true
|
||||
# tar -czvf "${target_dir}/release/$archive" -C ${temp_dir} "zed$suffix.app"
|
||||
|
||||
gzip -f --stdout --best "${target_dir}/${remote_server_triple}/release/remote_server" \
|
||||
> "${target_dir}/zed-remote-server-freebsd-x86_64.gz"
|
||||
@@ -1,191 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euxo pipefail
|
||||
source script/lib/blob-store.sh
|
||||
|
||||
# Function for displaying help info
|
||||
help_info() {
|
||||
echo "
|
||||
Usage: ${0##*/} [options]
|
||||
Build a release .tar.gz for Linux.
|
||||
|
||||
Options:
|
||||
-h, --help Display this help and exit.
|
||||
--flatpak Set ZED_BUNDLE_TYPE=flatpak so that this can be included in system info
|
||||
"
|
||||
}
|
||||
|
||||
# Parse all arguments manually
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
-h|--help)
|
||||
help_info
|
||||
exit 0
|
||||
;;
|
||||
--flatpak)
|
||||
export ZED_BUNDLE_TYPE=flatpak
|
||||
shift
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
-*)
|
||||
echo "Unknown option: $1" >&2
|
||||
help_info
|
||||
exit 1
|
||||
;;
|
||||
*)
|
||||
echo "Error: Unexpected argument: $1" >&2
|
||||
help_info
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
export ZED_BUNDLE=true
|
||||
|
||||
channel=$(<crates/zed/RELEASE_CHANNEL)
|
||||
target_dir="${CARGO_TARGET_DIR:-target}"
|
||||
|
||||
version="$(script/get-crate-version zed)"
|
||||
# Set RELEASE_VERSION so it's compiled into GPUI and it knows about the version.
|
||||
export RELEASE_VERSION="${version}"
|
||||
|
||||
commit=$(git rev-parse HEAD | cut -c 1-7)
|
||||
|
||||
version_info=$(rustc --version --verbose)
|
||||
host_line=$(echo "$version_info" | grep host)
|
||||
target_triple=${host_line#*: }
|
||||
musl_triple=${target_triple%-gnu}-musl
|
||||
remote_server_triple=${REMOTE_SERVER_TARGET:-"${musl_triple}"}
|
||||
rustup_installed=false
|
||||
if command -v rustup >/dev/null 2>&1; then
|
||||
rustup_installed=true
|
||||
fi
|
||||
|
||||
# Generate the licenses first, so they can be baked into the binaries
|
||||
script/generate-licenses
|
||||
|
||||
if "$rustup_installed"; then
|
||||
rustup target add "$remote_server_triple"
|
||||
fi
|
||||
|
||||
export CC=$(which clang)
|
||||
|
||||
# Build binary in release mode
|
||||
export RUSTFLAGS="${RUSTFLAGS:-} -C link-args=-Wl,--disable-new-dtags,-rpath,\$ORIGIN/../lib"
|
||||
cargo build --release --target "${target_triple}" --package zed --package cli
|
||||
# Build remote_server in separate invocation to prevent feature unification from other crates
|
||||
# from influencing dynamic libraries required by it.
|
||||
if [[ "$remote_server_triple" == "$musl_triple" ]]; then
|
||||
export RUSTFLAGS="${RUSTFLAGS:-} -C target-feature=+crt-static"
|
||||
fi
|
||||
cargo build --release --target "${remote_server_triple}" --package remote_server
|
||||
|
||||
# Upload debug info to sentry.io
|
||||
if ! command -v sentry-cli >/dev/null 2>&1; then
|
||||
echo "sentry-cli not found. skipping sentry upload."
|
||||
echo "install with: 'curl -sL https://sentry.io/get-cli | bash'"
|
||||
else
|
||||
if [[ -n "${SENTRY_AUTH_TOKEN:-}" ]]; then
|
||||
echo "Uploading zed debug symbols to sentry..."
|
||||
# note: this uploads the unstripped binary which is needed because it contains
|
||||
# .eh_frame data for stack unwinding. see https://github.com/getsentry/symbolic/issues/783
|
||||
for attempt in 1 2 3; do
|
||||
echo "Attempting sentry upload (attempt $attempt/3)..."
|
||||
if sentry-cli debug-files upload --include-sources --wait -p zed -o zed-dev \
|
||||
"${target_dir}/${target_triple}"/release/zed \
|
||||
"${target_dir}/${remote_server_triple}"/release/remote_server; then
|
||||
echo "Sentry upload successful on attempt $attempt"
|
||||
break
|
||||
else
|
||||
echo "Sentry upload failed on attempt $attempt"
|
||||
if [ $attempt -eq 3 ]; then
|
||||
echo "All sentry upload attempts failed"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
else
|
||||
echo "missing SENTRY_AUTH_TOKEN. skipping sentry upload."
|
||||
fi
|
||||
fi
|
||||
|
||||
# Strip debug symbols and save them for upload to DigitalOcean
|
||||
objcopy --strip-debug "${target_dir}/${target_triple}/release/zed"
|
||||
objcopy --strip-debug "${target_dir}/${target_triple}/release/cli"
|
||||
objcopy --strip-debug "${target_dir}/${remote_server_triple}/release/remote_server"
|
||||
|
||||
# Ensure that remote_server does not depend on libssl nor libcrypto, as we got rid of these deps.
|
||||
if ldd "${target_dir}/${remote_server_triple}/release/remote_server" | grep -q 'libcrypto\|libssl'; then
|
||||
if [[ "$remote_server_triple" == *-musl ]]; then
|
||||
echo "Error: remote_server still depends on libssl or libcrypto" && exit 1
|
||||
else
|
||||
echo "Info: Using non-musl remote-server build."
|
||||
fi
|
||||
fi
|
||||
|
||||
suffix=""
|
||||
if [ "$channel" != "stable" ]; then
|
||||
suffix="-$channel"
|
||||
fi
|
||||
|
||||
# Move everything that should end up in the final package
|
||||
# into a temp directory.
|
||||
temp_dir=$(mktemp -d)
|
||||
zed_dir="${temp_dir}/zed$suffix.app"
|
||||
|
||||
# Binary
|
||||
mkdir -p "${zed_dir}/bin" "${zed_dir}/libexec"
|
||||
cp "${target_dir}/${target_triple}/release/zed" "${zed_dir}/libexec/zed-editor"
|
||||
cp "${target_dir}/${target_triple}/release/cli" "${zed_dir}/bin/zed"
|
||||
|
||||
# Libs
|
||||
find_libs() {
|
||||
ldd ${target_dir}/${target_triple}/release/zed |\
|
||||
cut -d' ' -f3 |\
|
||||
grep -v '\<\(libstdc++.so\|libc.so\|libgcc_s.so\|libm.so\|libpthread.so\|libdl.so\|libasound.so\)'
|
||||
}
|
||||
|
||||
mkdir -p "${zed_dir}/lib"
|
||||
rm -rf "${zed_dir}/lib/*"
|
||||
cp $(find_libs) "${zed_dir}/lib"
|
||||
|
||||
# Icons
|
||||
mkdir -p "${zed_dir}/share/icons/hicolor/512x512/apps"
|
||||
cp "crates/zed/resources/app-icon$suffix.png" "${zed_dir}/share/icons/hicolor/512x512/apps/zed.png"
|
||||
mkdir -p "${zed_dir}/share/icons/hicolor/1024x1024/apps"
|
||||
cp "crates/zed/resources/app-icon$suffix@2x.png" "${zed_dir}/share/icons/hicolor/1024x1024/apps/zed.png"
|
||||
|
||||
# .desktop
|
||||
export DO_STARTUP_NOTIFY="true"
|
||||
export APP_CLI="zed"
|
||||
export APP_ICON="zed"
|
||||
export APP_ARGS="%U"
|
||||
if [[ "$channel" == "preview" ]]; then
|
||||
export APP_NAME="Zed Preview"
|
||||
elif [[ "$channel" == "nightly" ]]; then
|
||||
export APP_NAME="Zed Nightly"
|
||||
elif [[ "$channel" == "dev" ]]; then
|
||||
export APP_NAME="Zed Devel"
|
||||
else
|
||||
export APP_NAME="Zed"
|
||||
fi
|
||||
|
||||
mkdir -p "${zed_dir}/share/applications"
|
||||
envsubst < "crates/zed/resources/zed.desktop.in" > "${zed_dir}/share/applications/zed$suffix.desktop"
|
||||
chmod +x "${zed_dir}/share/applications/zed$suffix.desktop"
|
||||
|
||||
# Copy generated licenses so they'll end up in archive too
|
||||
cp "assets/licenses.md" "${zed_dir}/licenses.md"
|
||||
|
||||
# Create archive out of everything that's in the temp directory
|
||||
arch=$(uname -m)
|
||||
archive="zed-linux-${arch}.tar.gz"
|
||||
|
||||
rm -rf "${archive}"
|
||||
remove_match="zed(-[a-zA-Z0-9]+)?-linux-$(uname -m)\.tar\.gz"
|
||||
ls "${target_dir}/release" | grep -E ${remove_match} | xargs -d "\n" -I {} rm -f "${target_dir}/release/{}" || true
|
||||
tar -czvf "${target_dir}/release/$archive" -C ${temp_dir} "zed$suffix.app"
|
||||
|
||||
gzip -f --stdout --best "${target_dir}/${remote_server_triple}/release/remote_server" > "${target_dir}/zed-remote-server-linux-${arch}.gz"
|
||||
@@ -1,330 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
source script/lib/blob-store.sh
|
||||
|
||||
build_flag="--release"
|
||||
target_dir="release"
|
||||
open_result=false
|
||||
local_install=false
|
||||
can_code_sign=false
|
||||
|
||||
# This must match the team in the provisioning profile.
|
||||
IDENTITY="Zed Industries, Inc."
|
||||
APPLE_NOTARIZATION_TEAM="MQ55VZLNZQ"
|
||||
|
||||
# Function for displaying help info
|
||||
help_info() {
|
||||
echo "
|
||||
Usage: ${0##*/} [options] [architecture=host]
|
||||
Build the application bundle for macOS.
|
||||
|
||||
Options:
|
||||
-d Compile in debug mode
|
||||
-o Open dir with the resulting DMG or launch the app itself in local mode.
|
||||
-i Install the resulting DMG into /Applications.
|
||||
-h Display this help and exit.
|
||||
"
|
||||
}
|
||||
|
||||
while getopts 'dloih' flag
|
||||
do
|
||||
case "${flag}" in
|
||||
o) open_result=true;;
|
||||
d)
|
||||
export CARGO_INCREMENTAL=true
|
||||
export CARGO_BUNDLE_SKIP_BUILD=true
|
||||
build_flag="";
|
||||
target_dir="debug"
|
||||
;;
|
||||
i) local_install=true;;
|
||||
h)
|
||||
help_info
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
shift $((OPTIND-1))
|
||||
|
||||
|
||||
# Get release channel
|
||||
pushd crates/zed
|
||||
channel=$(<RELEASE_CHANNEL)
|
||||
export ZED_RELEASE_CHANNEL="${channel}"
|
||||
popd
|
||||
|
||||
export ZED_BUNDLE=true
|
||||
|
||||
cargo_bundle_version=$(cargo -q bundle --help 2>&1 | head -n 1 || echo "")
|
||||
if [ "$cargo_bundle_version" != "cargo-bundle v0.6.1-zed" ]; then
|
||||
cargo install cargo-bundle --git https://github.com/zed-industries/cargo-bundle.git --branch zed-deploy
|
||||
fi
|
||||
|
||||
# Deal with versions of macOS that don't include libstdc++ headers
|
||||
export CXXFLAGS="-stdlib=libc++"
|
||||
|
||||
version_info=$(rustc --version --verbose)
|
||||
host_line=$(echo "$version_info" | grep host)
|
||||
target_triple=${host_line#*: }
|
||||
if [[ $# -gt 0 && -n "$1" ]]; then
|
||||
target_triple="$1"
|
||||
fi
|
||||
arch_suffix=""
|
||||
|
||||
if [[ "$target_triple" = "x86_64-apple-darwin" ]]; then
|
||||
arch_suffix="x86_64"
|
||||
elif [[ "$target_triple" = "aarch64-apple-darwin" ]]; then
|
||||
arch_suffix="aarch64"
|
||||
else
|
||||
echo "Unsupported architecture $target_triple"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Generate the licenses first, so they can be baked into the binaries
|
||||
script/generate-licenses
|
||||
|
||||
rustup target add $target_triple
|
||||
|
||||
echo "Compiling zed binaries"
|
||||
cargo build ${build_flag} --package zed --package cli --target $target_triple
|
||||
# Build remote_server in separate invocation to prevent feature unification from other crates
|
||||
# from influencing dynamic libraries required by it.
|
||||
cargo build ${build_flag} --package remote_server --target $target_triple
|
||||
|
||||
echo "Creating application bundle"
|
||||
pushd crates/zed
|
||||
cp Cargo.toml Cargo.toml.backup
|
||||
sed \
|
||||
-i.backup \
|
||||
"s/package.metadata.bundle-${channel}/package.metadata.bundle/" \
|
||||
Cargo.toml
|
||||
|
||||
app_path=$(cargo bundle ${build_flag} --target $target_triple --select-workspace-root | xargs)
|
||||
|
||||
mv Cargo.toml.backup Cargo.toml
|
||||
popd
|
||||
echo "Bundled ${app_path}"
|
||||
|
||||
if [[ -n "${MACOS_CERTIFICATE:-}" && -n "${MACOS_CERTIFICATE_PASSWORD:-}" && -n "${APPLE_NOTARIZATION_KEY:-}" && -n "${APPLE_NOTARIZATION_KEY_ID:-}" && -n "${APPLE_NOTARIZATION_ISSUER_ID:-}" ]]; then
|
||||
can_code_sign=true
|
||||
|
||||
echo "Setting up keychain for code signing..."
|
||||
security create-keychain -p "$MACOS_CERTIFICATE_PASSWORD" zed.keychain || echo ""
|
||||
security default-keychain -s zed.keychain
|
||||
security unlock-keychain -p "$MACOS_CERTIFICATE_PASSWORD" zed.keychain
|
||||
# Calling set-keychain-settings without `-t` disables the auto-lock timeout
|
||||
security set-keychain-settings zed.keychain
|
||||
echo "$MACOS_CERTIFICATE" | base64 --decode > /tmp/zed-certificate.p12
|
||||
security import /tmp/zed-certificate.p12 -k zed.keychain -P "$MACOS_CERTIFICATE_PASSWORD" -T /usr/bin/codesign
|
||||
rm /tmp/zed-certificate.p12
|
||||
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$MACOS_CERTIFICATE_PASSWORD" zed.keychain
|
||||
|
||||
function cleanup() {
|
||||
echo "Cleaning up keychain"
|
||||
security default-keychain -s login.keychain
|
||||
security delete-keychain zed.keychain
|
||||
}
|
||||
|
||||
trap cleanup EXIT
|
||||
fi
|
||||
|
||||
GIT_VERSION="v2.43.3"
|
||||
GIT_VERSION_SHA="fa29823"
|
||||
|
||||
function download_and_unpack() {
|
||||
local url=$1
|
||||
local path_to_unpack=$2
|
||||
local target_path=$3
|
||||
|
||||
temp_dir=$(mktemp -d)
|
||||
|
||||
if ! command -v curl &> /dev/null; then
|
||||
echo "curl is not installed. Please install curl to continue."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
curl --silent --fail --location "$url" | tar -xvz -C "$temp_dir" -f - $path_to_unpack
|
||||
|
||||
mv "$temp_dir/$path_to_unpack" "$target_path"
|
||||
|
||||
rm -rf "$temp_dir"
|
||||
}
|
||||
|
||||
function download_git() {
|
||||
local architecture=$1
|
||||
local target_binary=$2
|
||||
|
||||
tmp_dir=$(mktemp -d)
|
||||
pushd "$tmp_dir"
|
||||
|
||||
case "$architecture" in
|
||||
aarch64-apple-darwin)
|
||||
download_and_unpack "https://github.com/desktop/dugite-native/releases/download/${GIT_VERSION}/dugite-native-${GIT_VERSION}-${GIT_VERSION_SHA}-macOS-arm64.tar.gz" bin/git ./git
|
||||
;;
|
||||
x86_64-apple-darwin)
|
||||
download_and_unpack "https://github.com/desktop/dugite-native/releases/download/${GIT_VERSION}/dugite-native-${GIT_VERSION}-${GIT_VERSION_SHA}-macOS-x64.tar.gz" bin/git ./git
|
||||
;;
|
||||
*)
|
||||
echo "Unsupported architecture: $architecture"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
popd
|
||||
|
||||
mv "${tmp_dir}/git" "${target_binary}"
|
||||
rm -rf "$tmp_dir"
|
||||
}
|
||||
|
||||
function sign_app_binaries() {
|
||||
rm -rf "${app_path}/Contents/Frameworks"
|
||||
mkdir -p "${app_path}/Contents/Frameworks"
|
||||
|
||||
echo "Downloading git binary"
|
||||
download_git "${target_triple}" "${app_path}/Contents/MacOS/git"
|
||||
|
||||
# Note: The app identifier for our development builds is the same as the app identifier for nightly.
|
||||
cp crates/zed/contents/$channel/embedded.provisionprofile "${app_path}/Contents/"
|
||||
|
||||
if [[ $can_code_sign = true ]]; then
|
||||
echo "Code signing binaries"
|
||||
# sequence of codesign commands modeled after this example: https://developer.apple.com/forums/thread/701514
|
||||
/usr/bin/codesign --deep --force --timestamp --options runtime --sign "$IDENTITY" "${app_path}/Contents/MacOS/cli" -v
|
||||
/usr/bin/codesign --deep --force --timestamp --options runtime --sign "$IDENTITY" "${app_path}/Contents/MacOS/git" -v
|
||||
/usr/bin/codesign --deep --force --timestamp --options runtime --entitlements crates/zed/resources/zed.entitlements --sign "$IDENTITY" "${app_path}/Contents/MacOS/zed" -v
|
||||
/usr/bin/codesign --force --timestamp --options runtime --entitlements crates/zed/resources/zed.entitlements --sign "$IDENTITY" "${app_path}" -v
|
||||
else
|
||||
echo "One or more of the following variables are missing: MACOS_CERTIFICATE, MACOS_CERTIFICATE_PASSWORD, APPLE_NOTARIZATION_KEY, APPLE_NOTARIZATION_KEY_ID, APPLE_NOTARIZATION_ISSUER_ID"
|
||||
|
||||
echo "====== WARNING ======"
|
||||
echo "This bundle is being signed without all entitlements, some features (e.g. universal links) will not work"
|
||||
echo "====== WARNING ======"
|
||||
|
||||
# NOTE: if you need to test universal links you have a few paths forward:
|
||||
# - create a PR and tag it with the `run-bundling` label, and download the .dmg file from there.
|
||||
# - get a signing key for the MQ55VZLNZQ team from Nathan.
|
||||
# - create your own signing key, and update references to MQ55VZLNZQ to your own team ID
|
||||
# then comment out this line.
|
||||
cat crates/zed/resources/zed.entitlements | sed '/com.apple.developer.associated-domains/,+1d' > "${app_path}/Contents/Resources/zed.entitlements"
|
||||
|
||||
codesign --force --deep --entitlements "${app_path}/Contents/Resources/zed.entitlements" --sign ${MACOS_SIGNING_KEY:- -} "${app_path}" -v
|
||||
fi
|
||||
|
||||
bundle_name=$(basename "$app_path")
|
||||
|
||||
if [ "$local_install" = true ]; then
|
||||
rm -rf "/Applications/$bundle_name"
|
||||
mv "$app_path" "/Applications/$bundle_name"
|
||||
echo "Installed application bundle: /Applications/$bundle_name"
|
||||
if [ "$open_result" = true ]; then
|
||||
echo "Opening /Applications/$bundle_name"
|
||||
open "/Applications/$bundle_name"
|
||||
fi
|
||||
elif [ "$open_result" = true ]; then
|
||||
open "$app_path"
|
||||
fi
|
||||
|
||||
if [[ "$target_dir" = "debug" ]]; then
|
||||
echo "Debug build detected - skipping DMG creation and signing"
|
||||
if [ "$local_install" = false ]; then
|
||||
echo "Created application bundle:"
|
||||
echo "$app_path"
|
||||
fi
|
||||
else
|
||||
dmg_target_directory="target/${target_triple}/${target_dir}"
|
||||
dmg_source_directory="${dmg_target_directory}/dmg"
|
||||
dmg_file_path="${dmg_target_directory}/Zed-${arch_suffix}.dmg"
|
||||
xcode_bin_dir_path="$(xcode-select -p)/usr/bin"
|
||||
|
||||
rm -rf ${dmg_source_directory}
|
||||
mkdir -p ${dmg_source_directory}
|
||||
mv "${app_path}" "${dmg_source_directory}"
|
||||
notarization_key_file=$(mktemp)
|
||||
|
||||
echo "Adding symlink to /Applications to ${dmg_source_directory}"
|
||||
ln -s /Applications ${dmg_source_directory}
|
||||
|
||||
echo "Creating final DMG at ${dmg_file_path} using ${dmg_source_directory}"
|
||||
hdiutil create -volname Zed -srcfolder "${dmg_source_directory}" -ov -format UDZO "${dmg_file_path}"
|
||||
|
||||
# If someone runs this bundle script locally, a symlink will be placed in `dmg_source_directory`.
|
||||
# This symlink causes CPU issues with Zed if the Zed codebase is the project being worked on, so we simply remove it for now.
|
||||
echo "Removing symlink to /Applications from ${dmg_source_directory}"
|
||||
rm ${dmg_source_directory}/Applications
|
||||
|
||||
echo "Adding license agreement to DMG"
|
||||
npm install --global dmg-license minimist
|
||||
dmg-license script/terms/terms.json "${dmg_file_path}"
|
||||
|
||||
if [[ $can_code_sign = true ]]; then
|
||||
echo "Notarizing DMG with Apple"
|
||||
/usr/bin/codesign --deep --force --timestamp --options runtime --sign "$IDENTITY" "$(pwd)/${dmg_file_path}" -v
|
||||
echo "$APPLE_NOTARIZATION_KEY" > "$notarization_key_file"
|
||||
"${xcode_bin_dir_path}/notarytool" submit --wait --key "$notarization_key_file" --key-id "$APPLE_NOTARIZATION_KEY_ID" --issuer "$APPLE_NOTARIZATION_ISSUER_ID" "${dmg_file_path}"
|
||||
rm "$notarization_key_file"
|
||||
"${xcode_bin_dir_path}/stapler" staple "${dmg_file_path}"
|
||||
fi
|
||||
|
||||
if [ "$open_result" = true ]; then
|
||||
open $dmg_target_directory
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
function sign_binary() {
|
||||
local binary_path=$1
|
||||
|
||||
if [[ $can_code_sign = true ]]; then
|
||||
echo "Code signing executable $binary_path"
|
||||
/usr/bin/codesign --deep --force --timestamp --options runtime --entitlements crates/zed/resources/zed.entitlements --sign "$IDENTITY" "${binary_path}" -v
|
||||
fi
|
||||
}
|
||||
|
||||
function upload_debug_symbols() {
|
||||
if [ "$local_install" = true ]; then
|
||||
echo "local install; skipping sentry upload."
|
||||
elif [[ -n "${SENTRY_AUTH_TOKEN:-}" ]]; then
|
||||
echo "Uploading zed debug symbols to sentry..."
|
||||
exe_path="target/${target_triple}/release/Zed"
|
||||
if ! dsymutil --flat "target/${target_triple}/${target_dir}/zed" 2> target/dsymutil.log; then
|
||||
echo "dsymutil failed"
|
||||
cat target/dsymutil.log
|
||||
exit 1
|
||||
fi
|
||||
if ! dsymutil --flat "target/${target_triple}/${target_dir}/remote_server" 2> target/dsymutil.log; then
|
||||
echo "dsymutil failed"
|
||||
cat target/dsymutil.log
|
||||
exit 1
|
||||
fi
|
||||
# note: this uploads the unstripped binary which is needed because it contains
|
||||
# .eh_frame data for stack unwinding. see https://github.com/getsentry/symbolic/issues/783
|
||||
sentry-cli debug-files upload --include-sources --wait -p zed -o zed-dev \
|
||||
# Try uploading up to 3 times
|
||||
for attempt in 1 2 3; do
|
||||
echo "Sentry upload attempt $attempt..."
|
||||
if sentry-cli debug-files upload --include-sources --wait -p zed -o zed-dev \
|
||||
"target/${target_triple}/${target_dir}/zed.dwarf" \
|
||||
"target/${target_triple}/${target_dir}/remote_server.dwarf"; then
|
||||
break
|
||||
else
|
||||
echo "Sentry upload failed on attempt $attempt"
|
||||
if [ $attempt -eq 3 ]; then
|
||||
echo "All sentry upload attempts failed"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
done
|
||||
else
|
||||
echo "missing SENTRY_AUTH_TOKEN. skipping sentry upload."
|
||||
fi
|
||||
}
|
||||
|
||||
upload_debug_symbols
|
||||
|
||||
cp target/${target_triple}/${target_dir}/zed "${app_path}/Contents/MacOS/zed"
|
||||
cp target/${target_triple}/${target_dir}/cli "${app_path}/Contents/MacOS/cli"
|
||||
sign_app_binaries
|
||||
|
||||
sign_binary "target/$target_triple/release/remote_server"
|
||||
gzip -f --stdout --best target/$target_triple/release/remote_server > target/zed-remote-server-macos-$arch_suffix.gz
|
||||
@@ -1,378 +0,0 @@
|
||||
[CmdletBinding()]
|
||||
Param(
|
||||
[Parameter()][Alias('i')][switch]$Install,
|
||||
[Parameter()][Alias('h')][switch]$Help,
|
||||
[Parameter()][Alias('a')][string]$Architecture,
|
||||
[Parameter()][string]$Name
|
||||
)
|
||||
|
||||
. "$PSScriptRoot/lib/workspace.ps1"
|
||||
|
||||
# https://stackoverflow.com/questions/57949031/powershell-script-stops-if-program-fails-like-bash-set-o-errexit
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$PSNativeCommandUseErrorActionPreference = $true
|
||||
|
||||
$buildSuccess = $false
|
||||
|
||||
$OSArchitecture = switch ([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture) {
|
||||
"X64" { "x86_64" }
|
||||
"Arm64" { "aarch64" }
|
||||
default { throw "Unsupported architecture" }
|
||||
}
|
||||
|
||||
$Architecture = if ($Architecture) {
|
||||
$Architecture
|
||||
} else {
|
||||
$OSArchitecture
|
||||
}
|
||||
|
||||
$CargoOutDir = "./target/$Architecture-pc-windows-msvc/release"
|
||||
|
||||
function Get-VSArch {
|
||||
param(
|
||||
[string]$Arch
|
||||
)
|
||||
|
||||
switch ($Arch) {
|
||||
"x86_64" { "amd64" }
|
||||
"aarch64" { "arm64" }
|
||||
}
|
||||
}
|
||||
|
||||
Push-Location
|
||||
& "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\Launch-VsDevShell.ps1" -Arch (Get-VSArch -Arch $Architecture) -HostArch (Get-VSArch -Arch $OSArchitecture)
|
||||
Pop-Location
|
||||
|
||||
$target = "$Architecture-pc-windows-msvc"
|
||||
|
||||
if ($Help) {
|
||||
Write-Output "Usage: test.ps1 [-Install] [-Help]"
|
||||
Write-Output "Build the installer for Windows.\n"
|
||||
Write-Output "Options:"
|
||||
Write-Output " -Architecture, -a Which architecture to build (x86_64 or aarch64)"
|
||||
Write-Output " -Install, -i Run the installer after building."
|
||||
Write-Output " -Help, -h Show this help message."
|
||||
exit 0
|
||||
}
|
||||
|
||||
Push-Location -Path crates/zed
|
||||
$channel = Get-Content "RELEASE_CHANNEL"
|
||||
$env:ZED_RELEASE_CHANNEL = $channel
|
||||
$env:RELEASE_CHANNEL = $channel
|
||||
Pop-Location
|
||||
|
||||
function CheckEnvironmentVariables {
|
||||
if(-not $env:CI) {
|
||||
return
|
||||
}
|
||||
|
||||
$requiredVars = @(
|
||||
'ZED_WORKSPACE', 'RELEASE_VERSION', 'ZED_RELEASE_CHANNEL',
|
||||
'AZURE_TENANT_ID', 'AZURE_CLIENT_ID', 'AZURE_CLIENT_SECRET',
|
||||
'ACCOUNT_NAME', 'CERT_PROFILE_NAME', 'ENDPOINT',
|
||||
'FILE_DIGEST', 'TIMESTAMP_DIGEST', 'TIMESTAMP_SERVER'
|
||||
)
|
||||
|
||||
foreach ($var in $requiredVars) {
|
||||
if (-not (Test-Path "env:$var")) {
|
||||
Write-Error "$var is not set"
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function PrepareForBundle {
|
||||
if (Test-Path "$innoDir") {
|
||||
Remove-Item -Path "$innoDir" -Recurse -Force
|
||||
}
|
||||
New-Item -Path "$innoDir" -ItemType Directory -Force
|
||||
Copy-Item -Path "$env:ZED_WORKSPACE\crates\zed\resources\windows\*" -Destination "$innoDir" -Recurse -Force
|
||||
New-Item -Path "$innoDir\make_appx" -ItemType Directory -Force
|
||||
New-Item -Path "$innoDir\appx" -ItemType Directory -Force
|
||||
New-Item -Path "$innoDir\bin" -ItemType Directory -Force
|
||||
New-Item -Path "$innoDir\tools" -ItemType Directory -Force
|
||||
|
||||
rustup target add $target
|
||||
}
|
||||
|
||||
function GenerateLicenses {
|
||||
$oldErrorActionPreference = $ErrorActionPreference
|
||||
$ErrorActionPreference = 'Continue'
|
||||
. $PSScriptRoot/generate-licenses.ps1
|
||||
$ErrorActionPreference = $oldErrorActionPreference
|
||||
}
|
||||
|
||||
function BuildZedAndItsFriends {
|
||||
Write-Output "Building Zed and its friends, for channel: $channel"
|
||||
# Build zed.exe, cli.exe and auto_update_helper.exe
|
||||
cargo build --release --package zed --package cli --package auto_update_helper --target $target
|
||||
Copy-Item -Path ".\$CargoOutDir\zed.exe" -Destination "$innoDir\Zed.exe" -Force
|
||||
Copy-Item -Path ".\$CargoOutDir\cli.exe" -Destination "$innoDir\cli.exe" -Force
|
||||
Copy-Item -Path ".\$CargoOutDir\auto_update_helper.exe" -Destination "$innoDir\auto_update_helper.exe" -Force
|
||||
# Build explorer_command_injector.dll
|
||||
switch ($channel) {
|
||||
"stable" {
|
||||
cargo build --release --features stable --no-default-features --package explorer_command_injector --target $target
|
||||
}
|
||||
"preview" {
|
||||
cargo build --release --features preview --no-default-features --package explorer_command_injector --target $target
|
||||
}
|
||||
default {
|
||||
cargo build --release --package explorer_command_injector --target $target
|
||||
}
|
||||
}
|
||||
Copy-Item -Path ".\$CargoOutDir\explorer_command_injector.dll" -Destination "$innoDir\zed_explorer_command_injector.dll" -Force
|
||||
}
|
||||
|
||||
function ZipZedAndItsFriendsDebug {
|
||||
$items = @(
|
||||
".\$CargoOutDir\zed.pdb",
|
||||
".\$CargoOutDir\cli.pdb",
|
||||
".\$CargoOutDir\auto_update_helper.pdb",
|
||||
".\$CargoOutDir\explorer_command_injector.pdb"
|
||||
)
|
||||
|
||||
Compress-Archive -Path $items -DestinationPath ".\$CargoOutDir\zed-$env:RELEASE_VERSION-$env:ZED_RELEASE_CHANNEL.dbg.zip" -Force
|
||||
}
|
||||
|
||||
|
||||
function UploadToSentry {
|
||||
if (-not (Get-Command "sentry-cli" -ErrorAction SilentlyContinue)) {
|
||||
Write-Output "sentry-cli not found. skipping sentry upload."
|
||||
Write-Output "install with: 'winget install -e --id=Sentry.sentry-cli'"
|
||||
return
|
||||
}
|
||||
if (-not (Test-Path "env:SENTRY_AUTH_TOKEN")) {
|
||||
Write-Output "missing SENTRY_AUTH_TOKEN. skipping sentry upload."
|
||||
return
|
||||
}
|
||||
Write-Output "Uploading zed debug symbols to sentry..."
|
||||
for ($i = 1; $i -le 3; $i++) {
|
||||
try {
|
||||
sentry-cli debug-files upload --include-sources --wait -p zed -o zed-dev $CargoOutDir
|
||||
break
|
||||
}
|
||||
catch {
|
||||
Write-Output "Sentry upload attempt $i failed: $_"
|
||||
if ($i -eq 3) {
|
||||
Write-Output "All sentry upload attempts failed"
|
||||
throw
|
||||
}
|
||||
Start-Sleep -Seconds 2
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function MakeAppx {
|
||||
switch ($channel) {
|
||||
"stable" {
|
||||
$manifestFile = "$env:ZED_WORKSPACE\crates\explorer_command_injector\AppxManifest.xml"
|
||||
}
|
||||
"preview" {
|
||||
$manifestFile = "$env:ZED_WORKSPACE\crates\explorer_command_injector\AppxManifest-Preview.xml"
|
||||
}
|
||||
default {
|
||||
$manifestFile = "$env:ZED_WORKSPACE\crates\explorer_command_injector\AppxManifest-Nightly.xml"
|
||||
}
|
||||
}
|
||||
Copy-Item -Path "$manifestFile" -Destination "$innoDir\make_appx\AppxManifest.xml"
|
||||
# Add makeAppx.exe to Path
|
||||
$sdk = "C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x64"
|
||||
$env:Path += ';' + $sdk
|
||||
makeAppx.exe pack /d "$innoDir\make_appx" /p "$innoDir\zed_explorer_command_injector.appx" /nv
|
||||
}
|
||||
|
||||
function SignZedAndItsFriends {
|
||||
if (-not $env:CI) {
|
||||
return
|
||||
}
|
||||
|
||||
$files = "$innoDir\Zed.exe,$innoDir\cli.exe,$innoDir\auto_update_helper.exe,$innoDir\zed_explorer_command_injector.dll,$innoDir\zed_explorer_command_injector.appx"
|
||||
& "$innoDir\sign.ps1" $files
|
||||
}
|
||||
|
||||
function DownloadAMDGpuServices {
|
||||
# If you update the AGS SDK version, please also update the version in `crates/gpui/src/platform/windows/directx_renderer.rs`
|
||||
$url = "https://codeload.github.com/GPUOpen-LibrariesAndSDKs/AGS_SDK/zip/refs/tags/v6.3.0"
|
||||
$zipPath = ".\AGS_SDK_v6.3.0.zip"
|
||||
# Download the AGS SDK zip file
|
||||
Invoke-WebRequest -Uri $url -OutFile $zipPath
|
||||
# Extract the AGS SDK zip file
|
||||
Expand-Archive -Path $zipPath -DestinationPath "." -Force
|
||||
}
|
||||
|
||||
function DownloadConpty {
|
||||
$url = "https://github.com/microsoft/terminal/releases/download/v1.23.12811.0/Microsoft.Windows.Console.ConPTY.1.23.251008001.nupkg"
|
||||
$zipPath = ".\Microsoft.Windows.Console.ConPTY.1.23.251008001.nupkg"
|
||||
Invoke-WebRequest -Uri $url -OutFile $zipPath
|
||||
Expand-Archive -Path $zipPath -DestinationPath ".\conpty" -Force
|
||||
}
|
||||
|
||||
function CollectFiles {
|
||||
Move-Item -Path "$innoDir\zed_explorer_command_injector.appx" -Destination "$innoDir\appx\zed_explorer_command_injector.appx" -Force
|
||||
Move-Item -Path "$innoDir\zed_explorer_command_injector.dll" -Destination "$innoDir\appx\zed_explorer_command_injector.dll" -Force
|
||||
Move-Item -Path "$innoDir\cli.exe" -Destination "$innoDir\bin\zed.exe" -Force
|
||||
Move-Item -Path "$innoDir\zed.sh" -Destination "$innoDir\bin\zed" -Force
|
||||
Move-Item -Path "$innoDir\auto_update_helper.exe" -Destination "$innoDir\tools\auto_update_helper.exe" -Force
|
||||
if($Architecture -eq "aarch64") {
|
||||
New-Item -Type Directory -Path "$innoDir\arm64" -Force
|
||||
Move-Item -Path ".\conpty\build\native\runtimes\arm64\OpenConsole.exe" -Destination "$innoDir\arm64\OpenConsole.exe" -Force
|
||||
Move-Item -Path ".\conpty\runtimes\win-arm64\native\conpty.dll" -Destination "$innoDir\conpty.dll" -Force
|
||||
}
|
||||
else {
|
||||
New-Item -Type Directory -Path "$innoDir\x64" -Force
|
||||
New-Item -Type Directory -Path "$innoDir\arm64" -Force
|
||||
Move-Item -Path ".\AGS_SDK-6.3.0\ags_lib\lib\amd_ags_x64.dll" -Destination "$innoDir\amd_ags_x64.dll" -Force
|
||||
Move-Item -Path ".\conpty\build\native\runtimes\x64\OpenConsole.exe" -Destination "$innoDir\x64\OpenConsole.exe" -Force
|
||||
Move-Item -Path ".\conpty\build\native\runtimes\arm64\OpenConsole.exe" -Destination "$innoDir\arm64\OpenConsole.exe" -Force
|
||||
Move-Item -Path ".\conpty\runtimes\win-x64\native\conpty.dll" -Destination "$innoDir\conpty.dll" -Force
|
||||
}
|
||||
}
|
||||
|
||||
function BuildInstaller {
|
||||
$issFilePath = "$innoDir\zed.iss"
|
||||
switch ($channel) {
|
||||
"stable" {
|
||||
$appId = "{{2DB0DA96-CA55-49BB-AF4F-64AF36A86712}"
|
||||
$appIconName = "app-icon"
|
||||
$appName = "Zed"
|
||||
$appDisplayName = "Zed"
|
||||
$appSetupName = "Zed-$Architecture"
|
||||
# The mutex name here should match the mutex name in crates\zed\src\zed\windows_only_instance.rs
|
||||
$appMutex = "Zed-Stable-Instance-Mutex"
|
||||
$appExeName = "Zed"
|
||||
$regValueName = "Zed"
|
||||
$appUserId = "ZedIndustries.Zed"
|
||||
$appShellNameShort = "Z&ed"
|
||||
$appAppxFullName = "ZedIndustries.Zed_1.0.0.0_neutral__japxn1gcva8rg"
|
||||
}
|
||||
"preview" {
|
||||
$appId = "{{F70E4811-D0E2-4D88-AC99-D63752799F95}"
|
||||
$appIconName = "app-icon-preview"
|
||||
$appName = "Zed Preview"
|
||||
$appDisplayName = "Zed Preview"
|
||||
$appSetupName = "Zed-$Architecture"
|
||||
# The mutex name here should match the mutex name in crates\zed\src\zed\windows_only_instance.rs
|
||||
$appMutex = "Zed-Preview-Instance-Mutex"
|
||||
$appExeName = "Zed"
|
||||
$regValueName = "ZedPreview"
|
||||
$appUserId = "ZedIndustries.Zed.Preview"
|
||||
$appShellNameShort = "Z&ed Preview"
|
||||
$appAppxFullName = "ZedIndustries.Zed.Preview_1.0.0.0_neutral__japxn1gcva8rg"
|
||||
}
|
||||
"nightly" {
|
||||
$appId = "{{1BDB21D3-14E7-433C-843C-9C97382B2FE0}"
|
||||
$appIconName = "app-icon-nightly"
|
||||
$appName = "Zed Nightly"
|
||||
$appDisplayName = "Zed Nightly"
|
||||
$appSetupName = "Zed-$Architecture"
|
||||
# The mutex name here should match the mutex name in crates\zed\src\zed\windows_only_instance.rs
|
||||
$appMutex = "Zed-Nightly-Instance-Mutex"
|
||||
$appExeName = "Zed"
|
||||
$regValueName = "ZedNightly"
|
||||
$appUserId = "ZedIndustries.Zed.Nightly"
|
||||
$appShellNameShort = "Z&ed Editor Nightly"
|
||||
$appAppxFullName = "ZedIndustries.Zed.Nightly_1.0.0.0_neutral__japxn1gcva8rg"
|
||||
}
|
||||
"dev" {
|
||||
$appId = "{{8357632E-24A4-4F32-BA97-E575B4D1FE5D}"
|
||||
$appIconName = "app-icon-dev"
|
||||
$appName = "Zed Dev"
|
||||
$appDisplayName = "Zed Dev"
|
||||
$appSetupName = "Zed-$Architecture"
|
||||
# The mutex name here should match the mutex name in crates\zed\src\zed\windows_only_instance.rs
|
||||
$appMutex = "Zed-Dev-Instance-Mutex"
|
||||
$appExeName = "Zed"
|
||||
$regValueName = "ZedDev"
|
||||
$appUserId = "ZedIndustries.Zed.Dev"
|
||||
$appShellNameShort = "Z&ed Dev"
|
||||
$appAppxFullName = "ZedIndustries.Zed.Dev_1.0.0.0_neutral__japxn1gcva8rg"
|
||||
}
|
||||
default {
|
||||
Write-Error "can't bundle installer for $channel."
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
# Windows runner 2022 default has iscc in PATH, https://github.com/actions/runner-images/blob/main/images/windows/Windows2022-Readme.md
|
||||
# Currently, we are using Windows 2022 runner.
|
||||
# Windows runner 2025 doesn't have iscc in PATH for now, https://github.com/actions/runner-images/issues/11228
|
||||
$innoSetupPath = "C:\Program Files (x86)\Inno Setup 6\ISCC.exe"
|
||||
|
||||
$definitions = @{
|
||||
"AppId" = $appId
|
||||
"AppIconName" = $appIconName
|
||||
"OutputDir" = "$env:ZED_WORKSPACE\target"
|
||||
"AppSetupName" = $appSetupName
|
||||
"AppName" = $appName
|
||||
"AppDisplayName" = $appDisplayName
|
||||
"RegValueName" = $regValueName
|
||||
"AppMutex" = $appMutex
|
||||
"AppExeName" = $appExeName
|
||||
"ResourcesDir" = "$innoDir"
|
||||
"ShellNameShort" = $appShellNameShort
|
||||
"AppUserId" = $appUserId
|
||||
"Version" = "$env:RELEASE_VERSION"
|
||||
"SourceDir" = "$env:ZED_WORKSPACE"
|
||||
"AppxFullName" = $appAppxFullName
|
||||
}
|
||||
|
||||
$defs = @()
|
||||
foreach ($key in $definitions.Keys) {
|
||||
$defs += "/d$key=`"$($definitions[$key])`""
|
||||
}
|
||||
|
||||
$innoArgs = @($issFilePath) + $defs
|
||||
if($env:CI) {
|
||||
$signTool = "powershell.exe -ExecutionPolicy Bypass -File $innoDir\sign.ps1 `$f"
|
||||
$innoArgs += "/sDefaultsign=`"$signTool`""
|
||||
}
|
||||
|
||||
# Execute Inno Setup
|
||||
Write-Host "🚀 Running Inno Setup: $innoSetupPath $innoArgs"
|
||||
$process = Start-Process -FilePath $innoSetupPath -ArgumentList $innoArgs -NoNewWindow -Wait -PassThru
|
||||
|
||||
if ($process.ExitCode -eq 0) {
|
||||
Write-Host "✅ Inno Setup successfully compiled the installer"
|
||||
Write-Output "SETUP_PATH=target/$appSetupName.exe" >> $env:GITHUB_ENV
|
||||
$script:buildSuccess = $true
|
||||
}
|
||||
else {
|
||||
Write-Host "❌ Inno Setup failed: $($process.ExitCode)"
|
||||
$script:buildSuccess = $false
|
||||
}
|
||||
}
|
||||
|
||||
ParseZedWorkspace
|
||||
$innoDir = "$env:ZED_WORKSPACE\inno\$Architecture"
|
||||
$debugArchive = "$CargoOutDir\zed-$env:RELEASE_VERSION-$env:ZED_RELEASE_CHANNEL.dbg.zip"
|
||||
$debugStoreKey = "$env:ZED_RELEASE_CHANNEL/zed-$env:RELEASE_VERSION-$env:ZED_RELEASE_CHANNEL.dbg.zip"
|
||||
|
||||
CheckEnvironmentVariables
|
||||
PrepareForBundle
|
||||
GenerateLicenses
|
||||
BuildZedAndItsFriends
|
||||
MakeAppx
|
||||
SignZedAndItsFriends
|
||||
ZipZedAndItsFriendsDebug
|
||||
DownloadAMDGpuServices
|
||||
DownloadConpty
|
||||
CollectFiles
|
||||
BuildInstaller
|
||||
|
||||
if($env:CI) {
|
||||
UploadToSentry
|
||||
}
|
||||
|
||||
if ($buildSuccess) {
|
||||
Write-Output "Build successful"
|
||||
if ($Install) {
|
||||
Write-Output "Installing Zed..."
|
||||
Start-Process -FilePath "$env:ZED_WORKSPACE/target/ZedEditorUserSetup-x64-$env:RELEASE_VERSION.exe"
|
||||
}
|
||||
exit 0
|
||||
}
|
||||
else {
|
||||
Write-Output "Build failed"
|
||||
exit 1
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
pattern='cmd-'
|
||||
result=$(git grep --no-color --line-number --fixed-strings -e "$pattern" -- \
|
||||
'assets/keymaps/' \
|
||||
':(exclude)assets/keymaps/storybook.json' \
|
||||
':(exclude)assets/keymaps/default-macos.json' \
|
||||
':(exclude)assets/keymaps/macos/*.json' || true)
|
||||
|
||||
if [[ -n "${result}" ]]; then
|
||||
echo "${result}"
|
||||
echo "Error: Found 'cmd-' in non-macOS keymap files."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
pattern='super-|win-|fn-'
|
||||
result=$(git grep --no-color --line-number --fixed-strings -e "$pattern" -- \
|
||||
'assets/keymaps/' || true)
|
||||
|
||||
if [[ -n "${result}" ]]; then
|
||||
echo "${result}"
|
||||
echo "Error: Found 'super-', 'win-', or 'fn-' in keymap files. Currently these aren't used."
|
||||
exit 1
|
||||
fi
|
||||
@@ -1,62 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
AGPL_CRATES=("collab")
|
||||
RELEASE_CRATES=("cli" "remote_server" "zed")
|
||||
|
||||
check_license () {
|
||||
local dir="$1"
|
||||
local allowed_licenses=()
|
||||
|
||||
local is_agpl=false
|
||||
for agpl_crate in "${AGPL_CRATES[@]}"; do
|
||||
if [[ "$dir" == "crates/$agpl_crate" ]]; then
|
||||
is_agpl=true
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ "$is_agpl" == true ]]; then
|
||||
allowed_licenses=("LICENSE-AGPL")
|
||||
else
|
||||
allowed_licenses=("LICENSE-GPL" "LICENSE-APACHE")
|
||||
fi
|
||||
|
||||
for license in "${allowed_licenses[@]}"; do
|
||||
if [[ -L "$dir/$license" ]]; then
|
||||
return 0
|
||||
elif [[ -e "$dir/$license" ]]; then
|
||||
echo "Error: $dir/$license exists but is not a symlink."
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ "$is_agpl" == true ]]; then
|
||||
echo "Error: $dir does not contain a LICENSE-AGPL symlink"
|
||||
else
|
||||
echo "Error: $dir does not contain a LICENSE-GPL or LICENSE-APACHE symlink"
|
||||
fi
|
||||
exit 1
|
||||
}
|
||||
|
||||
git ls-files "**/*/Cargo.toml" | while read -r cargo_toml; do
|
||||
check_license "$(dirname "$cargo_toml")"
|
||||
done
|
||||
|
||||
|
||||
# Make sure the AGPL server crates are included in the release tarball.
|
||||
for release_crate in "${RELEASE_CRATES[@]}"; do
|
||||
tree_output=$(cargo tree --package "$release_crate")
|
||||
for agpl_crate in "${AGPL_CRATES[@]}"; do
|
||||
# Look for lines that contain the crate name followed by " v" (version)
|
||||
# This matches patterns like "├── collab v0.44.0"
|
||||
if echo "$tree_output" | grep -E "(^|[^a-zA-Z_])${agpl_crate} v" > /dev/null; then
|
||||
echo "Error: crate '${agpl_crate}' is AGPL and is a dependency of crate '${release_crate}'." >&2
|
||||
echo "AGPL licensed code should not be used in the release distribution, only in servers." >&2
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
echo "check-licenses succeeded"
|
||||
@@ -1,32 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
usage() {
|
||||
echo "Usage: $0 [local|all] [--help]"
|
||||
echo " local Only check local links (default)"
|
||||
echo " all Check all links including remote ones"
|
||||
exit 1
|
||||
}
|
||||
|
||||
check_mode="local"
|
||||
if [ $# -eq 1 ]; then
|
||||
case "$1" in
|
||||
"local") check_mode="local" ;;
|
||||
"all") check_mode="all" ;;
|
||||
"--help") usage ;;
|
||||
*) echo "Invalid argument: $1" && usage ;;
|
||||
esac
|
||||
else
|
||||
usage
|
||||
fi
|
||||
|
||||
cargo install lychee
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
if [ "$check_mode" = "all" ]; then
|
||||
lychee --no-progress './docs/src/**/*'
|
||||
else
|
||||
lychee --exclude '^http' './docs/src/**/*'
|
||||
fi
|
||||
#
|
||||
@@ -1,14 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Brackets are used around characters so these don't show up in normal search.
|
||||
pattern='tod[o]!|FIXM[E]'
|
||||
result=$(git grep --no-color --ignore-case --line-number --extended-regexp -e $pattern -- \
|
||||
':(exclude).github/workflows/ci.yml' \
|
||||
':(exclude)*criteria.md' \
|
||||
':(exclude)*prompt.md' || true)
|
||||
if [[ -n "${result}" ]]; then
|
||||
echo "${result}"
|
||||
exit 1
|
||||
fi
|
||||
@@ -1,33 +0,0 @@
|
||||
# #!/bin/bash
|
||||
set -euxo pipefail
|
||||
|
||||
if [ "$#" -ne 3 ]; then
|
||||
echo "Usage: $0 <branch-name> <commit-sha> <channel>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
BRANCH_NAME="$1"
|
||||
COMMIT_SHA="$2"
|
||||
CHANNEL="$3"
|
||||
|
||||
SHORT_SHA="${COMMIT_SHA:0:8}"
|
||||
NEW_BRANCH="cherry-pick-${BRANCH_NAME}-${SHORT_SHA}"
|
||||
git fetch --depth 2 origin +${COMMIT_SHA} ${BRANCH_NAME}
|
||||
git checkout --force "origin/$BRANCH_NAME" -B "$NEW_BRANCH"
|
||||
|
||||
git cherry-pick "$COMMIT_SHA"
|
||||
|
||||
git push origin -f "$NEW_BRANCH"
|
||||
COMMIT_TITLE=$(git log -1 --pretty=format:"%s" "$COMMIT_SHA")
|
||||
COMMIT_BODY=$(git log -1 --pretty=format:"%b" "$COMMIT_SHA")
|
||||
|
||||
# Check if commit title ends with (#number)
|
||||
if [[ "$COMMIT_TITLE" =~ \(#([0-9]+)\)$ ]]; then
|
||||
PR_NUMBER="${BASH_REMATCH[1]}"
|
||||
PR_BODY="Cherry-pick of #${PR_NUMBER} to ${CHANNEL}"$'\n'$'\n'"----"$'\n'"${COMMIT_BODY}"
|
||||
else
|
||||
PR_BODY="Cherry-pick of ${COMMIT_SHA} to ${CHANNEL}"$'\n'$'\n'"----"$'\n'"${COMMIT_BODY}"
|
||||
fi
|
||||
|
||||
# Create a pull request
|
||||
gh pr create --base "$BRANCH_NAME" --head "$NEW_BRANCH" --title "$COMMIT_TITLE (cherry-pick to $CHANNEL)" --body "$PR_BODY"
|
||||
@@ -1,33 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Notes for fixing this script if it's broken:
|
||||
# - if you see an error about "can't find perf_6.1" you need to install `linux-perf` from the
|
||||
# version of Debian that matches the host (e.g. apt-get -t bookworm-backports install linux-perf)
|
||||
# - if you see an error about `addr2line` you may need to install binutils
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
source script/lib/deploy-helpers.sh
|
||||
|
||||
if [[ $# != 1 ]]; then
|
||||
echo "Usage: $0 <production|staging>"
|
||||
exit 1
|
||||
fi
|
||||
environment=$1
|
||||
|
||||
target_zed_kube_cluster
|
||||
|
||||
# 5s in production is ~200Mb..., in staging you probably want to bump this up.
|
||||
echo "Running perf on collab, collecting 5s of data..."
|
||||
|
||||
kubectl -n $environment exec -it deployments/collab -- perf record -p 1 -g -m 64 --call-graph dwarf -- sleep 5
|
||||
|
||||
run="collab-$environment-$(date -Iseconds)"
|
||||
echo "Processing data and downloading to '$run.perf'..."
|
||||
|
||||
kubectl -n $environment exec -it deployments/collab -- perf --no-pager script > "$run.perf"
|
||||
|
||||
which inferno-flamegraph 2>/dev/null || (echo "installing inferno..."; cargo install inferno)
|
||||
|
||||
inferno-collapse-perf "$run.perf" | inferno-flamegraph > "$run.svg"
|
||||
open "./$run.svg"
|
||||
@@ -1,9 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
preview=""
|
||||
if [[ "$GITHUB_REF_NAME" == *"-pre" ]]; then
|
||||
preview="-p"
|
||||
fi
|
||||
|
||||
gh release view "$GITHUB_REF_NAME" ||\
|
||||
gh release create -t "$GITHUB_REF_NAME" -d "$GITHUB_REF_NAME" -F "$1" $preview
|
||||
@@ -1 +0,0 @@
|
||||
node_modules/
|
||||
@@ -1,116 +0,0 @@
|
||||
import { danger, message, warn, fail } from "danger";
|
||||
const { prHygiene } = require("danger-plugin-pr-hygiene");
|
||||
|
||||
prHygiene({
|
||||
prefixPattern: /^([a-z\d\(\)_\s]+):(.*)/g,
|
||||
rules: {
|
||||
// Don't enable this rule just yet, as it can have false positives.
|
||||
useImperativeMood: "off",
|
||||
},
|
||||
});
|
||||
|
||||
const RELEASE_NOTES_PATTERN = /Release Notes:\r?\n\s+-/gm;
|
||||
const body = danger.github.pr.body;
|
||||
|
||||
const hasReleaseNotes = RELEASE_NOTES_PATTERN.test(body);
|
||||
|
||||
if (!hasReleaseNotes) {
|
||||
warn(
|
||||
[
|
||||
"This PR is missing release notes.",
|
||||
"",
|
||||
'Please add a "Release Notes" section that describes the change:',
|
||||
"",
|
||||
"```",
|
||||
"Release Notes:",
|
||||
"",
|
||||
"- Added/Fixed/Improved ...",
|
||||
"```",
|
||||
"",
|
||||
'If your change is not user-facing, you can use "N/A" for the entry:',
|
||||
"```",
|
||||
"Release Notes:",
|
||||
"",
|
||||
"- N/A",
|
||||
"```",
|
||||
].join("\n"),
|
||||
);
|
||||
}
|
||||
|
||||
const ISSUE_LINK_PATTERN =
|
||||
/(?:- )?(?<!(?:Close[sd]?|Fixe[sd]|Resolve[sd]|Implement[sed]|Follow-up of|Part of):?\s+)https:\/\/github\.com\/[\w-]+\/[\w-]+\/issues\/\d+/gi;
|
||||
|
||||
const bodyWithoutReleaseNotes = hasReleaseNotes ? body.split(/Release Notes:/)[0] : body;
|
||||
const includesIssueUrl = ISSUE_LINK_PATTERN.test(bodyWithoutReleaseNotes);
|
||||
|
||||
if (includesIssueUrl) {
|
||||
const matches = bodyWithoutReleaseNotes.match(ISSUE_LINK_PATTERN) ?? [];
|
||||
const issues = matches
|
||||
.map((match) => match.replace(/^#/, "").replace(/https:\/\/github\.com\/zed-industries\/zed\/issues\//, ""))
|
||||
.filter((issue, index, self) => self.indexOf(issue) === index);
|
||||
|
||||
const issuesToReport = issues.map((issue) => `#${issue}`).join(", ");
|
||||
message(
|
||||
[
|
||||
`This PR includes links to the following GitHub Issues: ${issuesToReport}`,
|
||||
"If this PR aims to close an issue, please include a `Closes #ISSUE` line at the top of the PR body.",
|
||||
].join("\n"),
|
||||
);
|
||||
}
|
||||
|
||||
const PROMPT_PATHS = [
|
||||
"assets/prompts/content_prompt.hbs",
|
||||
"assets/prompts/terminal_assistant_prompt.hbs",
|
||||
"crates/agent_settings/src/prompts/summarize_thread_detailed_prompt.txt",
|
||||
"crates/agent_settings/src/prompts/summarize_thread_prompt.txt",
|
||||
"crates/agent/src/templates/create_file_prompt.hbs",
|
||||
"crates/agent/src/templates/edit_file_prompt_xml.hbs",
|
||||
"crates/agent/src/templates/edit_file_prompt_diff_fenced.hbs",
|
||||
"crates/git_ui/src/commit_message_prompt.txt",
|
||||
];
|
||||
|
||||
const PROMPT_CHANGE_ATTESTATION = "I have ensured the LLM Worker works with these prompt changes.";
|
||||
|
||||
const modifiedPrompts = danger.git.modified_files.filter((file) =>
|
||||
PROMPT_PATHS.some((promptPath) => file.includes(promptPath)),
|
||||
);
|
||||
|
||||
for (const promptPath of modifiedPrompts) {
|
||||
if (body.includes(PROMPT_CHANGE_ATTESTATION)) {
|
||||
message(
|
||||
[
|
||||
`This PR contains changes to "${promptPath}".`,
|
||||
"The author has attested the LLM Worker works with the changes to this prompt.",
|
||||
].join("\n"),
|
||||
);
|
||||
} else {
|
||||
fail(
|
||||
[
|
||||
`Modifying the "${promptPath}" prompt may require corresponding changes in the LLM Worker.`,
|
||||
"If you are ensure what this entails, talk to @maxdeviant or another AI team member.",
|
||||
`Once you have made the changes—or determined that none are necessary—add "${PROMPT_CHANGE_ATTESTATION}" to the PR description.`,
|
||||
].join("\n"),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
const FIXTURE_CHANGE_ATTESTATION = "Changes to test fixtures are intentional and necessary.";
|
||||
|
||||
const FIXTURES_PATHS = ["crates/assistant_tools/src/edit_agent/evals/fixtures"];
|
||||
|
||||
const modifiedFixtures = danger.git.modified_files.filter((file) =>
|
||||
FIXTURES_PATHS.some((fixturePath) => file.includes(fixturePath)),
|
||||
);
|
||||
|
||||
if (modifiedFixtures.length > 0) {
|
||||
if (!body.includes(FIXTURE_CHANGE_ATTESTATION)) {
|
||||
const modifiedFixturesStr = modifiedFixtures.map((path) => "`" + path + "`").join(", ");
|
||||
fail(
|
||||
[
|
||||
`This PR modifies eval or test fixtures (${modifiedFixturesStr}), which are typically expected to remain unchanged.`,
|
||||
"If these changes are intentional and required, please add the following attestation to your PR description: ",
|
||||
`"${FIXTURE_CHANGE_ATTESTATION}"`,
|
||||
].join("\n\n"),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "danger",
|
||||
"version": "1.0.0",
|
||||
"private": true,
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"danger": "danger"
|
||||
},
|
||||
"devDependencies": {
|
||||
"danger": "13.0.4",
|
||||
"danger-plugin-pr-hygiene": "0.6.1"
|
||||
}
|
||||
}
|
||||
Generated
-884
@@ -1,884 +0,0 @@
|
||||
lockfileVersion: '9.0'
|
||||
|
||||
settings:
|
||||
autoInstallPeers: true
|
||||
excludeLinksFromLockfile: false
|
||||
|
||||
importers:
|
||||
|
||||
.:
|
||||
devDependencies:
|
||||
danger:
|
||||
specifier: 13.0.4
|
||||
version: 13.0.4
|
||||
danger-plugin-pr-hygiene:
|
||||
specifier: 0.6.1
|
||||
version: 0.6.1
|
||||
|
||||
packages:
|
||||
|
||||
'@gitbeaker/core@38.12.1':
|
||||
resolution: {integrity: sha512-8XMVcBIdVAAoxn7JtqmZ2Ee8f+AZLcCPmqEmPFOXY2jPS84y/DERISg/+sbhhb18iRy+ZsZhpWgQ/r3CkYNJOQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@gitbeaker/requester-utils@38.12.1':
|
||||
resolution: {integrity: sha512-Rc/DgngS0YPN+AY1s9UnexKSy4Lh0bkQVAq9p7PRbRpXb33SlTeCg8eg/8+A/mrMcHgYmP0XhH8lkizyA5tBUQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@gitbeaker/rest@38.12.1':
|
||||
resolution: {integrity: sha512-9KMSDtJ/sIov+5pcH+CAfiJXSiuYgN0KLKQFg0HHWR2DwcjGYkcbmhoZcWsaOWOqq4kihN1l7wX91UoRxxKKTQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@octokit/auth-token@4.0.0':
|
||||
resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==}
|
||||
engines: {node: '>= 18'}
|
||||
|
||||
'@octokit/core@5.2.2':
|
||||
resolution: {integrity: sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==}
|
||||
engines: {node: '>= 18'}
|
||||
|
||||
'@octokit/endpoint@9.0.6':
|
||||
resolution: {integrity: sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==}
|
||||
engines: {node: '>= 18'}
|
||||
|
||||
'@octokit/graphql@7.1.1':
|
||||
resolution: {integrity: sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==}
|
||||
engines: {node: '>= 18'}
|
||||
|
||||
'@octokit/openapi-types@24.2.0':
|
||||
resolution: {integrity: sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==}
|
||||
|
||||
'@octokit/plugin-paginate-rest@11.4.4-cjs.2':
|
||||
resolution: {integrity: sha512-2dK6z8fhs8lla5PaOTgqfCGBxgAv/le+EhPs27KklPhm1bKObpu6lXzwfUEQ16ajXzqNrKMujsFyo9K2eaoISw==}
|
||||
engines: {node: '>= 18'}
|
||||
peerDependencies:
|
||||
'@octokit/core': '5'
|
||||
|
||||
'@octokit/plugin-request-log@4.0.1':
|
||||
resolution: {integrity: sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==}
|
||||
engines: {node: '>= 18'}
|
||||
peerDependencies:
|
||||
'@octokit/core': '5'
|
||||
|
||||
'@octokit/plugin-rest-endpoint-methods@13.3.2-cjs.1':
|
||||
resolution: {integrity: sha512-VUjIjOOvF2oELQmiFpWA1aOPdawpyaCUqcEBc/UOUnj3Xp6DJGrJ1+bjUIIDzdHjnFNO6q57ODMfdEZnoBkCwQ==}
|
||||
engines: {node: '>= 18'}
|
||||
peerDependencies:
|
||||
'@octokit/core': ^5
|
||||
|
||||
'@octokit/request-error@5.1.1':
|
||||
resolution: {integrity: sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==}
|
||||
engines: {node: '>= 18'}
|
||||
|
||||
'@octokit/request@8.4.1':
|
||||
resolution: {integrity: sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==}
|
||||
engines: {node: '>= 18'}
|
||||
|
||||
'@octokit/rest@20.1.2':
|
||||
resolution: {integrity: sha512-GmYiltypkHHtihFwPRxlaorG5R9VAHuk/vbszVoRTGXnAsY60wYLkh/E2XiFmdZmqrisw+9FaazS1i5SbdWYgA==}
|
||||
engines: {node: '>= 18'}
|
||||
|
||||
'@octokit/types@13.10.0':
|
||||
resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==}
|
||||
|
||||
'@tootallnate/once@2.0.0':
|
||||
resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
|
||||
engines: {node: '>= 10'}
|
||||
|
||||
agent-base@6.0.2:
|
||||
resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
|
||||
engines: {node: '>= 6.0.0'}
|
||||
|
||||
ansi-styles@3.2.1:
|
||||
resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
|
||||
engines: {node: '>=4'}
|
||||
|
||||
async-retry@1.2.3:
|
||||
resolution: {integrity: sha512-tfDb02Th6CE6pJUF2gjW5ZVjsgwlucVXOEQMvEX9JgSJMs9gAX+Nz3xRuJBKuUYjTSYORqvDBORdAQ3LU59g7Q==}
|
||||
|
||||
before-after-hook@2.2.3:
|
||||
resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==}
|
||||
|
||||
braces@3.0.3:
|
||||
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
buffer-equal-constant-time@1.0.1:
|
||||
resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==}
|
||||
|
||||
call-bind-apply-helpers@1.0.2:
|
||||
resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
call-bound@1.0.4:
|
||||
resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
chalk@2.4.2:
|
||||
resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
|
||||
engines: {node: '>=4'}
|
||||
|
||||
color-convert@1.9.3:
|
||||
resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
|
||||
|
||||
color-name@1.1.3:
|
||||
resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
|
||||
|
||||
colors@1.4.0:
|
||||
resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==}
|
||||
engines: {node: '>=0.1.90'}
|
||||
|
||||
commander@2.20.3:
|
||||
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
|
||||
|
||||
core-js@3.45.1:
|
||||
resolution: {integrity: sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==}
|
||||
|
||||
danger-plugin-pr-hygiene@0.6.1:
|
||||
resolution: {integrity: sha512-nb+iUQvirE3BlKXI1WoOND6sujyGzHar590mJm5tt4RLi65HXFaU5hqONxgDoWFujJNHYnXse9yaZdxnxEi4QA==}
|
||||
|
||||
danger@13.0.4:
|
||||
resolution: {integrity: sha512-IAdQ5nSJyIs4zKj6AN35ixt2B0Ce3WZUm3IFe/CMnL/Op7wV7IGg4D348U0EKNaNPP58QgXbdSk9pM+IXP1QXg==}
|
||||
engines: {node: '>=18'}
|
||||
hasBin: true
|
||||
|
||||
debug@4.4.1:
|
||||
resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==}
|
||||
engines: {node: '>=6.0'}
|
||||
peerDependencies:
|
||||
supports-color: '*'
|
||||
peerDependenciesMeta:
|
||||
supports-color:
|
||||
optional: true
|
||||
|
||||
deprecation@2.3.1:
|
||||
resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==}
|
||||
|
||||
dunder-proto@1.0.1:
|
||||
resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
ecdsa-sig-formatter@1.0.11:
|
||||
resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
|
||||
|
||||
es-define-property@1.0.1:
|
||||
resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
es-errors@1.3.0:
|
||||
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
es-object-atoms@1.1.1:
|
||||
resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
escape-string-regexp@1.0.5:
|
||||
resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
|
||||
engines: {node: '>=0.8.0'}
|
||||
|
||||
fast-json-patch@3.1.1:
|
||||
resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==}
|
||||
|
||||
fill-range@7.1.1:
|
||||
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
function-bind@1.1.2:
|
||||
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
|
||||
|
||||
get-intrinsic@1.3.0:
|
||||
resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
get-proto@1.0.1:
|
||||
resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
get-stdin@6.0.0:
|
||||
resolution: {integrity: sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==}
|
||||
engines: {node: '>=4'}
|
||||
|
||||
gopd@1.2.0:
|
||||
resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
has-flag@2.0.0:
|
||||
resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
has-flag@3.0.0:
|
||||
resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
|
||||
engines: {node: '>=4'}
|
||||
|
||||
has-symbols@1.1.0:
|
||||
resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
hasown@2.0.2:
|
||||
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
http-proxy-agent@5.0.0:
|
||||
resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==}
|
||||
engines: {node: '>= 6'}
|
||||
|
||||
https-proxy-agent@5.0.1:
|
||||
resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
|
||||
engines: {node: '>= 6'}
|
||||
|
||||
hyperlinker@1.0.0:
|
||||
resolution: {integrity: sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==}
|
||||
engines: {node: '>=4'}
|
||||
|
||||
ini@5.0.0:
|
||||
resolution: {integrity: sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==}
|
||||
engines: {node: ^18.17.0 || >=20.5.0}
|
||||
|
||||
is-number@7.0.0:
|
||||
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
|
||||
engines: {node: '>=0.12.0'}
|
||||
|
||||
json5@2.2.3:
|
||||
resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
|
||||
engines: {node: '>=6'}
|
||||
hasBin: true
|
||||
|
||||
jsonpointer@5.0.1:
|
||||
resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
jsonwebtoken@9.0.2:
|
||||
resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==}
|
||||
engines: {node: '>=12', npm: '>=6'}
|
||||
|
||||
jwa@1.4.2:
|
||||
resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==}
|
||||
|
||||
jws@3.2.2:
|
||||
resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==}
|
||||
|
||||
lodash.find@4.6.0:
|
||||
resolution: {integrity: sha512-yaRZoAV3Xq28F1iafWN1+a0rflOej93l1DQUejs3SZ41h2O9UJBoS9aueGjPDgAl4B6tPC0NuuchLKaDQQ3Isg==}
|
||||
|
||||
lodash.includes@4.3.0:
|
||||
resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==}
|
||||
|
||||
lodash.isboolean@3.0.3:
|
||||
resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==}
|
||||
|
||||
lodash.isinteger@4.0.4:
|
||||
resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==}
|
||||
|
||||
lodash.isnumber@3.0.3:
|
||||
resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==}
|
||||
|
||||
lodash.isobject@3.0.2:
|
||||
resolution: {integrity: sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==}
|
||||
|
||||
lodash.isplainobject@4.0.6:
|
||||
resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
|
||||
|
||||
lodash.isstring@4.0.1:
|
||||
resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==}
|
||||
|
||||
lodash.keys@4.2.0:
|
||||
resolution: {integrity: sha512-J79MkJcp7Df5mizHiVNpjoHXLi4HLjh9VLS/M7lQSGoQ+0oQ+lWEigREkqKyizPB1IawvQLLKY8mzEcm1tkyxQ==}
|
||||
|
||||
lodash.mapvalues@4.6.0:
|
||||
resolution: {integrity: sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==}
|
||||
|
||||
lodash.memoize@4.1.2:
|
||||
resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
|
||||
|
||||
lodash.once@4.1.1:
|
||||
resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==}
|
||||
|
||||
math-intrinsics@1.1.0:
|
||||
resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
memfs-or-file-map-to-github-branch@1.3.0:
|
||||
resolution: {integrity: sha512-AzgIEodmt51dgwB3TmihTf1Fh2SmszdZskC6trFHy4v71R5shLmdjJSYI7ocVfFa7C/TE6ncb0OZ9eBg2rmkBQ==}
|
||||
|
||||
micromatch@4.0.8:
|
||||
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
|
||||
engines: {node: '>=8.6'}
|
||||
|
||||
minimist@1.2.8:
|
||||
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
|
||||
|
||||
ms@2.1.3:
|
||||
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
|
||||
|
||||
node-cleanup@2.1.2:
|
||||
resolution: {integrity: sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==}
|
||||
|
||||
node-fetch@2.7.0:
|
||||
resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
|
||||
engines: {node: 4.x || >=6.0.0}
|
||||
peerDependencies:
|
||||
encoding: ^0.1.0
|
||||
peerDependenciesMeta:
|
||||
encoding:
|
||||
optional: true
|
||||
|
||||
object-inspect@1.13.4:
|
||||
resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
once@1.4.0:
|
||||
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
|
||||
|
||||
override-require@1.1.1:
|
||||
resolution: {integrity: sha512-eoJ9YWxFcXbrn2U8FKT6RV+/Kj7fiGAB1VvHzbYKt8xM5ZuKZgCGvnHzDxmreEjcBH28ejg5MiOH4iyY1mQnkg==}
|
||||
|
||||
p-limit@2.3.0:
|
||||
resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
p-try@2.2.0:
|
||||
resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
parse-diff@0.7.1:
|
||||
resolution: {integrity: sha512-1j3l8IKcy4yRK2W4o9EYvJLSzpAVwz4DXqCewYyx2vEwk2gcf3DBPqc8Fj4XV3K33OYJ08A8fWwyu/ykD/HUSg==}
|
||||
|
||||
parse-github-url@1.0.3:
|
||||
resolution: {integrity: sha512-tfalY5/4SqGaV/GIGzWyHnFjlpTPTNpENR9Ea2lLldSJ8EWXMsvacWucqY3m3I4YPtas15IxTLQVQ5NSYXPrww==}
|
||||
engines: {node: '>= 0.10'}
|
||||
hasBin: true
|
||||
|
||||
parse-link-header@2.0.0:
|
||||
resolution: {integrity: sha512-xjU87V0VyHZybn2RrCX5TIFGxTVZE6zqqZWMPlIKiSKuWh/X5WZdt+w1Ki1nXB+8L/KtL+nZ4iq+sfI6MrhhMw==}
|
||||
|
||||
picomatch@2.3.1:
|
||||
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
|
||||
engines: {node: '>=8.6'}
|
||||
|
||||
pinpoint@1.1.0:
|
||||
resolution: {integrity: sha512-+04FTD9x7Cls2rihLlo57QDCcHoLBGn5Dk51SwtFBWkUWLxZaBXyNVpCw1S+atvE7GmnFjeaRZ0WLq3UYuqAdg==}
|
||||
|
||||
prettyjson@1.2.5:
|
||||
resolution: {integrity: sha512-rksPWtoZb2ZpT5OVgtmy0KHVM+Dca3iVwWY9ifwhcexfjebtgjg3wmrUt9PvJ59XIYBcknQeYHD8IAnVlh9lAw==}
|
||||
hasBin: true
|
||||
|
||||
qs@6.14.0:
|
||||
resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
|
||||
engines: {node: '>=0.6'}
|
||||
|
||||
readline-sync@1.4.10:
|
||||
resolution: {integrity: sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==}
|
||||
engines: {node: '>= 0.8.0'}
|
||||
|
||||
regenerator-runtime@0.13.11:
|
||||
resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
|
||||
|
||||
require-from-string@2.0.2:
|
||||
resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
retry@0.12.0:
|
||||
resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==}
|
||||
engines: {node: '>= 4'}
|
||||
|
||||
safe-buffer@5.2.1:
|
||||
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
|
||||
|
||||
semver@7.7.2:
|
||||
resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
|
||||
engines: {node: '>=10'}
|
||||
hasBin: true
|
||||
|
||||
side-channel-list@1.0.0:
|
||||
resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
side-channel-map@1.0.1:
|
||||
resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
side-channel-weakmap@1.0.2:
|
||||
resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
side-channel@1.1.0:
|
||||
resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
supports-color@5.5.0:
|
||||
resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
|
||||
engines: {node: '>=4'}
|
||||
|
||||
supports-hyperlinks@1.0.1:
|
||||
resolution: {integrity: sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==}
|
||||
engines: {node: '>=4'}
|
||||
|
||||
to-regex-range@5.0.1:
|
||||
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
|
||||
engines: {node: '>=8.0'}
|
||||
|
||||
tr46@0.0.3:
|
||||
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
|
||||
|
||||
universal-user-agent@6.0.1:
|
||||
resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==}
|
||||
|
||||
webidl-conversions@3.0.1:
|
||||
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
|
||||
|
||||
whatwg-url@5.0.0:
|
||||
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
|
||||
|
||||
wrappy@1.0.2:
|
||||
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
|
||||
|
||||
xcase@2.0.1:
|
||||
resolution: {integrity: sha512-UmFXIPU+9Eg3E9m/728Bii0lAIuoc+6nbrNUKaRPJOFp91ih44qqGlWtxMB6kXFrRD6po+86ksHM5XHCfk6iPw==}
|
||||
|
||||
xtend@4.0.2:
|
||||
resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
|
||||
engines: {node: '>=0.4'}
|
||||
|
||||
snapshots:
|
||||
|
||||
'@gitbeaker/core@38.12.1':
|
||||
dependencies:
|
||||
'@gitbeaker/requester-utils': 38.12.1
|
||||
qs: 6.14.0
|
||||
xcase: 2.0.1
|
||||
|
||||
'@gitbeaker/requester-utils@38.12.1':
|
||||
dependencies:
|
||||
qs: 6.14.0
|
||||
xcase: 2.0.1
|
||||
|
||||
'@gitbeaker/rest@38.12.1':
|
||||
dependencies:
|
||||
'@gitbeaker/core': 38.12.1
|
||||
'@gitbeaker/requester-utils': 38.12.1
|
||||
|
||||
'@octokit/auth-token@4.0.0': {}
|
||||
|
||||
'@octokit/core@5.2.2':
|
||||
dependencies:
|
||||
'@octokit/auth-token': 4.0.0
|
||||
'@octokit/graphql': 7.1.1
|
||||
'@octokit/request': 8.4.1
|
||||
'@octokit/request-error': 5.1.1
|
||||
'@octokit/types': 13.10.0
|
||||
before-after-hook: 2.2.3
|
||||
universal-user-agent: 6.0.1
|
||||
|
||||
'@octokit/endpoint@9.0.6':
|
||||
dependencies:
|
||||
'@octokit/types': 13.10.0
|
||||
universal-user-agent: 6.0.1
|
||||
|
||||
'@octokit/graphql@7.1.1':
|
||||
dependencies:
|
||||
'@octokit/request': 8.4.1
|
||||
'@octokit/types': 13.10.0
|
||||
universal-user-agent: 6.0.1
|
||||
|
||||
'@octokit/openapi-types@24.2.0': {}
|
||||
|
||||
'@octokit/plugin-paginate-rest@11.4.4-cjs.2(@octokit/core@5.2.2)':
|
||||
dependencies:
|
||||
'@octokit/core': 5.2.2
|
||||
'@octokit/types': 13.10.0
|
||||
|
||||
'@octokit/plugin-request-log@4.0.1(@octokit/core@5.2.2)':
|
||||
dependencies:
|
||||
'@octokit/core': 5.2.2
|
||||
|
||||
'@octokit/plugin-rest-endpoint-methods@13.3.2-cjs.1(@octokit/core@5.2.2)':
|
||||
dependencies:
|
||||
'@octokit/core': 5.2.2
|
||||
'@octokit/types': 13.10.0
|
||||
|
||||
'@octokit/request-error@5.1.1':
|
||||
dependencies:
|
||||
'@octokit/types': 13.10.0
|
||||
deprecation: 2.3.1
|
||||
once: 1.4.0
|
||||
|
||||
'@octokit/request@8.4.1':
|
||||
dependencies:
|
||||
'@octokit/endpoint': 9.0.6
|
||||
'@octokit/request-error': 5.1.1
|
||||
'@octokit/types': 13.10.0
|
||||
universal-user-agent: 6.0.1
|
||||
|
||||
'@octokit/rest@20.1.2':
|
||||
dependencies:
|
||||
'@octokit/core': 5.2.2
|
||||
'@octokit/plugin-paginate-rest': 11.4.4-cjs.2(@octokit/core@5.2.2)
|
||||
'@octokit/plugin-request-log': 4.0.1(@octokit/core@5.2.2)
|
||||
'@octokit/plugin-rest-endpoint-methods': 13.3.2-cjs.1(@octokit/core@5.2.2)
|
||||
|
||||
'@octokit/types@13.10.0':
|
||||
dependencies:
|
||||
'@octokit/openapi-types': 24.2.0
|
||||
|
||||
'@tootallnate/once@2.0.0': {}
|
||||
|
||||
agent-base@6.0.2:
|
||||
dependencies:
|
||||
debug: 4.4.1
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
ansi-styles@3.2.1:
|
||||
dependencies:
|
||||
color-convert: 1.9.3
|
||||
|
||||
async-retry@1.2.3:
|
||||
dependencies:
|
||||
retry: 0.12.0
|
||||
|
||||
before-after-hook@2.2.3: {}
|
||||
|
||||
braces@3.0.3:
|
||||
dependencies:
|
||||
fill-range: 7.1.1
|
||||
|
||||
buffer-equal-constant-time@1.0.1: {}
|
||||
|
||||
call-bind-apply-helpers@1.0.2:
|
||||
dependencies:
|
||||
es-errors: 1.3.0
|
||||
function-bind: 1.1.2
|
||||
|
||||
call-bound@1.0.4:
|
||||
dependencies:
|
||||
call-bind-apply-helpers: 1.0.2
|
||||
get-intrinsic: 1.3.0
|
||||
|
||||
chalk@2.4.2:
|
||||
dependencies:
|
||||
ansi-styles: 3.2.1
|
||||
escape-string-regexp: 1.0.5
|
||||
supports-color: 5.5.0
|
||||
|
||||
color-convert@1.9.3:
|
||||
dependencies:
|
||||
color-name: 1.1.3
|
||||
|
||||
color-name@1.1.3: {}
|
||||
|
||||
colors@1.4.0: {}
|
||||
|
||||
commander@2.20.3: {}
|
||||
|
||||
core-js@3.45.1: {}
|
||||
|
||||
danger-plugin-pr-hygiene@0.6.1: {}
|
||||
|
||||
danger@13.0.4:
|
||||
dependencies:
|
||||
'@gitbeaker/rest': 38.12.1
|
||||
'@octokit/rest': 20.1.2
|
||||
async-retry: 1.2.3
|
||||
chalk: 2.4.2
|
||||
commander: 2.20.3
|
||||
core-js: 3.45.1
|
||||
debug: 4.4.1
|
||||
fast-json-patch: 3.1.1
|
||||
get-stdin: 6.0.0
|
||||
http-proxy-agent: 5.0.0
|
||||
https-proxy-agent: 5.0.1
|
||||
hyperlinker: 1.0.0
|
||||
ini: 5.0.0
|
||||
json5: 2.2.3
|
||||
jsonpointer: 5.0.1
|
||||
jsonwebtoken: 9.0.2
|
||||
lodash.find: 4.6.0
|
||||
lodash.includes: 4.3.0
|
||||
lodash.isobject: 3.0.2
|
||||
lodash.keys: 4.2.0
|
||||
lodash.mapvalues: 4.6.0
|
||||
lodash.memoize: 4.1.2
|
||||
memfs-or-file-map-to-github-branch: 1.3.0
|
||||
micromatch: 4.0.8
|
||||
node-cleanup: 2.1.2
|
||||
node-fetch: 2.7.0
|
||||
override-require: 1.1.1
|
||||
p-limit: 2.3.0
|
||||
parse-diff: 0.7.1
|
||||
parse-github-url: 1.0.3
|
||||
parse-link-header: 2.0.0
|
||||
pinpoint: 1.1.0
|
||||
prettyjson: 1.2.5
|
||||
readline-sync: 1.4.10
|
||||
regenerator-runtime: 0.13.11
|
||||
require-from-string: 2.0.2
|
||||
supports-hyperlinks: 1.0.1
|
||||
transitivePeerDependencies:
|
||||
- encoding
|
||||
- supports-color
|
||||
|
||||
debug@4.4.1:
|
||||
dependencies:
|
||||
ms: 2.1.3
|
||||
|
||||
deprecation@2.3.1: {}
|
||||
|
||||
dunder-proto@1.0.1:
|
||||
dependencies:
|
||||
call-bind-apply-helpers: 1.0.2
|
||||
es-errors: 1.3.0
|
||||
gopd: 1.2.0
|
||||
|
||||
ecdsa-sig-formatter@1.0.11:
|
||||
dependencies:
|
||||
safe-buffer: 5.2.1
|
||||
|
||||
es-define-property@1.0.1: {}
|
||||
|
||||
es-errors@1.3.0: {}
|
||||
|
||||
es-object-atoms@1.1.1:
|
||||
dependencies:
|
||||
es-errors: 1.3.0
|
||||
|
||||
escape-string-regexp@1.0.5: {}
|
||||
|
||||
fast-json-patch@3.1.1: {}
|
||||
|
||||
fill-range@7.1.1:
|
||||
dependencies:
|
||||
to-regex-range: 5.0.1
|
||||
|
||||
function-bind@1.1.2: {}
|
||||
|
||||
get-intrinsic@1.3.0:
|
||||
dependencies:
|
||||
call-bind-apply-helpers: 1.0.2
|
||||
es-define-property: 1.0.1
|
||||
es-errors: 1.3.0
|
||||
es-object-atoms: 1.1.1
|
||||
function-bind: 1.1.2
|
||||
get-proto: 1.0.1
|
||||
gopd: 1.2.0
|
||||
has-symbols: 1.1.0
|
||||
hasown: 2.0.2
|
||||
math-intrinsics: 1.1.0
|
||||
|
||||
get-proto@1.0.1:
|
||||
dependencies:
|
||||
dunder-proto: 1.0.1
|
||||
es-object-atoms: 1.1.1
|
||||
|
||||
get-stdin@6.0.0: {}
|
||||
|
||||
gopd@1.2.0: {}
|
||||
|
||||
has-flag@2.0.0: {}
|
||||
|
||||
has-flag@3.0.0: {}
|
||||
|
||||
has-symbols@1.1.0: {}
|
||||
|
||||
hasown@2.0.2:
|
||||
dependencies:
|
||||
function-bind: 1.1.2
|
||||
|
||||
http-proxy-agent@5.0.0:
|
||||
dependencies:
|
||||
'@tootallnate/once': 2.0.0
|
||||
agent-base: 6.0.2
|
||||
debug: 4.4.1
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
https-proxy-agent@5.0.1:
|
||||
dependencies:
|
||||
agent-base: 6.0.2
|
||||
debug: 4.4.1
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
hyperlinker@1.0.0: {}
|
||||
|
||||
ini@5.0.0: {}
|
||||
|
||||
is-number@7.0.0: {}
|
||||
|
||||
json5@2.2.3: {}
|
||||
|
||||
jsonpointer@5.0.1: {}
|
||||
|
||||
jsonwebtoken@9.0.2:
|
||||
dependencies:
|
||||
jws: 3.2.2
|
||||
lodash.includes: 4.3.0
|
||||
lodash.isboolean: 3.0.3
|
||||
lodash.isinteger: 4.0.4
|
||||
lodash.isnumber: 3.0.3
|
||||
lodash.isplainobject: 4.0.6
|
||||
lodash.isstring: 4.0.1
|
||||
lodash.once: 4.1.1
|
||||
ms: 2.1.3
|
||||
semver: 7.7.2
|
||||
|
||||
jwa@1.4.2:
|
||||
dependencies:
|
||||
buffer-equal-constant-time: 1.0.1
|
||||
ecdsa-sig-formatter: 1.0.11
|
||||
safe-buffer: 5.2.1
|
||||
|
||||
jws@3.2.2:
|
||||
dependencies:
|
||||
jwa: 1.4.2
|
||||
safe-buffer: 5.2.1
|
||||
|
||||
lodash.find@4.6.0: {}
|
||||
|
||||
lodash.includes@4.3.0: {}
|
||||
|
||||
lodash.isboolean@3.0.3: {}
|
||||
|
||||
lodash.isinteger@4.0.4: {}
|
||||
|
||||
lodash.isnumber@3.0.3: {}
|
||||
|
||||
lodash.isobject@3.0.2: {}
|
||||
|
||||
lodash.isplainobject@4.0.6: {}
|
||||
|
||||
lodash.isstring@4.0.1: {}
|
||||
|
||||
lodash.keys@4.2.0: {}
|
||||
|
||||
lodash.mapvalues@4.6.0: {}
|
||||
|
||||
lodash.memoize@4.1.2: {}
|
||||
|
||||
lodash.once@4.1.1: {}
|
||||
|
||||
math-intrinsics@1.1.0: {}
|
||||
|
||||
memfs-or-file-map-to-github-branch@1.3.0:
|
||||
dependencies:
|
||||
'@octokit/rest': 20.1.2
|
||||
|
||||
micromatch@4.0.8:
|
||||
dependencies:
|
||||
braces: 3.0.3
|
||||
picomatch: 2.3.1
|
||||
|
||||
minimist@1.2.8: {}
|
||||
|
||||
ms@2.1.3: {}
|
||||
|
||||
node-cleanup@2.1.2: {}
|
||||
|
||||
node-fetch@2.7.0:
|
||||
dependencies:
|
||||
whatwg-url: 5.0.0
|
||||
|
||||
object-inspect@1.13.4: {}
|
||||
|
||||
once@1.4.0:
|
||||
dependencies:
|
||||
wrappy: 1.0.2
|
||||
|
||||
override-require@1.1.1: {}
|
||||
|
||||
p-limit@2.3.0:
|
||||
dependencies:
|
||||
p-try: 2.2.0
|
||||
|
||||
p-try@2.2.0: {}
|
||||
|
||||
parse-diff@0.7.1: {}
|
||||
|
||||
parse-github-url@1.0.3: {}
|
||||
|
||||
parse-link-header@2.0.0:
|
||||
dependencies:
|
||||
xtend: 4.0.2
|
||||
|
||||
picomatch@2.3.1: {}
|
||||
|
||||
pinpoint@1.1.0: {}
|
||||
|
||||
prettyjson@1.2.5:
|
||||
dependencies:
|
||||
colors: 1.4.0
|
||||
minimist: 1.2.8
|
||||
|
||||
qs@6.14.0:
|
||||
dependencies:
|
||||
side-channel: 1.1.0
|
||||
|
||||
readline-sync@1.4.10: {}
|
||||
|
||||
regenerator-runtime@0.13.11: {}
|
||||
|
||||
require-from-string@2.0.2: {}
|
||||
|
||||
retry@0.12.0: {}
|
||||
|
||||
safe-buffer@5.2.1: {}
|
||||
|
||||
semver@7.7.2: {}
|
||||
|
||||
side-channel-list@1.0.0:
|
||||
dependencies:
|
||||
es-errors: 1.3.0
|
||||
object-inspect: 1.13.4
|
||||
|
||||
side-channel-map@1.0.1:
|
||||
dependencies:
|
||||
call-bound: 1.0.4
|
||||
es-errors: 1.3.0
|
||||
get-intrinsic: 1.3.0
|
||||
object-inspect: 1.13.4
|
||||
|
||||
side-channel-weakmap@1.0.2:
|
||||
dependencies:
|
||||
call-bound: 1.0.4
|
||||
es-errors: 1.3.0
|
||||
get-intrinsic: 1.3.0
|
||||
object-inspect: 1.13.4
|
||||
side-channel-map: 1.0.1
|
||||
|
||||
side-channel@1.1.0:
|
||||
dependencies:
|
||||
es-errors: 1.3.0
|
||||
object-inspect: 1.13.4
|
||||
side-channel-list: 1.0.0
|
||||
side-channel-map: 1.0.1
|
||||
side-channel-weakmap: 1.0.2
|
||||
|
||||
supports-color@5.5.0:
|
||||
dependencies:
|
||||
has-flag: 3.0.0
|
||||
|
||||
supports-hyperlinks@1.0.1:
|
||||
dependencies:
|
||||
has-flag: 2.0.0
|
||||
supports-color: 5.5.0
|
||||
|
||||
to-regex-range@5.0.1:
|
||||
dependencies:
|
||||
is-number: 7.0.0
|
||||
|
||||
tr46@0.0.3: {}
|
||||
|
||||
universal-user-agent@6.0.1: {}
|
||||
|
||||
webidl-conversions@3.0.1: {}
|
||||
|
||||
whatwg-url@5.0.0:
|
||||
dependencies:
|
||||
tr46: 0.0.3
|
||||
webidl-conversions: 3.0.1
|
||||
|
||||
wrappy@1.0.2: {}
|
||||
|
||||
xcase@2.0.1: {}
|
||||
|
||||
xtend@4.0.2: {}
|
||||
@@ -1,3 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
cargo build -p zed && cargo run -p cli -- --foreground --zed=${CARGO_TARGET_DIR:-target}/debug/zed "$@"
|
||||
@@ -1,21 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -eu
|
||||
source script/lib/deploy-helpers.sh
|
||||
|
||||
if [[ $# != 1 ]]; then
|
||||
echo "Usage: $0 <production|staging>"
|
||||
exit 1
|
||||
fi
|
||||
environment=$1
|
||||
tag="$(tag_for_environment $environment)"
|
||||
|
||||
branch=$(git rev-parse --abbrev-ref HEAD)
|
||||
if [ "$branch" != "main" ]; then
|
||||
echo "You must be on main to run this script"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git pull --ff-only origin main
|
||||
git tag -f $tag
|
||||
git push -f origin $tag
|
||||
@@ -1,33 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
if [ -z "${GITHUB_ACTIONS-}" ]; then
|
||||
echo "Error: This script must be run in a GitHub Actions environment"
|
||||
exit 1
|
||||
elif [ -z "${GITHUB_REF-}" ]; then
|
||||
# This should be the release tag 'v0.x.x'
|
||||
echo "Error: GITHUB_REF is not set"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
version=$(script/get-crate-version zed)
|
||||
channel=$(cat crates/zed/RELEASE_CHANNEL)
|
||||
echo "Publishing version: ${version} on release channel ${channel}"
|
||||
echo "RELEASE_CHANNEL=${channel}" >> $GITHUB_ENV
|
||||
echo "RELEASE_VERSION=${version}" >> $GITHUB_ENV
|
||||
|
||||
expected_tag_name=""
|
||||
case ${channel} in
|
||||
stable)
|
||||
expected_tag_name="v${version}";;
|
||||
preview)
|
||||
expected_tag_name="v${version}-pre";;
|
||||
*)
|
||||
echo "can't publish a release on channel ${channel}"
|
||||
exit 1;;
|
||||
esac
|
||||
if [[ $GITHUB_REF_NAME != $expected_tag_name ]]; then
|
||||
echo "invalid release tag ${GITHUB_REF_NAME}. expected ${expected_tag_name}"
|
||||
exit 1
|
||||
fi
|
||||
@@ -1,37 +0,0 @@
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
if (-not $env:GITHUB_ACTIONS) {
|
||||
Write-Error "Error: This script must be run in a GitHub Actions environment"
|
||||
exit 1
|
||||
}
|
||||
|
||||
if (-not $env:GITHUB_REF) {
|
||||
Write-Error "Error: GITHUB_REF is not set"
|
||||
exit 1
|
||||
}
|
||||
|
||||
$version = & "script/get-crate-version.ps1" "zed"
|
||||
$channel = Get-Content "crates/zed/RELEASE_CHANNEL"
|
||||
|
||||
Write-Host "Publishing version: $version on release channel $channel"
|
||||
Write-Output "RELEASE_CHANNEL=$channel" >> $env:GITHUB_ENV
|
||||
Write-Output "RELEASE_VERSION=$version" >> $env:GITHUB_ENV
|
||||
|
||||
$expectedTagName = ""
|
||||
switch ($channel) {
|
||||
"stable" {
|
||||
$expectedTagName = "v$version"
|
||||
}
|
||||
"preview" {
|
||||
$expectedTagName = "v$version-pre"
|
||||
}
|
||||
default {
|
||||
Write-Error "can't publish a release on channel $channel"
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
if ($env:GITHUB_REF_NAME -ne $expectedTagName) {
|
||||
Write-Error "invalid release tag $($env:GITHUB_REF_NAME). expected $expectedTagName"
|
||||
exit 1
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Check if database name is provided
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "Usage: $0 <database-name>"
|
||||
doctl databases list
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DATABASE_NAME="$1"
|
||||
DATABASE_ID=$(doctl databases list --format ID,Name --no-header | grep "$DATABASE_NAME" | awk '{print $1}')
|
||||
|
||||
if [ -z "$DATABASE_ID" ]; then
|
||||
echo "Error: Database '$DATABASE_NAME' not found"
|
||||
exit 1
|
||||
fi
|
||||
CURRENT_IP=$(curl -s https://api.ipify.org)
|
||||
if [ -z "$CURRENT_IP" ]; then
|
||||
echo "Error: Failed to get current IP address"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
EXISTING_RULE=$(doctl databases firewalls list "$DATABASE_ID" | grep "ip_addr" | grep "$CURRENT_IP")
|
||||
|
||||
if [ -z "$EXISTING_RULE" ]; then
|
||||
echo "IP not found in whitelist. Adding $CURRENT_IP to database firewall..."
|
||||
doctl databases firewalls append "$DATABASE_ID" --rule ip_addr:"$CURRENT_IP"
|
||||
fi
|
||||
|
||||
CONNECTION_URL=$(doctl databases connection "$DATABASE_ID" --format URI --no-header)
|
||||
|
||||
if [ -z "$CONNECTION_URL" ]; then
|
||||
echo "Error: Failed to get database connection details"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
psql "$CONNECTION_URL"
|
||||
@@ -1,60 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Check if ./target/wasi-sdk exists
|
||||
if [ ! -d "./target/wasi-sdk" ]; then
|
||||
echo "WASI SDK not found, downloading v25..."
|
||||
|
||||
# Determine OS and architecture
|
||||
OS=$(uname -s | tr '[:upper:]' '[:lower:]')
|
||||
ARCH=$(uname -m)
|
||||
|
||||
# Map architecture names to WASI SDK format
|
||||
case $ARCH in
|
||||
x86_64)
|
||||
ARCH="x86_64"
|
||||
;;
|
||||
arm64|aarch64)
|
||||
ARCH="arm64"
|
||||
;;
|
||||
*)
|
||||
echo "Unsupported architecture: $ARCH"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# Map OS names to WASI SDK format
|
||||
case $OS in
|
||||
darwin)
|
||||
OS="macos"
|
||||
;;
|
||||
linux)
|
||||
OS="linux"
|
||||
;;
|
||||
mingw*|msys*|cygwin*)
|
||||
OS="mingw"
|
||||
;;
|
||||
*)
|
||||
echo "Unsupported OS: $OS"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# Construct download URL
|
||||
WASI_SDK_VERSION="25"
|
||||
WASI_SDK_URL="https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${WASI_SDK_VERSION}/wasi-sdk-${WASI_SDK_VERSION}.0-${ARCH}-${OS}.tar.gz"
|
||||
|
||||
echo "Downloading from: $WASI_SDK_URL"
|
||||
|
||||
# Create target directory if it doesn't exist
|
||||
mkdir -p ./target
|
||||
|
||||
# Download and extract
|
||||
curl -L "$WASI_SDK_URL" | tar -xz -C ./target
|
||||
|
||||
# Rename the extracted directory to wasi-sdk
|
||||
mv "./target/wasi-sdk-${WASI_SDK_VERSION}.0-${ARCH}-${OS}" "./target/wasi-sdk"
|
||||
|
||||
echo "WASI SDK v25 installed successfully"
|
||||
else
|
||||
echo "WASI SDK already exists at ./target/wasi-sdk"
|
||||
fi
|
||||
@@ -1,115 +0,0 @@
|
||||
#!/usr/bin/env node --redirect-warnings=/dev/null
|
||||
|
||||
const { execFileSync } = require("child_process");
|
||||
|
||||
main();
|
||||
|
||||
async function main() {
|
||||
let version = process.argv[2];
|
||||
let channel = process.argv[3];
|
||||
let parts = version.split(".");
|
||||
|
||||
if (
|
||||
process.argv.length != 4 ||
|
||||
parts.length != 3 ||
|
||||
parts.find((part) => isNaN(part)) != null ||
|
||||
(channel != "stable" && channel != "preview")
|
||||
) {
|
||||
console.log("Usage: draft-release-notes <version> {stable|preview}");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// currently we can only draft notes for patch releases.
|
||||
if (parts[2] === 0) {
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
let priorVersion = [parts[0], parts[1], parts[2] - 1].join(".");
|
||||
let suffix = channel == "preview" ? "-pre" : "";
|
||||
let [tag, priorTag] = [`v${version}${suffix}`, `v${priorVersion}${suffix}`];
|
||||
|
||||
try {
|
||||
execFileSync("rm", ["-rf", "target/shallow_clone"]);
|
||||
execFileSync("git", [
|
||||
"clone",
|
||||
"https://github.com/zed-industries/zed",
|
||||
"target/shallow_clone",
|
||||
"--filter=tree:0",
|
||||
"--no-checkout",
|
||||
"--branch",
|
||||
tag,
|
||||
"--depth",
|
||||
100,
|
||||
]);
|
||||
execFileSync("git", ["-C", "target/shallow_clone", "rev-parse", "--verify", tag]);
|
||||
try {
|
||||
execFileSync("git", ["-C", "target/shallow_clone", "rev-parse", "--verify", priorTag]);
|
||||
} catch (e) {
|
||||
console.error(`Prior tag ${priorTag} not found`);
|
||||
process.exit(0);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e.stderr.toString());
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const newCommits = getCommits(priorTag, tag);
|
||||
|
||||
let releaseNotes = [];
|
||||
let missing = [];
|
||||
let skipped = [];
|
||||
|
||||
for (const commit of newCommits) {
|
||||
let link = "https://github.com/zed-industries/zed/pull/" + commit.pr;
|
||||
let notes = commit.releaseNotes;
|
||||
if (commit.pr == "") {
|
||||
link = "https://github.com/zed-industries/zed/commits/" + commit.hash;
|
||||
} else if (!notes.includes("zed-industries/zed/issues")) {
|
||||
notes = notes + " ([#" + commit.pr + "](" + link + "))";
|
||||
}
|
||||
|
||||
if (commit.releaseNotes == "") {
|
||||
missing.push("- MISSING " + commit.firstLine + " " + link);
|
||||
} else if (commit.releaseNotes.startsWith("- N/A")) {
|
||||
skipped.push("- N/A " + commit.firstLine + " " + link);
|
||||
} else {
|
||||
releaseNotes.push(notes);
|
||||
}
|
||||
}
|
||||
|
||||
console.log(releaseNotes.join("\n") + "\n");
|
||||
}
|
||||
|
||||
function getCommits(oldTag, newTag) {
|
||||
const pullRequestNumbers = execFileSync(
|
||||
"git",
|
||||
["-C", "target/shallow_clone", "log", `${oldTag}..${newTag}`, "--format=DIVIDER\n%H|||%B"],
|
||||
{ encoding: "utf8" },
|
||||
)
|
||||
.replace(/\r\n/g, "\n")
|
||||
.split("DIVIDER\n")
|
||||
.filter((commit) => commit.length > 0)
|
||||
.map((commit) => {
|
||||
let [hash, firstLine] = commit.split("\n")[0].split("|||");
|
||||
let cherryPick = firstLine.match(/\(cherry-pick #([0-9]+)\)/)?.[1] || "";
|
||||
let pr = firstLine.match(/\(#(\d+)\)$/)?.[1] || "";
|
||||
let releaseNotes = (commit.split(/Release notes:.*\n/i)[1] || "")
|
||||
.split("\n\n")[0]
|
||||
.trim()
|
||||
.replace(/\n(?![\n-])/g, " ");
|
||||
|
||||
if (releaseNotes.includes("<public_issue_number_if_exists>")) {
|
||||
releaseNotes = "";
|
||||
}
|
||||
|
||||
return {
|
||||
hash,
|
||||
pr,
|
||||
cherryPick,
|
||||
releaseNotes,
|
||||
firstLine,
|
||||
};
|
||||
});
|
||||
|
||||
return pullRequestNumbers;
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
databases=$(psql --tuples-only --command "
|
||||
SELECT
|
||||
datname
|
||||
FROM
|
||||
pg_database
|
||||
WHERE
|
||||
datistemplate = false
|
||||
AND datname like 'zed-test-%'
|
||||
")
|
||||
|
||||
for database in $databases; do
|
||||
echo $database
|
||||
dropdb $database
|
||||
done
|
||||
@@ -1,22 +0,0 @@
|
||||
param (
|
||||
[Parameter(Mandatory = $true)]
|
||||
[int]$MAX_SIZE_IN_GB
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
$PSNativeCommandUseErrorActionPreference = $true
|
||||
$ProgressPreference = "SilentlyContinue"
|
||||
|
||||
if (-Not (Test-Path -Path "target")) {
|
||||
Write-Host "target directory does not exist yet"
|
||||
exit 0
|
||||
}
|
||||
|
||||
$current_size_gb = (Get-ChildItem -Recurse -Force -File -Path "target" | Measure-Object -Property Length -Sum).Sum / 1GB
|
||||
|
||||
Write-Host "target directory size: ${current_size_gb}GB. max size: ${MAX_SIZE_IN_GB}GB"
|
||||
|
||||
if ($current_size_gb -gt $MAX_SIZE_IN_GB) {
|
||||
Write-Host "Dev drive is almost full, increase the size first!"
|
||||
exit 1
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
cd "$(dirname "$0")/../.."
|
||||
shopt -s extglob
|
||||
|
||||
script/bundle-linux --flatpak
|
||||
archive_match="zed(-[a-zA-Z0-9]+)?-linux-$(uname -m)\.tar\.gz"
|
||||
archive=$(ls "target/release" | grep -E ${archive_match})
|
||||
channel=$(<crates/zed/RELEASE_CHANNEL)
|
||||
|
||||
export CHANNEL="$channel"
|
||||
export ARCHIVE="$archive"
|
||||
if [[ "$channel" == "dev" ]]; then
|
||||
export APP_ID="dev.zed.ZedDev"
|
||||
export APP_NAME="Zed Devel"
|
||||
export BRANDING_LIGHT="#99c1f1"
|
||||
export BRANDING_DARK="#1a5fb4"
|
||||
export ICON_FILE="app-icon-dev"
|
||||
elif [[ "$channel" == "nightly" ]]; then
|
||||
export APP_ID="dev.zed.ZedNightly"
|
||||
export APP_NAME="Zed Nightly"
|
||||
export BRANDING_LIGHT="#e9aa6a"
|
||||
export BRANDING_DARK="#1a5fb4"
|
||||
export ICON_FILE="app-icon-nightly"
|
||||
elif [[ "$channel" == "preview" ]]; then
|
||||
export APP_ID="dev.zed.ZedPreview"
|
||||
export APP_NAME="Zed Preview"
|
||||
export BRANDING_LIGHT="#99c1f1"
|
||||
export BRANDING_DARK="#1a5fb4"
|
||||
export ICON_FILE="app-icon-preview"
|
||||
elif [[ "$channel" == "stable" ]]; then
|
||||
export APP_ID="dev.zed.Zed"
|
||||
export APP_NAME="Zed"
|
||||
export BRANDING_LIGHT="#99c1f1"
|
||||
export BRANDING_DARK="#1a5fb4"
|
||||
export ICON_FILE="app-icon"
|
||||
else
|
||||
echo "Invalid channel: '$channel'"
|
||||
exit
|
||||
fi
|
||||
|
||||
envsubst < "crates/zed/resources/flatpak/manifest-template.json" > "$APP_ID.json"
|
||||
flatpak-builder --user --install --force-clean build "$APP_ID.json"
|
||||
flatpak build-bundle ~/.local/share/flatpak/repo "target/release/$APP_ID.flatpak" "$APP_ID"
|
||||
echo "Created 'target/release/$APP_ID.flatpak'"
|
||||
@@ -1,93 +0,0 @@
|
||||
import os
|
||||
import re
|
||||
import requests
|
||||
import sys
|
||||
import textwrap
|
||||
|
||||
from html import escape
|
||||
|
||||
def clean_line(line: str, in_code_fence: bool) -> str:
|
||||
line = re.sub(r"\(\[(#\d+)\]\([\w|\d\:|\/|\.|\-|_]*\)\)", lambda match: f"[{match.group(1)}]", line)
|
||||
line = re.sub(r"\[(#\d+)\]\([\w|\d\:|\/|\.|\-|_]*\)", lambda match: f"[{match.group(1)}]", line)
|
||||
if not in_code_fence:
|
||||
line = line.strip()
|
||||
|
||||
return escape(line)
|
||||
|
||||
|
||||
def convert_body(body: str) -> str:
|
||||
formatted = ""
|
||||
|
||||
in_code_fence = False
|
||||
in_list = False
|
||||
for line in body.splitlines():
|
||||
line = clean_line(line, in_code_fence)
|
||||
if not line:
|
||||
continue
|
||||
if re.search(r'\[[\w|\d|:|\/|\.|\-|_]*\]\([\w|\d|:|\/|\.|\-|_]*\)', line):
|
||||
continue
|
||||
line = re.sub(r"(?<!\`)`([^`\n]+)`(?!`)", lambda match: f"<code>{match.group(1)}</code>", line)
|
||||
|
||||
contains_code_fence = bool(re.search(r"```", line))
|
||||
is_list = bool(re.search(r"^-\s*", line))
|
||||
|
||||
if in_list and not is_list:
|
||||
formatted += "</ul>\n"
|
||||
if (not in_code_fence and contains_code_fence) or (not in_list and is_list):
|
||||
formatted += "<ul>\n"
|
||||
in_list = is_list
|
||||
in_code_fence = contains_code_fence != in_code_fence
|
||||
|
||||
if is_list:
|
||||
line = re.sub(r"^-\s*", "", line)
|
||||
line = f" <li>{line}</li>"
|
||||
elif in_code_fence or contains_code_fence:
|
||||
line = f" <li><code> {line}</code></li>"
|
||||
else:
|
||||
line = f"<p>{line}</p>"
|
||||
formatted += f"{line}\n"
|
||||
|
||||
if (not in_code_fence and contains_code_fence):
|
||||
formatted += "</ul>\n"
|
||||
if in_code_fence or in_list:
|
||||
formatted += "</ul>\n"
|
||||
return formatted
|
||||
|
||||
def get_release_info(tag: str):
|
||||
url = f"https://api.github.com/repos/zed-industries/zed/releases/tags/{tag}"
|
||||
response = requests.get(url)
|
||||
if response.status_code == 200:
|
||||
return response.json()
|
||||
else:
|
||||
print(f"Failed to fetch release info for tag '{tag}'. Status code: {response.status_code}")
|
||||
quit()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
os.chdir(sys.path[0])
|
||||
|
||||
if len(sys.argv) != 3:
|
||||
print("Usage: python convert-release-notes.py <tag> <channel>")
|
||||
sys.exit(1)
|
||||
|
||||
tag = sys.argv[1]
|
||||
channel = sys.argv[2]
|
||||
|
||||
release_info = get_release_info(tag)
|
||||
body = convert_body(release_info["body"])
|
||||
version = tag.removeprefix("v").removesuffix("-pre")
|
||||
date = release_info["published_at"]
|
||||
|
||||
release_info_str = f"<release version=\"{version}\" date=\"{date}\">\n"
|
||||
release_info_str += f" <description>\n"
|
||||
release_info_str += textwrap.indent(body, " " * 8)
|
||||
release_info_str += f" </description>\n"
|
||||
release_info_str += f" <url>https://github.com/zed-industries/zed/releases/tag/{tag}</url>\n"
|
||||
release_info_str += "</release>\n"
|
||||
|
||||
channel_releases_file = f"../../crates/zed/resources/flatpak/release-info/{channel}"
|
||||
with open(channel_releases_file) as f:
|
||||
old_release_info = f.read()
|
||||
with open(channel_releases_file, "w") as f:
|
||||
f.write(textwrap.indent(release_info_str, " " * 8) + old_release_info)
|
||||
print(f"Added release notes from {tag} to '{channel_releases_file}'")
|
||||
@@ -1,9 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
flatpak remote-add --if-not-exists --user flathub https://dl.flathub.org/repo/flathub.flatpakrepo
|
||||
|
||||
arch=$(arch)
|
||||
fd_version=23.08
|
||||
flatpak install -y --user org.freedesktop.Platform/${arch}/${fd_version}
|
||||
flatpak install -y --user org.freedesktop.Sdk/${arch}/${fd_version}
|
||||
flatpak install -y --user org.freedesktop.Sdk.Extension.rust-stable/${arch}/${fd_version}
|
||||
@@ -1,35 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -xeuo pipefail
|
||||
|
||||
# if root or if sudo/unavailable, define an empty variable
|
||||
if [ "$(id -u)" -eq 0 ]; then
|
||||
maysudo=''
|
||||
else
|
||||
maysudo="$(command -v sudo || command -v doas || true)"
|
||||
fi
|
||||
|
||||
function finalize {
|
||||
# after packages install (curl, etc), get the rust toolchain
|
||||
which rustup >/dev/null 2>&1 || curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
|
||||
echo "Finished installing FreeBSD dependencies with script/freebsd"
|
||||
}
|
||||
|
||||
# FreeBSD
|
||||
# https://www.freebsd.org/ports/
|
||||
pkg=$(command -v pkg || true)
|
||||
if [[ -n $pkg ]]; then
|
||||
deps=(
|
||||
cmake
|
||||
gcc
|
||||
git
|
||||
llvm
|
||||
protobuf
|
||||
rustup-init
|
||||
libx11
|
||||
alsa-lib
|
||||
)
|
||||
$maysudo "$pkg" install "${deps[@]}"
|
||||
finalize
|
||||
exit 0
|
||||
fi
|
||||
@@ -1,56 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
CARGO_ABOUT_VERSION="0.8.2"
|
||||
OUTPUT_FILE="${1:-$(pwd)/assets/licenses.md}"
|
||||
TEMPLATE_FILE="script/licenses/template.md.hbs"
|
||||
|
||||
fail_on_stderr() {
|
||||
local tmpfile=$(mktemp)
|
||||
"$@" 2> >(tee "$tmpfile" >&2)
|
||||
local rc=$?
|
||||
[ -s "$tmpfile" ] && rc=1
|
||||
rm "$tmpfile"
|
||||
return $rc
|
||||
}
|
||||
|
||||
echo -n "" >"$OUTPUT_FILE"
|
||||
|
||||
{
|
||||
echo -e "# ###### THEME LICENSES ######\n"
|
||||
cat assets/themes/LICENSES
|
||||
|
||||
echo -e "\n# ###### ICON LICENSES ######\n"
|
||||
cat assets/icons/LICENSES
|
||||
|
||||
echo -e "\n# ###### CODE LICENSES ######\n"
|
||||
} >>"$OUTPUT_FILE"
|
||||
|
||||
if ! cargo about --version | grep "cargo-about $CARGO_ABOUT_VERSION" &>/dev/null; then
|
||||
echo "Installing cargo-about@$CARGO_ABOUT_VERSION..."
|
||||
cargo install "cargo-about@$CARGO_ABOUT_VERSION"
|
||||
else
|
||||
echo "cargo-about@$CARGO_ABOUT_VERSION is already installed."
|
||||
fi
|
||||
|
||||
echo "Generating cargo licenses"
|
||||
if [ -z "${ALLOW_MISSING_LICENSES-}" ]; then FAIL_FLAG=--fail; else FAIL_FLAG=""; fi
|
||||
if [ -z "${ALLOW_MISSING_LICENSES-}" ]; then WRAPPER=fail_on_stderr; else WRAPPER=""; fi
|
||||
set -x
|
||||
$WRAPPER cargo about generate \
|
||||
$FAIL_FLAG \
|
||||
-c script/licenses/zed-licenses.toml \
|
||||
"$TEMPLATE_FILE" >>"$OUTPUT_FILE"
|
||||
set +x
|
||||
|
||||
sed -i.bak 's/"/"/g' "$OUTPUT_FILE"
|
||||
sed -i.bak 's/'/'\''/g' "$OUTPUT_FILE" # The ` '\'' ` thing ends the string, appends a single quote, and re-opens the string
|
||||
sed -i.bak 's/=/=/g' "$OUTPUT_FILE"
|
||||
sed -i.bak 's/`/`/g' "$OUTPUT_FILE"
|
||||
sed -i.bak 's/</</g' "$OUTPUT_FILE"
|
||||
sed -i.bak 's/>/>/g' "$OUTPUT_FILE"
|
||||
|
||||
rm -rf "${OUTPUT_FILE}.bak"
|
||||
|
||||
echo "generate-licenses completed. See $OUTPUT_FILE"
|
||||
@@ -1,26 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
CARGO_ABOUT_VERSION="0.8.2"
|
||||
OUTPUT_FILE="${1:-$(pwd)/assets/licenses.csv}"
|
||||
TEMPLATE_FILE="script/licenses/template.csv.hbs"
|
||||
|
||||
if ! cargo about --version | grep "cargo-about $CARGO_ABOUT_VERSION" 2>&1 > /dev/null; then
|
||||
echo "Installing cargo-about@$CARGO_ABOUT_VERSION..."
|
||||
cargo install "cargo-about@$CARGO_ABOUT_VERSION"
|
||||
else
|
||||
echo "cargo-about@$CARGO_ABOUT_VERSION is already installed."
|
||||
fi
|
||||
|
||||
echo "Generating cargo licenses"
|
||||
set -x
|
||||
cargo about generate \
|
||||
--fail \
|
||||
-c script/licenses/zed-licenses.toml \
|
||||
$TEMPLATE_FILE \
|
||||
| awk 'NR==1{print;next} NF{print | "sort"}' \
|
||||
> "$OUTPUT_FILE"
|
||||
set +x
|
||||
|
||||
echo "generate-licenses-csv completed. See $OUTPUT_FILE"
|
||||
@@ -1,44 +0,0 @@
|
||||
$CARGO_ABOUT_VERSION="0.8.2"
|
||||
$outputFile=$args[0] ? $args[0] : "$(Get-Location)/assets/licenses.md"
|
||||
$templateFile="script/licenses/template.md.hbs"
|
||||
|
||||
New-Item -Path "$outputFile" -ItemType File -Value "" -Force
|
||||
|
||||
@(
|
||||
"# ###### THEME LICENSES ######\n"
|
||||
Get-Content assets/themes/LICENSES
|
||||
"\n# ###### ICON LICENSES ######\n"
|
||||
Get-Content assets/icons/LICENSES
|
||||
"\n# ###### CODE LICENSES ######\n"
|
||||
) | Add-Content -Path $outputFile
|
||||
|
||||
$versionOutput = cargo about --version
|
||||
if (-not ($versionOutput -match "cargo-about $CARGO_ABOUT_VERSION")) {
|
||||
Write-Host "Installing cargo-about@$CARGO_ABOUT_VERSION..."
|
||||
cargo install "cargo-about@$CARGO_ABOUT_VERSION"
|
||||
} else {
|
||||
Write-Host "cargo-about@$CARGO_ABOUT_VERSION" is already installed
|
||||
}
|
||||
|
||||
Write-Host "Generating cargo licenses"
|
||||
|
||||
$failFlag = $env:ALLOW_MISSING_LICENSES ? "--fail" : ""
|
||||
$args = @('about', 'generate', $failFlag, '-c', 'script/licenses/zed-licenses.toml', $templateFile, '-o', $outputFile) | Where-Object { $_ }
|
||||
cargo @args
|
||||
|
||||
Write-Host "Applying replacements"
|
||||
$replacements = @{
|
||||
'"' = '"'
|
||||
''' = "'"
|
||||
'=' = '='
|
||||
'`' = '`'
|
||||
'<' = '<'
|
||||
'>' = '>'
|
||||
}
|
||||
$content = Get-Content $outputFile
|
||||
foreach ($find in $replacements.keys) {
|
||||
$content = $content -replace $find, $replacements[$find]
|
||||
}
|
||||
$content | Set-Content $outputFile
|
||||
|
||||
Write-Host "generate-licenses completed. See $outputFile"
|
||||
@@ -1,10 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
if ! command -v pandoc &> /dev/null
|
||||
then
|
||||
brew install pandoc # Install pandoc using Homebrew
|
||||
fi
|
||||
|
||||
pandoc ./legal/terms.md -f markdown-smart -t rtf -o ./script/terms/terms.rtf --standalone
|
||||
@@ -1,67 +0,0 @@
|
||||
#!/usr/bin/env node --redirect-warnings=/dev/null
|
||||
|
||||
const { execFileSync } = require("child_process");
|
||||
let { GITHUB_ACCESS_TOKEN } = process.env;
|
||||
const PR_REGEX = /#\d+/; // Ex: matches on #4241
|
||||
const FIXES_REGEX = /(fixes|closes|completes) (.+[/#]\d+.*)$/im;
|
||||
|
||||
main();
|
||||
|
||||
async function main() {
|
||||
if (!GITHUB_ACCESS_TOKEN) {
|
||||
try {
|
||||
GITHUB_ACCESS_TOKEN = execFileSync("gh", ["auth", "token"]).toString();
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
console.log("No GITHUB_ACCESS_TOKEN, and no `gh auth token`");
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Use form of: YYYY-MM-DD - 2023-01-09
|
||||
const startDate = new Date(process.argv[2]);
|
||||
const today = new Date();
|
||||
|
||||
console.log(`Pull requests from ${startDate} to ${today}\n`);
|
||||
|
||||
let pullRequestNumbers = getPullRequestNumbers(startDate, today);
|
||||
|
||||
// Fetch the pull requests from the GitHub API.
|
||||
console.log("Merged pull requests:");
|
||||
for (const pullRequestNumber of pullRequestNumbers) {
|
||||
const webURL = `https://github.com/zed-industries/zed/pull/${pullRequestNumber}`;
|
||||
const apiURL = `https://api.github.com/repos/zed-industries/zed/pulls/${pullRequestNumber}`;
|
||||
|
||||
const response = await fetch(apiURL, {
|
||||
headers: {
|
||||
Authorization: `token ${GITHUB_ACCESS_TOKEN}`,
|
||||
},
|
||||
});
|
||||
|
||||
const pullRequest = await response.json();
|
||||
console.log("*", pullRequest.title);
|
||||
console.log(" PR URL: ", webURL);
|
||||
console.log(" Merged: ", pullRequest.merged_at);
|
||||
console.log();
|
||||
}
|
||||
}
|
||||
|
||||
function getPullRequestNumbers(startDate, endDate) {
|
||||
const sinceDate = startDate.toISOString();
|
||||
const untilDate = endDate.toISOString();
|
||||
|
||||
const pullRequestNumbers = execFileSync(
|
||||
"git",
|
||||
["log", `--since=${sinceDate}`, `--until=${untilDate}`, "--oneline"],
|
||||
{ encoding: "utf8" },
|
||||
)
|
||||
.split("\n")
|
||||
.filter((line) => line.length > 0)
|
||||
.map((line) => {
|
||||
const match = line.match(/#(\d+)/);
|
||||
return match ? match[1] : null;
|
||||
})
|
||||
.filter((line) => line);
|
||||
|
||||
return pullRequestNumbers;
|
||||
}
|
||||
@@ -1,125 +0,0 @@
|
||||
#!/usr/bin/env node --redirect-warnings=/dev/null
|
||||
|
||||
const { execFileSync } = require("child_process");
|
||||
const { GITHUB_ACCESS_TOKEN } = process.env;
|
||||
|
||||
main();
|
||||
|
||||
async function main() {
|
||||
const startDate = new Date(process.argv[2]);
|
||||
const today = new Date();
|
||||
|
||||
console.log(`Release notes from ${startDate} to ${today}\n`);
|
||||
|
||||
const releases = await getReleases(startDate, today);
|
||||
const previewReleases = releases.filter((release) =>
|
||||
release.tagName.includes("-pre"),
|
||||
);
|
||||
|
||||
const stableReleases = releases.filter(
|
||||
(release) => !release.tagName.includes("-pre"),
|
||||
);
|
||||
|
||||
// Filter out all preview release, as all of those changes have made it to the stable release, except for the latest preview release
|
||||
const aggregatedReleases = stableReleases
|
||||
.concat(previewReleases[0])
|
||||
.reverse();
|
||||
|
||||
const aggregatedReleaseTitles = aggregatedReleases
|
||||
.map((release) => release.name)
|
||||
.join(", ");
|
||||
|
||||
console.log();
|
||||
console.log(`Release titles: ${aggregatedReleaseTitles}`);
|
||||
|
||||
console.log("Release notes:");
|
||||
console.log();
|
||||
|
||||
for (const release of aggregatedReleases) {
|
||||
const publishedDate = release.publishedAt.split("T")[0];
|
||||
console.log(`${release.name}: ${publishedDate}`);
|
||||
console.log();
|
||||
console.log(release.description);
|
||||
console.log();
|
||||
}
|
||||
}
|
||||
|
||||
async function getReleases(startDate, endDate) {
|
||||
const query = `
|
||||
query ($owner: String!, $repo: String!, $cursor: String) {
|
||||
repository(owner: $owner, name: $repo) {
|
||||
releases(first: 100, orderBy: {field: CREATED_AT, direction: DESC}, after: $cursor) {
|
||||
nodes {
|
||||
tagName
|
||||
name
|
||||
createdAt
|
||||
publishedAt
|
||||
description
|
||||
url
|
||||
author {
|
||||
login
|
||||
}
|
||||
}
|
||||
pageInfo {
|
||||
hasNextPage
|
||||
endCursor
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
let allReleases = [];
|
||||
let hasNextPage = true;
|
||||
let cursor = null;
|
||||
|
||||
while (hasNextPage) {
|
||||
const response = await fetch("https://api.github.com/graphql", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
Authorization: `Bearer ${GITHUB_ACCESS_TOKEN}`,
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({
|
||||
query,
|
||||
variables: { owner: "zed-industries", repo: "zed", cursor },
|
||||
}),
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`HTTP error! status: ${response.status}`);
|
||||
}
|
||||
|
||||
const data = await response.json();
|
||||
|
||||
if (data.errors) {
|
||||
throw new Error(`GraphQL error: ${JSON.stringify(data.errors)}`);
|
||||
}
|
||||
|
||||
if (!data.data || !data.data.repository || !data.data.repository.releases) {
|
||||
throw new Error(`Unexpected response structure: ${JSON.stringify(data)}`);
|
||||
}
|
||||
|
||||
const releases = data.data.repository.releases.nodes;
|
||||
allReleases = allReleases.concat(releases);
|
||||
|
||||
hasNextPage = data.data.repository.releases.pageInfo.hasNextPage;
|
||||
cursor = data.data.repository.releases.pageInfo.endCursor;
|
||||
|
||||
lastReleaseOnPage = releases[releases.length - 1];
|
||||
|
||||
if (
|
||||
releases.length > 0 &&
|
||||
new Date(lastReleaseOnPage.createdAt) < startDate
|
||||
) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const filteredReleases = allReleases.filter((release) => {
|
||||
const releaseDate = new Date(release.createdAt);
|
||||
return releaseDate >= startDate && releaseDate <= endDate;
|
||||
});
|
||||
|
||||
return filteredReleases;
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
channel="$1"
|
||||
|
||||
query=""
|
||||
case $channel in
|
||||
stable)
|
||||
;;
|
||||
preview)
|
||||
query="&preview=1"
|
||||
;;
|
||||
nightly)
|
||||
query="&nightly=1"
|
||||
;;
|
||||
*)
|
||||
echo "this must be run on either of stable|preview|nightly release branches" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
curl -s "https://cloud.zed.dev/releases/$channel/latest/asset?asset=zed&os=macos&arch=aarch64" | jq -r .version
|
||||
@@ -1,105 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Replace 'bug/feature/crash' labels with 'Bug/Feature/Crash' types on open
|
||||
GitHub issues.
|
||||
|
||||
Requires `requests` library and a GitHub access token with "Issues (write)"
|
||||
permission passed as an environment variable.
|
||||
Was used as a quick-and-dirty one-off-bulk-operation script to clean up issue
|
||||
types in the `zed` repository. Leaving it here for reference only; there's no
|
||||
error handling, you've been warned.
|
||||
"""
|
||||
|
||||
|
||||
import logging
|
||||
import os
|
||||
|
||||
import requests
|
||||
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
GITHUB_API_BASE_URL = "https://api.github.com"
|
||||
REPO_OWNER = "zed-industries"
|
||||
REPO_NAME = "zed"
|
||||
GITHUB_TOKEN = os.getenv("GITHUB_TOKEN")
|
||||
HEADERS = {
|
||||
"Authorization": f"token {GITHUB_TOKEN}",
|
||||
"Accept": "application/vnd.github+json"
|
||||
}
|
||||
LABELS_TO_TYPES = {
|
||||
'bug': 'Bug',
|
||||
'feature': 'Feature',
|
||||
'crash': 'Crash',
|
||||
}
|
||||
|
||||
|
||||
def get_open_issues_without_type(repo):
|
||||
"""Get open issues without type via GitHub's REST API."""
|
||||
issues = []
|
||||
issues_url = f"{GITHUB_API_BASE_URL}/repos/{REPO_OWNER}/{repo}/issues"
|
||||
|
||||
log.info("Start fetching issues from the GitHub API.")
|
||||
params = {
|
||||
"state": "open",
|
||||
"type": "none",
|
||||
"page": 1,
|
||||
"per_page": 100, # worked fine despite the docs saying 30
|
||||
}
|
||||
while True:
|
||||
response = requests.get(issues_url, headers=HEADERS, params=params)
|
||||
response.raise_for_status()
|
||||
issues.extend(response.json())
|
||||
log.info(f"Fetched the next page, total issues so far: {len(issues)}.")
|
||||
|
||||
# is there a next page?
|
||||
link_header = response.headers.get('Link', '')
|
||||
if 'rel="next"' not in link_header:
|
||||
break
|
||||
params['page'] += 1
|
||||
|
||||
log.info("Done fetching issues.")
|
||||
return issues
|
||||
|
||||
|
||||
def replace_labels_with_types(issues, labels_to_types):
|
||||
"""Replace labels with types, a new attribute of issues.
|
||||
|
||||
Only changes the issues with one type-sounding label, leaving those with
|
||||
two labels (e.g. `bug` *and* `crash`) alone, logging a warning.
|
||||
"""
|
||||
for issue in issues:
|
||||
log.debug(f"Processing issue {issue['number']}.")
|
||||
# for GitHub, all PRs are issues but not all issues are PRs; skip PRs
|
||||
if 'pull_request' in issue:
|
||||
continue
|
||||
issue_labels = (label['name'] for label in issue['labels'])
|
||||
matching_labels = labels_to_types.keys() & set(issue_labels)
|
||||
if len(matching_labels) != 1:
|
||||
log.warning(
|
||||
f"Issue {issue['url']} has either no or multiple type-sounding "
|
||||
"labels, won't be processed.")
|
||||
continue
|
||||
label_to_replace = matching_labels.pop()
|
||||
issue_type = labels_to_types[label_to_replace]
|
||||
log.debug(
|
||||
f"Replacing label {label_to_replace} with type {issue_type} "
|
||||
f"for issue {issue['title']}.")
|
||||
|
||||
# add the type
|
||||
api_url_issue = f"{GITHUB_API_BASE_URL}/repos/{REPO_OWNER}/{REPO_NAME}/issues/{issue['number']}"
|
||||
add_type_response = requests.patch(
|
||||
api_url_issue, headers=HEADERS, json={"type": issue_type})
|
||||
add_type_response.raise_for_status()
|
||||
log.debug(f"Added type {issue_type} to issue {issue['title']}.")
|
||||
|
||||
# delete the label
|
||||
api_url_delete_label = f"{GITHUB_API_BASE_URL}/repos/{REPO_OWNER}/{REPO_NAME}/issues/{issue['number']}/labels/{label_to_replace}"
|
||||
delete_response = requests.delete(api_url_delete_label, headers=HEADERS)
|
||||
delete_response.raise_for_status()
|
||||
log.info(
|
||||
f"Deleted label {label_to_replace} from issue {issue['title']}.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
open_issues_without_type = get_open_issues_without_type(REPO_NAME)
|
||||
replace_labels_with_types(open_issues_without_type, LABELS_TO_TYPES)
|
||||
@@ -1,93 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Add `state:needs triage` label to open GitHub issues of types Bug and Crash
|
||||
if they're missing area, priority, or frequency labels. Don't touch issues
|
||||
with an assignee or another `state:` label.
|
||||
|
||||
Requires `requests` library and a GitHub access token with "Issues (write)"
|
||||
permission passed as an environment variable. Was used as a quick-and-dirty
|
||||
one-off-bulk-operation script to surface older untriaged issues in the `zed`
|
||||
repository. Leaving it here for reference only; there's no error handling or
|
||||
guardrails, you've been warned.
|
||||
"""
|
||||
|
||||
import itertools
|
||||
import logging
|
||||
import os
|
||||
|
||||
import requests
|
||||
|
||||
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
GITHUB_API_BASE_URL = "https://api.github.com"
|
||||
REPO_OWNER = "zed-industries"
|
||||
REPO_NAME = "zed"
|
||||
GITHUB_TOKEN = os.getenv("GITHUB_TOKEN")
|
||||
HEADERS = {
|
||||
"Authorization": f"token {GITHUB_TOKEN}",
|
||||
"Accept": "application/vnd.github+json"
|
||||
}
|
||||
REQUIRED_LABELS_PREFIXES = ["area:", "priority:", "frequency:"]
|
||||
NEEDS_TRIAGE_LABEL = "state:needs triage"
|
||||
|
||||
|
||||
def get_open_issues(repo, issue_type):
|
||||
"""Get open issues of certain type(s) via GitHub's REST API."""
|
||||
issues = []
|
||||
issues_url = f"{GITHUB_API_BASE_URL}/repos/{REPO_OWNER}/{repo}/issues"
|
||||
|
||||
log.info("Start fetching open issues from the GitHub API.")
|
||||
params = {
|
||||
"state": "open",
|
||||
"type": issue_type,
|
||||
"page": 1,
|
||||
"per_page": 100, # worked fine despite the docs saying 30
|
||||
}
|
||||
while True:
|
||||
response = requests.get(issues_url, headers=HEADERS, params=params)
|
||||
response.raise_for_status()
|
||||
issues.extend(response.json())
|
||||
log.info(f"Fetched the next page, total issues so far: {len(issues)}.")
|
||||
|
||||
# is there a next page?
|
||||
link_header = response.headers.get('Link', '')
|
||||
if 'rel="next"' not in link_header:
|
||||
break
|
||||
params['page'] += 1
|
||||
|
||||
log.info("Done fetching issues.")
|
||||
return issues
|
||||
|
||||
|
||||
def is_untriaged(issue):
|
||||
issue_labels = [label['name'] for label in issue['labels']]
|
||||
# don't want to overwrite existing state labels
|
||||
no_state_label = not any(label.startswith('state:') for label in issue_labels)
|
||||
# we want at least one label for each of the required prefixes
|
||||
has_all_required_labels = all(
|
||||
any(label.startswith(prefix) for label in issue_labels)
|
||||
for prefix in REQUIRED_LABELS_PREFIXES
|
||||
)
|
||||
# let's also assume if we managed to assign an issue it's triaged enough
|
||||
no_assignee = not issue['assignee']
|
||||
return no_state_label and no_assignee and not has_all_required_labels
|
||||
|
||||
|
||||
def label_issues(issues, label):
|
||||
for issue in issues:
|
||||
log.debug(f"Processing issue {issue['number']}.")
|
||||
api_url_add_label = f"{GITHUB_API_BASE_URL}/repos/{REPO_OWNER}/{REPO_NAME}/issues/{issue['number']}/labels"
|
||||
add_response = requests.post(
|
||||
api_url_add_label, headers=HEADERS, json={"labels": [label]}
|
||||
)
|
||||
add_response.raise_for_status()
|
||||
log.info(f"Added label '{label}' to issue {issue['title']}.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
open_bugs = get_open_issues(REPO_NAME, "Bug")
|
||||
open_crashes = get_open_issues(REPO_NAME, "Crash")
|
||||
untriaged_issues = filter(
|
||||
is_untriaged, itertools.chain(open_bugs, open_crashes))
|
||||
label_issues(untriaged_issues, label=NEEDS_TRIAGE_LABEL)
|
||||
@@ -1,210 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
GitHub PR Analyzer for zed-industries/zed repository
|
||||
Downloads all PRs and groups them by first assignee with status, open date, and last updated date.
|
||||
"""
|
||||
|
||||
import urllib.request
|
||||
import urllib.parse
|
||||
import urllib.error
|
||||
import json
|
||||
from datetime import datetime
|
||||
from collections import defaultdict
|
||||
import sys
|
||||
import os
|
||||
|
||||
# GitHub API configuration
|
||||
GITHUB_API_BASE = "https://api.github.com"
|
||||
REPO_OWNER = "zed-industries"
|
||||
REPO_NAME = "zed"
|
||||
GITHUB_TOKEN = os.getenv("GITHUB_TOKEN")
|
||||
|
||||
def make_github_request(url, params=None):
|
||||
"""Make a request to GitHub API with proper headers and pagination support."""
|
||||
if params:
|
||||
url_parts = list(urllib.parse.urlparse(url))
|
||||
query = dict(urllib.parse.parse_qsl(url_parts[4]))
|
||||
query.update(params)
|
||||
url_parts[4] = urllib.parse.urlencode(query)
|
||||
url = urllib.parse.urlunparse(url_parts)
|
||||
|
||||
req = urllib.request.Request(url)
|
||||
req.add_header("Accept", "application/vnd.github.v3+json")
|
||||
req.add_header("User-Agent", "GitHub-PR-Analyzer")
|
||||
|
||||
if GITHUB_TOKEN:
|
||||
req.add_header("Authorization", f"token {GITHUB_TOKEN}")
|
||||
|
||||
try:
|
||||
response = urllib.request.urlopen(req)
|
||||
return response
|
||||
except urllib.error.URLError as e:
|
||||
print(f"Error making request to {url}: {e}")
|
||||
return None
|
||||
except urllib.error.HTTPError as e:
|
||||
print(f"HTTP error {e.code} for {url}: {e.reason}")
|
||||
return None
|
||||
|
||||
def fetch_all_prs():
|
||||
"""Fetch all PRs from the repository using pagination."""
|
||||
prs = []
|
||||
page = 1
|
||||
per_page = 100
|
||||
|
||||
print("Fetching PRs from GitHub API...")
|
||||
|
||||
while True:
|
||||
url = f"{GITHUB_API_BASE}/repos/{REPO_OWNER}/{REPO_NAME}/pulls"
|
||||
params = {
|
||||
"state": "open",
|
||||
"sort": "updated",
|
||||
"direction": "desc",
|
||||
"per_page": per_page,
|
||||
"page": page
|
||||
}
|
||||
|
||||
response = make_github_request(url, params)
|
||||
if not response:
|
||||
break
|
||||
|
||||
try:
|
||||
data = response.read().decode('utf-8')
|
||||
page_prs = json.loads(data)
|
||||
except (json.JSONDecodeError, UnicodeDecodeError) as e:
|
||||
print(f"Error parsing response: {e}")
|
||||
break
|
||||
|
||||
if not page_prs:
|
||||
break
|
||||
|
||||
prs.extend(page_prs)
|
||||
print(f"Fetched page {page}: {len(page_prs)} PRs (Total: {len(prs)})")
|
||||
|
||||
# Check if we have more pages
|
||||
link_header = response.getheader('Link', '')
|
||||
if 'rel="next"' not in link_header:
|
||||
break
|
||||
|
||||
page += 1
|
||||
|
||||
print(f"Total PRs fetched: {len(prs)}")
|
||||
return prs
|
||||
|
||||
def format_date_as_days_ago(date_string):
|
||||
"""Format ISO date string as 'X days ago'."""
|
||||
if not date_string:
|
||||
return "N/A days ago"
|
||||
|
||||
try:
|
||||
dt = datetime.fromisoformat(date_string.replace('Z', '+00:00'))
|
||||
now = datetime.now(dt.tzinfo)
|
||||
days_diff = (now - dt).days
|
||||
|
||||
if days_diff == 0:
|
||||
return "today"
|
||||
elif days_diff == 1:
|
||||
return "1 day ago"
|
||||
else:
|
||||
return f"{days_diff} days ago"
|
||||
except:
|
||||
return "N/A days ago"
|
||||
|
||||
def get_first_assignee(pr):
|
||||
"""Get the first assignee from a PR, or return 'Unassigned' if none."""
|
||||
assignees = pr.get('assignees', [])
|
||||
if assignees:
|
||||
return assignees[0].get('login', 'Unknown')
|
||||
return 'Unassigned'
|
||||
|
||||
def get_pr_status(pr):
|
||||
"""Determine if PR is draft or ready for review."""
|
||||
if pr.get('draft', False):
|
||||
return "Draft"
|
||||
return "Ready"
|
||||
|
||||
def analyze_prs(prs):
|
||||
"""Group PRs by first assignee and organize the data."""
|
||||
grouped_prs = defaultdict(list)
|
||||
|
||||
for pr in prs:
|
||||
assignee = get_first_assignee(pr)
|
||||
|
||||
pr_info = {
|
||||
'number': pr['number'],
|
||||
'title': pr['title'],
|
||||
'status': get_pr_status(pr),
|
||||
'state': pr['state'],
|
||||
'created_at': format_date_as_days_ago(pr['created_at']),
|
||||
'updated_at': format_date_as_days_ago(pr['updated_at']),
|
||||
'updated_at_raw': pr['updated_at'],
|
||||
'url': pr['html_url'],
|
||||
'author': pr['user']['login']
|
||||
}
|
||||
|
||||
grouped_prs[assignee].append(pr_info)
|
||||
|
||||
# Sort PRs within each group by update date (newest first)
|
||||
for assignee in grouped_prs:
|
||||
grouped_prs[assignee].sort(key=lambda x: x['updated_at_raw'], reverse=True)
|
||||
|
||||
return dict(grouped_prs)
|
||||
|
||||
def print_pr_report(grouped_prs):
|
||||
"""Print formatted report of PRs grouped by assignee."""
|
||||
print(f"OPEN PR REPORT FOR {REPO_OWNER}/{REPO_NAME}")
|
||||
print()
|
||||
|
||||
# Sort assignees alphabetically, but put 'Unassigned' last
|
||||
assignees = sorted(grouped_prs.keys())
|
||||
if 'Unassigned' in assignees:
|
||||
assignees.remove('Unassigned')
|
||||
assignees.append('Unassigned')
|
||||
|
||||
total_prs = sum(len(prs) for prs in grouped_prs.values())
|
||||
print(f"Total Open PRs: {total_prs}")
|
||||
print()
|
||||
|
||||
for assignee in assignees:
|
||||
prs = grouped_prs[assignee]
|
||||
assignee_display = f"@{assignee}" if assignee != 'Unassigned' else assignee
|
||||
print(f"assigned to {assignee_display} ({len(prs)} PRs):")
|
||||
|
||||
for pr in prs:
|
||||
print(f"- {pr['author']}: [{pr['title']}]({pr['url']}) opened:{pr['created_at']} updated:{pr['updated_at']}")
|
||||
|
||||
print()
|
||||
|
||||
def save_json_report(grouped_prs, filename="pr_report.json"):
|
||||
"""Save the PR data to a JSON file."""
|
||||
try:
|
||||
with open(filename, 'w') as f:
|
||||
json.dump(grouped_prs, f, indent=2)
|
||||
print(f"📄 Report saved to {filename}")
|
||||
except Exception as e:
|
||||
print(f"Error saving JSON report: {e}")
|
||||
|
||||
def main():
|
||||
"""Main function to orchestrate the PR analysis."""
|
||||
print("GitHub PR Analyzer")
|
||||
print("==================")
|
||||
|
||||
if not GITHUB_TOKEN:
|
||||
print("⚠️ Warning: GITHUB_TOKEN not set. You may hit rate limits.")
|
||||
print(" Set GITHUB_TOKEN environment variable for authenticated requests.")
|
||||
print()
|
||||
|
||||
# Fetch all PRs
|
||||
prs = fetch_all_prs()
|
||||
|
||||
if not prs:
|
||||
print("❌ Failed to fetch PRs. Please check your connection and try again.")
|
||||
sys.exit(1)
|
||||
|
||||
# Analyze and group PRs
|
||||
grouped_prs = analyze_prs(prs)
|
||||
|
||||
# Print report
|
||||
print_pr_report(grouped_prs)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,3 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
cargo run -p theme_importer -- "$@"
|
||||
@@ -1,154 +0,0 @@
|
||||
#!/usr/bin/env sh
|
||||
set -eu
|
||||
|
||||
# Downloads the latest tarball from https://zed.dev/releases and unpacks it
|
||||
# into ~/.local/. If you'd prefer to do this manually, instructions are at
|
||||
# https://zed.dev/docs/linux.
|
||||
|
||||
main() {
|
||||
platform="$(uname -s)"
|
||||
arch="$(uname -m)"
|
||||
channel="${ZED_CHANNEL:-stable}"
|
||||
# Use TMPDIR if available (for environments with non-standard temp directories)
|
||||
if [ -n "${TMPDIR:-}" ] && [ -d "${TMPDIR}" ]; then
|
||||
temp="$(mktemp -d "$TMPDIR/zed-XXXXXX")"
|
||||
else
|
||||
temp="$(mktemp -d "/tmp/zed-XXXXXX")"
|
||||
fi
|
||||
|
||||
if [ "$platform" = "Darwin" ]; then
|
||||
platform="macos"
|
||||
elif [ "$platform" = "Linux" ]; then
|
||||
platform="linux"
|
||||
else
|
||||
echo "Unsupported platform $platform"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
case "$platform-$arch" in
|
||||
macos-arm64* | linux-arm64* | linux-armhf | linux-aarch64)
|
||||
arch="aarch64"
|
||||
;;
|
||||
macos-x86* | linux-x86* | linux-i686*)
|
||||
arch="x86_64"
|
||||
;;
|
||||
*)
|
||||
echo "Unsupported platform or architecture"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
if command -v curl >/dev/null 2>&1; then
|
||||
curl () {
|
||||
command curl -fL "$@"
|
||||
}
|
||||
elif command -v wget >/dev/null 2>&1; then
|
||||
curl () {
|
||||
wget -O- "$@"
|
||||
}
|
||||
else
|
||||
echo "Could not find 'curl' or 'wget' in your path"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
"$platform" "$@"
|
||||
|
||||
if [ "$(command -v zed)" = "$HOME/.local/bin/zed" ]; then
|
||||
echo "Zed has been installed. Run with 'zed'"
|
||||
else
|
||||
echo "To run Zed from your terminal, you must add ~/.local/bin to your PATH"
|
||||
echo "Run:"
|
||||
|
||||
case "$SHELL" in
|
||||
*zsh)
|
||||
echo " echo 'export PATH=\$HOME/.local/bin:\$PATH' >> ~/.zshrc"
|
||||
echo " source ~/.zshrc"
|
||||
;;
|
||||
*fish)
|
||||
echo " fish_add_path -U $HOME/.local/bin"
|
||||
;;
|
||||
*)
|
||||
echo " echo 'export PATH=\$HOME/.local/bin:\$PATH' >> ~/.bashrc"
|
||||
echo " source ~/.bashrc"
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "To run Zed now, '~/.local/bin/zed'"
|
||||
fi
|
||||
}
|
||||
|
||||
linux() {
|
||||
if [ -n "${ZED_BUNDLE_PATH:-}" ]; then
|
||||
cp "$ZED_BUNDLE_PATH" "$temp/zed-linux-$arch.tar.gz"
|
||||
else
|
||||
echo "Downloading Zed"
|
||||
curl "https://cloud.zed.dev/releases/$channel/latest/download?asset=zed&arch=$arch&os=linux&source=install.sh" > "$temp/zed-linux-$arch.tar.gz"
|
||||
fi
|
||||
|
||||
suffix=""
|
||||
if [ "$channel" != "stable" ]; then
|
||||
suffix="-$channel"
|
||||
fi
|
||||
|
||||
appid=""
|
||||
case "$channel" in
|
||||
stable)
|
||||
appid="dev.zed.Zed"
|
||||
;;
|
||||
nightly)
|
||||
appid="dev.zed.Zed-Nightly"
|
||||
;;
|
||||
preview)
|
||||
appid="dev.zed.Zed-Preview"
|
||||
;;
|
||||
dev)
|
||||
appid="dev.zed.Zed-Dev"
|
||||
;;
|
||||
*)
|
||||
echo "Unknown release channel: ${channel}. Using stable app ID."
|
||||
appid="dev.zed.Zed"
|
||||
;;
|
||||
esac
|
||||
|
||||
# Unpack
|
||||
rm -rf "$HOME/.local/zed$suffix.app"
|
||||
mkdir -p "$HOME/.local/zed$suffix.app"
|
||||
tar -xzf "$temp/zed-linux-$arch.tar.gz" -C "$HOME/.local/"
|
||||
|
||||
# Setup ~/.local directories
|
||||
mkdir -p "$HOME/.local/bin" "$HOME/.local/share/applications"
|
||||
|
||||
# Link the binary
|
||||
if [ -f "$HOME/.local/zed$suffix.app/bin/zed" ]; then
|
||||
ln -sf "$HOME/.local/zed$suffix.app/bin/zed" "$HOME/.local/bin/zed"
|
||||
else
|
||||
# support for versions before 0.139.x.
|
||||
ln -sf "$HOME/.local/zed$suffix.app/bin/cli" "$HOME/.local/bin/zed"
|
||||
fi
|
||||
|
||||
# Copy .desktop file
|
||||
desktop_file_path="$HOME/.local/share/applications/${appid}.desktop"
|
||||
cp "$HOME/.local/zed$suffix.app/share/applications/zed$suffix.desktop" "${desktop_file_path}"
|
||||
sed -i "s|Icon=zed|Icon=$HOME/.local/zed$suffix.app/share/icons/hicolor/512x512/apps/zed.png|g" "${desktop_file_path}"
|
||||
sed -i "s|Exec=zed|Exec=$HOME/.local/zed$suffix.app/bin/zed|g" "${desktop_file_path}"
|
||||
}
|
||||
|
||||
macos() {
|
||||
echo "Downloading Zed"
|
||||
curl "https://cloud.zed.dev/releases/$channel/latest/download?asset=zed&os=macos&arch=$arch&source=install.sh" > "$temp/Zed-$arch.dmg"
|
||||
hdiutil attach -quiet "$temp/Zed-$arch.dmg" -mountpoint "$temp/mount"
|
||||
app="$(cd "$temp/mount/"; echo *.app)"
|
||||
echo "Installing $app"
|
||||
if [ -d "/Applications/$app" ]; then
|
||||
echo "Removing existing $app"
|
||||
rm -rf "/Applications/$app"
|
||||
fi
|
||||
ditto "$temp/mount/$app" "/Applications/$app"
|
||||
hdiutil detach -quiet "$temp/mount"
|
||||
|
||||
mkdir -p "$HOME/.local/bin"
|
||||
# Link the binary
|
||||
ln -sf "/Applications/$app/Contents/MacOS/cli" "$HOME/.local/bin/zed"
|
||||
}
|
||||
|
||||
main "$@"
|
||||
@@ -1,11 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
if [[ $# -ne 1 ]]; then
|
||||
echo "Usage: $0 [production|staging|...]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
export ZED_KUBE_NAMESPACE=$1
|
||||
|
||||
pod=$(kubectl --namespace=${ZED_KUBE_NAMESPACE} get pods --selector=app=zed --output=jsonpath='{.items[*].metadata.name}')
|
||||
exec kubectl --namespace $ZED_KUBE_NAMESPACE exec --tty --stdin $pod -- /bin/bash
|
||||
@@ -1,29 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euox pipefail
|
||||
|
||||
if [ "$#" -lt 1 ]; then
|
||||
echo "Usage: $0 <language> [version]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
LANGUAGE=$1
|
||||
VERSION=${2:-}
|
||||
|
||||
EXTENSION_DIR="extensions/$LANGUAGE"
|
||||
EXTENSION_TOML="$EXTENSION_DIR/extension.toml"
|
||||
CARGO_TOML="$EXTENSION_DIR/Cargo.toml"
|
||||
|
||||
if [ ! -d "$EXTENSION_DIR" ]; then
|
||||
echo "Directory $EXTENSION_DIR does not exist."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$VERSION" ]; then
|
||||
grep -m 1 'version =' "$EXTENSION_TOML" | awk -F\" '{print $2}'
|
||||
exit 0
|
||||
fi
|
||||
|
||||
sed -i '' -e "s/^version = \".*\"/version = \"$VERSION\"/" "$EXTENSION_TOML"
|
||||
sed -i '' -e "s/^version = \".*\"/version = \"$VERSION\"/" "$CARGO_TOML"
|
||||
cargo update --workspace
|
||||
@@ -1,6 +0,0 @@
|
||||
Crate Name,Crate Version,License,Url
|
||||
{{#each licenses}}
|
||||
{{#each used_by}}
|
||||
{{crate.name}},{{crate.version}},{{../name}},{{#if crate.repository}}{{crate.repository}}{{else}}https://crates.io/crates/{{crate.name}}{{/if}}
|
||||
{{/each}}
|
||||
{{/each}}
|
||||
@@ -1,51 +0,0 @@
|
||||
## Overview of licenses:
|
||||
|
||||
{{#each overview}}
|
||||
* {{name}} ({{count}})
|
||||
{{/each}}
|
||||
|
||||
### All license texts:
|
||||
{{#each licenses}}
|
||||
|
||||
#### {{name}}
|
||||
|
||||
##### Used by:
|
||||
|
||||
{{#each used_by}}
|
||||
* [{{crate.name}} {{crate.version}}]({{#if crate.repository}} {{crate.repository}} {{else}} https://crates.io/crates/{{crate.name}} {{/if}})
|
||||
{{/each}}
|
||||
|
||||
{{text}}
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
{{/each}}
|
||||
|
||||
#### MIT License
|
||||
|
||||
##### Used by:
|
||||
|
||||
* [Windows Terminal]( https://github.com/microsoft/terminal )
|
||||
|
||||
Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
|
||||
MIT License
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
@@ -1,47 +0,0 @@
|
||||
no-clearly-defined = true
|
||||
private = { ignore = true }
|
||||
# Licenses allowed in Zed's dependencies. AGPL should not be added to
|
||||
# this list as use of AGPL software is sometimes disallowed. When
|
||||
# adding to this list, please check the following open source license
|
||||
# policies:
|
||||
#
|
||||
# * https://opensource.google/documentation/reference/thirdparty/licenses
|
||||
#
|
||||
# The Zed project does have AGPL crates, but these are only involved
|
||||
# in servers and are not built into the binaries in the release
|
||||
# tarball. `script/check-licenses` checks that AGPL crates are not
|
||||
# involved in release binaries.
|
||||
accepted = [
|
||||
"Apache-2.0",
|
||||
"MIT",
|
||||
"MIT-0",
|
||||
"Apache-2.0 WITH LLVM-exception",
|
||||
"MPL-2.0",
|
||||
"BSD-3-Clause",
|
||||
"BSD-2-Clause",
|
||||
"ISC",
|
||||
"CC0-1.0",
|
||||
"NCSA",
|
||||
"Unicode-3.0",
|
||||
"OpenSSL",
|
||||
"Zlib",
|
||||
"BSL-1.0",
|
||||
]
|
||||
|
||||
[procinfo.clarify]
|
||||
license = "MIT"
|
||||
[[procinfo.clarify.files]]
|
||||
path = 'LICENSE.md'
|
||||
checksum = '37db33bbbd7348969eda397b89a16f252d56c1ca7481b6ccaf56ccdcbab5dcca'
|
||||
|
||||
[webpki.clarify]
|
||||
license = "ISC" # It actually says 'ISC-style' but I don't know the SPDX expression for that.
|
||||
[[webpki.clarify.files]]
|
||||
path = 'LICENSE'
|
||||
checksum = '5b698ca13897be3afdb7174256fa1574f8c6892b8bea1a66dd6469d3fe27885a'
|
||||
|
||||
[fuchsia-cprng.clarify]
|
||||
license = "BSD-3-Clause"
|
||||
[[fuchsia-cprng.clarify.files]]
|
||||
path = 'LICENSE'
|
||||
checksum = '03b114f53e6587a398931762ee11e2395bfdba252a329940e2c8c9e81813845b'
|
||||
@@ -1,30 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
if command -v docker >/dev/null 2>&1; then
|
||||
ENGINE="docker"
|
||||
elif command -v podman >/dev/null 2>&1; then
|
||||
ENGINE="podman"
|
||||
else
|
||||
echo "Neither Docker nor Podman found. Please install one of them."
|
||||
exit 1
|
||||
fi
|
||||
if [ ! -d ~/.mitmproxy ]; then
|
||||
mkdir -p ~/.mitmproxy
|
||||
fi
|
||||
|
||||
CONTAINER_ID="$(${ENGINE} run -d --rm -it -v ~/.mitmproxy:/home/mitmproxy/.mitmproxy -p 9876:8080 mitmproxy/mitmproxy mitmdump)"
|
||||
|
||||
trap "${ENGINE} stop \"$CONTAINER_ID\" 1> /dev/null || true; exit 1" SIGINT
|
||||
|
||||
echo "Add the root certificate created in ~/.mitmproxy to your certificate chain for HTTP"
|
||||
echo "on macOS:"
|
||||
echo "sudo security add-trusted-cert -d -p ssl -p basic -k /Library/Keychains/System.keychain ~/.mitmproxy/mitmproxy-ca-cert.pem"
|
||||
echo "Press enter to continue"
|
||||
read
|
||||
|
||||
http_proxy=http://localhost:9876 cargo run
|
||||
|
||||
# Clean up detached proxy after running
|
||||
${ENGINE} stop "${CONTAINER_ID}" 2>/dev/null || true
|
||||
@@ -1,61 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# This script manages prompt overrides for the Zed editor.
|
||||
#
|
||||
# It provides functionality to:
|
||||
# 1. Link the current repository's prompt templates to Zed's configuration.
|
||||
# 2. Create and link a separate Git worktree for prompt management.
|
||||
# 3. Unlink previously linked prompt overrides.
|
||||
#
|
||||
# Usage:
|
||||
# ./script_name.sh link # Link current repo's prompts
|
||||
# ./script_name.sh link --worktree # Create and link a separate worktree
|
||||
# ./script_name.sh unlink # Remove existing prompt override link
|
||||
#
|
||||
# The script ensures proper Git branch and worktree setup when using the
|
||||
# --worktree option. It also provides informative output and error handling.
|
||||
|
||||
if [ "$1" = "link" ]; then
|
||||
# Remove existing link (or directory)
|
||||
rm -rf ~/.config/zed/prompt_overrides
|
||||
if [ "$2" = "--worktree" ]; then
|
||||
# Check if 'prompts' branch exists, create if not
|
||||
if ! git show-ref --quiet refs/heads/prompts; then
|
||||
git branch prompts
|
||||
fi
|
||||
# Check if 'prompts' worktree exists
|
||||
if git worktree list | grep -q "../zed_prompts"; then
|
||||
echo "Worktree already exists at ../zed_prompts."
|
||||
else
|
||||
# Create worktree if it doesn't exist
|
||||
git worktree add ../zed_prompts prompts || git worktree add ../zed_prompts -b prompts
|
||||
fi
|
||||
ln -sf "$(realpath "$(pwd)/../zed_prompts/assets/prompts")" ~/.config/zed/prompt_overrides
|
||||
echo "Linked $(realpath "$(pwd)/../zed_prompts/assets/prompts") to ~/.config/zed/prompt_overrides"
|
||||
echo -e "\033[0;33mDon't forget you have it linked, or your prompts will go stale\033[0m"
|
||||
else
|
||||
ln -sf "$(pwd)/assets/prompts" ~/.config/zed/prompt_overrides
|
||||
echo "Linked $(pwd)/assets/prompts to ~/.config/zed/prompt_overrides"
|
||||
fi
|
||||
elif [ "$1" = "unlink" ]; then
|
||||
if [ -e ~/.config/zed/prompt_overrides ]; then
|
||||
# Remove symbolic link
|
||||
rm -rf ~/.config/zed/prompt_overrides
|
||||
echo "Unlinked ~/.config/zed/prompt_overrides"
|
||||
else
|
||||
echo -e "\033[33mWarning: No file exists at ~/.config/zed/prompt_overrides\033[0m"
|
||||
fi
|
||||
else
|
||||
echo "This script helps you manage prompt overrides for Zed."
|
||||
echo "You can link this directory to have Zed use the contents of your current repo templates as your active prompts,"
|
||||
echo "or store your modifications in a separate Git worktree."
|
||||
echo
|
||||
echo "Usage: $0 [link [--worktree]|unlink]"
|
||||
echo
|
||||
echo "Options:"
|
||||
echo " link Create a symbolic link from ./assets/prompts to ~/.config/zed/prompt_overrides"
|
||||
echo " link --worktree Create a 'prompts' Git worktree in ../prompts, then link ../prompts/assets/prompts"
|
||||
echo " to ~/.config/zed/prompt_overrides"
|
||||
echo " unlink Remove the symbolic link at ~/.config/zed/prompt_overrides"
|
||||
exit 1
|
||||
fi
|
||||
@@ -1,70 +0,0 @@
|
||||
#!/usr/bin/env node --redirect-warnings=/dev/null
|
||||
|
||||
const fs = require("fs");
|
||||
const { randomBytes } = require("crypto");
|
||||
const { execFileSync } = require("child_process");
|
||||
const {
|
||||
minimizeTestPlan,
|
||||
buildTests,
|
||||
runTests,
|
||||
} = require("./randomized-test-minimize");
|
||||
|
||||
const { ZED_SERVER_URL } = process.env;
|
||||
if (!ZED_SERVER_URL) throw new Error("Missing env var `ZED_SERVER_URL`");
|
||||
|
||||
main();
|
||||
|
||||
async function main() {
|
||||
buildTests();
|
||||
|
||||
const seed = randomU64();
|
||||
const commit = execFileSync("git", ["rev-parse", "HEAD"], {
|
||||
encoding: "utf8",
|
||||
}).trim();
|
||||
|
||||
console.log("commit:", commit);
|
||||
console.log("starting seed:", seed);
|
||||
|
||||
const planPath = "target/test-plan.json";
|
||||
const minPlanPath = "target/test-plan.min.json";
|
||||
const failingSeed = runTests({
|
||||
SEED: seed,
|
||||
SAVE_PLAN: planPath,
|
||||
ITERATIONS: 50000,
|
||||
OPERATIONS: 200,
|
||||
});
|
||||
|
||||
if (!failingSeed) {
|
||||
console.log("tests passed");
|
||||
return;
|
||||
}
|
||||
|
||||
console.log("found failure at seed", failingSeed);
|
||||
const minimizedSeed = minimizeTestPlan(planPath, minPlanPath);
|
||||
const minimizedPlan = fs.readFileSync(minPlanPath, "utf8");
|
||||
|
||||
console.log("minimized plan:\n", minimizedPlan);
|
||||
|
||||
const url = `${ZED_SERVER_URL}/api/randomized_test_failure`;
|
||||
const body = {
|
||||
seed: minimizedSeed,
|
||||
plan: JSON.parse(minimizedPlan),
|
||||
commit: commit,
|
||||
};
|
||||
await fetch(url, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify(body),
|
||||
});
|
||||
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
function randomU64() {
|
||||
const bytes = randomBytes(8);
|
||||
const hexString = bytes.reduce(
|
||||
(string, byte) => string + byte.toString(16),
|
||||
"",
|
||||
);
|
||||
return BigInt("0x" + hexString).toString(10);
|
||||
}
|
||||
@@ -1,135 +0,0 @@
|
||||
#!/usr/bin/env node --redirect-warnings=/dev/null
|
||||
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
const { spawnSync } = require("child_process");
|
||||
|
||||
const FAILING_SEED_REGEX = /failing seed: (\d+)/gi;
|
||||
const CARGO_TEST_ARGS = ["--release", "--lib", "--package", "collab"];
|
||||
|
||||
if (require.main === module) {
|
||||
if (process.argv.length < 4) {
|
||||
process.stderr.write(
|
||||
"usage: script/randomized-test-minimize <input-plan> <output-plan> [start-index]\n",
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
minimizeTestPlan(
|
||||
process.argv[2],
|
||||
process.argv[3],
|
||||
parseInt(process.argv[4]) || 0,
|
||||
);
|
||||
}
|
||||
|
||||
function minimizeTestPlan(inputPlanPath, outputPlanPath, startIndex = 0) {
|
||||
const tempPlanPath = inputPlanPath + ".try";
|
||||
|
||||
fs.copyFileSync(inputPlanPath, outputPlanPath);
|
||||
let testPlan = JSON.parse(fs.readFileSync(outputPlanPath, "utf8"));
|
||||
|
||||
process.stderr.write("minimizing failing test plan...\n");
|
||||
for (let ix = startIndex; ix < testPlan.length; ix++) {
|
||||
// Skip 'MutateClients' entries, since they themselves are not single operations.
|
||||
if (testPlan[ix].MutateClients) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Remove a row from the test plan
|
||||
const newTestPlan = testPlan.slice();
|
||||
newTestPlan.splice(ix, 1);
|
||||
fs.writeFileSync(tempPlanPath, serializeTestPlan(newTestPlan), "utf8");
|
||||
|
||||
process.stderr.write(
|
||||
`${ix}/${testPlan.length}: ${JSON.stringify(testPlan[ix])}`,
|
||||
);
|
||||
const failingSeed = runTests({
|
||||
SEED: "0",
|
||||
LOAD_PLAN: tempPlanPath,
|
||||
SAVE_PLAN: tempPlanPath,
|
||||
ITERATIONS: "500",
|
||||
});
|
||||
|
||||
// If the test failed, keep the test plan with the removed row. Reload the test
|
||||
// plan from the JSON file, since the test itself will remove any operations
|
||||
// which are no longer valid before saving the test plan.
|
||||
if (failingSeed != null) {
|
||||
process.stderr.write(` - remove. failing seed: ${failingSeed}.\n`);
|
||||
fs.copyFileSync(tempPlanPath, outputPlanPath);
|
||||
testPlan = JSON.parse(fs.readFileSync(outputPlanPath, "utf8"));
|
||||
ix--;
|
||||
} else {
|
||||
process.stderr.write(` - keep.\n`);
|
||||
}
|
||||
}
|
||||
|
||||
fs.unlinkSync(tempPlanPath);
|
||||
|
||||
// Re-run the final minimized plan to get the correct failing seed.
|
||||
// This is a workaround for the fact that the execution order can
|
||||
// slightly change when replaying a test plan after it has been
|
||||
// saved and loaded.
|
||||
const failingSeed = runTests({
|
||||
SEED: "0",
|
||||
ITERATIONS: "5000",
|
||||
LOAD_PLAN: outputPlanPath,
|
||||
});
|
||||
|
||||
process.stderr.write(`final test plan: ${outputPlanPath}\n`);
|
||||
process.stderr.write(`final seed: ${failingSeed}\n`);
|
||||
return failingSeed;
|
||||
}
|
||||
|
||||
function buildTests() {
|
||||
const { status } = spawnSync(
|
||||
"cargo",
|
||||
["test", "--no-run", ...CARGO_TEST_ARGS],
|
||||
{
|
||||
stdio: "inherit",
|
||||
encoding: "utf8",
|
||||
env: {
|
||||
...process.env,
|
||||
},
|
||||
},
|
||||
);
|
||||
if (status !== 0) {
|
||||
throw new Error("build failed");
|
||||
}
|
||||
}
|
||||
|
||||
function runTests(env) {
|
||||
const { status, stdout } = spawnSync(
|
||||
"cargo",
|
||||
["test", ...CARGO_TEST_ARGS, "random_project_collaboration"],
|
||||
{
|
||||
stdio: "pipe",
|
||||
encoding: "utf8",
|
||||
env: {
|
||||
...process.env,
|
||||
...env,
|
||||
},
|
||||
},
|
||||
);
|
||||
|
||||
if (status !== 0) {
|
||||
FAILING_SEED_REGEX.lastIndex = 0;
|
||||
const match = FAILING_SEED_REGEX.exec(stdout);
|
||||
if (!match) {
|
||||
process.stderr.write("test failed, but no failing seed found:\n");
|
||||
process.stderr.write(stdout);
|
||||
process.stderr.write("\n");
|
||||
process.exit(1);
|
||||
}
|
||||
return match[1];
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function serializeTestPlan(plan) {
|
||||
return "[\n" + plan.map((row) => JSON.stringify(row)).join(",\n") + "\n]\n";
|
||||
}
|
||||
|
||||
exports.buildTests = buildTests;
|
||||
exports.runTests = runTests;
|
||||
exports.minimizeTestPlan = minimizeTestPlan;
|
||||
@@ -1,17 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -xeuo pipefail
|
||||
|
||||
# if root or if sudo/unavailable, define an empty variable
|
||||
if [ "$(id -u)" -eq 0 ]
|
||||
then maysudo=''
|
||||
else maysudo="$(command -v sudo || command -v doas || true)"
|
||||
fi
|
||||
|
||||
deps=(
|
||||
clang
|
||||
)
|
||||
|
||||
$maysudo apt-get update
|
||||
$maysudo apt-get install -y "${deps[@]}"
|
||||
exit 0
|
||||
@@ -1,3 +0,0 @@
|
||||
psql postgres -c "DROP DATABASE zed WITH (FORCE);"
|
||||
psql postgres -c "DROP DATABASE zed_llm WITH (FORCE);"
|
||||
script/bootstrap
|
||||
@@ -1,15 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
if ! which minio > /dev/null; then
|
||||
echo "minio not found - run script/bootstrap to install it and do other setup"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mkdir -p .blob_store/the-extensions-bucket
|
||||
mkdir -p .blob_store/zed-crash-reports
|
||||
|
||||
export MINIO_ROOT_USER=the-blob-store-access-key
|
||||
export MINIO_ROOT_PASSWORD=the-blob-store-secret-key
|
||||
exec minio server --quiet .blob_store
|
||||
@@ -1,9 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euxo pipefail
|
||||
|
||||
if [ -n "${UNIT_EVAL_COMMIT:-}" ]; then
|
||||
git fetch origin "$UNIT_EVAL_COMMIT" && git checkout "$UNIT_EVAL_COMMIT"
|
||||
fi
|
||||
|
||||
GPUI_TEST_TIMEOUT=1500 cargo nextest run --workspace --no-fail-fast --features unit-eval --no-capture -E 'test(::eval_)'
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
cargo run -p collab migrate
|
||||
@@ -1,39 +0,0 @@
|
||||
# Configures a drive for testing in CI.
|
||||
|
||||
# Currently, total CI requires almost 45GB of space, here we are creating a 100GB drive.
|
||||
$Volume = New-VHD -Path C:/zed_dev_drive.vhdx -SizeBytes 100GB |
|
||||
Mount-VHD -Passthru |
|
||||
Initialize-Disk -Passthru |
|
||||
New-Partition -AssignDriveLetter -UseMaximumSize |
|
||||
Format-Volume -DevDrive -Confirm:$false -Force
|
||||
|
||||
$Drive = "$($Volume.DriveLetter):"
|
||||
|
||||
# Designate the Dev Drive as trusted
|
||||
# See https://learn.microsoft.com/en-us/windows/dev-drive/#how-do-i-designate-a-dev-drive-as-trusted
|
||||
fsutil devdrv trust $Drive
|
||||
|
||||
# There is no virus on the Dev Drive!
|
||||
# Windows Defender is the wolf in antivirus wool, slowing your PC like a digital fool!
|
||||
# See https://learn.microsoft.com/en-us/windows/dev-drive/#how-do-i-configure-additional-filters-on-dev-drive
|
||||
fsutil devdrv enable /disallowAv
|
||||
|
||||
# Remount so the changes take effect
|
||||
Dismount-VHD -Path C:/zed_dev_drive.vhdx
|
||||
Mount-VHD -Path C:/zed_dev_drive.vhdx
|
||||
|
||||
# Show some debug information
|
||||
Write-Output $Volume
|
||||
Write-Output "Using Dev Drive at $Drive"
|
||||
|
||||
# Move Cargo to the dev drive
|
||||
New-Item -Path "$($Drive)/.cargo/bin" -ItemType Directory -Force
|
||||
Copy-Item -Path "C:/Users/runneradmin/.cargo/*" -Destination "$($Drive)/.cargo/" -Recurse -Force
|
||||
|
||||
Write-Output `
|
||||
"DEV_DRIVE=$($Drive)" `
|
||||
"RUSTUP_HOME=$($Drive)/.rustup" `
|
||||
"CARGO_HOME=$($Drive)/.cargo" `
|
||||
"ZED_WORKSPACE=$($Drive)/zed" `
|
||||
"PATH=$($Drive)/.cargo/bin;$env:PATH" `
|
||||
>> $env:GITHUB_ENV
|
||||
@@ -1,27 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euxo pipefail
|
||||
|
||||
if [ "$#" -ne 1 ]; then
|
||||
echo "Usage: $0 <release_version>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mkdir -p snap/gui
|
||||
|
||||
export DO_STARTUP_NOTIFY="true"
|
||||
export APP_NAME="Zed"
|
||||
export APP_CLI="zed"
|
||||
export APP_ICON="\${SNAP}/meta/gui/zed.png"
|
||||
export APP_ARGS="%U"
|
||||
envsubst < "crates/zed/resources/zed.desktop.in" > "snap/gui/zed.desktop"
|
||||
cp "crates/zed/resources/app-icon.png" "snap/gui/zed.png"
|
||||
|
||||
RELEASE_VERSION="$1" envsubst < crates/zed/resources/snap/snapcraft.yaml.in > snap/snapcraft.yaml
|
||||
|
||||
# Clean seems to be needed to actually check that the snapcraft.yaml
|
||||
# works. For example, when a `stage-package` is removed, it will
|
||||
# still remain on rebuild.
|
||||
snapcraft clean
|
||||
|
||||
snapcraft
|
||||
@@ -1,25 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# This script is intended to be run after `snap-build`.
|
||||
#
|
||||
# It expects a version to be passed as the first argument, and expects
|
||||
# the built `.snap` for that version to be in the current directory.
|
||||
#
|
||||
# This will uninstall the current `zed` snap, replacing it with a snap
|
||||
# that directly uses the `snap/unpacked` directory.
|
||||
|
||||
set -euxo pipefail
|
||||
|
||||
if [ "$#" -ne 1 ]; then
|
||||
echo "Usage: $0 <release_version>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Rerun as root
|
||||
[ "$UID" -eq 0 ] || exec sudo bash -e "$0" "$@"
|
||||
|
||||
snap remove zed || true
|
||||
mkdir -p snap
|
||||
rm -rf snap/unpacked
|
||||
unsquashfs -dest snap/unpacked "zed_$1_amd64.snap"
|
||||
snap try --classic snap/unpacked
|
||||
@@ -1,32 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Squawk is a linter for database migrations. It helps identify dangerous patterns, and suggests alternatives.
|
||||
# Squawk flagging an error does not mean that you need to take a different approach, but it does indicate you need to think about what you're doing.
|
||||
# See also: https://squawkhq.com
|
||||
|
||||
set -e
|
||||
|
||||
if [ -z "$GITHUB_BASE_REF" ]; then
|
||||
echo 'Not a pull request, skipping squawk modified migrations linting'
|
||||
exit
|
||||
fi
|
||||
|
||||
SQUAWK_VERSION=0.26.0
|
||||
SQUAWK_BIN="./target/squawk-$SQUAWK_VERSION"
|
||||
SQUAWK_ARGS="--assume-in-transaction --config script/lib/squawk.toml"
|
||||
|
||||
pkgutil --pkg-info com.apple.pkg.RosettaUpdateAuto || /usr/sbin/softwareupdate --install-rosetta --agree-to-license
|
||||
# When bootstrapping a brand new CI machine, the `target` directory may not exist yet.
|
||||
mkdir -p "./target"
|
||||
curl -L -o "$SQUAWK_BIN" "https://github.com/sbdchd/squawk/releases/download/v$SQUAWK_VERSION/squawk-darwin-x86_64"
|
||||
chmod +x "$SQUAWK_BIN"
|
||||
|
||||
if [ -n "$SQUAWK_GITHUB_TOKEN" ]; then
|
||||
export SQUAWK_GITHUB_REPO_OWNER=$(echo $GITHUB_REPOSITORY | awk -F/ '{print $1}')
|
||||
export SQUAWK_GITHUB_REPO_NAME=$(echo $GITHUB_REPOSITORY | awk -F/ '{print $2}')
|
||||
export SQUAWK_GITHUB_PR_NUMBER=$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }')
|
||||
|
||||
$SQUAWK_BIN $SQUAWK_ARGS upload-to-github $(git diff --name-only origin/$GITHUB_BASE_REF...origin/$GITHUB_HEAD_REF 'crates/collab/migrations/*.sql' 'crates/collab/migrations_llm/*.sql')
|
||||
else
|
||||
$SQUAWK_BIN $SQUAWK_ARGS $(git ls-files --others crates/collab/migrations/*.sql crates/collab/migrations_llm/*.sql) $(git diff --name-only main crates/collab/migrations/*.sql crates/collab/migrations_llm/*.sql)
|
||||
fi
|
||||
@@ -1,7 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
cargo run -p storybook
|
||||
else
|
||||
cargo run -p storybook -- "components/$1"
|
||||
fi
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"lang": "en-US",
|
||||
"type": "rtf",
|
||||
"file": "terms.rtf"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,129 +0,0 @@
|
||||
{\rtf1\ansi\deff0{\fonttbl{\f0 \fswiss Helvetica;}{\f1 \fmodern Courier;}}
|
||||
{\colortbl;\red255\green0\blue0;\red0\green0\blue255;}
|
||||
\widowctrl\hyphauto
|
||||
|
||||
{\pard \qc \f0 \sa180 \li0 \fi0 \b \fs36 Zed End User Terms\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 PLEASE READ THESE TERMS AND CONDITIONS CAREFULLY BEFORE USING THE SERVICE OR SOFTWARE OFFERED BY ZED INDUSTRIES, INC. ("ZED", OR "WE"). BY ACCESSING OR USING THE SOLUTION (AS DEFINED BELOW) IN ANY MANNER, YOU ("YOU" OR "CUSTOMER") AGREE TO BE BOUND BY THESE TERMS (THE "AGREEMENT") TO THE EXCLUSION OF ALL OTHER TERMS. YOU REPRESENT AND WARRANT THAT YOU HAVE THE AUTHORITY TO ENTER INTO THIS AGREEMENT; IF YOU ARE ENTERING INTO THIS AGREEMENT ON BEHALF OF AN ORGANIZATION OR ENTITY, REFERENCES TO "CUSTOMER" AND "YOU" IN THIS AGREEMENT, REFER TO THAT ORGANIZATION OR ENTITY. IF YOU DO NOT AGREE TO ALL OF THE FOLLOWING, YOU MAY NOT USE OR ACCESS THE SOLUTION IN ANY MANNER. IF THE TERMS OF THIS AGREEMENT ARE CONSIDERED AN OFFER, ACCEPTANCE IS EXPRESSLY LIMITED TO SUCH TERMS.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel1 \b \fs32 1. ACCESS TO AND USE OF THE SOLUTION\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 Subject to the terms and conditions of this Agreement, Zed hereby grants to You, and You hereby accept from Zed, a term-limited, non-exclusive, non-transferable, non-assignable and non-sublicensable license to make use of the Editor for Your internal use only, and subject to the use limitations in Section 2.2.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel1 \b \fs32 2. TERMS APPLICABLE TO THE EDITOR\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel2 \b \fs28 2.1. License Grant\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 Subject to the terms and conditions of this Agreement, Zed hereby grants to You, and You hereby accept from Zed, a term-limited, non-exclusive, non-transferable, non-assignable and non-sublicensable license to make use of the Editor for Your internal use only, and subject to the use limitations in Section 2.2.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel2 \b \fs28 2.2. License Limitations\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 You agree that You shall not: (a) exceed the scope of the licenses granted in Section 2.1; (b) make copies of the Editor; (c) distribute, sublicense, assign, delegate, rent, lease, sell, time-share or otherwise transfer the benefits of, use under, or rights to, the license granted in Section 2.1; (d) reverse engineer, decompile, disassemble or otherwise attempt to learn the source code, structure or algorithms underlying the Editor, except to the extent required to be permitted under applicable law; (e) modify, translate or create derivative works of the Editor; or (f) remove any copyright, trademark, patent or other proprietary notice that appears on the Editor or copies thereof.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel2 \b \fs28 2.3. Open Source Software\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 Zed makes certain versions of the Editor and related software available at the Zed GitHub Repository: {\field{\*\fldinst{HYPERLINK "https://github.com/zed-industries/zed"}}{\fldrslt{\ul
|
||||
https://github.com/zed-industries/zed
|
||||
}}}
|
||||
(the "Repo"). Your use of such software is subject to the open source software licenses declared in the Repo.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel1 \b \fs32 3. TERMS APPLICABLE TO THE ZED SERVICE\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel2 \b \fs28 3.1. Access to and Scope of Zed Service\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 If you have elected to use the Zed Service by enabling or activating the Zed Service, Zed will use commercially reasonable efforts to make the Zed Service available to You as set forth in this Agreement. Once you elected to use the Zed Service, You may access and use the Zed Service during the Term, subject to Your compliance with the terms and conditions of the Agreement.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel2 \b \fs28 3.2. Restrictions\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 You will use the Zed Service only in accordance with all applicable laws, including, but not limited to, laws related to data (whether applicable within the United States, the European Union, or otherwise). You agree not to (and will not allow any third party to): (i) remove or otherwise alter any proprietary notices or labels from the Zed Service or any portion thereof; (ii) reverse engineer, decompile, disassemble, or otherwise attempt to discover the underlying structure, ideas, or algorithms of the Zed Service or any software used to provide or make the Zed Service available; or (iii) rent, resell or otherwise allow any third party access to or use of the Zed Service. Zed may suspend Your access to or use of the Zed Service as follows: (a) immediately if Zed reasonably believes Your use of the Zed Service may pose a security risk to or may adversely impact the Zed Service; or (b) if You are in breach of this Agreement.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel2 \b \fs28 3.3. Customer Data\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 You are solely responsible for Customer Data including, but not limited to: (a) compliance with all applicable laws and this Agreement; (b) any claims relating to Customer Data; and (c) any claims that Customer Data infringes, misappropriates, or otherwise violates the rights of any third party. You agree and acknowledge that Customer Data may be irretrievably deleted if Your account is terminated. For purposes of this Agreement, "Customer Data" shall mean any data, information or other material provided, uploaded, or submitted by You to the Zed Service in the course of using the Zed Service. Notwithstanding anything to the contrary, You represent and warrant that You will not transfer or make available to Zed any personally identifiable information or related information subject to applicable data privacy laws or regulations, unless otherwise agreed to in writing by Zed.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel3 \b \fs24 3.3.1. Customer Data Made Available to Zed\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 To the extent You elect to make Customer Data available to Zed, the same may only be used by Zed according to the Customer Data type and the use rights regarding the same as described herein:\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel3 \b \fs24 3.3.2. Usage Data\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 To improve the Editor and understand how You use it, Zed optionally collects the following usage data:\par}
|
||||
{\pard \ql \f0 \sa0 \li720 \fi-360 \bullet \tx360\tab (a)\tx360\tab file extensions of opened files;\sa180\par}
|
||||
{\pard \ql \f0 \sa0 \li720 \fi-360 \bullet \tx360\tab (b)\tx360\tab features and tools You use within the Editor;\sa180\par}
|
||||
{\pard \ql \f0 \sa0 \li720 \fi-360 \bullet \tx360\tab (c)\tx360\tab project statistics (e.g., number of files); and\sa180\par}
|
||||
{\pard \ql \f0 \sa0 \li720 \fi-360 \bullet \tx360\tab (d)\tx360\tab frameworks detected in Your projects\sa180\sa180\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 (a-d collectively, "Usage Data"). Usage Data does not include any of Your software code or sensitive project details. You may change Your preferences disabling the collection of Usage Data and You can audit Usage Data collected by the Editor at any time. See {\field{\*\fldinst{HYPERLINK "https://zed.dev/docs/telemetry"}}{\fldrslt{\ul
|
||||
https://zed.dev/docs/telemetry
|
||||
}}}
|
||||
for more.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 Usage Data is associated with a secure random telemetry ID which may be linked to Your email address. This linkage currently serves two purposes: (1) it allows Zed to analyze usage patterns over time while maintaining Your privacy; and (2) it enables Zed to reach out to specific user groups for feedback and improvement suggestions. Zed may contact You based on Your usage patterns to better understand your needs and improve the Solution. If You delete Your account, the link between Your telemetry ID and Your email address will be permanently removed. By continuing to use Editor or Solution with this feature enabled You agree to this Usage Data collection.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel3 \b \fs24 3.3.3. Crash Reports\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 Customer Data consisting of data related to the behavior of the Solution prior to a crash or failure, such as stack traces are collected and classified as "Crash Reports". Zed will use commercially reasonable efforts to exclude any personally identifiable information from Crash Reports, but due to the nature of a crash, Zed does not ensure that information such as paths will be excluded from Crash Reports. Crash Reports will be used solely for Zed's internal purposes in connection with diagnosing defects in the Solution that led to the crash. You may grant us permission to capture Crash Reports when installing or activating the Solution, and You may change Your preferences at any time in the settings feature of the Solution. Once You grant us this permission, Zed will retain the Crash Reports indefinitely.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel3 \b \fs24 3.3.4. User Content\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \u8226 ? You may access, modify or create certain data or information in connection with your access or use of the Zed Editor or the Solution. Such data and information may include, but is not limited to any of the following:\par}
|
||||
{\pard \ql \f0 \sa0 \li720 \fi-360 \bullet \tx360\tab (a)\tx360\tab file contents and associated metadata (e.g., filename, paths, size, timestamps);\sa180\par}
|
||||
{\pard \ql \f0 \sa0 \li720 \fi-360 \bullet \tx360\tab (b)\tx360\tab source control history, comments and metadata (e.g., git history, commit messages);\sa180\par}
|
||||
{\pard \ql \f0 \sa0 \li720 \fi-360 \bullet \tx360\tab (c)\tx360\tab configuration data (e.g., settings, keymaps);\sa180\par}
|
||||
{\pard \ql \f0 \sa0 \li720 \fi-360 \bullet \tx360\tab (d)\tx360\tab anything typed, pasted and/or displayed on screen while using the Editor;\sa180\par}
|
||||
{\pard \ql \f0 \sa0 \li720 \fi-360 \bullet \tx360\tab (e)\tx360\tab derivative works of the above generated by the Editor (e.g., format conversions, summaries, indexes, caches);\sa180\par}
|
||||
{\pard \ql \f0 \sa0 \li720 \fi-360 \bullet \tx360\tab (f)\tx360\tab metadata, code and other derivative works of the above returned by language servers and other local tooling; and\sa180\par}
|
||||
{\pard \ql \f0 \sa0 \li720 \fi-360 \bullet \tx360\tab (g)\tx360\tab metadata, code and other derivative works of the above returned by services integrated with the Zed Editor\sa180\sa180\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 (a-g collectively, "User Content").\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel3 \b \fs24 3.3.5. Handling of User Content\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 Zed will make use of or transfer User Content only as specified in this Agreement, or as necessary to comply with applicable law.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel3 \b \fs24 3.3.5.1. Zed Collaboration Services\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 When using Zed Collaboration Services, User Content is transmitted from Your environment only if You collaborate with other Zed users by electing to share a project in the Editor. Once You share a project, Zed may transmit User Content consisting of file paths, file contents, and metadata regarding the code returned by language servers. Currently, Zed does not persist any User Content beyond the Your collaboration session. If You unshare a project or disconnect from the Solution, all information associated with such project will be deleted from Zed servers. In the future, Zed may save User Content regarding projects beyond the scope of a single collaboration session. We may share such User Content with those users You elected to grant access to. Zed's access to such User Content is limited to debugging and making improvements to the Solution.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel3 \b \fs24 3.3.5.2. Other Services\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 The Zed Editor supports integration with API-based services maintained and not operated by Zed (the "Other Services"). By way of example, Other Services includes those made available by GitHub, Anthropic, OpenAI, and similar providers, or those You host or manage directly. You may configure the Zed Editor to interoperate, communicate with, and exchange data (including User Content) directly with the Other Services. Zed is not responsible or otherwise liable with respect to Your use of any Other Service, including but not limited to the exchange of data between the Other Service and the Zed Editor. The terms and conditions, including the applicable privacy policy, with respect to the Other Service are those made available by the applicable Other Service, not these Terms.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel3 \b \fs24 3.3.5.3. Zed AI Services\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 The Zed Editor supports integration with API-based services maintained and operated by Zed (the "Zed AI Services"). You may elect to use Zed AI Services as the provider for various Zed Editor features (e.g., Agent Panel, Inline Assistant, Edit Predictions, and similar features). In connection with Your use of these features, the Zed Editor and Zed AI Services may make use of User Content to generate contextually relevant responses (the \u8220"Output\u8221"). Other than as specified in Section 3.3.5.4 of these Terms, Zed will not use User Content for training of its models, or disclose User Content.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 Output is provided "as is" without any warranties or guarantees of functionality, security, or fitness for a particular purpose. While efforts are made to ensure the accuracy and reliability, Output may include errors, vulnerabilities, and defects. You are responsible for reviewing, testing, and validating Output before use in any production or critical environment. Zed assumes no liability for any damages, losses, or liability arising from the use, modification, reliance on, or deployment of Output. Any such use is at Your own risk.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel3 \b \fs24 3.3.5.4. Improvement Feedback\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 When using Zed AI Services to provide Edit Predictions in connection with certain open source software projects, You may elect to share requests, responses and feedback comments (collectively "Model Improvement Feedback") with Zed, and Zed may use the same to improve Zed Edit Predictions models. You may opt-out of sharing Model Improvement Feedback at any time.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 For more information on Zed Edit Predictions please see: {\field{\*\fldinst{HYPERLINK "https://zed.dev/docs/ai/ai-improvement"}}{\fldrslt{\ul
|
||||
https://zed.dev/docs/ai/ai-improvement
|
||||
}}}
|
||||
\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 When using Zed AI Services in connection with the Agent Panel, You may elect to share with Zed requests, responses and feedback regarding the Agent Panel and related Output (the \u8220"Agent Improvement Feedback\u8221") with Zed, and Zed may use the same to improve the Agent Panel and related Output. Zed will only collect Agent Improvement Feedback when You elect to share the same.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 For more information regarding the Agent Panel please see: {\field{\*\fldinst{HYPERLINK "https://zed.dev/docs/ai/ai-improvement"}}{\fldrslt{\ul
|
||||
https://zed.dev/docs/ai/ai-improvement
|
||||
}}}
|
||||
\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel3 \b \fs24 3.4. Privacy Policy\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 You and Zed are bound by the terms and conditions contained in the Zed Privacy Policy which is incorporated by reference hereto. The Zed Privacy Policy is available at the following URL: {\field{\*\fldinst{HYPERLINK "https://zed.dev/privacy-policy"}}{\fldrslt{\ul
|
||||
https://zed.dev/privacy-policy
|
||||
}}}
|
||||
.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel1 \b \fs32 4. FEE BASED SERVICES, FEES AND PAYMENT TERMS\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel2 \b \fs28 4.1. Fee Based Services\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 The Zed AI Services is made available with additional usage benefits (the \u8220"Enhanced Use \u8221") as described in the table published at {\field{\*\fldinst{HYPERLINK "https://zed.dev/pricing"}}{\fldrslt{\ul
|
||||
zed.dev/pricing
|
||||
}}}
|
||||
(the \u8220"Pricing Table\u8221"), subject to the requirements and limitations set forth in the Pricing Table and these Terms. In order to make use of the Enhanced Use, Customer must access the Zed AI Services through a Zed registered account.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel2 \b \fs28 4.2. Fees\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 Customer shall pay to Zed the applicable fees set forth in Pricing Table, together with any applicable taxes and shipping and handling (collectively, the \u8220"Fees\u8221"). Customer shall have no right of return, and all Fees shall be non-refundable.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel2 \b \fs28 4.3. Payment Terms\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 All amounts payable to Zed under this Agreement shall be paid in United States dollars and paid Zed according to the method of payment, frequency and calculated as set forth in the Pricing Table.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel2 \b \fs28 4.4. Taxes; Set-offs\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 Any and all payments made by Customer in accordance with this Agreement are exclusive of any taxes that might be assessed by any jurisdiction. Customer shall pay or reimburse Zed for all sales, use, property and similar taxes; all customs duties, import fees, stamp duties, license fees and similar charges; and all other mandatory payments to government agencies of whatever kind, except taxes imposed on the net or gross income of Zed. All amounts payable to Zed under this Agreement shall be without set-off and without deduction of any taxes, levies, imposts, charges, withholdings and/or duties of any nature which may be levied or imposed, including without limitation, value added tax, customs duty and withholding tax.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel1 \b \fs32 5. TERM AND TERMINATION\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel2 \b \fs28 5.1. Term\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 The term of this Agreement shall commence on the date You first download the Editor or use the Zed Service (the "Effective Date"), and unless terminated earlier according to this Section 3, will end pursuant to this Section 5 (the "Term").\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel2 \b \fs28 5.2. Termination\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 This Agreement may be terminated: (a) by either party if the other has materially breached this Agreement; or (b) by Zed at any time and for any reason upon notice to Customer. You acknowledge that Zed is under no obligation to continue to operate the Zed Service or make the Editor available, and We may end any programs in connection with the same at any time.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel2 \b \fs28 5.3. Effect of Termination and Survival\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 Upon any expiration or termination of this Agreement, Customer shall (i) immediately cease use of the Zed Service, and (ii) return all Zed Confidential Information and other materials provided by Zed. The following provisions will survive termination of this Agreement: Sections 3.3 (Customer Data), Section 3.4 (Privacy Policy), Section 5.3 (Effect of Termination and Survival), Section 6 (Ownership), Section 7 (Indemnification), Section 9 (Limitation of Liability), Section 10 (Third Party Services), and Section 11 (Miscellaneous).\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel1 \b \fs32 6. OWNERSHIP\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 Zed retains all right, title, and interest in and to the Zed Service, Editor, and any software, products, works or other intellectual property created, used, provided, or made available by Zed under or in connection with the Zed Service or Editor. Customer may from time to time provide suggestions, comments, or other feedback to Zed with respect to the Zed Service or Editor ("Feedback"). Customer shall, and hereby does, grant to Zed a nonexclusive, worldwide, perpetual, irrevocable, transferable, sublicensable, royalty-free, fully paid-up license to use and exploit the Feedback for any purpose. You retain all right, title and interest in and to the Customer Data, including all intellectual property rights therein. No intellectual property rights with respect to any software code you develop or modify with the Editor or Zed Service (collectively, the \u8220"Output\u8221") are transferred or assigned to Zed hereunder.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel1 \b \fs32 7. INDEMNIFICATION\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 Customer will defend, indemnify, and hold Zed, its affiliates, suppliers and licensors harmless and each of their respective officers, directors, employees and representatives from and against any claims, damages, losses, liabilities, costs, and expenses (including reasonable attorneys' fees) arising out of or relating to any third party claim with respect to: (a) Customer Data; (b) breach of this Agreement or violation of applicable law by Customer; or (c) alleged infringement or misappropriation of third-party's intellectual property rights resulting from Customer Data.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel1 \b \fs32 8. WARRANTY\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 Zed does not represent or warrant that the operation of the Zed Service or Editor (or any portion thereof) will be uninterrupted or error free, or that the Zed Service or Editor (or any portion thereof) will operate in combination with other hardware, software, systems or data not provided by Zed. CUSTOMER ACKNOWLEDGES THAT, ZED MAKES NO EXPRESS OR IMPLIED REPRESENTATIONS OR WARRANTIES OF ANY KIND WITH RESPECT TO THE SERVICE OR SOFTWARE, OR THEIR CONDITION. ZED HEREBY EXPRESSLY EXCLUDES, ANY AND ALL OTHER EXPRESS OR IMPLIED REPRESENTATIONS OR WARRANTIES, WHETHER UNDER COMMON LAW, STATUTE OR OTHERWISE, INCLUDING WITHOUT LIMITATION ANY AND ALL WARRANTIES AS TO MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, SATISFACTORY QUALITY OR NON-INFRINGEMENT OF THIRD-PARTY RIGHTS.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel1 \b \fs32 9. LIMITATIONS OF LIABILITY\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 IN NO EVENT SHALL ZED BE LIABLE FOR ANY LOST DATA, LOST PROFITS, BUSINESS INTERRUPTION, REPLACEMENT SERVICE OR OTHER SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR INDIRECT DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THEORY OF LIABILITY. ZED'S LIABILITY FOR ALL CLAIMS ARISING UNDER THIS AGREEMENT, WHETHER IN CONTRACT, TORT OR OTHERWISE, SHALL NOT EXCEED THE GREATER OF: THE FEES PAID TO ZED BY CUSTOMER DURING THE TWELVE (12) MONTH PERIOD PRECEDING THE DATE OF THE CLAIM, OR ONE THOUSAND US DOLLARS ($1,000).\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel1 \b \fs32 10. Third Party Services\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 Zed may make certain third party services available to You within the Editor or the Zed Service (each a "Third Party Service"). You acknowledge and agree that (a) use of each Third Party Service is subject to the corresponding terms and conditions available at the following URL: {\field{\*\fldinst{HYPERLINK "https://zed.dev/third-party-terms"}}{\fldrslt{\ul
|
||||
https://zed.dev/third-party-terms
|
||||
}}}
|
||||
and/or presented in connection with Your use of such Third Party Service; (b) the terms and conditions of this Agreement do not apply with respect to Your use of any Third Party Service; and (c) Zed is not liable in any way regarding Your use of any Third Party Service.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel1 \b \fs32 11. MISCELLANEOUS\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel2 \b \fs28 11.1. Export Control\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 You hereby certify that You will comply with all current US Export Control laws. You agree to defend, indemnify and hold Zed harmless from any liability for Your violation of U.S. Export Control laws.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel2 \b \fs28 11.2. Compliance with Laws\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 You shall comply with all applicable laws and regulations in its use of the Solution, including without limitation the unlawful gathering or collecting, or assisting in the gathering or collecting of information in violation of any privacy laws or regulations. You shall, at its own expense, defend, indemnify and hold harmless Zed from and against any and all claims, losses, liabilities, damages, judgments, government or federal sanctions, costs and expenses (including attorneys' fees) incurred by Zed arising from any claim or assertion by any third party of violation of privacy laws or regulations by You or any of its agents, officers, directors or employees.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel2 \b \fs28 11.3. Assignment\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 Neither party may transfer and assign its rights and obligations under this Agreement without the prior written consent of the other party. Notwithstanding the foregoing, Zed may transfer and assign its rights under this Agreement without consent from the other party in connection with a change in control, acquisition or sale of all or substantially all of its assets.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel2 \b \fs28 11.4. Force Majeure\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 Neither party shall be responsible for failure or delay in performance by events out of their reasonable control, including but not limited to, acts of God, Internet outage, terrorism, war, fires, earthquakes and other disasters (each a "Force Majeure"). Notwithstanding the foregoing: if a Force Majeure continues for more than thirty (30) days, either party may to terminate this agreement by written notice to the other party.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel2 \b \fs28 11.5. Notice\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 All notices between the parties shall be in writing and shall be deemed to have been given if personally delivered or sent by registered or certified mail (return receipt), or by recognized courier service.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel2 \b \fs28 11.6. No Agency\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 Both parties agree that no agency, partnership, joint venture, or employment is created as a result of this Agreement. You do not have any authority of any kind to bind Zed.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel2 \b \fs28 11.7. Governing Law\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 This Agreement shall be governed exclusively by, and construed exclusively in accordance with, the laws of the United States and the State of California, without regard to its conflict of laws provisions. The federal courts of the United States in the Northern District of California and the state courts of the State of California shall have exclusive jurisdiction to adjudicate any dispute arising out of or relating to this Agreement. Each party hereby consents to the jurisdiction of such courts and waives any right it may otherwise have to challenge the appropriateness of such forums, whether on the basis of the doctrine of forum non conveniens or otherwise. The United Nations Convention on Contracts for the International Sale of Goods shall not apply to this Agreement or any Purchase Order issued under this Agreement.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel2 \b \fs28 11.8. Updated Agreement\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 Zed reserves the right to update this Agreement at any time. The terms and conditions of the updated version of the Agreement shall apply to the Zed Service and Editor downloaded, or accessed following the date of publication of the updated version. If You do not agree with any terms of the updated Agreement, You may not use or access the Zed Service or Editor in any manner. Zed may from time-to-time provide release notes applicable to the Editor or Zed Service, and such release notes may contain additional use restrictions or terms applicable to Customer Data. Your use of the Editor or Zed Service after the applicable release notes are made available shall be subject to the additional use restrictions or terms applicable to Customer Data.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 \outlinelevel2 \b \fs28 11.9. Entire Agreement\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 This Agreement is the complete and exclusive statement of the mutual understanding of the parties and supersedes and cancels all previous written and oral agreements, communications, and other understandings relating to the subject matter of this Agreement, and all waivers and modifications must be in a writing signed by both parties, except as otherwise provided herein. Any term or provision of this Agreement held to be illegal or unenforceable shall be, to the fullest extent possible, interpreted so as to be construed as valid, but in any event the validity or enforceability of the remainder hereof shall not be affected.\par}
|
||||
{\pard \ql \f0 \sa180 \li0 \fi0 {\b DATE: May 6, 2025}\par}
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
which gh >/dev/null || brew install gh
|
||||
|
||||
if [ "$1" == "nightly" ]; then
|
||||
./script/bump-nightly
|
||||
exit
|
||||
fi
|
||||
|
||||
version=$(./script/get-released-version "$1" | sed 's/\.[^\.]*$/.x/')
|
||||
echo "Bumping $1 (v$version)"
|
||||
|
||||
gh workflow run "bump_patch_version.yml" -f branch="v$version"
|
||||
echo "Follow along at: https://github.com/zed-industries/zed/actions"
|
||||
@@ -1,158 +0,0 @@
|
||||
#!/usr/bin/env sh
|
||||
set -eu
|
||||
|
||||
# Uninstalls Zed that was installed using the install.sh script
|
||||
|
||||
check_remaining_installations() {
|
||||
platform="$(uname -s)"
|
||||
if [ "$platform" = "Darwin" ]; then
|
||||
# Check for any Zed variants in /Applications
|
||||
remaining=$(ls -d /Applications/Zed*.app 2>/dev/null | wc -l)
|
||||
[ "$remaining" -eq 0 ]
|
||||
else
|
||||
# Check for any Zed variants in ~/.local
|
||||
remaining=$(ls -d "$HOME/.local/zed"*.app 2>/dev/null | wc -l)
|
||||
[ "$remaining" -eq 0 ]
|
||||
fi
|
||||
}
|
||||
|
||||
prompt_remove_preferences() {
|
||||
printf "Do you want to keep your Zed preferences? [Y/n] "
|
||||
read -r response
|
||||
case "$response" in
|
||||
[nN]|[nN][oO])
|
||||
rm -rf "$HOME/.config/zed"
|
||||
echo "Preferences removed."
|
||||
;;
|
||||
*)
|
||||
echo "Preferences kept."
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
main() {
|
||||
platform="$(uname -s)"
|
||||
channel="${ZED_CHANNEL:-stable}"
|
||||
|
||||
if [ "$platform" = "Darwin" ]; then
|
||||
platform="macos"
|
||||
elif [ "$platform" = "Linux" ]; then
|
||||
platform="linux"
|
||||
else
|
||||
echo "Unsupported platform $platform"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
"$platform"
|
||||
|
||||
echo "Zed has been uninstalled"
|
||||
}
|
||||
|
||||
linux() {
|
||||
suffix=""
|
||||
if [ "$channel" != "stable" ]; then
|
||||
suffix="-$channel"
|
||||
fi
|
||||
|
||||
appid=""
|
||||
db_suffix="stable"
|
||||
case "$channel" in
|
||||
stable)
|
||||
appid="dev.zed.Zed"
|
||||
db_suffix="stable"
|
||||
;;
|
||||
nightly)
|
||||
appid="dev.zed.Zed-Nightly"
|
||||
db_suffix="nightly"
|
||||
;;
|
||||
preview)
|
||||
appid="dev.zed.Zed-Preview"
|
||||
db_suffix="preview"
|
||||
;;
|
||||
dev)
|
||||
appid="dev.zed.Zed-Dev"
|
||||
db_suffix="dev"
|
||||
;;
|
||||
*)
|
||||
echo "Unknown release channel: ${channel}. Using stable app ID."
|
||||
appid="dev.zed.Zed"
|
||||
db_suffix="stable"
|
||||
;;
|
||||
esac
|
||||
|
||||
# Remove the app directory
|
||||
rm -rf "$HOME/.local/zed$suffix.app"
|
||||
|
||||
# Remove the binary symlink
|
||||
rm -f "$HOME/.local/bin/zed"
|
||||
|
||||
# Remove the .desktop file
|
||||
rm -f "$HOME/.local/share/applications/${appid}.desktop"
|
||||
|
||||
# Remove the database directory for this channel
|
||||
rm -rf "$HOME/.local/share/zed/db/0-$db_suffix"
|
||||
|
||||
# Remove socket file
|
||||
rm -f "$HOME/.local/share/zed/zed-$db_suffix.sock"
|
||||
|
||||
# Remove the entire Zed directory if no installations remain
|
||||
if check_remaining_installations; then
|
||||
rm -rf "$HOME/.local/share/zed"
|
||||
prompt_remove_preferences
|
||||
fi
|
||||
|
||||
rm -rf $HOME/.zed_server
|
||||
}
|
||||
|
||||
macos() {
|
||||
app="Zed.app"
|
||||
db_suffix="stable"
|
||||
app_id="dev.zed.Zed"
|
||||
case "$channel" in
|
||||
nightly)
|
||||
app="Zed Nightly.app"
|
||||
db_suffix="nightly"
|
||||
app_id="dev.zed.Zed-Nightly"
|
||||
;;
|
||||
preview)
|
||||
app="Zed Preview.app"
|
||||
db_suffix="preview"
|
||||
app_id="dev.zed.Zed-Preview"
|
||||
;;
|
||||
dev)
|
||||
app="Zed Dev.app"
|
||||
db_suffix="dev"
|
||||
app_id="dev.zed.Zed-Dev"
|
||||
;;
|
||||
esac
|
||||
|
||||
# Remove the app bundle
|
||||
if [ -d "/Applications/$app" ]; then
|
||||
rm -rf "/Applications/$app"
|
||||
fi
|
||||
|
||||
# Remove the binary symlink
|
||||
rm -f "$HOME/.local/bin/zed"
|
||||
|
||||
# Remove the database directory for this channel
|
||||
rm -rf "$HOME/Library/Application Support/Zed/db/0-$db_suffix"
|
||||
|
||||
# Remove app-specific files and directories
|
||||
rm -rf "$HOME/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/$app_id.sfl"*
|
||||
rm -rf "$HOME/Library/Caches/$app_id"
|
||||
rm -rf "$HOME/Library/HTTPStorages/$app_id"
|
||||
rm -rf "$HOME/Library/Preferences/$app_id.plist"
|
||||
rm -rf "$HOME/Library/Saved Application State/$app_id.savedState"
|
||||
|
||||
# Remove the entire Zed directory if no installations remain
|
||||
if check_remaining_installations; then
|
||||
rm -rf "$HOME/Library/Application Support/Zed"
|
||||
rm -rf "$HOME/Library/Logs/Zed"
|
||||
|
||||
prompt_remove_preferences
|
||||
fi
|
||||
|
||||
rm -rf $HOME/.zed_server
|
||||
}
|
||||
|
||||
main "$@"
|
||||
@@ -1,25 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
cd "$(dirname "$0")/.." || exit 1
|
||||
cd crates/languages/src/json/schemas
|
||||
files=(
|
||||
"tsconfig.json"
|
||||
"package.json"
|
||||
)
|
||||
for file in "${files[@]}"; do
|
||||
curl -sL -o "$file" "https://raw.githubusercontent.com/SchemaStore/schemastore/master/src/schemas/json/$file"
|
||||
done
|
||||
|
||||
HASH="$(curl -s 'https://api.github.com/repos/SchemaStore/schemastore/commits/HEAD' | jq -r '.sha')"
|
||||
SHORT_HASH="${HASH:0:7}"
|
||||
DATE="$(curl -s 'https://api.github.com/repos/SchemaStore/schemastore/commits/HEAD' |jq -r .commit.author.date | cut -c1-10)"
|
||||
echo
|
||||
echo "Updated JSON schemas to [SchemaStore/schemastore@$SHORT_HASH](https://github.com/SchemaStore/schemastore/tree/$HASH) ($DATE)"
|
||||
echo
|
||||
for file in "${files[@]}"; do
|
||||
echo "- [$file](https://github.com/SchemaStore/schemastore/commits/master/src/schemas/json/$file)" \
|
||||
"@ [$SHORT_HASH](https://raw.githubusercontent.com/SchemaStore/schemastore/$HASH/src/schemas/json/$file)"
|
||||
done
|
||||
echo
|
||||
@@ -1 +0,0 @@
|
||||
3.13
|
||||
@@ -1,161 +0,0 @@
|
||||
import os
|
||||
from datetime import date, datetime, timedelta
|
||||
from typing import Any, Optional
|
||||
|
||||
import requests
|
||||
import typer
|
||||
from pytz import timezone
|
||||
from typer import Typer
|
||||
|
||||
app: Typer = typer.Typer()
|
||||
|
||||
AMERICA_NEW_YORK_TIMEZONE = "America/New_York"
|
||||
DATETIME_FORMAT: str = "%B %d, %Y %I:%M %p"
|
||||
ISSUES_PER_SECTION: int = 50
|
||||
ISSUES_TO_FETCH: int = 100
|
||||
|
||||
REPO_OWNER = "zed-industries"
|
||||
REPO_NAME = "zed"
|
||||
GITHUB_API_BASE_URL = "https://api.github.com"
|
||||
|
||||
EXCLUDE_LABEL = "ignore top-ranking issues"
|
||||
|
||||
|
||||
@app.command()
|
||||
def main(
|
||||
github_token: Optional[str] = None,
|
||||
issue_reference_number: Optional[int] = None,
|
||||
query_day_interval: Optional[int] = None,
|
||||
) -> None:
|
||||
script_start_time: datetime = datetime.now()
|
||||
start_date: date | None = None
|
||||
|
||||
if query_day_interval:
|
||||
tz = timezone(AMERICA_NEW_YORK_TIMEZONE)
|
||||
today = datetime.now(tz).date()
|
||||
start_date = today - timedelta(days=query_day_interval)
|
||||
|
||||
# GitHub Workflow will pass in the token as an argument,
|
||||
# but we can place it in our env when running the script locally, for convenience
|
||||
token = github_token or os.getenv("GITHUB_ACCESS_TOKEN")
|
||||
if not token:
|
||||
raise typer.BadParameter(
|
||||
"GitHub token is required. Pass --github-token or set GITHUB_ACCESS_TOKEN env var."
|
||||
)
|
||||
|
||||
headers = {
|
||||
"Authorization": f"token {token}",
|
||||
"Accept": "application/vnd.github+json",
|
||||
}
|
||||
|
||||
section_to_issues = get_section_to_issues(headers, start_date)
|
||||
issue_text: str = create_issue_text(section_to_issues)
|
||||
|
||||
if issue_reference_number:
|
||||
update_reference_issue(headers, issue_reference_number, issue_text)
|
||||
else:
|
||||
print(issue_text)
|
||||
|
||||
run_duration: timedelta = datetime.now() - script_start_time
|
||||
print(f"Ran for {run_duration}")
|
||||
|
||||
|
||||
def get_section_to_issues(
|
||||
headers: dict[str, str], start_date: date | None = None
|
||||
) -> dict[str, list[dict[str, Any]]]:
|
||||
"""Fetch top-ranked issues for each section from GitHub."""
|
||||
|
||||
section_filters = {
|
||||
"Bugs": "type:Bug",
|
||||
"Crashes": "type:Crash",
|
||||
"Features": "type:Feature",
|
||||
"Tracking issues": "type:Tracking",
|
||||
"Meta issues": "type:Meta",
|
||||
"Windows": 'label:"platform:windows"',
|
||||
}
|
||||
|
||||
section_to_issues: dict[str, list[dict[str, Any]]] = {}
|
||||
for section, search_qualifier in section_filters.items():
|
||||
query_parts = [
|
||||
f"repo:{REPO_OWNER}/{REPO_NAME}",
|
||||
"is:issue",
|
||||
"is:open",
|
||||
f'-label:"{EXCLUDE_LABEL}"',
|
||||
search_qualifier,
|
||||
]
|
||||
|
||||
if start_date:
|
||||
query_parts.append(f"created:>={start_date.strftime('%Y-%m-%d')}")
|
||||
|
||||
query = " ".join(query_parts)
|
||||
url = f"{GITHUB_API_BASE_URL}/search/issues"
|
||||
params = {
|
||||
"q": query,
|
||||
"sort": "reactions-+1",
|
||||
"order": "desc",
|
||||
"per_page": ISSUES_TO_FETCH, # this will work as long as it's ≤ 100
|
||||
}
|
||||
|
||||
# we are only fetching one page on purpose
|
||||
response = requests.get(url, headers=headers, params=params)
|
||||
response.raise_for_status()
|
||||
items = response.json()["items"]
|
||||
|
||||
issues: list[dict[str, Any]] = []
|
||||
for item in items:
|
||||
reactions = item["reactions"]
|
||||
score = reactions["+1"] - reactions["-1"]
|
||||
if score > 0:
|
||||
issues.append({
|
||||
"url": item["html_url"],
|
||||
"score": score,
|
||||
"created_at": item["created_at"],
|
||||
})
|
||||
|
||||
if not issues:
|
||||
continue
|
||||
|
||||
issues.sort(key=lambda x: (-x["score"], x["created_at"]))
|
||||
section_to_issues[section] = issues[:ISSUES_PER_SECTION]
|
||||
|
||||
# Sort sections by total score (highest total first)
|
||||
section_to_issues = dict(
|
||||
sorted(
|
||||
section_to_issues.items(),
|
||||
key=lambda item: sum(issue["score"] for issue in item[1]),
|
||||
reverse=True,
|
||||
)
|
||||
)
|
||||
return section_to_issues
|
||||
|
||||
|
||||
def update_reference_issue(
|
||||
headers: dict[str, str], issue_number: int, body: str
|
||||
) -> None:
|
||||
url = f"{GITHUB_API_BASE_URL}/repos/{REPO_OWNER}/{REPO_NAME}/issues/{issue_number}"
|
||||
response = requests.patch(url, headers=headers, json={"body": body})
|
||||
response.raise_for_status()
|
||||
|
||||
|
||||
def create_issue_text(section_to_issues: dict[str, list[dict[str, Any]]]) -> str:
|
||||
tz = timezone(AMERICA_NEW_YORK_TIMEZONE)
|
||||
current_datetime: str = datetime.now(tz).strftime(f"{DATETIME_FORMAT} (%Z)")
|
||||
|
||||
lines: list[str] = [f"*Updated on {current_datetime}*"]
|
||||
|
||||
for section, issues in section_to_issues.items():
|
||||
lines.append(f"\n## {section}\n")
|
||||
for i, issue in enumerate(issues):
|
||||
lines.append(f"{i + 1}. {issue['url']} ({issue['score']} :thumbsup:)")
|
||||
|
||||
lines.append("\n---\n")
|
||||
lines.append(
|
||||
"*For details on how this issue is generated, "
|
||||
"[see the script](https://github.com/zed-industries/zed/blob/main/script/update_top_ranking_issues/main.py)*"
|
||||
)
|
||||
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app()
|
||||
@@ -1,14 +0,0 @@
|
||||
[project]
|
||||
name = "update-top-ranking-issues"
|
||||
version = "0.1.0"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.13"
|
||||
dependencies = [
|
||||
"mypy>=1.15.0",
|
||||
"pytz>=2025.1",
|
||||
"requests>=2.32.0",
|
||||
"ruff>=0.9.7",
|
||||
"typer>=0.15.1",
|
||||
"types-pytz>=2025.1.0.20250204",
|
||||
"types-requests>=2.32.0",
|
||||
]
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"venvPath": ".",
|
||||
"venv": ".venv"
|
||||
}
|
||||
Generated
-274
@@ -1,274 +0,0 @@
|
||||
version = 1
|
||||
revision = 3
|
||||
requires-python = ">=3.13"
|
||||
|
||||
[[package]]
|
||||
name = "certifi"
|
||||
version = "2024.8.30"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9", size = 168507, upload-time = "2024-08-30T01:55:04.365Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", size = 167321, upload-time = "2024-08-30T01:55:02.591Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "charset-normalizer"
|
||||
version = "3.4.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", size = 106620, upload-time = "2024-10-09T07:40:20.413Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/f3/89/68a4c86f1a0002810a27f12e9a7b22feb198c59b2f05231349fbce5c06f4/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", size = 194617, upload-time = "2024-10-09T07:39:07.317Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/4f/cd/8947fe425e2ab0aa57aceb7807af13a0e4162cd21eee42ef5b053447edf5/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", size = 125310, upload-time = "2024-10-09T07:39:08.353Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/5b/f0/b5263e8668a4ee9becc2b451ed909e9c27058337fda5b8c49588183c267a/charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", size = 119126, upload-time = "2024-10-09T07:39:09.327Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ff/6e/e445afe4f7fda27a533f3234b627b3e515a1b9429bc981c9a5e2aa5d97b6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", size = 139342, upload-time = "2024-10-09T07:39:10.322Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/a1/b2/4af9993b532d93270538ad4926c8e37dc29f2111c36f9c629840c57cd9b3/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", size = 149383, upload-time = "2024-10-09T07:39:12.042Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/fb/6f/4e78c3b97686b871db9be6f31d64e9264e889f8c9d7ab33c771f847f79b7/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", size = 142214, upload-time = "2024-10-09T07:39:13.059Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/2b/c9/1c8fe3ce05d30c87eff498592c89015b19fade13df42850aafae09e94f35/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", size = 144104, upload-time = "2024-10-09T07:39:14.815Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ee/68/efad5dcb306bf37db7db338338e7bb8ebd8cf38ee5bbd5ceaaaa46f257e6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", size = 146255, upload-time = "2024-10-09T07:39:15.868Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/0c/75/1ed813c3ffd200b1f3e71121c95da3f79e6d2a96120163443b3ad1057505/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", size = 140251, upload-time = "2024-10-09T07:39:16.995Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/7d/0d/6f32255c1979653b448d3c709583557a4d24ff97ac4f3a5be156b2e6a210/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", size = 148474, upload-time = "2024-10-09T07:39:18.021Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ac/a0/c1b5298de4670d997101fef95b97ac440e8c8d8b4efa5a4d1ef44af82f0d/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", size = 151849, upload-time = "2024-10-09T07:39:19.243Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/04/4f/b3961ba0c664989ba63e30595a3ed0875d6790ff26671e2aae2fdc28a399/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", size = 149781, upload-time = "2024-10-09T07:39:20.397Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d8/90/6af4cd042066a4adad58ae25648a12c09c879efa4849c705719ba1b23d8c/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482", size = 144970, upload-time = "2024-10-09T07:39:21.452Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/cc/67/e5e7e0cbfefc4ca79025238b43cdf8a2037854195b37d6417f3d0895c4c2/charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", size = 94973, upload-time = "2024-10-09T07:39:22.509Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/65/97/fc9bbc54ee13d33dc54a7fcf17b26368b18505500fc01e228c27b5222d80/charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", size = 102308, upload-time = "2024-10-09T07:39:23.524Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", size = 49446, upload-time = "2024-10-09T07:40:19.383Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "click"
|
||||
version = "8.1.7"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", size = 336121, upload-time = "2023-08-17T17:29:11.868Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", size = 97941, upload-time = "2023-08-17T17:29:10.08Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "colorama"
|
||||
version = "0.4.6"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "3.10"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "markdown-it-py"
|
||||
version = "3.0.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "mdurl" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mdurl"
|
||||
version = "0.1.2"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mypy"
|
||||
version = "1.15.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "mypy-extensions" },
|
||||
{ name = "typing-extensions" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/ce/43/d5e49a86afa64bd3839ea0d5b9c7103487007d728e1293f52525d6d5486a/mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43", size = 3239717, upload-time = "2025-02-05T03:50:34.655Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/6a/9b/fd2e05d6ffff24d912f150b87db9e364fa8282045c875654ce7e32fffa66/mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445", size = 10788592, upload-time = "2025-02-05T03:48:55.789Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/74/37/b246d711c28a03ead1fd906bbc7106659aed7c089d55fe40dd58db812628/mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d", size = 9753611, upload-time = "2025-02-05T03:48:44.581Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/a6/ac/395808a92e10cfdac8003c3de9a2ab6dc7cde6c0d2a4df3df1b815ffd067/mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5", size = 11438443, upload-time = "2025-02-05T03:49:25.514Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d2/8b/801aa06445d2de3895f59e476f38f3f8d610ef5d6908245f07d002676cbf/mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036", size = 12402541, upload-time = "2025-02-05T03:49:57.623Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/c7/67/5a4268782eb77344cc613a4cf23540928e41f018a9a1ec4c6882baf20ab8/mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357", size = 12494348, upload-time = "2025-02-05T03:48:52.361Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/83/3e/57bb447f7bbbfaabf1712d96f9df142624a386d98fb026a761532526057e/mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf", size = 9373648, upload-time = "2025-02-05T03:49:11.395Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/09/4e/a7d65c7322c510de2c409ff3828b03354a7c43f5a8ed458a7a131b41c7b9/mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e", size = 2221777, upload-time = "2025-02-05T03:50:08.348Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mypy-extensions"
|
||||
version = "1.0.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433, upload-time = "2023-02-04T12:11:27.157Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695, upload-time = "2023-02-04T12:11:25.002Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pygments"
|
||||
version = "2.18.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", size = 4891905, upload-time = "2024-05-04T13:42:02.013Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", size = 1205513, upload-time = "2024-05-04T13:41:57.345Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pytz"
|
||||
version = "2025.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/5f/57/df1c9157c8d5a05117e455d66fd7cf6dbc46974f832b1058ed4856785d8a/pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e", size = 319617, upload-time = "2025-01-31T01:54:48.615Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/eb/38/ac33370d784287baa1c3d538978b5e2ea064d4c1b93ffbd12826c190dd10/pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57", size = 507930, upload-time = "2025-01-31T01:54:45.634Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "requests"
|
||||
version = "2.32.3"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "certifi" },
|
||||
{ name = "charset-normalizer" },
|
||||
{ name = "idna" },
|
||||
{ name = "urllib3" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218, upload-time = "2024-05-29T15:37:49.536Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload-time = "2024-05-29T15:37:47.027Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rich"
|
||||
version = "13.9.2"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "markdown-it-py" },
|
||||
{ name = "pygments" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/aa/9e/1784d15b057b0075e5136445aaea92d23955aad2c93eaede673718a40d95/rich-13.9.2.tar.gz", hash = "sha256:51a2c62057461aaf7152b4d611168f93a9fc73068f8ded2790f29fe2b5366d0c", size = 222843, upload-time = "2024-10-04T11:50:31.453Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/67/91/5474b84e505a6ccc295b2d322d90ff6aa0746745717839ee0c5fb4fdcceb/rich-13.9.2-py3-none-any.whl", hash = "sha256:8c82a3d3f8dcfe9e734771313e606b39d8247bb6b826e196f4914b333b743cf1", size = 242117, upload-time = "2024-10-04T11:50:29.123Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ruff"
|
||||
version = "0.9.7"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/39/8b/a86c300359861b186f18359adf4437ac8e4c52e42daa9eedc731ef9d5b53/ruff-0.9.7.tar.gz", hash = "sha256:643757633417907510157b206e490c3aa11cab0c087c912f60e07fbafa87a4c6", size = 3669813, upload-time = "2025-02-20T13:26:52.111Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/b1/f3/3a1d22973291226df4b4e2ff70196b926b6f910c488479adb0eeb42a0d7f/ruff-0.9.7-py3-none-linux_armv6l.whl", hash = "sha256:99d50def47305fe6f233eb8dabfd60047578ca87c9dcb235c9723ab1175180f4", size = 11774588, upload-time = "2025-02-20T13:25:52.253Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/8e/c9/b881f4157b9b884f2994fd08ee92ae3663fb24e34b0372ac3af999aa7fc6/ruff-0.9.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d59105ae9c44152c3d40a9c40d6331a7acd1cdf5ef404fbe31178a77b174ea66", size = 11746848, upload-time = "2025-02-20T13:25:57.279Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/14/89/2f546c133f73886ed50a3d449e6bf4af27d92d2f960a43a93d89353f0945/ruff-0.9.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f313b5800483770bd540cddac7c90fc46f895f427b7820f18fe1822697f1fec9", size = 11177525, upload-time = "2025-02-20T13:26:00.007Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d7/93/6b98f2c12bf28ab9def59c50c9c49508519c5b5cfecca6de871cf01237f6/ruff-0.9.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:042ae32b41343888f59c0a4148f103208bf6b21c90118d51dc93a68366f4e903", size = 11996580, upload-time = "2025-02-20T13:26:03.274Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/8e/3f/b3fcaf4f6d875e679ac2b71a72f6691a8128ea3cb7be07cbb249f477c061/ruff-0.9.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87862589373b33cc484b10831004e5e5ec47dc10d2b41ba770e837d4f429d721", size = 11525674, upload-time = "2025-02-20T13:26:06.073Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f0/48/33fbf18defb74d624535d5d22adcb09a64c9bbabfa755bc666189a6b2210/ruff-0.9.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a17e1e01bee0926d351a1ee9bc15c445beae888f90069a6192a07a84af544b6b", size = 12739151, upload-time = "2025-02-20T13:26:08.964Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/63/b5/7e161080c5e19fa69495cbab7c00975ef8a90f3679caa6164921d7f52f4a/ruff-0.9.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:7c1f880ac5b2cbebd58b8ebde57069a374865c73f3bf41f05fe7a179c1c8ef22", size = 13416128, upload-time = "2025-02-20T13:26:12.54Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/4e/c8/b5e7d61fb1c1b26f271ac301ff6d9de5e4d9a9a63f67d732fa8f200f0c88/ruff-0.9.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e63fc20143c291cab2841dbb8260e96bafbe1ba13fd3d60d28be2c71e312da49", size = 12870858, upload-time = "2025-02-20T13:26:16.794Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/da/cb/2a1a8e4e291a54d28259f8fc6a674cd5b8833e93852c7ef5de436d6ed729/ruff-0.9.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91ff963baed3e9a6a4eba2a02f4ca8eaa6eba1cc0521aec0987da8d62f53cbef", size = 14786046, upload-time = "2025-02-20T13:26:19.85Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ca/6c/c8f8a313be1943f333f376d79724260da5701426c0905762e3ddb389e3f4/ruff-0.9.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88362e3227c82f63eaebf0b2eff5b88990280fb1ecf7105523883ba8c3aaf6fb", size = 12550834, upload-time = "2025-02-20T13:26:23.082Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/9d/ad/f70cf5e8e7c52a25e166bdc84c082163c9c6f82a073f654c321b4dff9660/ruff-0.9.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:0372c5a90349f00212270421fe91874b866fd3626eb3b397ede06cd385f6f7e0", size = 11961307, upload-time = "2025-02-20T13:26:26.738Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/52/d5/4f303ea94a5f4f454daf4d02671b1fbfe2a318b5fcd009f957466f936c50/ruff-0.9.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d76b8ab60e99e6424cd9d3d923274a1324aefce04f8ea537136b8398bbae0a62", size = 11612039, upload-time = "2025-02-20T13:26:30.26Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/eb/c8/bd12a23a75603c704ce86723be0648ba3d4ecc2af07eecd2e9fa112f7e19/ruff-0.9.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0c439bdfc8983e1336577f00e09a4e7a78944fe01e4ea7fe616d00c3ec69a3d0", size = 12168177, upload-time = "2025-02-20T13:26:33.452Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/cc/57/d648d4f73400fef047d62d464d1a14591f2e6b3d4a15e93e23a53c20705d/ruff-0.9.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:115d1f15e8fdd445a7b4dc9a30abae22de3f6bcabeb503964904471691ef7606", size = 12610122, upload-time = "2025-02-20T13:26:37.365Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/49/79/acbc1edd03ac0e2a04ae2593555dbc9990b34090a9729a0c4c0cf20fb595/ruff-0.9.7-py3-none-win32.whl", hash = "sha256:e9ece95b7de5923cbf38893f066ed2872be2f2f477ba94f826c8defdd6ec6b7d", size = 9988751, upload-time = "2025-02-20T13:26:40.366Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/6d/95/67153a838c6b6ba7a2401241fd8a00cd8c627a8e4a0491b8d853dedeffe0/ruff-0.9.7-py3-none-win_amd64.whl", hash = "sha256:3770fe52b9d691a15f0b87ada29c45324b2ace8f01200fb0c14845e499eb0c2c", size = 11002987, upload-time = "2025-02-20T13:26:43.762Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/63/6a/aca01554949f3a401991dc32fe22837baeaccb8a0d868256cbb26a029778/ruff-0.9.7-py3-none-win_arm64.whl", hash = "sha256:b075a700b2533feb7a01130ff656a4ec0d5f340bb540ad98759b8401c32c2037", size = 10177763, upload-time = "2025-02-20T13:26:48.92Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "shellingham"
|
||||
version = "1.5.4"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "typer"
|
||||
version = "0.15.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "click" },
|
||||
{ name = "rich" },
|
||||
{ name = "shellingham" },
|
||||
{ name = "typing-extensions" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/cb/ce/dca7b219718afd37a0068f4f2530a727c2b74a8b6e8e0c0080a4c0de4fcd/typer-0.15.1.tar.gz", hash = "sha256:a0588c0a7fa68a1978a069818657778f86abe6ff5ea6abf472f940a08bfe4f0a", size = 99789, upload-time = "2024-12-04T17:44:58.956Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/d0/cc/0a838ba5ca64dc832aa43f727bd586309846b0ffb2ce52422543e6075e8a/typer-0.15.1-py3-none-any.whl", hash = "sha256:7994fb7b8155b64d3402518560648446072864beefd44aa2dc36972a5972e847", size = 44908, upload-time = "2024-12-04T17:44:57.291Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "types-pytz"
|
||||
version = "2025.1.0.20250204"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/b3/d2/2190c54d53c04491ad72a1df019c5dfa692e6ab6c2dba1be7b6c9d530e30/types_pytz-2025.1.0.20250204.tar.gz", hash = "sha256:00f750132769f1c65a4f7240bc84f13985b4da774bd17dfbe5d9cd442746bd49", size = 10352, upload-time = "2025-02-04T02:39:05.553Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/be/50/65ffad73746f1d8b15992c030e0fd22965fd5ae2c0206dc28873343b3230/types_pytz-2025.1.0.20250204-py3-none-any.whl", hash = "sha256:32ca4a35430e8b94f6603b35beb7f56c32260ddddd4f4bb305fdf8f92358b87e", size = 10059, upload-time = "2025-02-04T02:39:03.899Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "types-requests"
|
||||
version = "2.32.4.20250913"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "urllib3" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/36/27/489922f4505975b11de2b5ad07b4fe1dca0bca9be81a703f26c5f3acfce5/types_requests-2.32.4.20250913.tar.gz", hash = "sha256:abd6d4f9ce3a9383f269775a9835a4c24e5cd6b9f647d64f88aa4613c33def5d", size = 23113, upload-time = "2025-09-13T02:40:02.309Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/2a/20/9a227ea57c1285986c4cf78400d0a91615d25b24e257fd9e2969606bdfae/types_requests-2.32.4.20250913-py3-none-any.whl", hash = "sha256:78c9c1fffebbe0fa487a418e0fa5252017e9c60d1a2da394077f1780f655d7e1", size = 20658, upload-time = "2025-09-13T02:40:01.115Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "typing-extensions"
|
||||
version = "4.12.2"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321, upload-time = "2024-06-07T18:52:15.995Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438, upload-time = "2024-06-07T18:52:13.582Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "update-top-ranking-issues"
|
||||
version = "0.1.0"
|
||||
source = { virtual = "." }
|
||||
dependencies = [
|
||||
{ name = "mypy" },
|
||||
{ name = "pytz" },
|
||||
{ name = "requests" },
|
||||
{ name = "ruff" },
|
||||
{ name = "typer" },
|
||||
{ name = "types-pytz" },
|
||||
{ name = "types-requests" },
|
||||
]
|
||||
|
||||
[package.metadata]
|
||||
requires-dist = [
|
||||
{ name = "mypy", specifier = ">=1.15.0" },
|
||||
{ name = "pytz", specifier = ">=2025.1" },
|
||||
{ name = "requests", specifier = ">=2.32.0" },
|
||||
{ name = "ruff", specifier = ">=0.9.7" },
|
||||
{ name = "typer", specifier = ">=0.15.1" },
|
||||
{ name = "types-pytz", specifier = ">=2025.1.0.20250204" },
|
||||
{ name = "types-requests", specifier = ">=2.32.0" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "urllib3"
|
||||
version = "2.2.3"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", size = 300677, upload-time = "2024-09-12T10:52:18.401Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338, upload-time = "2024-09-12T10:52:16.589Z" },
|
||||
]
|
||||
@@ -1,15 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
bash -euo pipefail
|
||||
source script/lib/blob-store.sh
|
||||
|
||||
commit=$1
|
||||
if [ "$#" -ne 1 ] || ! [[ $commit =~ ^[0-9a-f]{40}$ ]]; then
|
||||
echo "Usage: $0 <git-sha>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
bucket_name="zed-extension-cli"
|
||||
target_triple=$(rustc -vV | sed -n 's|host: ||p')
|
||||
|
||||
upload_to_blob_store_public $bucket_name "target/release/zed-extension" "${commit}/${target_triple}/zed-extension"
|
||||
@@ -1,17 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
bash -euo pipefail
|
||||
source script/lib/blob-store.sh
|
||||
|
||||
bucket_name="zed-nightly-host"
|
||||
version=$(./script/get-crate-version zed)+nightly."${GITHUB_RUN_NUMBER}.${GITHUB_SHA}"
|
||||
|
||||
for file_to_upload in ./release-artifacts/*; do
|
||||
[ -f "$file_to_upload" ] || continue
|
||||
upload_to_blob_store_public $bucket_name "$file_to_upload" "nightly/$(basename "$file_to_upload")"
|
||||
upload_to_blob_store_public $bucket_name "$file_to_upload" "${version}/$(basename "$file_to_upload")"
|
||||
rm -f "$file_to_upload"
|
||||
done
|
||||
|
||||
echo -n ${version} > ./release-artifacts/latest-sha
|
||||
upload_to_blob_store_public $bucket_name "release-artifacts/latest-sha" "nightly/latest-sha"
|
||||
@@ -1,33 +0,0 @@
|
||||
[CmdletBinding()]
|
||||
Param(
|
||||
[Parameter()][string]$Architecture
|
||||
)
|
||||
|
||||
# Based on the template in: https://docs.digitalocean.com/reference/api/spaces-api/
|
||||
$ErrorActionPreference = "Stop"
|
||||
. "$PSScriptRoot\lib\blob-store.ps1"
|
||||
. "$PSScriptRoot\lib\workspace.ps1"
|
||||
|
||||
ParseZedWorkspace
|
||||
Write-Host "Uploading nightly for target: $target"
|
||||
|
||||
$bucketName = "zed-nightly-host"
|
||||
$releaseVersion = & "$PSScriptRoot\get-crate-version.ps1" zed
|
||||
$version = "$releaseVersion+nightly.$env:GITHUB_RUN_NUMBER.$env:GITHUB_SHA"
|
||||
|
||||
# TODO:
|
||||
# Upload remote server files
|
||||
# $remoteServerFiles = Get-ChildItem -Path "target" -Filter "zed-remote-server-*.gz" -Recurse -File
|
||||
# foreach ($file in $remoteServerFiles) {
|
||||
# Upload-ToBlobStore -BucketName $bucketName -FileToUpload $file.FullName -BlobStoreKey "nightly/$($file.Name)"
|
||||
# Remove-Item -Path $file.FullName
|
||||
# }
|
||||
|
||||
UploadToBlobStore -BucketName $bucketName -FileToUpload "target/Zed-$Architecture.exe" -BlobStoreKey "nightly/Zed-$Architecture.exe"
|
||||
UploadToBlobStore -BucketName $bucketName -FileToUpload "target/Zed-$Architecture.exe" -BlobStoreKey "$version/Zed-$Architecture.exe"
|
||||
|
||||
Remove-Item -Path "target/Zed-$Architecture.exe" -ErrorAction SilentlyContinue
|
||||
|
||||
$version | Out-File -FilePath "target/latest-sha" -NoNewline
|
||||
UploadToBlobStore -BucketName $bucketName -FileToUpload "target/latest-sha" -BlobStoreKey "nightly/latest-sha-windows"
|
||||
Remove-Item -Path "target/latest-sha" -ErrorAction SilentlyContinue
|
||||
@@ -1,30 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -eu
|
||||
source script/lib/deploy-helpers.sh
|
||||
|
||||
if [[ $# != 1 ]]; then
|
||||
echo "Usage: $0 <production|staging>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
environment=$1
|
||||
url="$(url_for_environment $environment)"
|
||||
tag="$(tag_for_environment $environment)"
|
||||
|
||||
target_zed_kube_cluster
|
||||
|
||||
deployed_image_id=$(
|
||||
kubectl \
|
||||
--namespace=${environment} \
|
||||
get deployment collab \
|
||||
-o 'jsonpath={.spec.template.spec.containers[0].image}' \
|
||||
| cut -d: -f2
|
||||
)
|
||||
|
||||
echo "Deployed image version: $deployed_image_id"
|
||||
|
||||
git fetch >/dev/null
|
||||
if [[ "$(git rev-parse tags/$tag)" != $deployed_image_id ]]; then
|
||||
echo "NOTE: tags/$tag $(git rev-parse tags/$tag) is not yet deployed"
|
||||
fi;
|
||||
@@ -1,217 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const HELP = `
|
||||
USAGE
|
||||
zed-local [options] [zed args]
|
||||
|
||||
SUMMARY
|
||||
Runs 1-6 instances of Zed using a locally-running collaboration server.
|
||||
Each instance of Zed will be signed in as a different user specified in
|
||||
either \`.admins.json\` or \`.admins.default.json\`.
|
||||
|
||||
All arguments after the initial options will be passed through to the first
|
||||
instance of Zed. This can be used to test SSH remoting along with collab, like
|
||||
so:
|
||||
|
||||
$ script/zed-local -2 ssh://your-ssh-uri-here
|
||||
|
||||
OPTIONS
|
||||
--help Print this help message
|
||||
--release Build Zed in release mode
|
||||
-2, -3, -4, ... Spawn multiple Zed instances, with their windows tiled.
|
||||
--top Arrange the Zed windows so they take up the top half of the screen.
|
||||
--stable Use stable Zed release installed on local machine for all instances (except for the first one).
|
||||
--preview Like --stable, but uses the locally-installed preview release instead.
|
||||
`.trim();
|
||||
|
||||
const { spawn, execSync, execFileSync } = require("child_process");
|
||||
const assert = require("assert");
|
||||
|
||||
let users;
|
||||
if (process.env.SEED_PATH) {
|
||||
users = require(process.env.SEED_PATH).admins;
|
||||
} else {
|
||||
users = require("../crates/collab/seed.default.json").admins;
|
||||
try {
|
||||
const defaultUsers = users;
|
||||
const customUsers = require("../crates/collab/seed.json").admins;
|
||||
assert(customUsers.length > 0);
|
||||
users = customUsers.concat(
|
||||
defaultUsers.filter((user) => !customUsers.includes(user)),
|
||||
);
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
const RESOLUTION_REGEX = /(\d+) x (\d+)/;
|
||||
const DIGIT_FLAG_REGEX = /^--?(\d+)$/;
|
||||
|
||||
let instanceCount = 1;
|
||||
let isReleaseMode = false;
|
||||
let isTop = false;
|
||||
let othersOnStable = false;
|
||||
let othersOnPreview = false;
|
||||
let isStateful = false;
|
||||
|
||||
const args = process.argv.slice(2);
|
||||
while (args.length > 0) {
|
||||
const arg = args[0];
|
||||
|
||||
const digitMatch = arg.match(DIGIT_FLAG_REGEX);
|
||||
if (digitMatch) {
|
||||
instanceCount = parseInt(digitMatch[1]);
|
||||
} else if (arg === "--release") {
|
||||
isReleaseMode = true;
|
||||
} else if (arg == "--stateful") {
|
||||
isStateful = true;
|
||||
} else if (arg === "--top") {
|
||||
isTop = true;
|
||||
} else if (arg === "--help") {
|
||||
console.log(HELP);
|
||||
process.exit(0);
|
||||
} else if (arg === "--stable") {
|
||||
othersOnStable = true;
|
||||
} else if (arg === "--preview") {
|
||||
othersOnPreview = true;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
||||
args.shift();
|
||||
}
|
||||
const os = require("os");
|
||||
const platform = os.platform();
|
||||
|
||||
let screenWidth, screenHeight;
|
||||
const titleBarHeight = 24;
|
||||
|
||||
if (platform === "darwin") {
|
||||
// macOS
|
||||
const displayInfo = JSON.parse(
|
||||
execFileSync("system_profiler", ["SPDisplaysDataType", "-json"], {
|
||||
encoding: "utf8",
|
||||
}),
|
||||
);
|
||||
const mainDisplayResolution = displayInfo?.SPDisplaysDataType?.flatMap(
|
||||
(display) => display?.spdisplays_ndrvs,
|
||||
)
|
||||
?.find((entry) => entry?.spdisplays_main === "spdisplays_yes")
|
||||
?._spdisplays_resolution?.match(RESOLUTION_REGEX);
|
||||
if (!mainDisplayResolution) {
|
||||
throw new Error("Could not parse screen resolution");
|
||||
}
|
||||
screenWidth = parseInt(mainDisplayResolution[1]);
|
||||
screenHeight = parseInt(mainDisplayResolution[2]) - titleBarHeight;
|
||||
} else if (platform === "linux") {
|
||||
// Linux
|
||||
try {
|
||||
const xrandrOutput = execSync('xrandr | grep "\\*" | cut -d" " -f4', {
|
||||
encoding: "utf8",
|
||||
}).trim();
|
||||
[screenWidth, screenHeight] = xrandrOutput.split("x").map(Number);
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
throw new Error("Could not get screen resolution");
|
||||
}
|
||||
} else if (platform === "win32") {
|
||||
// windows
|
||||
try {
|
||||
const resolutionOutput = execSync(
|
||||
`powershell -Command "& {Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.Screen]::PrimaryScreen.WorkingArea.Size}"`,
|
||||
{ encoding: "utf8" },
|
||||
).trim();
|
||||
[screenWidth, screenHeight] = resolutionOutput.match(/\d+/g).map(Number);
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
throw new Error("Could not get screen resolution on Windows");
|
||||
}
|
||||
}
|
||||
|
||||
if (platform !== "win32") {
|
||||
screenHeight -= titleBarHeight;
|
||||
}
|
||||
|
||||
if (isTop) {
|
||||
screenHeight = Math.floor(screenHeight / 2);
|
||||
}
|
||||
|
||||
// Determine the window size for each instance
|
||||
let rows;
|
||||
let columns;
|
||||
switch (instanceCount) {
|
||||
case 1:
|
||||
[rows, columns] = [1, 1];
|
||||
break;
|
||||
case 2:
|
||||
[rows, columns] = [1, 2];
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
[rows, columns] = [2, 2];
|
||||
break;
|
||||
case 5:
|
||||
case 6:
|
||||
[rows, columns] = [2, 3];
|
||||
break;
|
||||
}
|
||||
|
||||
const instanceWidth = Math.floor(screenWidth / columns);
|
||||
const instanceHeight = Math.floor(screenHeight / rows);
|
||||
|
||||
// If a user is specified, make sure it's first in the list
|
||||
const user = process.env.ZED_IMPERSONATE;
|
||||
if (user) {
|
||||
users = [user].concat(users.filter((u) => u !== user));
|
||||
}
|
||||
|
||||
let buildArgs = ["build"];
|
||||
let zedBinary = "target/debug/zed";
|
||||
if (isReleaseMode) {
|
||||
buildArgs.push("--release");
|
||||
zedBinary = "target/release/zed";
|
||||
}
|
||||
|
||||
try {
|
||||
execFileSync("cargo", buildArgs, {
|
||||
stdio: "inherit",
|
||||
});
|
||||
} catch (e) {
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
setTimeout(() => {
|
||||
for (let i = 0; i < instanceCount; i++) {
|
||||
const row = Math.floor(i / columns);
|
||||
const column = i % columns;
|
||||
let position;
|
||||
if (platform == "win32") {
|
||||
position = [column * instanceWidth, row * instanceHeight].join(",");
|
||||
} else {
|
||||
position = [
|
||||
column * instanceWidth,
|
||||
row * instanceHeight + titleBarHeight,
|
||||
].join(",");
|
||||
}
|
||||
const size = [instanceWidth, instanceHeight].join(",");
|
||||
let binaryPath = zedBinary;
|
||||
if (i != 0 && othersOnStable) {
|
||||
binaryPath = "/Applications/Zed.app/Contents/MacOS/zed";
|
||||
} else if (i != 0 && othersOnPreview) {
|
||||
binaryPath = "/Applications/Zed Preview.app/Contents/MacOS/zed";
|
||||
}
|
||||
spawn(binaryPath, i == 0 ? args : [], {
|
||||
stdio: "inherit",
|
||||
env: Object.assign({}, process.env, {
|
||||
ZED_IMPERSONATE: users[i],
|
||||
ZED_WINDOW_POSITION: position,
|
||||
ZED_STATELESS: isStateful && i == 0 ? "" : "1",
|
||||
ZED_ALWAYS_ACTIVE: "1",
|
||||
ZED_SERVER_URL: "http://localhost:3000",
|
||||
ZED_RPC_URL: "http://localhost:8080/rpc",
|
||||
ZED_ADMIN_API_TOKEN: "internal-api-key-secret",
|
||||
ZED_WINDOW_SIZE: size,
|
||||
ZED_CLIENT_CHECKSUM_SEED: "development-checksum-seed",
|
||||
RUST_LOG: process.env.RUST_LOG || "info",
|
||||
}),
|
||||
});
|
||||
}
|
||||
}, 0.1);
|
||||
Reference in New Issue
Block a user