feat: major repository modernization and tracking cleanup
## Summary Comprehensive repository cleanup focusing on plugin dependency management, documentation improvements, and git tracking optimization. ## Key Changes ### 🔧 Core Infrastructure - Synchronized all nu-* dependencies across plugins for version consistency - Enhanced upstream tracking and automation systems - Removed nushell directory from git tracking for cleaner repository management ### 📚 Documentation - Significantly expanded README.md with comprehensive development guides - Added detailed workflow documentation and command references - Improved plugin collection overview and usage examples ### 🧹 Repository Cleanup - Removed legacy bash scripts (build-all.sh, collect-install.sh, make_plugin.sh) - Streamlined automation through unified justfile and nushell script approach - Updated .gitignore with nushell directory and archive patterns - Removed nushell directory from git tracking to prevent unwanted changes ### 🔌 Plugin Updates - **nu_plugin_image**: Major refactoring with modular architecture improvements - **nu_plugin_hashes**: Enhanced functionality and build system improvements - **nu_plugin_highlight**: Updated for new plugin API compatibility - **nu_plugin_clipboard**: Dependency synchronization - **nu_plugin_desktop_notifications**: Version alignment - **nu_plugin_port_extension & nu_plugin_qr_maker**: Consistency updates - **nu_plugin_kcl & nu_plugin_tera**: Submodule synchronization ### 🏗️ Git Tracking Optimization - Removed nushell directory from version control for cleaner repository management - Added comprehensive .gitignore patterns for build artifacts and archives ## Statistics - 2,082 files changed - 2,373 insertions, 339,936 deletions - Net reduction of 337,563 lines (primarily from removing nushell directory tracking) ## Benefits - Complete version consistency across all plugins - Cleaner repository with optimized git tracking - Improved developer experience with streamlined workflows - Enhanced documentation and automation - Reduced repository size and complexity 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
0a460ceeb5
commit
b99dcc83c3
9
.gitignore
vendored
9
.gitignore
vendored
@ -1,6 +1,13 @@
|
||||
wk
|
||||
CLAUDE.md
|
||||
.claude
|
||||
COMMIT_MESSAGE.md
|
||||
wrks
|
||||
nushell
|
||||
nushell-*
|
||||
*.tar.gz
|
||||
#*-nushell-plugins.tar.gz
|
||||
github-com
|
||||
.coder
|
||||
target
|
||||
distribution/nu
|
||||
distribution/nu_plugin*
|
||||
|
98
CHANGELOG.md
Normal file
98
CHANGELOG.md
Normal file
@ -0,0 +1,98 @@
|
||||
# Changelog
|
||||
|
||||
## Changes since commit 0a460ce (2024-09-20)
|
||||
|
||||
### 🎯 Major Updates
|
||||
|
||||
#### Documentation and Repository Structure
|
||||
- **Enhanced README.md**: Significantly expanded documentation with 682 new lines covering:
|
||||
- Comprehensive plugin collection overview
|
||||
- Detailed development workflows and automation
|
||||
- Version consistency system documentation
|
||||
- Advanced upstream tracking system guide
|
||||
- Complete command reference and usage examples
|
||||
|
||||
#### Script and Automation Cleanup
|
||||
- **Removed legacy scripts**: Cleaned up old bash scripts (build-all.sh, collect-install.sh, make_plugin.sh)
|
||||
- **Streamlined automation**: Consolidated script system in favor of unified approach via justfile and nushell scripts
|
||||
|
||||
### 🔧 Plugin Updates and Dependency Management
|
||||
|
||||
#### Nushell Core Updates
|
||||
- **Updated nushell submodule**: Comprehensive update to latest nushell version (0.107.1)
|
||||
- **Synchronized dependencies**: Updated all nu-* dependencies across all plugins for version consistency
|
||||
- **Updated Cargo.lock files**: Refreshed dependency lock files for all plugins
|
||||
|
||||
#### Plugin-Specific Changes
|
||||
|
||||
##### nu_plugin_clipboard
|
||||
- Updated Cargo.toml with new dependency versions
|
||||
- Refreshed Cargo.lock with 253 dependency changes
|
||||
|
||||
##### nu_plugin_desktop_notifications
|
||||
- Updated Cargo.toml for nushell 0.107.1 compatibility
|
||||
- Refreshed Cargo.lock with 218 dependency updates
|
||||
|
||||
##### nu_plugin_hashes
|
||||
- **Enhanced functionality**: Updated hasher.rs implementation
|
||||
- **Build system improvements**: Modified build.rs configuration
|
||||
- Updated Cargo.toml with 24 configuration changes
|
||||
- Refreshed Cargo.lock with 283 dependency updates
|
||||
|
||||
##### nu_plugin_highlight
|
||||
- **Code improvements**: Enhanced highlight.rs and plugin.rs implementations
|
||||
- Updated for new nushell plugin API compatibility
|
||||
- Refreshed Cargo.lock with 476 dependency updates
|
||||
|
||||
##### nu_plugin_image
|
||||
- **Major code refactoring**: Comprehensive updates to image processing modules
|
||||
- **Removed deprecated code**: Deleted ansi_to_image.rs (replaced with modular approach)
|
||||
- **Enhanced modules**:
|
||||
- Updated escape_parser.rs, font_family.rs, internal_scale.rs
|
||||
- Improved palette.rs and printer.rs implementations
|
||||
- Enhanced nu_plugin.rs for both ansi_to_image and image_to_ansi
|
||||
- **Logging improvements**: Updated logger.rs and macros.rs
|
||||
- **Main entry point**: Updated main.rs with new plugin architecture
|
||||
- Refreshed Cargo.lock with 494 dependency updates
|
||||
|
||||
##### nu_plugin_kcl and nu_plugin_tera
|
||||
- Updated submodule references
|
||||
- Synchronized with latest upstream changes
|
||||
|
||||
##### nu_plugin_port_extension and nu_plugin_qr_maker
|
||||
- Updated Cargo.toml for version consistency
|
||||
- Refreshed Cargo.lock files
|
||||
|
||||
#### API KCL Plugin
|
||||
- Updated Cargo.lock with 266 dependency changes
|
||||
|
||||
### 🏗️ Repository Infrastructure Updates
|
||||
|
||||
#### Git Tracking Cleanup
|
||||
- **Removed nushell directory from tracking**: The nushell submodule directory is now properly ignored
|
||||
- **Updated .gitignore**: Added patterns for nushell directory, nushell-* files, and *.tar.gz archives
|
||||
|
||||
### 📊 Statistics Summary
|
||||
|
||||
- **Total files changed**: 2,082
|
||||
- **Lines added**: 2,373
|
||||
- **Lines removed**: 339,936
|
||||
- **Net change**: -337,563 lines (primarily from removing nushell directory from tracking)
|
||||
|
||||
### 🎯 Key Benefits
|
||||
|
||||
1. **Version Consistency**: All plugins now use synchronized nushell dependencies
|
||||
2. **Enhanced Documentation**: Comprehensive guides for development and usage
|
||||
3. **Improved Plugin APIs**: Updated to latest nushell plugin architecture
|
||||
4. **Better Development Experience**: Streamlined automation and clearer workflows
|
||||
5. **Modern Codebase**: Updated to latest Rust and nushell best practices
|
||||
|
||||
### 🔄 Migration Notes
|
||||
|
||||
- Legacy bash scripts have been removed in favor of unified justfile and nushell script approach
|
||||
- All plugins updated to nushell 0.107.1 compatibility
|
||||
- Enhanced upstream tracking system now fully operational
|
||||
- Version consistency checking is now mandatory for all operations
|
||||
- **Important**: The nushell directory is no longer tracked by git - it should be managed as a local dependency
|
||||
|
||||
This represents a major modernization and cleanup of the nushell plugins repository, with streamlined tracking and improved developer experience.
|
712
README.md
712
README.md
@ -1,99 +1,637 @@
|
||||
# Nushell plugins for Provisioning
|
||||
# 🚀 Nushell Plugins Repository
|
||||
|
||||
A [Nushell](https://nushell.sh/) plugins collection for [Provisioning project](https://rlung.librecloud.online/jesus/provisioning)
|
||||
A comprehensive collection of nushell plugins with automated upstream tracking, dependency management, and development workflows.
|
||||
|
||||
>[!WARNING]
|
||||
> This repo contains sub-repos, use git clone --recurse-submodules
|
||||
## 📋 Table of Contents
|
||||
|
||||
```bash
|
||||
git clone --recurse-submodules [URL-to-clone-nushell-plugin]
|
||||
```
|
||||
- [Quick Start](#-quick-start)
|
||||
- [Why This Repository?](#-why-this-repository)
|
||||
- [Plugin Collection](#-plugin-collection)
|
||||
- [Development Workflows](#-development-workflows)
|
||||
- [Upstream Tracking System](#-upstream-tracking-system)
|
||||
- [Scripts and Tools](#-scripts-and-tools)
|
||||
- [File Structure](#-file-structure)
|
||||
- [Installation Methods](#-installation-methods)
|
||||
- [FAQ](#-faq)
|
||||
- [Contributing](#-contributing)
|
||||
|
||||
> [!CAUTION]
|
||||
> **nu_plugin_*** have dependencies to nushell source via local path in Cargo.toml
|
||||
> Nushell and plugins require to be **sync** with same version
|
||||
## 🚀 Quick Start
|
||||
|
||||
## FILES (content layout)
|
||||
|
||||
<pre>
|
||||
.
|
||||
├── collect-install.sh Script to collect all nu_plugin_* and install in /usr/local/bin
|
||||
├── env Main value settings
|
||||
├── pack-dist.sh Script to archive **distribution** nu_plugin_* as architecture-platform.tar.gz
|
||||
├── distribution
|
||||
│ ├── collect-install.sh Script to build and collect nu_plugin_*
|
||||
│ ├── install.sh Script to install nu_plugin_* binaries
|
||||
│ ├── kcl-install.sh Script to install KCL
|
||||
│ ├── install_nu_plugins.nu Nushell script to install nu_plugin_*
|
||||
│ ├── LICENSE
|
||||
│ └── README.txt
|
||||
├── generate Template to generate plugins. Used with make_plugin.sh
|
||||
│ └── nu_plugin_template
|
||||
├── LICENSE
|
||||
├── make_plugin.sh To generate Nushell plugins. Used with generate path
|
||||
├── nushell Nushell repo to be used as path for all nu_plugin_*
|
||||
├── nu_plugin_clipboard
|
||||
├── nu_plugin_desktop_notifications
|
||||
├── nu_plugin_hashes
|
||||
├── nu_plugin_highlight
|
||||
├── nu_plugin_image
|
||||
├── nu_plugin_port_extension
|
||||
├── nu_plugin_qr_maker
|
||||
├── nu_plugin_kcl Repo for nu_plugin_kcl (repo sub-module)
|
||||
├── nu_plugin_tera Repo for nu_plugin_tera (repo sub-module)
|
||||
├── api_nu_plugin_kcl A try to use API KCL, nu_plugin_kcl is recommended option
|
||||
├── bin_archives Repo with plataform binaries as archives
|
||||
└── README.md
|
||||
</pre>
|
||||
|
||||
Main values can be changed in [env](env)
|
||||
```bash
|
||||
export APP_NAME=nushell-plugins
|
||||
export TARGET_PATH=${TARGET_PATH:-distribution}
|
||||
export INSTALL_FILE=${INSTALL_FILE:-install_nu_plugins.nu}
|
||||
export INSTALL_BIN_PATH=${INSTALL_BIN_PATH:-/usr/local/bin}
|
||||
export ARCHIVE_DIR_PATH=${ARCHIVE_DIR_PATH:-/tmp}
|
||||
export BIN_ARCHIVES_DIR_PATH=bin_archives
|
||||
```
|
||||
|
||||
## Build and Install
|
||||
|
||||
- Run [build-all.sh](build-all.sh)
|
||||
```bash
|
||||
./build-all.sh
|
||||
```
|
||||
- Collect all target/release with [collect-install.sh](collect-install.sh), this will:
|
||||
- Run [distribution/collect-install.sh](distribution/collect-install.sh) to copy release binaries into [distribution](distribution) directory
|
||||
- Install [distribution](distribution) directory **nu_plugin_** into $INSTALL_BIN_PATH (**/usr/local/bin**)
|
||||
- Generatel [distribution](distribution) **nu_plugin_** install script in [install_nu_plugin.nu](distribution/install_nu_plugin.nu)
|
||||
- Install [KCL](https://www.kcl-lang.io/) for **nu_plugin_kcl** into $INSTALL_BIN_PATH (**/usr/local/bin**)
|
||||
```bash
|
||||
./collect-install.sh
|
||||
```
|
||||
## Nushell install
|
||||
|
||||
Plugins have to be added from [Nushell](https://nushell.sh/)
|
||||
|
||||
Use [install_nu_plugin.nu](distribution/install_nu_plugin.nu)
|
||||
```
|
||||
distribution/install_nu_plugin.nu
|
||||
```
|
||||
|
||||
## Pack distribution
|
||||
|
||||
[pack-dist.sh](pack-dist.sh) is script to archive **distribution** nu_plugin_* as architecture-platform.tar.gz
|
||||
### Prerequisites
|
||||
|
||||
```bash
|
||||
./pack-dis.sh
|
||||
# Install required tools
|
||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # Rust
|
||||
cargo install just # Just (optional but recommended)
|
||||
# Note: Nushell will be auto-installed if missing
|
||||
```
|
||||
This will generate an architecture-platform.tar.gz like: darwin-arm64-nushell-plugins.tar.gz
|
||||
|
||||
To install in a plataform:
|
||||
### Basic Usage
|
||||
|
||||
```bash
|
||||
cd /tmp
|
||||
tar xzf architecture-platform.tar.gz
|
||||
# Clone the repository
|
||||
git clone <repository-url>
|
||||
cd nushell-plugins
|
||||
|
||||
# Validate nushell version consistency (recommended first step)
|
||||
just validate-nushell
|
||||
|
||||
# Using Just (recommended)
|
||||
just status # Show plugin status
|
||||
just status-mark-locals-ok # Mark local plugins as OK (recommended)
|
||||
just upstream-check # Check for upstream updates
|
||||
just build # Build all plugins
|
||||
just dev-flow # Complete development workflow
|
||||
|
||||
# Using scripts directly (with automatic version checking)
|
||||
./scripts/run.sh plugin_status.nu
|
||||
./scripts/run.sh check_upstream_changes.nu
|
||||
./scripts/run.sh build_all.nu
|
||||
```
|
||||
|
||||
### ⚠️ Critical: Version Consistency
|
||||
|
||||
**This system requires version consistency between your installed nushell and the submodule version.** All operations automatically check version consistency and will fail if versions don't match.
|
||||
|
||||
- **Auto-fix**: `just fix-nushell` or `./scripts/run.sh --fix --check-only`
|
||||
- **Manual check**: `just validate-nushell`
|
||||
|
||||
## 🎯 Why This Repository?
|
||||
|
||||
### The Challenge
|
||||
|
||||
Developing nushell plugins involves several challenges:
|
||||
|
||||
1. **Dependency Management**: Nushell evolves rapidly, requiring frequent dependency updates
|
||||
2. **Upstream Synchronization**: Many plugins have upstream repositories that need tracking
|
||||
3. **Build Consistency**: Ensuring all plugins build with the same nushell version
|
||||
4. **Distribution**: Packaging and distributing multiple plugins efficiently
|
||||
|
||||
### Our Solution
|
||||
|
||||
This repository provides:
|
||||
|
||||
- **🔄 Automated Upstream Tracking**: Monitors upstream changes and auto-approves nu_* dependency updates
|
||||
- **📦 Unified Build System**: Builds all plugins with consistent nushell versions
|
||||
- **🛡️ Safe Merge Process**: Preserves local changes while integrating upstream updates
|
||||
- **🚀 Distribution Pipeline**: Automated packaging and installation scripts
|
||||
- **⚡ Developer Experience**: Just recipes and scripts for common tasks
|
||||
|
||||
## 📦 Plugin Collection
|
||||
|
||||
| Plugin | Status | Type | Description |
|
||||
|--------|--------|------|-------------|
|
||||
| **nu_plugin_clipboard** | ✅ Tracked | Upstream | Clipboard operations (copy/paste) |
|
||||
| **nu_plugin_highlight** | ✅ Tracked | Upstream | Syntax highlighting for source code |
|
||||
| **nu_plugin_image** | 🏠 Local | Local | Image processing and manipulation |
|
||||
| **nu_plugin_hashes** | 🏠 Local | Local | Hash computation utilities |
|
||||
| **nu_plugin_desktop_notifications** | 🏠 Local | Local | Desktop notification system |
|
||||
| **nu_plugin_fluent** | ✅ Tracked | Upstream | Fluent localization framework |
|
||||
| **nu_plugin_tera** | ✅ Tracked | Private | Tera templating engine (private repo) |
|
||||
| **nu_plugin_kcl** | ✅ Tracked | Private | KCL configuration language (private repo) |
|
||||
|
||||
### Legend
|
||||
- ✅ **Tracked**: Has upstream repository with automated tracking
|
||||
- 🏠 **Local**: Developed locally without upstream
|
||||
- 🔒 **Private**: Private repository with tracking (requires authentication)
|
||||
|
||||
## 🔄 Development Workflows
|
||||
|
||||
### Daily Development (Using Just)
|
||||
|
||||
```bash
|
||||
# Check what needs attention
|
||||
just status-attention
|
||||
|
||||
# Update from upstream sources
|
||||
just upstream-check
|
||||
|
||||
# Build and test everything
|
||||
just dev-flow
|
||||
|
||||
# Work on specific plugin
|
||||
just build-plugin nu_plugin_clipboard
|
||||
just test-plugin nu_plugin_clipboard
|
||||
```
|
||||
|
||||
### Release Workflow
|
||||
|
||||
```bash
|
||||
# Complete release pipeline
|
||||
just release-flow
|
||||
|
||||
# Or step by step:
|
||||
just build # Build all plugins
|
||||
just collect # Collect binaries
|
||||
just pack # Create distribution archive
|
||||
```
|
||||
|
||||
### Quality Assurance
|
||||
|
||||
```bash
|
||||
# Run all quality checks
|
||||
just quality-flow
|
||||
|
||||
# Individual checks
|
||||
just fmt # Format code
|
||||
just lint # Run clippy
|
||||
just test # Run tests
|
||||
just audit # Security audit
|
||||
```
|
||||
|
||||
## 🎛️ Upstream Tracking System
|
||||
|
||||
### How It Works
|
||||
|
||||
The upstream tracking system automatically:
|
||||
|
||||
1. **Fetches** latest changes from upstream repositories
|
||||
2. **Analyzes** differences between local and upstream code
|
||||
3. **Auto-approves** changes that only affect nu_* dependencies
|
||||
4. **Flags** other changes for manual review
|
||||
5. **Preserves** local modifications during merges
|
||||
6. **Excludes** specified plugins from tracking operations
|
||||
|
||||
### Configuration
|
||||
|
||||
#### Plugin Registry (`etc/plugin_registry.toml`)
|
||||
|
||||
```toml
|
||||
[plugins.nu_plugin_example]
|
||||
upstream_url = "https://github.com/user/nu_plugin_example"
|
||||
upstream_branch = "main"
|
||||
auto_ok_on_nu_deps_only = true # Auto-approve nu_* dependency changes
|
||||
status = "unknown" # Current status
|
||||
```
|
||||
|
||||
#### Exclusion Configuration (`etc/upstream_exclude.toml`)
|
||||
|
||||
Control which plugins are excluded from upstream operations:
|
||||
|
||||
```toml
|
||||
[exclude]
|
||||
# Plugins to exclude from ALL upstream operations
|
||||
plugins = [
|
||||
"nu_plugin_manual_only",
|
||||
"nu_plugin_deprecated"
|
||||
]
|
||||
|
||||
[exclude.check]
|
||||
# Exclude from checking only (can still be manually merged)
|
||||
plugins = [
|
||||
"nu_plugin_no_auto_check"
|
||||
]
|
||||
|
||||
[exclude.merge]
|
||||
# Exclude from automatic merging (but can still be checked)
|
||||
plugins = [
|
||||
"nu_plugin_complex_merge"
|
||||
]
|
||||
|
||||
[exclude.patterns]
|
||||
# Exclude plugins matching patterns
|
||||
plugins = [
|
||||
"nu_plugin_test_*",
|
||||
"nu_plugin_experimental_*"
|
||||
]
|
||||
```
|
||||
|
||||
### Commands
|
||||
|
||||
```bash
|
||||
# Check all upstream sources
|
||||
just upstream-check
|
||||
|
||||
# Check specific plugin
|
||||
just upstream-check-plugin nu_plugin_clipboard
|
||||
|
||||
# Preview changes before merging
|
||||
just upstream-preview nu_plugin_clipboard
|
||||
|
||||
# Safely merge upstream changes
|
||||
just upstream-merge nu_plugin_clipboard
|
||||
|
||||
# Merge all pending changes
|
||||
just upstream-merge-all
|
||||
|
||||
# Manage exclusions
|
||||
just exclude nu_plugin_test add # Add to exclusion list
|
||||
just exclude nu_plugin_test remove # Remove from exclusion list
|
||||
just exclude-list # Show all excluded plugins
|
||||
```
|
||||
|
||||
### Status System
|
||||
|
||||
| Status | Description | Action Required |
|
||||
|--------|-------------|-----------------|
|
||||
| ✅ `ok` | Synchronized with upstream | None |
|
||||
| ⚠️ `pending` | Changes detected, needs review | Manual review |
|
||||
| ❌ `error` | Error during sync | Investigation |
|
||||
| 🔥 `conflict` | Merge conflicts | Manual resolution |
|
||||
| ❓ `unknown` | Not yet checked | Run upstream check |
|
||||
| 🏠 `local_only` | No upstream repository | None |
|
||||
|
||||
### Status Management
|
||||
|
||||
#### Manual Status Updates
|
||||
|
||||
You can manually update plugin status using justfile recipes or scripts:
|
||||
|
||||
```bash
|
||||
# Update specific plugin status
|
||||
just status-update PLUGIN STATUS
|
||||
just status-update nu_plugin_image ok
|
||||
|
||||
# Mark all local development plugins as OK (recommended)
|
||||
just status-mark-locals-ok
|
||||
|
||||
# Using scripts directly
|
||||
./scripts/run.sh plugin_status.nu update nu_plugin_hashes ok
|
||||
```
|
||||
|
||||
#### Common Status Management Tasks
|
||||
|
||||
```bash
|
||||
# Check current status
|
||||
just status # Full dashboard
|
||||
just status-summary # Quick summary only
|
||||
just status-attention # Only plugins needing attention
|
||||
|
||||
# Mark local plugins as reviewed/OK
|
||||
just status-mark-locals-ok # Marks nu_plugin_image, nu_plugin_hashes, nu_plugin_desktop_notifications as OK
|
||||
|
||||
# Individual updates
|
||||
just status-update nu_plugin_image ok
|
||||
just status-update nu_plugin_highlight pending
|
||||
```
|
||||
|
||||
#### When to Update Status
|
||||
|
||||
- **Local plugins** (`nu_plugin_image`, `nu_plugin_hashes`, `nu_plugin_desktop_notifications`): Mark as `ok` after reviewing local changes
|
||||
- **Upstream plugins**: Status is automatically managed by `just upstream-check`
|
||||
- **Manual override**: Use `status-update` when you need to override automatic status detection
|
||||
|
||||
## 🛠️ Scripts and Tools
|
||||
|
||||
### Consolidated Script System
|
||||
|
||||
The repository now uses a **unified script system** with automatic nushell detection and **mandatory version consistency checking**.
|
||||
|
||||
### Directory Structure
|
||||
|
||||
```
|
||||
scripts/
|
||||
├── run.sh # Universal script runner with version checking
|
||||
├── check_version.nu # Version consistency validator
|
||||
├── lib/
|
||||
│ └── cargo_toml_diff.nu # Cargo.toml analysis library
|
||||
├── check_upstream_changes.nu # Upstream monitoring
|
||||
├── plugin_status.nu # Status dashboard
|
||||
├── safe_merge_upstream.nu # Safe merge operations
|
||||
├── build_all.nu # Build all plugins
|
||||
├── collect_install.nu # Collection for distribution
|
||||
├── pack_dist.nu # Distribution packaging
|
||||
├── make_plugin.nu # Plugin template generator
|
||||
├── update_nu_versions.nu # Dependency version management
|
||||
└── sh/ # Essential shell scripts only
|
||||
├── update_nushell.sh # Nushell installer/updater
|
||||
├── update_nu_versions.sh # Dependency version manager
|
||||
├── test_single.sh # Testing utilities
|
||||
└── test_update.sh # Testing utilities
|
||||
etc/
|
||||
├── plugin_registry.toml # Central plugin configuration
|
||||
└── upstream_exclude.toml # Upstream exclusion configuration
|
||||
```
|
||||
|
||||
### Using the Universal Script Runner
|
||||
|
||||
**All nushell scripts should be run through the universal wrapper for automatic version checking:**
|
||||
|
||||
```bash
|
||||
# Universal wrapper with automatic version checking
|
||||
./scripts/run.sh <script_name> [args...]
|
||||
|
||||
# Status and information
|
||||
./scripts/run.sh plugin_status.nu # Show dashboard
|
||||
./scripts/run.sh plugin_status.nu --all # Include local plugins
|
||||
./scripts/run.sh plugin_status.nu summary # Quick summary
|
||||
|
||||
# Upstream tracking
|
||||
./scripts/run.sh check_upstream_changes.nu # Check all
|
||||
./scripts/run.sh check_upstream_changes.nu --plugin highlight # Check one
|
||||
./scripts/run.sh safe_merge_upstream.nu highlight # Merge one
|
||||
./scripts/run.sh safe_merge_upstream.nu --all # Merge all pending
|
||||
|
||||
# Development
|
||||
./scripts/run.sh build_all.nu # Build all plugins
|
||||
./scripts/run.sh update_nu_versions.nu # Update nu dependencies
|
||||
|
||||
# Version management
|
||||
./scripts/run.sh --check-only # Only check version consistency
|
||||
./scripts/run.sh --fix --check-only # Auto-fix version mismatches
|
||||
```
|
||||
|
||||
### Direct Nushell Script Usage (Advanced)
|
||||
|
||||
**⚠️ Warning: Direct usage skips the universal wrapper's version checking - not recommended**
|
||||
|
||||
```bash
|
||||
# Run from repository root (version checking included in each script)
|
||||
nu scripts/plugin_status.nu
|
||||
nu scripts/check_upstream_changes.nu --plugin highlight
|
||||
nu scripts/build_all.nu --verbose
|
||||
```
|
||||
|
||||
### Version Consistency System
|
||||
|
||||
Every script automatically validates that your system nushell version matches the submodule version:
|
||||
|
||||
- **Automatic detection**: Missing nushell is auto-installed
|
||||
- **Version validation**: System vs submodule version comparison
|
||||
- **Auto-fix capability**: `--fix` flag resolves version mismatches
|
||||
- **Clear error messages**: Detailed guidance when issues occur
|
||||
|
||||
## 📁 File Structure
|
||||
|
||||
```
|
||||
nushell-plugins/
|
||||
├── README.md # This file
|
||||
├── justfile # Just task runner recipes
|
||||
├── env # Environment configuration
|
||||
├── LICENSE # License file
|
||||
├── etc/ # Configuration files
|
||||
│ ├── plugin_registry.toml # Plugin tracking configuration
|
||||
│ └── upstream_exclude.toml # Upstream exclusion configuration
|
||||
├── scripts/ # All automation scripts
|
||||
│ ├── run.sh # Universal script runner
|
||||
│ ├── check_version.nu # Version consistency validator
|
||||
│ ├── *.nu # Nushell script implementations
|
||||
│ ├── lib/ # Shared libraries
|
||||
│ └── sh/ # Essential shell scripts
|
||||
├── generate/ # Plugin templates
|
||||
│ └── nu_plugin_template/ # Base template for new plugins
|
||||
├── distribution/ # Build output directory
|
||||
├── bin_archives/ # Distribution archives
|
||||
├── nushell/ # Nushell submodule (for dependency versions)
|
||||
├── nu_plugin_*/ # Individual plugin directories
|
||||
└── docs/ # Documentation
|
||||
```
|
||||
|
||||
## 📥 Installation Methods
|
||||
|
||||
### Method 1: Repository Clone (Recommended for Development)
|
||||
|
||||
```bash
|
||||
git clone <repository-url>
|
||||
cd nushell-plugins
|
||||
just build # Build all plugins
|
||||
just collect # Prepare for installation
|
||||
|
||||
# Install specific plugins
|
||||
cd distribution
|
||||
./install.sh
|
||||
./install_nu_plugin.nu
|
||||
cd /tmp
|
||||
nu install_nu_plugins.nu --plugins [nu_plugin_clipboard, nu_plugin_highlight]
|
||||
```
|
||||
|
||||
### Method 2: Pre-built Archive
|
||||
|
||||
```bash
|
||||
# Download and extract archive
|
||||
wget https://releases.../linux-amd64-nushell-plugins.tar.gz
|
||||
tar -xzf linux-amd64-nushell-plugins.tar.gz
|
||||
cd nushell-plugins
|
||||
|
||||
# Install all plugins
|
||||
nu install_nu_plugins.nu
|
||||
|
||||
# Or install specific plugins
|
||||
nu install_nu_plugins.nu --plugins [nu_plugin_clipboard]
|
||||
```
|
||||
|
||||
### Method 3: Individual Plugin Installation
|
||||
|
||||
```bash
|
||||
# Build and install single plugin
|
||||
cd nu_plugin_clipboard
|
||||
cargo build --release
|
||||
plugin add target/release/nu_plugin_clipboard
|
||||
```
|
||||
|
||||
### Method 4: Using Cargo
|
||||
|
||||
```bash
|
||||
# For plugins published to crates.io
|
||||
cargo install nu_plugin_clipboard
|
||||
plugin add ~/.cargo/bin/nu_plugin_clipboard
|
||||
```
|
||||
|
||||
## 🎮 Using Just Recipes
|
||||
|
||||
Just provides convenient shortcuts for all common tasks with **automatic version validation**:
|
||||
|
||||
### Version Validation Commands (New!)
|
||||
|
||||
```bash
|
||||
just validate-nushell # Check nushell version consistency
|
||||
just fix-nushell # Auto-fix version mismatches
|
||||
```
|
||||
|
||||
### Basic Commands
|
||||
|
||||
```bash
|
||||
just # Show all available recipes
|
||||
just status # Plugin status dashboard
|
||||
just build # Build all plugins
|
||||
just test # Test all plugins
|
||||
just clean # Clean build artifacts
|
||||
```
|
||||
|
||||
### Upstream Management
|
||||
|
||||
```bash
|
||||
just upstream-check # Check for upstream updates
|
||||
just upstream-merge highlight # Merge specific plugin
|
||||
just upstream-merge-all # Merge all pending
|
||||
```
|
||||
|
||||
### Development Workflows
|
||||
|
||||
**All workflows now include mandatory version validation as the first step:**
|
||||
|
||||
```bash
|
||||
just dev-flow # Validate → Check → Build → Test → Status
|
||||
just release-flow # Validate → Build → Collect → Package
|
||||
just quality-flow # Validate → Format → Lint → Test
|
||||
just update-flow # Update → Fix Version → Update versions → Check upstream
|
||||
```
|
||||
|
||||
### Plugin-Specific Operations
|
||||
|
||||
```bash
|
||||
just build-plugin clipboard # Build specific plugin
|
||||
just test-plugin clipboard # Test specific plugin
|
||||
just install-plugin clipboard # Install plugin locally
|
||||
```
|
||||
|
||||
### Advanced Features
|
||||
|
||||
```bash
|
||||
just interactive # Interactive plugin selection (requires fzf)
|
||||
just watch clipboard # Watch for changes and rebuild (requires entr)
|
||||
just validate # Validate setup and dependencies
|
||||
```
|
||||
|
||||
## ❓ FAQ
|
||||
|
||||
### Q: Why do I get "Version mismatch detected" errors?
|
||||
|
||||
**A:** This system requires your installed nushell version to match the submodule version for consistency. All operations automatically check version consistency and will fail if versions don't match.
|
||||
|
||||
**Solutions:**
|
||||
- **Auto-fix**: `just fix-nushell` or `./scripts/run.sh --fix --check-only`
|
||||
- **Manual check**: `just validate-nushell`
|
||||
- **Skip (not recommended)**: `./scripts/run.sh --no-version-check script.nu`
|
||||
|
||||
### Q: What happened to the bash wrapper scripts?
|
||||
|
||||
**A:** The repository has been consolidated to eliminate script duplication. The old bash wrappers in `scripts/sh/` have been removed in favor of:
|
||||
- **Universal wrapper**: `./scripts/run.sh` with automatic version checking
|
||||
- **Direct nu scripts**: All scripts moved from `scripts/nu/` to `scripts/`
|
||||
- **Just recipes**: Updated to use the new system
|
||||
|
||||
### Q: How does the new script system work?
|
||||
|
||||
**A:** The new system provides:
|
||||
1. **Universal wrapper** (`scripts/run.sh`) with automatic nushell detection and version validation
|
||||
2. **Consolidated scripts** - all nu scripts in `scripts/` directory
|
||||
3. **Mandatory version checking** - every operation validates version consistency
|
||||
4. **Auto-installation** - missing nushell is automatically installed
|
||||
|
||||
### Q: How does automatic upstream tracking work?
|
||||
|
||||
**A:** The system fetches changes from upstream repositories and analyzes them. If only nu_* dependencies changed (like nu-plugin, nu-protocol), it automatically marks the plugin as "OK". Other changes are flagged for manual review. You can exclude specific plugins from tracking using the `etc/upstream_exclude.toml` file.
|
||||
|
||||
### Q: What happens to my local changes during upstream merges?
|
||||
|
||||
**A:** Local changes are preserved. The system:
|
||||
1. Creates backup branches before any merge
|
||||
2. Applies upstream changes in a temporary branch
|
||||
3. Restores your local nu_* dependency versions
|
||||
4. Tests compilation before applying changes
|
||||
5. Rolls back on any failure
|
||||
|
||||
### Q: Can I disable automatic upstream tracking for a plugin?
|
||||
|
||||
**A:** Yes, set `auto_ok_on_nu_deps_only = false` in `etc/plugin_registry.toml` for that plugin.
|
||||
|
||||
### Q: How do I add a new plugin to the repository?
|
||||
|
||||
**A:** Use the template generator:
|
||||
```bash
|
||||
just make-plugin nu_plugin_myfeature
|
||||
# or
|
||||
nu scripts/nu/make_plugin.nu nu_plugin_myfeature
|
||||
```
|
||||
|
||||
### Q: What if upstream tracking fails?
|
||||
|
||||
**A:** Check the plugin status with `just status`. Failed plugins show error details. Common issues:
|
||||
- Network connectivity to upstream repository
|
||||
- Authentication for private repositories
|
||||
- Merge conflicts requiring manual resolution
|
||||
|
||||
### Q: How do I update nushell dependency versions?
|
||||
|
||||
**A:** Use the version updater:
|
||||
```bash
|
||||
just update-nu-versions # Update all plugins
|
||||
just list-nu-versions # Show current versions
|
||||
```
|
||||
|
||||
### Q: Can I use this with my own private plugins?
|
||||
|
||||
**A:** Yes! Add your private repository URLs to `etc/plugin_registry.toml`. The system supports SSH URLs for private repositories.
|
||||
|
||||
### Q: How do I distribute plugins to other systems?
|
||||
|
||||
**A:** Use the distribution pipeline:
|
||||
```bash
|
||||
just build # Build all plugins
|
||||
just collect # Collect binaries
|
||||
just pack # Create archive
|
||||
```
|
||||
|
||||
The resulting archive contains all binaries and installation scripts.
|
||||
|
||||
### Q: What's the difference between shell scripts and nushell scripts?
|
||||
|
||||
**A:**
|
||||
- **Nushell scripts** (`scripts/nu/`): Primary implementation with full features
|
||||
- **Shell scripts** (`scripts/sh/`): Wrappers for compatibility with non-nushell environments
|
||||
- Both provide the same functionality, use whichever fits your environment
|
||||
|
||||
### Q: How do I contribute a new plugin?
|
||||
|
||||
**A:**
|
||||
1. Create the plugin: `just make-plugin nu_plugin_yourname`
|
||||
2. Implement your functionality
|
||||
3. Add upstream URL to `etc/plugin_registry.toml` if it has one
|
||||
4. Test: `just build-plugin nu_plugin_yourname`
|
||||
5. Submit a pull request
|
||||
|
||||
### Q: How do I exclude plugins from upstream tracking?
|
||||
|
||||
**A:** Edit `etc/upstream_exclude.toml` to exclude plugins from specific operations:
|
||||
- Add to `[exclude]` section to exclude from all operations
|
||||
- Add to `[exclude.check]` to skip automatic checks
|
||||
- Add to `[exclude.merge]` to prevent automatic merging
|
||||
- Use patterns like `nu_plugin_test_*` to exclude multiple plugins
|
||||
|
||||
You can also use Just commands:
|
||||
```bash
|
||||
just exclude nu_plugin_test add # Add to exclusion
|
||||
just exclude nu_plugin_test remove # Remove from exclusion
|
||||
just exclude-list # Show excluded plugins
|
||||
```
|
||||
|
||||
### Q: Can I use this system for other Rust projects?
|
||||
|
||||
**A:** The upstream tracking and dependency management concepts can be adapted, but this system is specifically designed for nushell plugins with nu_* dependencies.
|
||||
|
||||
## 🤝 Contributing
|
||||
|
||||
1. Fork the repository
|
||||
2. Create a feature branch: `git checkout -b feature/amazing-feature`
|
||||
3. Make your changes
|
||||
4. Test thoroughly: `just quality-flow`
|
||||
5. Commit your changes: `git commit -m 'Add amazing feature'`
|
||||
6. Push to the branch: `git push origin feature/amazing-feature`
|
||||
7. Open a pull request
|
||||
|
||||
### Development Guidelines
|
||||
|
||||
- Follow existing code style and patterns
|
||||
- Add tests for new functionality
|
||||
- Update documentation for user-facing changes
|
||||
- Use `just quality-flow` before submitting
|
||||
- All scripts should work from repository root
|
||||
|
||||
### Adding New Plugins
|
||||
|
||||
- Use the template generator: `just make-plugin nu_plugin_name`
|
||||
- Follow nushell plugin conventions
|
||||
- Add comprehensive documentation
|
||||
- Include examples and tests
|
||||
|
||||
## 📄 License
|
||||
|
||||
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
||||
|
||||
## 🙏 Acknowledgments
|
||||
|
||||
- [Nushell Team](https://www.nushell.sh/) for the amazing shell and plugin system
|
||||
- Plugin authors for their contributions to the nushell ecosystem
|
||||
- Contributors to this repository
|
||||
|
||||
---
|
||||
|
||||
**Happy Plugin Development! 🎉**
|
268
api_nu_plugin_kcl/Cargo.lock
generated
268
api_nu_plugin_kcl/Cargo.lock
generated
@ -372,6 +372,15 @@ dependencies = [
|
||||
"regex-automata 0.1.10",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "buf-trait"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "21eaafc770e8c073d6c3facafe7617e774305d4954aa6351b9c452eb37ee17b4"
|
||||
dependencies = [
|
||||
"zerocopy 0.7.35",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bumpalo"
|
||||
version = "3.19.0"
|
||||
@ -398,9 +407,27 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
|
||||
|
||||
[[package]]
|
||||
name = "bytesize"
|
||||
version = "1.3.3"
|
||||
version = "2.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2e93abca9e28e0a1b9877922aacb20576e05d4679ffa78c3d6dc22a26a216659"
|
||||
checksum = "f5c434ae3cf0089ca203e9019ebe529c47ff45cefe8af7c85ecb734ef541822f"
|
||||
|
||||
[[package]]
|
||||
name = "byteyarn"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b93e51d26468a15ea59f8525e0c13dc405db43e644a0b1e6d44346c72cf4cf7b"
|
||||
dependencies = [
|
||||
"buf-trait",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "castaway"
|
||||
version = "0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a"
|
||||
dependencies = [
|
||||
"rustversion",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
@ -1010,9 +1037,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "fancy-regex"
|
||||
version = "0.14.0"
|
||||
version = "0.16.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6e24cb5a94bcae1e5408b0effca5cd7172ea3c5755049c5f3af4cd283a165298"
|
||||
checksum = "998b056554fbe42e03ae0e152895cd1a7e1002aec800fdc6635d20270260c46f"
|
||||
dependencies = [
|
||||
"bit-set 0.8.0",
|
||||
"regex-automata 0.4.9",
|
||||
@ -1671,9 +1698,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "2.9.0"
|
||||
version = "2.11.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
|
||||
checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5"
|
||||
dependencies = [
|
||||
"equivalent",
|
||||
"hashbrown 0.15.4",
|
||||
@ -2238,7 +2265,7 @@ name = "kclvm-primitives"
|
||||
version = "0.11.2"
|
||||
source = "git+https://github.com/kcl-lang/kcl#d5a5ae33e38154dc1251bddd5759423f44c95dcc"
|
||||
dependencies = [
|
||||
"indexmap 2.9.0",
|
||||
"indexmap 2.11.4",
|
||||
"rustc-hash 2.1.1",
|
||||
]
|
||||
|
||||
@ -2467,6 +2494,18 @@ version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
||||
|
||||
[[package]]
|
||||
name = "lean_string"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "962df00ba70ac8d5ca5c064e17e5c3d090c087fd8d21aa45096c716b169da514"
|
||||
dependencies = [
|
||||
"castaway",
|
||||
"itoa",
|
||||
"ryu",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.174"
|
||||
@ -2853,9 +2892,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-cmd-base"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"indexmap 2.9.0",
|
||||
"indexmap 2.11.4",
|
||||
"miette",
|
||||
"nu-engine",
|
||||
"nu-parser",
|
||||
@ -2865,11 +2904,12 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-cmd-lang"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"itertools 0.14.0",
|
||||
"nu-cmd-base",
|
||||
"nu-engine",
|
||||
"nu-experimental",
|
||||
"nu-parser",
|
||||
"nu-protocol",
|
||||
"nu-utils",
|
||||
@ -2878,7 +2918,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-derive-value"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"heck 0.5.0",
|
||||
"proc-macro-error2",
|
||||
@ -2889,22 +2929,32 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-engine"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"fancy-regex 0.16.2",
|
||||
"log",
|
||||
"nu-experimental",
|
||||
"nu-glob",
|
||||
"nu-path",
|
||||
"nu-protocol",
|
||||
"nu-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nu-experimental"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"itertools 0.14.0",
|
||||
"thiserror 2.0.12",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nu-glob"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
|
||||
[[package]]
|
||||
name = "nu-parser"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"bytesize",
|
||||
"chrono",
|
||||
@ -2920,7 +2970,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-path"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"dirs",
|
||||
"omnipath",
|
||||
@ -2930,7 +2980,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"log",
|
||||
"nix",
|
||||
@ -2944,7 +2994,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin-core"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"interprocess",
|
||||
"log",
|
||||
@ -2958,7 +3008,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin-engine"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"log",
|
||||
"nu-engine",
|
||||
@ -2973,7 +3023,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin-protocol"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"nu-protocol",
|
||||
"nu-utils",
|
||||
@ -2985,7 +3035,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin-test-support"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"nu-ansi-term",
|
||||
"nu-cmd-lang",
|
||||
@ -3001,7 +3051,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-protocol"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"brotli",
|
||||
"bytes",
|
||||
@ -3009,15 +3059,16 @@ dependencies = [
|
||||
"chrono-humanize",
|
||||
"dirs",
|
||||
"dirs-sys",
|
||||
"fancy-regex 0.14.0",
|
||||
"fancy-regex 0.16.2",
|
||||
"heck 0.5.0",
|
||||
"indexmap 2.9.0",
|
||||
"indexmap 2.11.4",
|
||||
"log",
|
||||
"lru",
|
||||
"memchr",
|
||||
"miette",
|
||||
"nix",
|
||||
"nu-derive-value",
|
||||
"nu-experimental",
|
||||
"nu-glob",
|
||||
"nu-path",
|
||||
"nu-system",
|
||||
@ -3038,7 +3089,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-system"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"itertools 0.14.0",
|
||||
@ -3056,13 +3107,16 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-utils"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"byteyarn",
|
||||
"crossterm",
|
||||
"crossterm_winapi",
|
||||
"fancy-regex 0.14.0",
|
||||
"fancy-regex 0.16.2",
|
||||
"lean_string",
|
||||
"log",
|
||||
"lscolors",
|
||||
"memchr",
|
||||
"nix",
|
||||
"num-format",
|
||||
"serde",
|
||||
@ -3149,6 +3203,25 @@ dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "objc2-core-foundation"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166"
|
||||
dependencies = [
|
||||
"bitflags 2.9.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "objc2-io-kit"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "71c1c64d6120e51cd86033f67176b1cb66780c2efe34dec55176f77befd93c0a"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"objc2-core-foundation",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "object"
|
||||
version = "0.36.7"
|
||||
@ -3369,7 +3442,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db"
|
||||
dependencies = [
|
||||
"fixedbitset",
|
||||
"indexmap 2.9.0",
|
||||
"indexmap 2.11.4",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -3464,7 +3537,7 @@ version = "0.2.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
|
||||
dependencies = [
|
||||
"zerocopy",
|
||||
"zerocopy 0.8.26",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -3906,26 +3979,6 @@ dependencies = [
|
||||
"rand_core 0.6.4",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rayon"
|
||||
version = "1.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
|
||||
dependencies = [
|
||||
"either",
|
||||
"rayon-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rayon-core"
|
||||
version = "1.12.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
|
||||
dependencies = [
|
||||
"crossbeam-deque",
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "recvmsg"
|
||||
version = "1.0.0"
|
||||
@ -4479,7 +4532,7 @@ name = "serde_yaml"
|
||||
version = "0.9.34+deprecated"
|
||||
source = "git+https://github.com/kcl-lang/kcl#d5a5ae33e38154dc1251bddd5759423f44c95dcc"
|
||||
dependencies = [
|
||||
"indexmap 2.9.0",
|
||||
"indexmap 2.11.4",
|
||||
"itoa",
|
||||
"kclvm-primitives",
|
||||
"ryu",
|
||||
@ -4539,9 +4592,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "shadow-rs"
|
||||
version = "1.2.0"
|
||||
version = "1.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3f6fd27df794ced2ef39872879c93a9f87c012607318af8621cd56d2c3a8b3a2"
|
||||
checksum = "b8aa5c0570cd9654158bd39f0f8caba24edbc058313946e89f4648b1de1ecf49"
|
||||
dependencies = [
|
||||
"const_format",
|
||||
"is_debug",
|
||||
@ -4840,16 +4893,16 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "sysinfo"
|
||||
version = "0.33.1"
|
||||
version = "0.36.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01"
|
||||
checksum = "252800745060e7b9ffb7b2badbd8b31cfa4aa2e61af879d0a3bf2a317c20217d"
|
||||
dependencies = [
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
"memchr",
|
||||
"ntapi",
|
||||
"rayon",
|
||||
"windows 0.57.0",
|
||||
"objc2-core-foundation",
|
||||
"objc2-io-kit",
|
||||
"windows 0.61.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -5195,7 +5248,7 @@ version = "0.22.27"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a"
|
||||
dependencies = [
|
||||
"indexmap 2.9.0",
|
||||
"indexmap 2.11.4",
|
||||
"serde",
|
||||
"serde_spanned",
|
||||
"toml_datetime",
|
||||
@ -5848,12 +5901,24 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windows"
|
||||
version = "0.57.0"
|
||||
version = "0.61.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143"
|
||||
checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893"
|
||||
dependencies = [
|
||||
"windows-core 0.57.0",
|
||||
"windows-targets 0.52.6",
|
||||
"windows-collections",
|
||||
"windows-core 0.61.2",
|
||||
"windows-future",
|
||||
"windows-link",
|
||||
"windows-numerics",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-collections"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8"
|
||||
dependencies = [
|
||||
"windows-core 0.61.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -5868,18 +5933,6 @@ dependencies = [
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-core"
|
||||
version = "0.57.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d"
|
||||
dependencies = [
|
||||
"windows-implement 0.57.0",
|
||||
"windows-interface 0.57.0",
|
||||
"windows-result 0.1.2",
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-core"
|
||||
version = "0.61.2"
|
||||
@ -5894,21 +5947,21 @@ dependencies = [
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-implement"
|
||||
version = "0.56.0"
|
||||
name = "windows-future"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b"
|
||||
checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.104",
|
||||
"windows-core 0.61.2",
|
||||
"windows-link",
|
||||
"windows-threading",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-implement"
|
||||
version = "0.57.0"
|
||||
version = "0.56.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7"
|
||||
checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@ -5937,17 +5990,6 @@ dependencies = [
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-interface"
|
||||
version = "0.57.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-interface"
|
||||
version = "0.59.1"
|
||||
@ -5965,6 +6007,16 @@ version = "0.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
|
||||
|
||||
[[package]]
|
||||
name = "windows-numerics"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1"
|
||||
dependencies = [
|
||||
"windows-core 0.61.2",
|
||||
"windows-link",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-result"
|
||||
version = "0.1.2"
|
||||
@ -6114,6 +6166,15 @@ dependencies = [
|
||||
"windows_x86_64_msvc 0.53.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-threading"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6"
|
||||
dependencies = [
|
||||
"windows-link",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_gnullvm"
|
||||
version = "0.42.2"
|
||||
@ -6376,13 +6437,34 @@ dependencies = [
|
||||
"synstructure 0.13.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.7.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
|
||||
dependencies = [
|
||||
"byteorder",
|
||||
"zerocopy-derive 0.7.35",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.8.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f"
|
||||
dependencies = [
|
||||
"zerocopy-derive",
|
||||
"zerocopy-derive 0.8.26",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.7.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
14
build-all.sh
14
build-all.sh
@ -1,14 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
for plgn in nu_plugin_*
|
||||
do
|
||||
cd $plgn
|
||||
echo "Build $plgn ..."
|
||||
if cargo build -r ; then
|
||||
echo "Created $plgn ..."
|
||||
else
|
||||
echo "Error in $plgn !!"
|
||||
fi
|
||||
echo "---"
|
||||
cd ..
|
||||
done
|
||||
|
@ -1,12 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
ORG=$(pwd)
|
||||
[ -r env ] && . ./env
|
||||
|
||||
[ -z "$TARGET_PATH" ] && echo "Check env values && exit 1
|
||||
[ -z "$INSTALL_BIN_PATH" ] && echo "Check env values && exit 1
|
||||
|
||||
cd $TARGET_PATH || exit 1
|
||||
[ -x collect-install.sh ] && ./collect-install.sh
|
||||
|
||||
cd $ORG || exit 1
|
||||
|
203
etc/plugin_registry.toml
Normal file
203
etc/plugin_registry.toml
Normal file
@ -0,0 +1,203 @@
|
||||
[metadata]
|
||||
version = "1.0.0"
|
||||
last_updated = "2024-09-20"
|
||||
description = "Registry for tracking upstream changes in nushell plugins"
|
||||
|
||||
[plugins.nu_plugin_highlight]
|
||||
upstream_url = "https://github.com/cptpiepmatz/nu-plugin-highlight"
|
||||
upstream_branch = "main"
|
||||
last_checked_commit = ""
|
||||
last_checked_date = ""
|
||||
status = "unknown"
|
||||
auto_ok_on_nu_deps_only = true
|
||||
local_path = "nu_plugin_highlight"
|
||||
has_local_changes = true
|
||||
description = "Syntax highlighting plugin for nushell"
|
||||
|
||||
[plugins.nu_plugin_clipboard]
|
||||
upstream_url = "https://github.com/FMotalleb/nu_plugin_clipboard"
|
||||
upstream_branch = "main"
|
||||
last_checked_commit = ""
|
||||
last_checked_date = ""
|
||||
status = "unknown"
|
||||
auto_ok_on_nu_deps_only = true
|
||||
local_path = "nu_plugin_clipboard"
|
||||
has_local_changes = true
|
||||
description = "Clipboard operations plugin for nushell"
|
||||
|
||||
[plugins.nu_plugin_image]
|
||||
upstream_url = ""
|
||||
upstream_branch = ""
|
||||
last_checked_commit = ""
|
||||
last_checked_date = ""
|
||||
status = "ok"
|
||||
auto_ok_on_nu_deps_only = false
|
||||
local_path = "nu_plugin_image"
|
||||
has_local_changes = true
|
||||
description = "Image processing plugin for nushell (local development)"
|
||||
|
||||
[plugins.nu_plugin_hashes]
|
||||
upstream_url = ""
|
||||
upstream_branch = ""
|
||||
last_checked_commit = ""
|
||||
last_checked_date = ""
|
||||
status = "ok"
|
||||
auto_ok_on_nu_deps_only = false
|
||||
local_path = "nu_plugin_hashes"
|
||||
has_local_changes = true
|
||||
description = "Hash computation plugin for nushell (local development)"
|
||||
|
||||
[plugins.nu_plugin_desktop_notifications]
|
||||
upstream_url = ""
|
||||
upstream_branch = ""
|
||||
last_checked_commit = ""
|
||||
last_checked_date = ""
|
||||
status = "ok"
|
||||
auto_ok_on_nu_deps_only = false
|
||||
local_path = "nu_plugin_desktop_notifications"
|
||||
has_local_changes = true
|
||||
description = "Desktop notifications plugin for nushell (local development)"
|
||||
|
||||
[plugins.nu_plugin_fluent]
|
||||
upstream_url = "https://github.com/YourUsername/nu_plugin_fluent"
|
||||
upstream_branch = "main"
|
||||
last_checked_commit = ""
|
||||
last_checked_date = ""
|
||||
status = "unknown"
|
||||
auto_ok_on_nu_deps_only = true
|
||||
local_path = "nu_plugin_fluent"
|
||||
has_local_changes = true
|
||||
description = "Fluent localization plugin for nushell"
|
||||
|
||||
[plugins.nu_plugin_tera]
|
||||
upstream_url = "ssh://git@repo.jesusperez.pro:32225/jesus/nu_plugin_tera.git"
|
||||
upstream_branch = "main"
|
||||
last_checked_commit = ""
|
||||
last_checked_date = ""
|
||||
status = "unknown"
|
||||
auto_ok_on_nu_deps_only = true
|
||||
local_path = "nu_plugin_tera"
|
||||
has_local_changes = true
|
||||
description = "Tera templating plugin for nushell (private repo)"
|
||||
|
||||
[plugins.nu_plugin_kcl]
|
||||
upstream_url = "ssh://git@repo.jesusperez.pro:32225/jesus/nu_plugin_kcl.git"
|
||||
upstream_branch = "main"
|
||||
last_checked_commit = ""
|
||||
last_checked_date = ""
|
||||
status = "ok"
|
||||
auto_ok_on_nu_deps_only = true
|
||||
local_path = "nu_plugin_kcl"
|
||||
has_local_changes = true
|
||||
description = "KCL configuration language plugin for nushell (private repo)"
|
||||
|
||||
[settings]
|
||||
nu_managed_dependencies = [
|
||||
"nu-plugin",
|
||||
"nu-protocol",
|
||||
"nu-plugin-test-support",
|
||||
"nu-cmd-base",
|
||||
"nu-engine",
|
||||
"nu-parser",
|
||||
"nu-color-config",
|
||||
"nu-ansi-term",
|
||||
"nu-json",
|
||||
"nu-utils",
|
||||
]
|
||||
check_files = [
|
||||
"src/**/*.rs",
|
||||
"Cargo.toml",
|
||||
"README.md",
|
||||
"LICENSE",
|
||||
]
|
||||
auto_merge_enabled = false
|
||||
max_days_between_checks = 7
|
||||
notify_on_pending_changes = true
|
||||
|
||||
["plugins.nu_plugin_highlight"]
|
||||
upstream_url = "https://github.com/cptpiepmatz/nu-plugin-highlight"
|
||||
upstream_branch = "main"
|
||||
last_checked_commit = "ee5c049314cae074dffffddac5c1d4f7a6374b6a"
|
||||
last_checked_date = "2025-09-20 14:35:04"
|
||||
status = "pending"
|
||||
auto_ok_on_nu_deps_only = true
|
||||
local_path = "nu_plugin_highlight"
|
||||
has_local_changes = true
|
||||
description = "Syntax highlighting plugin for nushell"
|
||||
|
||||
["plugins.nu_plugin_clipboard"]
|
||||
upstream_url = "https://github.com/FMotalleb/nu_plugin_clipboard"
|
||||
upstream_branch = "main"
|
||||
last_checked_commit = "ffb98a64720ac18329f578eac9a751dbc99951b5"
|
||||
last_checked_date = "2025-09-20 14:35:06"
|
||||
status = "pending"
|
||||
auto_ok_on_nu_deps_only = true
|
||||
local_path = "nu_plugin_clipboard"
|
||||
has_local_changes = true
|
||||
description = "Clipboard operations plugin for nushell"
|
||||
|
||||
["plugins.nu_plugin_image"]
|
||||
upstream_url = ""
|
||||
upstream_branch = ""
|
||||
last_checked_commit = ""
|
||||
last_checked_date = ""
|
||||
status = "local_only"
|
||||
auto_ok_on_nu_deps_only = false
|
||||
local_path = "nu_plugin_image"
|
||||
has_local_changes = true
|
||||
description = "Image processing plugin for nushell (local development)"
|
||||
|
||||
["plugins.nu_plugin_hashes"]
|
||||
upstream_url = ""
|
||||
upstream_branch = ""
|
||||
last_checked_commit = ""
|
||||
last_checked_date = ""
|
||||
status = "local_only"
|
||||
auto_ok_on_nu_deps_only = false
|
||||
local_path = "nu_plugin_hashes"
|
||||
has_local_changes = true
|
||||
description = "Hash computation plugin for nushell (local development)"
|
||||
|
||||
["plugins.nu_plugin_desktop_notifications"]
|
||||
upstream_url = ""
|
||||
upstream_branch = ""
|
||||
last_checked_commit = ""
|
||||
last_checked_date = ""
|
||||
status = "local_only"
|
||||
auto_ok_on_nu_deps_only = false
|
||||
local_path = "nu_plugin_desktop_notifications"
|
||||
has_local_changes = true
|
||||
description = "Desktop notifications plugin for nushell (local development)"
|
||||
|
||||
["plugins.nu_plugin_fluent"]
|
||||
upstream_url = "https://github.com/YourUsername/nu_plugin_fluent"
|
||||
upstream_branch = "main"
|
||||
last_checked_commit = ""
|
||||
last_checked_date = ""
|
||||
status = "error"
|
||||
auto_ok_on_nu_deps_only = true
|
||||
local_path = "nu_plugin_fluent"
|
||||
has_local_changes = true
|
||||
description = "Fluent localization plugin for nushell"
|
||||
|
||||
["plugins.nu_plugin_tera"]
|
||||
upstream_url = "ssh://git@repo.jesusperez.pro:32225/jesus/nu_plugin_tera.git"
|
||||
upstream_branch = "main"
|
||||
last_checked_commit = "da1ee63a250bfa4ee3c32e846f22b53c00a1385f"
|
||||
last_checked_date = "2025-09-20 14:35:07"
|
||||
status = "ok"
|
||||
auto_ok_on_nu_deps_only = true
|
||||
local_path = "nu_plugin_tera"
|
||||
has_local_changes = true
|
||||
description = "Tera templating plugin for nushell (private repo)"
|
||||
|
||||
["plugins.nu_plugin_kcl"]
|
||||
upstream_url = "ssh://git@repo.jesusperez.pro:32225/jesus/nu_plugin_kcl.git"
|
||||
upstream_branch = "main"
|
||||
last_checked_commit = "02870456387c94bfd68fd26f6bf0cfaf8b3accff"
|
||||
last_checked_date = "2025-09-20 14:35:08"
|
||||
status = "ok"
|
||||
auto_ok_on_nu_deps_only = true
|
||||
local_path = "nu_plugin_kcl"
|
||||
has_local_changes = true
|
||||
description = "KCL configuration language plugin for nushell (private repo)"
|
50
etc/upstream_exclude.toml
Normal file
50
etc/upstream_exclude.toml
Normal file
@ -0,0 +1,50 @@
|
||||
# Upstream Tracking Exclusions Configuration
|
||||
# Plugins listed here will be excluded from upstream tracking operations
|
||||
|
||||
[exclude]
|
||||
# Plugins to exclude from all upstream operations
|
||||
plugins = [
|
||||
# Example: plugins that should never be tracked
|
||||
# "nu_plugin_example",
|
||||
]
|
||||
|
||||
# Exclude from specific operations
|
||||
[exclude.check]
|
||||
# Plugins to exclude from upstream checking only
|
||||
plugins = [
|
||||
# Example: plugins that have upstream but should not be checked automatically
|
||||
# "nu_plugin_manual_only",
|
||||
]
|
||||
|
||||
[exclude.merge]
|
||||
# Plugins to exclude from automatic merging (but can still be checked)
|
||||
plugins = [
|
||||
# Example: plugins that need manual merge handling
|
||||
# "nu_plugin_complex_merge",
|
||||
]
|
||||
|
||||
# Patterns for exclusion (using glob patterns)
|
||||
[exclude.patterns]
|
||||
# Exclude plugins matching these patterns
|
||||
plugins = [
|
||||
# Example: exclude all test plugins
|
||||
# "nu_plugin_test_*",
|
||||
|
||||
# Example: exclude experimental plugins
|
||||
# "nu_plugin_experimental_*",
|
||||
]
|
||||
|
||||
# Metadata about exclusions
|
||||
[metadata]
|
||||
version = "1.0.0"
|
||||
description = "Configuration file for excluding plugins from upstream tracking operations"
|
||||
last_updated = "2024-09-20"
|
||||
|
||||
# Comments explaining exclusion reasons
|
||||
[comments]
|
||||
# Use this section to document why specific plugins are excluded
|
||||
# Format: plugin_name = "reason for exclusion"
|
||||
|
||||
# Example exclusions:
|
||||
# nu_plugin_example = "Upstream repository is archived and no longer maintained"
|
||||
# nu_plugin_manual = "Requires manual merge due to complex local modifications"
|
422
justfile
Normal file
422
justfile
Normal file
@ -0,0 +1,422 @@
|
||||
# Nushell Plugins Development Justfile
|
||||
# Convenient recipes for common development tasks
|
||||
|
||||
# Set shell to bash for compatibility
|
||||
set shell := ["bash", "-c"]
|
||||
|
||||
# Default recipe - show help
|
||||
default:
|
||||
@just --list
|
||||
|
||||
# 🔍 Version Validation Commands
|
||||
|
||||
# Check nushell version consistency
|
||||
validate-nushell:
|
||||
@echo "🔍 Validating nushell version consistency..."
|
||||
@./scripts/run.sh --check-only
|
||||
|
||||
# Fix nushell version mismatches
|
||||
fix-nushell:
|
||||
@echo "🔧 Fixing nushell version mismatches..."
|
||||
@./scripts/run.sh --fix --check-only
|
||||
|
||||
# 📊 Status and Information Commands
|
||||
|
||||
# Show plugin status dashboard
|
||||
status:
|
||||
@echo "📊 Plugin Status Dashboard"
|
||||
@./scripts/run.sh plugin_status.nu
|
||||
|
||||
# Show detailed status for all plugins
|
||||
status-all:
|
||||
@echo "📊 All Plugins Status"
|
||||
@./scripts/run.sh plugin_status.nu --all
|
||||
|
||||
# Show plugins requiring attention
|
||||
status-attention:
|
||||
@echo "🚨 Plugins Requiring Attention"
|
||||
@./scripts/run.sh plugin_status.nu attention
|
||||
|
||||
# Show summary only
|
||||
status-summary:
|
||||
@echo "📊 Quick Summary"
|
||||
@./scripts/run.sh plugin_status.nu summary
|
||||
|
||||
# Update plugin status manually
|
||||
status-update PLUGIN STATUS:
|
||||
@echo "🔄 Updating {{PLUGIN}} status to {{STATUS}}..."
|
||||
@./scripts/run.sh plugin_status.nu update {{PLUGIN}} {{STATUS}}
|
||||
|
||||
# Mark local development plugins as OK
|
||||
status-mark-locals-ok:
|
||||
@echo "✅ Marking local development plugins as OK..."
|
||||
@./scripts/run.sh plugin_status.nu update nu_plugin_image ok
|
||||
@./scripts/run.sh plugin_status.nu update nu_plugin_hashes ok
|
||||
@./scripts/run.sh plugin_status.nu update nu_plugin_desktop_notifications ok
|
||||
@echo "✅ All local plugins marked as OK"
|
||||
|
||||
# 🔄 Upstream Tracking Commands
|
||||
|
||||
# Check upstream changes for all plugins
|
||||
upstream-check:
|
||||
@echo "🔍 Checking upstream changes..."
|
||||
@./scripts/run.sh check_upstream_changes.nu
|
||||
|
||||
# Check upstream for specific plugin
|
||||
upstream-check-plugin PLUGIN:
|
||||
@echo "🔍 Checking upstream for {{PLUGIN}}..."
|
||||
@./scripts/run.sh check_upstream_changes.nu --plugin {{PLUGIN}}
|
||||
|
||||
# Preview merge changes for a plugin
|
||||
upstream-preview PLUGIN:
|
||||
@echo "👀 Preview merge for {{PLUGIN}}..."
|
||||
@./scripts/run.sh safe_merge_upstream.nu --preview {{PLUGIN}}
|
||||
|
||||
# Safely merge upstream changes for a plugin
|
||||
upstream-merge PLUGIN:
|
||||
@echo "🔀 Merging upstream changes for {{PLUGIN}}..."
|
||||
@./scripts/run.sh safe_merge_upstream.nu {{PLUGIN}}
|
||||
|
||||
# Merge all pending upstream changes
|
||||
upstream-merge-all:
|
||||
@echo "🔀 Merging all pending upstream changes..."
|
||||
@./scripts/run.sh safe_merge_upstream.nu --all
|
||||
|
||||
# Force merge upstream for a plugin (even if status is OK)
|
||||
upstream-merge-force PLUGIN:
|
||||
@echo "💪 Force merging {{PLUGIN}}..."
|
||||
@./scripts/run.sh safe_merge_upstream.nu --force {{PLUGIN}}
|
||||
|
||||
# 🔧 Development Commands
|
||||
|
||||
# Build all plugins
|
||||
build:
|
||||
@echo "🔨 Building all plugins..."
|
||||
@./scripts/run.sh build_all.nu
|
||||
|
||||
# Build all plugins with verbose output
|
||||
build-verbose:
|
||||
@echo "🔨 Building all plugins (verbose)..."
|
||||
@./scripts/run.sh build_all.nu --verbose
|
||||
|
||||
# Build all plugins in parallel (experimental)
|
||||
build-parallel:
|
||||
@echo "⚡ Building all plugins in parallel..."
|
||||
@./scripts/run.sh build_all.nu --parallel
|
||||
|
||||
# Create a new plugin from template
|
||||
make-plugin PLUGIN_NAME:
|
||||
@echo "🆕 Creating new plugin: {{PLUGIN_NAME}}"
|
||||
@./scripts/run.sh make_plugin.nu {{PLUGIN_NAME}}
|
||||
|
||||
# Update nu dependency versions
|
||||
update-nu-versions:
|
||||
@echo "🔄 Updating nu dependency versions..."
|
||||
@./scripts/run.sh update_nu_versions.nu
|
||||
|
||||
# List current nu dependency versions
|
||||
list-nu-versions:
|
||||
@echo "📋 Current nu dependency versions:"
|
||||
@./scripts/run.sh update_nu_versions.nu list
|
||||
|
||||
# Update nushell submodule
|
||||
update-nushell:
|
||||
@echo "🔄 Updating nushell submodule..."
|
||||
@bash scripts/sh/update_nushell.sh update
|
||||
|
||||
# 📦 Distribution Commands
|
||||
|
||||
# Collect built plugins for distribution
|
||||
collect:
|
||||
@echo "📦 Collecting plugins for distribution..."
|
||||
@./scripts/run.sh collect_install.nu
|
||||
|
||||
# List available built plugins
|
||||
collect-list:
|
||||
@echo "📋 Available built plugins:"
|
||||
@./scripts/run.sh collect_install.nu --list
|
||||
|
||||
# Create distribution package
|
||||
pack:
|
||||
@echo "📦 Creating distribution package..."
|
||||
@./scripts/run.sh pack_dist.nu
|
||||
|
||||
# Show what would be packaged
|
||||
pack-list:
|
||||
@echo "📋 Files that would be packaged:"
|
||||
@./scripts/run.sh pack_dist.nu --list
|
||||
|
||||
# 🧪 Testing and Quality Commands
|
||||
|
||||
# Run cargo check on all plugins
|
||||
check:
|
||||
@echo "🔍 Running cargo check on all plugins..."
|
||||
@for plugin in nu_plugin_*; do \
|
||||
if [ -d "$$plugin" ]; then \
|
||||
echo "Checking $$plugin..."; \
|
||||
cd "$$plugin" && cargo check && cd ..; \
|
||||
fi; \
|
||||
done
|
||||
|
||||
# Run cargo test on all plugins
|
||||
test:
|
||||
@echo "🧪 Running tests on all plugins..."
|
||||
@for plugin in nu_plugin_*; do \
|
||||
if [ -d "$$plugin" ]; then \
|
||||
echo "Testing $$plugin..."; \
|
||||
cd "$$plugin" && cargo test && cd ..; \
|
||||
fi; \
|
||||
done
|
||||
|
||||
# Run cargo clippy on all plugins
|
||||
lint:
|
||||
@echo "📏 Running clippy on all plugins..."
|
||||
@for plugin in nu_plugin_*; do \
|
||||
if [ -d "$$plugin" ]; then \
|
||||
echo "Linting $$plugin..."; \
|
||||
cd "$$plugin" && cargo clippy -- -D warnings && cd ..; \
|
||||
fi; \
|
||||
done
|
||||
|
||||
# Format all Rust code
|
||||
fmt:
|
||||
@echo "🎨 Formatting Rust code..."
|
||||
@for plugin in nu_plugin_*; do \
|
||||
if [ -d "$$plugin" ]; then \
|
||||
echo "Formatting $$plugin..."; \
|
||||
cd "$$plugin" && cargo fmt && cd ..; \
|
||||
fi; \
|
||||
done
|
||||
|
||||
# 🔒 Security and Maintenance Commands
|
||||
|
||||
# Run cargo audit on all plugins
|
||||
audit:
|
||||
@echo "🔒 Running security audit..."
|
||||
@for plugin in nu_plugin_*; do \
|
||||
if [ -d "$$plugin" ]; then \
|
||||
echo "Auditing $$plugin..."; \
|
||||
cd "$$plugin" && cargo audit && cd ..; \
|
||||
fi; \
|
||||
done
|
||||
|
||||
# Update all dependencies (careful!)
|
||||
update-deps:
|
||||
@echo "⬆️ Updating dependencies (this may break things)..."
|
||||
@for plugin in nu_plugin_*; do \
|
||||
if [ -d "$$plugin" ]; then \
|
||||
echo "Updating deps in $$plugin..."; \
|
||||
cd "$$plugin" && cargo update && cd ..; \
|
||||
fi; \
|
||||
done
|
||||
|
||||
# Clean all build artifacts
|
||||
clean:
|
||||
@echo "🧹 Cleaning build artifacts..."
|
||||
@for plugin in nu_plugin_*; do \
|
||||
if [ -d "$$plugin" ]; then \
|
||||
echo "Cleaning $$plugin..."; \
|
||||
cd "$$plugin" && cargo clean && cd ..; \
|
||||
fi; \
|
||||
done
|
||||
|
||||
# 📋 Plugin-specific Commands
|
||||
|
||||
# Run command on specific plugin
|
||||
plugin PLUGIN CMD:
|
||||
@echo "🔧 Running '{{CMD}}' on {{PLUGIN}}"
|
||||
@cd {{PLUGIN}} && {{CMD}}
|
||||
|
||||
# Build specific plugin
|
||||
build-plugin PLUGIN:
|
||||
@echo "🔨 Building {{PLUGIN}}..."
|
||||
@cd {{PLUGIN}} && cargo build --release
|
||||
|
||||
# Test specific plugin
|
||||
test-plugin PLUGIN:
|
||||
@echo "🧪 Testing {{PLUGIN}}..."
|
||||
@cd {{PLUGIN}} && cargo test
|
||||
|
||||
# Check specific plugin
|
||||
check-plugin PLUGIN:
|
||||
@echo "🔍 Checking {{PLUGIN}}..."
|
||||
@cd {{PLUGIN}} && cargo check
|
||||
|
||||
# Install specific plugin locally
|
||||
install-plugin PLUGIN:
|
||||
@echo "📥 Installing {{PLUGIN}} locally..."
|
||||
@cd {{PLUGIN}} && cargo build --release
|
||||
@echo "To add to nushell: plugin add ./{{PLUGIN}}/target/release/{{PLUGIN}}"
|
||||
|
||||
# 🎯 Workflow Commands
|
||||
|
||||
# Complete development workflow: check version, upstream, build, test
|
||||
dev-flow:
|
||||
@echo "🎯 Running complete development workflow..."
|
||||
@just validate-nushell
|
||||
@just upstream-check
|
||||
@just build
|
||||
@just test
|
||||
@just status
|
||||
|
||||
# Complete release workflow: check version, build, collect, package
|
||||
release-flow:
|
||||
@echo "🚀 Running complete release workflow..."
|
||||
@just validate-nushell
|
||||
@just build
|
||||
@just collect
|
||||
@just pack
|
||||
|
||||
# Quality check workflow: check version, format, lint, test
|
||||
quality-flow:
|
||||
@echo "✨ Running quality check workflow..."
|
||||
@just validate-nushell
|
||||
@just fmt
|
||||
@just lint
|
||||
@just test
|
||||
|
||||
# Update workflow: update nushell, fix version, update versions, check upstream
|
||||
update-flow:
|
||||
@echo "🔄 Running update workflow..."
|
||||
@just update-nushell
|
||||
@just fix-nushell
|
||||
@just update-nu-versions
|
||||
@just upstream-check
|
||||
|
||||
# 🆘 Help and Information
|
||||
|
||||
# Show plugin registry information
|
||||
registry:
|
||||
@echo "📋 Plugin Registry Information:"
|
||||
@if [ -f etc/plugin_registry.toml ]; then \
|
||||
echo "Registry file: etc/plugin_registry.toml"; \
|
||||
echo ""; \
|
||||
echo "Plugins with upstream:"; \
|
||||
grep -A2 "upstream_url.*=" etc/plugin_registry.toml | grep -v "^--" || true; \
|
||||
else \
|
||||
echo "Registry file not found!"; \
|
||||
fi
|
||||
|
||||
# Manage upstream exclusions
|
||||
exclude PLUGIN ACTION="add":
|
||||
#!/usr/bin/env bash
|
||||
EXCLUDE_FILE="etc/upstream_exclude.toml"
|
||||
if [ "$ACTION" = "add" ]; then
|
||||
echo "🚫 Adding {{PLUGIN}} to exclusion list..."
|
||||
# This is a simplified version - you might want to use a proper TOML parser
|
||||
if grep -q "^plugins = \[" "$EXCLUDE_FILE"; then
|
||||
sed -i.bak "/^plugins = \[/s/\]/\"{{PLUGIN}}\", \]/" "$EXCLUDE_FILE"
|
||||
echo "✅ Added {{PLUGIN}} to exclusions"
|
||||
else
|
||||
echo "⚠️ Please manually add {{PLUGIN}} to $EXCLUDE_FILE"
|
||||
fi
|
||||
elif [ "$ACTION" = "remove" ]; then
|
||||
echo "✅ Removing {{PLUGIN}} from exclusion list..."
|
||||
sed -i.bak "s/\"{{PLUGIN}}\",*[[:space:]]*//" "$EXCLUDE_FILE"
|
||||
echo "✅ Removed {{PLUGIN}} from exclusions"
|
||||
elif [ "$ACTION" = "list" ]; then
|
||||
echo "📋 Currently excluded plugins:"
|
||||
if [ -f "$EXCLUDE_FILE" ]; then
|
||||
grep -A10 "\[exclude\]" "$EXCLUDE_FILE" | grep -E "^[[:space:]]*\"" | sed 's/[",]//g' | sed 's/^[[:space:]]*/ - /'
|
||||
else
|
||||
echo "No exclusions file found"
|
||||
fi
|
||||
else
|
||||
echo "❌ Unknown action: $ACTION"
|
||||
echo "Usage: just exclude PLUGIN [add|remove|list]"
|
||||
fi
|
||||
|
||||
# Show excluded plugins
|
||||
exclude-list:
|
||||
@just exclude "" list
|
||||
|
||||
# Show environment configuration
|
||||
env-info:
|
||||
@echo "🌍 Environment Configuration:"
|
||||
@if [ -f env ]; then \
|
||||
cat env; \
|
||||
else \
|
||||
echo "No env file found"; \
|
||||
fi
|
||||
|
||||
# Show system information
|
||||
system-info:
|
||||
@echo "💻 System Information:"
|
||||
@echo "OS: $$(uname -s)"
|
||||
@echo "Architecture: $$(uname -m)"
|
||||
@echo "Nushell: $$(nu --version 2>/dev/null || echo 'Not installed')"
|
||||
@echo "Rust: $$(rustc --version 2>/dev/null || echo 'Not installed')"
|
||||
@echo "Cargo: $$(cargo --version 2>/dev/null || echo 'Not installed')"
|
||||
@echo "Just: $$(just --version 2>/dev/null || echo 'Not installed')"
|
||||
|
||||
# Validate setup and dependencies
|
||||
validate:
|
||||
@echo "✅ Validating setup..."
|
||||
@echo "Checking required tools:"
|
||||
@command -v nu >/dev/null 2>&1 && echo "✅ nushell" || echo "❌ nushell (required)"
|
||||
@command -v cargo >/dev/null 2>&1 && echo "✅ cargo" || echo "❌ cargo (required)"
|
||||
@command -v git >/dev/null 2>&1 && echo "✅ git" || echo "❌ git (required)"
|
||||
@command -v just >/dev/null 2>&1 && echo "✅ just" || echo "❌ just (optional but recommended)"
|
||||
@echo ""
|
||||
@echo "Checking directory structure:"
|
||||
@[ -d scripts ] && echo "✅ scripts directory" || echo "❌ scripts directory"
|
||||
@[ -d etc ] && echo "✅ etc directory" || echo "❌ etc directory"
|
||||
@[ -f etc/plugin_registry.toml ] && echo "✅ plugin registry" || echo "❌ plugin registry"
|
||||
@[ -f etc/upstream_exclude.toml ] && echo "✅ upstream exclusions" || echo "⚠️ upstream exclusions (optional)"
|
||||
@[ -f env ] && echo "✅ env file" || echo "⚠️ env file (optional)"
|
||||
@echo ""
|
||||
@echo "Plugin directories:"
|
||||
@ls -d nu_plugin_* 2>/dev/null | wc -l | xargs echo "📦 Found plugins:"
|
||||
|
||||
# 📚 Documentation Commands
|
||||
|
||||
# Generate plugin documentation
|
||||
docs:
|
||||
@echo "📚 Generating documentation..."
|
||||
@for plugin in nu_plugin_*; do \
|
||||
if [ -d "$$plugin" ]; then \
|
||||
echo "Generating docs for $$plugin..."; \
|
||||
cd "$$plugin" && cargo doc --no-deps && cd ..; \
|
||||
fi; \
|
||||
done
|
||||
|
||||
# Open documentation in browser
|
||||
docs-open PLUGIN:
|
||||
@echo "📖 Opening documentation for {{PLUGIN}}..."
|
||||
@cd {{PLUGIN}} && cargo doc --open
|
||||
|
||||
# 🧰 Advanced Commands
|
||||
|
||||
# Interactive plugin selection (requires fzf)
|
||||
interactive:
|
||||
#!/usr/bin/env bash
|
||||
if command -v fzf >/dev/null 2>&1; then
|
||||
echo "🎯 Interactive Plugin Selection"
|
||||
PLUGIN=$(ls -d nu_plugin_* | fzf --prompt="Select plugin: ")
|
||||
if [ -n "$PLUGIN" ]; then
|
||||
ACTION=$(echo -e "build\ntest\ncheck\nlint\nupstream-check\nupstream-merge\ninstall" | fzf --prompt="Select action: ")
|
||||
if [ -n "$ACTION" ]; then
|
||||
case $ACTION in
|
||||
"upstream-check") just upstream-check-plugin $PLUGIN ;;
|
||||
"upstream-merge") just upstream-merge $PLUGIN ;;
|
||||
"build") just build-plugin $PLUGIN ;;
|
||||
"test") just test-plugin $PLUGIN ;;
|
||||
"check") just check-plugin $PLUGIN ;;
|
||||
"lint") cd $PLUGIN && cargo clippy ;;
|
||||
"install") just install-plugin $PLUGIN ;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
else
|
||||
echo "❌ fzf not installed. Install with: brew install fzf (macOS) or apt install fzf (Ubuntu)"
|
||||
fi
|
||||
|
||||
# Watch for changes and rebuild (requires entr)
|
||||
watch PLUGIN:
|
||||
#!/usr/bin/env bash
|
||||
if command -v entr >/dev/null 2>&1; then
|
||||
echo "👀 Watching {{PLUGIN}} for changes..."
|
||||
find {{PLUGIN}}/src -name "*.rs" | entr just build-plugin {{PLUGIN}}
|
||||
else
|
||||
echo "❌ entr not installed. Install with: brew install entr (macOS) or apt install entr (Ubuntu)"
|
||||
fi
|
@ -1,2 +0,0 @@
|
||||
#!/bin/bash
|
||||
cargo generate --force --path generate/nu_plugin_template
|
255
nu_plugin_clipboard/Cargo.lock
generated
255
nu_plugin_clipboard/Cargo.lock
generated
@ -55,9 +55,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "arboard"
|
||||
version = "3.5.0"
|
||||
version = "3.6.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c1df21f715862ede32a0c525ce2ca4d52626bb0007f8c18b87a384503ac33e70"
|
||||
checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf"
|
||||
dependencies = [
|
||||
"clipboard-win",
|
||||
"log",
|
||||
@ -66,6 +66,7 @@ dependencies = [
|
||||
"objc2-foundation",
|
||||
"parking_lot",
|
||||
"percent-encoding",
|
||||
"windows-sys 0.60.2",
|
||||
"wl-clipboard-rs",
|
||||
"x11rb",
|
||||
]
|
||||
@ -142,6 +143,15 @@ dependencies = [
|
||||
"alloc-stdlib",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "buf-trait"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "21eaafc770e8c073d6c3facafe7617e774305d4954aa6351b9c452eb37ee17b4"
|
||||
dependencies = [
|
||||
"zerocopy",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bumpalo"
|
||||
version = "3.19.0"
|
||||
@ -160,6 +170,24 @@ version = "1.10.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
|
||||
|
||||
[[package]]
|
||||
name = "byteyarn"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b93e51d26468a15ea59f8525e0c13dc405db43e644a0b1e6d44346c72cf4cf7b"
|
||||
dependencies = [
|
||||
"buf-trait",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "castaway"
|
||||
version = "0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a"
|
||||
dependencies = [
|
||||
"rustversion",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.2.27"
|
||||
@ -248,31 +276,6 @@ dependencies = [
|
||||
"cfg-if",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-deque"
|
||||
version = "0.8.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
|
||||
dependencies = [
|
||||
"crossbeam-epoch",
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-epoch"
|
||||
version = "0.9.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.8.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
|
||||
|
||||
[[package]]
|
||||
name = "crossterm"
|
||||
version = "0.28.1"
|
||||
@ -381,9 +384,9 @@ checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59"
|
||||
|
||||
[[package]]
|
||||
name = "fancy-regex"
|
||||
version = "0.14.0"
|
||||
version = "0.16.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6e24cb5a94bcae1e5408b0effca5cd7172ea3c5755049c5f3af4cd283a165298"
|
||||
checksum = "998b056554fbe42e03ae0e152895cd1a7e1002aec800fdc6635d20270260c46f"
|
||||
dependencies = [
|
||||
"bit-set",
|
||||
"regex-automata",
|
||||
@ -512,9 +515,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "2.9.0"
|
||||
version = "2.11.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
|
||||
checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5"
|
||||
dependencies = [
|
||||
"equivalent",
|
||||
"hashbrown",
|
||||
@ -582,6 +585,18 @@ dependencies = [
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lean_string"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "962df00ba70ac8d5ca5c064e17e5c3d090c087fd8d21aa45096c716b169da514"
|
||||
dependencies = [
|
||||
"castaway",
|
||||
"itoa",
|
||||
"ryu",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.174"
|
||||
@ -787,7 +802,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-derive-value"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"proc-macro-error2",
|
||||
@ -798,24 +813,35 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-engine"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"fancy-regex",
|
||||
"log",
|
||||
"nu-experimental",
|
||||
"nu-glob",
|
||||
"nu-path",
|
||||
"nu-protocol",
|
||||
"nu-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nu-experimental"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"itertools 0.14.0",
|
||||
"thiserror 2.0.12",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nu-glob"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
|
||||
[[package]]
|
||||
name = "nu-json"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"linked-hash-map",
|
||||
"nu-utils",
|
||||
"num-traits",
|
||||
"serde",
|
||||
"serde_json",
|
||||
@ -823,7 +849,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-path"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"dirs",
|
||||
"omnipath",
|
||||
@ -833,7 +859,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"log",
|
||||
"nix",
|
||||
@ -847,7 +873,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin-core"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"interprocess",
|
||||
"log",
|
||||
@ -861,7 +887,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin-protocol"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"nu-protocol",
|
||||
"nu-utils",
|
||||
@ -873,7 +899,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-protocol"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"brotli",
|
||||
"bytes",
|
||||
@ -890,6 +916,7 @@ dependencies = [
|
||||
"miette",
|
||||
"nix",
|
||||
"nu-derive-value",
|
||||
"nu-experimental",
|
||||
"nu-glob",
|
||||
"nu-path",
|
||||
"nu-system",
|
||||
@ -910,7 +937,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-system"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"itertools 0.14.0",
|
||||
@ -928,13 +955,16 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-utils"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"byteyarn",
|
||||
"crossterm",
|
||||
"crossterm_winapi",
|
||||
"fancy-regex",
|
||||
"lean_string",
|
||||
"log",
|
||||
"lscolors",
|
||||
"memchr",
|
||||
"nix",
|
||||
"num-format",
|
||||
"serde",
|
||||
@ -946,7 +976,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu_plugin_clipboard"
|
||||
version = "0.105.2"
|
||||
version = "0.107.0"
|
||||
dependencies = [
|
||||
"arboard",
|
||||
"nu-json",
|
||||
@ -1035,6 +1065,16 @@ dependencies = [
|
||||
"objc2-core-foundation",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "objc2-io-kit"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "71c1c64d6120e51cd86033f67176b1cb66780c2efe34dec55176f77befd93c0a"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"objc2-core-foundation",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "objc2-io-surface"
|
||||
version = "0.3.1"
|
||||
@ -1227,26 +1267,6 @@ version = "5.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
|
||||
|
||||
[[package]]
|
||||
name = "rayon"
|
||||
version = "1.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
|
||||
dependencies = [
|
||||
"either",
|
||||
"rayon-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rayon-core"
|
||||
version = "1.12.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
|
||||
dependencies = [
|
||||
"crossbeam-deque",
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "recvmsg"
|
||||
version = "1.0.0"
|
||||
@ -1545,16 +1565,16 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "sysinfo"
|
||||
version = "0.33.1"
|
||||
version = "0.36.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01"
|
||||
checksum = "252800745060e7b9ffb7b2badbd8b31cfa4aa2e61af879d0a3bf2a317c20217d"
|
||||
dependencies = [
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
"memchr",
|
||||
"ntapi",
|
||||
"rayon",
|
||||
"windows 0.57.0",
|
||||
"objc2-core-foundation",
|
||||
"objc2-io-kit",
|
||||
"windows 0.61.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1905,12 +1925,24 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windows"
|
||||
version = "0.57.0"
|
||||
version = "0.61.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143"
|
||||
checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893"
|
||||
dependencies = [
|
||||
"windows-core 0.57.0",
|
||||
"windows-targets 0.52.6",
|
||||
"windows-collections",
|
||||
"windows-core 0.61.2",
|
||||
"windows-future",
|
||||
"windows-link",
|
||||
"windows-numerics",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-collections"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8"
|
||||
dependencies = [
|
||||
"windows-core 0.61.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1925,18 +1957,6 @@ dependencies = [
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-core"
|
||||
version = "0.57.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d"
|
||||
dependencies = [
|
||||
"windows-implement 0.57.0",
|
||||
"windows-interface 0.57.0",
|
||||
"windows-result 0.1.2",
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-core"
|
||||
version = "0.61.2"
|
||||
@ -1951,21 +1971,21 @@ dependencies = [
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-implement"
|
||||
version = "0.56.0"
|
||||
name = "windows-future"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b"
|
||||
checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"windows-core 0.61.2",
|
||||
"windows-link",
|
||||
"windows-threading",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-implement"
|
||||
version = "0.57.0"
|
||||
version = "0.56.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7"
|
||||
checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@ -1994,17 +2014,6 @@ dependencies = [
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-interface"
|
||||
version = "0.57.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-interface"
|
||||
version = "0.59.1"
|
||||
@ -2022,6 +2031,16 @@ version = "0.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
|
||||
|
||||
[[package]]
|
||||
name = "windows-numerics"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1"
|
||||
dependencies = [
|
||||
"windows-core 0.61.2",
|
||||
"windows-link",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-result"
|
||||
version = "0.1.2"
|
||||
@ -2132,6 +2151,15 @@ dependencies = [
|
||||
"windows_x86_64_msvc 0.53.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-threading"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6"
|
||||
dependencies = [
|
||||
"windows-link",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_gnullvm"
|
||||
version = "0.48.5"
|
||||
@ -2314,3 +2342,24 @@ name = "x11rb-protocol"
|
||||
version = "0.13.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d"
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.7.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
|
||||
dependencies = [
|
||||
"byteorder",
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.7.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
@ -12,15 +12,15 @@ keywords = [
|
||||
homepage = "https://github.com/FMotalleb/nu_plugin_clipboard"
|
||||
repository = "https://github.com/FMotalleb/nu_plugin_clipboard"
|
||||
description = "A nushell plugin to copy text into clipboard or get text from it."
|
||||
version = "0.105.2"
|
||||
version = "0.107.0"
|
||||
edition = "2024"
|
||||
readme = "README.md"
|
||||
|
||||
[dependencies]
|
||||
nu-plugin = { version = "0.105.2", path = "../nushell/crates/nu-plugin" }
|
||||
nu-protocol = { version = "0.105.2", features = ["plugin"] , path = "../nushell/crates/nu-protocol" }
|
||||
arboard = { version = "3.5.0", default-features = false }
|
||||
nu-json = { path = "../nushell/crates/nu-json", version = "0.105.2" }
|
||||
nu-plugin = { version = "0.107.1", path = "../nushell/crates/nu-plugin" }
|
||||
nu-protocol = { version = "0.107.1", features = ["plugin"] , path = "../nushell/crates/nu-protocol" }
|
||||
arboard = { version = "3.6.1", default-features = false }
|
||||
nu-json = { version = "0.107.1", path = "../nushell/crates/nu-json" }
|
||||
|
||||
[features]
|
||||
default = [
|
||||
|
220
nu_plugin_desktop_notifications/Cargo.lock
generated
220
nu_plugin_desktop_notifications/Cargo.lock
generated
@ -293,6 +293,15 @@ dependencies = [
|
||||
"alloc-stdlib",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "buf-trait"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "21eaafc770e8c073d6c3facafe7617e774305d4954aa6351b9c452eb37ee17b4"
|
||||
dependencies = [
|
||||
"zerocopy",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bumpalo"
|
||||
version = "3.17.0"
|
||||
@ -311,6 +320,24 @@ version = "1.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9"
|
||||
|
||||
[[package]]
|
||||
name = "byteyarn"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b93e51d26468a15ea59f8525e0c13dc405db43e644a0b1e6d44346c72cf4cf7b"
|
||||
dependencies = [
|
||||
"buf-trait",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "castaway"
|
||||
version = "0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a"
|
||||
dependencies = [
|
||||
"rustversion",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.2.14"
|
||||
@ -399,25 +426,6 @@ dependencies = [
|
||||
"cfg-if",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-deque"
|
||||
version = "0.8.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
|
||||
dependencies = [
|
||||
"crossbeam-epoch",
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-epoch"
|
||||
version = "0.9.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.8.21"
|
||||
@ -588,9 +596,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "fancy-regex"
|
||||
version = "0.14.0"
|
||||
version = "0.16.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6e24cb5a94bcae1e5408b0effca5cd7172ea3c5755049c5f3af4cd283a165298"
|
||||
checksum = "998b056554fbe42e03ae0e152895cd1a7e1002aec800fdc6635d20270260c46f"
|
||||
dependencies = [
|
||||
"bit-set",
|
||||
"regex-automata",
|
||||
@ -727,9 +735,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "2.9.0"
|
||||
version = "2.11.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
|
||||
checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5"
|
||||
dependencies = [
|
||||
"equivalent",
|
||||
"hashbrown",
|
||||
@ -798,10 +806,22 @@ dependencies = [
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.169"
|
||||
name = "lean_string"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
|
||||
checksum = "962df00ba70ac8d5ca5c064e17e5c3d090c087fd8d21aa45096c716b169da514"
|
||||
dependencies = [
|
||||
"castaway",
|
||||
"itoa",
|
||||
"ryu",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.175"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543"
|
||||
|
||||
[[package]]
|
||||
name = "libloading"
|
||||
@ -1033,7 +1053,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-derive-value"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"proc-macro-error2",
|
||||
@ -1044,22 +1064,32 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-engine"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"fancy-regex",
|
||||
"log",
|
||||
"nu-experimental",
|
||||
"nu-glob",
|
||||
"nu-path",
|
||||
"nu-protocol",
|
||||
"nu-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nu-experimental"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"itertools 0.14.0",
|
||||
"thiserror 2.0.12",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nu-glob"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
|
||||
[[package]]
|
||||
name = "nu-path"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"dirs",
|
||||
"omnipath",
|
||||
@ -1069,7 +1099,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"log",
|
||||
"nix",
|
||||
@ -1083,7 +1113,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin-core"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"interprocess",
|
||||
"log",
|
||||
@ -1097,7 +1127,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin-protocol"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"nu-protocol",
|
||||
"nu-utils",
|
||||
@ -1109,7 +1139,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-protocol"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"brotli",
|
||||
"bytes",
|
||||
@ -1126,6 +1156,7 @@ dependencies = [
|
||||
"miette",
|
||||
"nix",
|
||||
"nu-derive-value",
|
||||
"nu-experimental",
|
||||
"nu-glob",
|
||||
"nu-path",
|
||||
"nu-system",
|
||||
@ -1146,7 +1177,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-system"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"itertools 0.14.0",
|
||||
@ -1164,13 +1195,16 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-utils"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"byteyarn",
|
||||
"crossterm",
|
||||
"crossterm_winapi",
|
||||
"fancy-regex",
|
||||
"lean_string",
|
||||
"log",
|
||||
"lscolors",
|
||||
"memchr",
|
||||
"nix",
|
||||
"num-format",
|
||||
"serde",
|
||||
@ -1234,6 +1268,25 @@ dependencies = [
|
||||
"objc_id",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "objc2-core-foundation"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "objc2-io-kit"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "71c1c64d6120e51cd86033f67176b1cb66780c2efe34dec55176f77befd93c0a"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"objc2-core-foundation",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "objc_id"
|
||||
version = "0.1.1"
|
||||
@ -1459,26 +1512,6 @@ dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rayon"
|
||||
version = "1.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
|
||||
dependencies = [
|
||||
"either",
|
||||
"rayon-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rayon-core"
|
||||
version = "1.12.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
|
||||
dependencies = [
|
||||
"crossbeam-deque",
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "recvmsg"
|
||||
version = "1.0.0"
|
||||
@ -1790,16 +1823,16 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "sysinfo"
|
||||
version = "0.33.1"
|
||||
version = "0.36.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01"
|
||||
checksum = "252800745060e7b9ffb7b2badbd8b31cfa4aa2e61af879d0a3bf2a317c20217d"
|
||||
dependencies = [
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
"memchr",
|
||||
"ntapi",
|
||||
"rayon",
|
||||
"windows 0.57.0",
|
||||
"objc2-core-foundation",
|
||||
"objc2-io-kit",
|
||||
"windows 0.61.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -2150,16 +2183,6 @@ dependencies = [
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows"
|
||||
version = "0.57.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143"
|
||||
dependencies = [
|
||||
"windows-core 0.57.0",
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows"
|
||||
version = "0.61.1"
|
||||
@ -2203,18 +2226,6 @@ dependencies = [
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-core"
|
||||
version = "0.57.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d"
|
||||
dependencies = [
|
||||
"windows-implement 0.57.0",
|
||||
"windows-interface 0.57.0",
|
||||
"windows-result 0.1.2",
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-core"
|
||||
version = "0.61.0"
|
||||
@ -2249,17 +2260,6 @@ dependencies = [
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-implement"
|
||||
version = "0.57.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-implement"
|
||||
version = "0.60.0"
|
||||
@ -2282,17 +2282,6 @@ dependencies = [
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-interface"
|
||||
version = "0.57.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-interface"
|
||||
version = "0.59.1"
|
||||
@ -2659,6 +2648,27 @@ dependencies = [
|
||||
"zvariant",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.7.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
|
||||
dependencies = [
|
||||
"byteorder",
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.7.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zvariant"
|
||||
version = "5.4.0"
|
||||
|
@ -1,12 +1,12 @@
|
||||
[dependencies]
|
||||
nu-plugin = { version = "0.105.2", path = "../nushell/crates/nu-plugin" }
|
||||
nu-plugin = { version = "0.107.1", path = "../nushell/crates/nu-plugin" }
|
||||
|
||||
[dependencies.notify-rust]
|
||||
version = "4.11.7"
|
||||
|
||||
[dependencies.nu-protocol]
|
||||
features = ["plugin"]
|
||||
version = "0.105.2"
|
||||
version = "0.107.0"
|
||||
path = "../nushell/crates/nu-protocol"
|
||||
|
||||
[package]
|
||||
@ -19,4 +19,4 @@ license = "MIT"
|
||||
name = "nu_plugin_desktop_notifications"
|
||||
readme = "README.md"
|
||||
repository = "https://github.com/FMotalleb/nu_plugin_desktop_notifications"
|
||||
version = "1.2.12"
|
||||
version = "1.2.12"
|
285
nu_plugin_hashes/Cargo.lock
generated
285
nu_plugin_hashes/Cargo.lock
generated
@ -67,15 +67,15 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
|
||||
|
||||
[[package]]
|
||||
name = "ascon-core"
|
||||
version = "0.4.1"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7c4c9bc969387b7d7e7e931b978833ab18251a39e0f94addad7b823d08b8db74"
|
||||
checksum = "c90c8493a0b3bf8678a82f096821a2c527dd6344bbcef6265bfcc09745f44e24"
|
||||
|
||||
[[package]]
|
||||
name = "ascon-hash"
|
||||
version = "0.2.1"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "00df3a4d2b05a6c06e50ed7e87826a43ddb847c46835cd87caa3a8e633e31777"
|
||||
checksum = "f9a9c93d95a4f3344947e14ad2fd9c1d2ea789c8f8ecef6a906b9ac295301763"
|
||||
dependencies = [
|
||||
"ascon-core",
|
||||
"digest",
|
||||
@ -195,6 +195,15 @@ dependencies = [
|
||||
"alloc-stdlib",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "buf-trait"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "21eaafc770e8c073d6c3facafe7617e774305d4954aa6351b9c452eb37ee17b4"
|
||||
dependencies = [
|
||||
"zerocopy 0.7.35",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bumpalo"
|
||||
version = "3.19.0"
|
||||
@ -215,9 +224,27 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
|
||||
|
||||
[[package]]
|
||||
name = "bytesize"
|
||||
version = "1.3.3"
|
||||
version = "2.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2e93abca9e28e0a1b9877922aacb20576e05d4679ffa78c3d6dc22a26a216659"
|
||||
checksum = "f5c434ae3cf0089ca203e9019ebe529c47ff45cefe8af7c85ecb734ef541822f"
|
||||
|
||||
[[package]]
|
||||
name = "byteyarn"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b93e51d26468a15ea59f8525e0c13dc405db43e644a0b1e6d44346c72cf4cf7b"
|
||||
dependencies = [
|
||||
"buf-trait",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "castaway"
|
||||
version = "0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a"
|
||||
dependencies = [
|
||||
"rustversion",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
@ -333,31 +360,6 @@ dependencies = [
|
||||
"cfg-if",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-deque"
|
||||
version = "0.8.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
|
||||
dependencies = [
|
||||
"crossbeam-epoch",
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-epoch"
|
||||
version = "0.9.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.8.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
|
||||
|
||||
[[package]]
|
||||
name = "crossterm"
|
||||
version = "0.28.1"
|
||||
@ -474,9 +476,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "fancy-regex"
|
||||
version = "0.14.0"
|
||||
version = "0.16.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6e24cb5a94bcae1e5408b0effca5cd7172ea3c5755049c5f3af4cd283a165298"
|
||||
checksum = "998b056554fbe42e03ae0e152895cd1a7e1002aec800fdc6635d20270260c46f"
|
||||
dependencies = [
|
||||
"bit-set",
|
||||
"regex-automata",
|
||||
@ -609,9 +611,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "2.9.0"
|
||||
version = "2.11.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
|
||||
checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5"
|
||||
dependencies = [
|
||||
"equivalent",
|
||||
"hashbrown",
|
||||
@ -705,6 +707,18 @@ dependencies = [
|
||||
"cpufeatures",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lean_string"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "962df00ba70ac8d5ca5c064e17e5c3d090c087fd8d21aa45096c716b169da514"
|
||||
dependencies = [
|
||||
"castaway",
|
||||
"itoa",
|
||||
"ryu",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.174"
|
||||
@ -919,7 +933,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-cmd-base"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"miette",
|
||||
@ -931,11 +945,12 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-cmd-lang"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"itertools 0.14.0",
|
||||
"nu-cmd-base",
|
||||
"nu-engine",
|
||||
"nu-experimental",
|
||||
"nu-parser",
|
||||
"nu-protocol",
|
||||
"nu-utils",
|
||||
@ -944,7 +959,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-derive-value"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"proc-macro-error2",
|
||||
@ -955,22 +970,32 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-engine"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"fancy-regex",
|
||||
"log",
|
||||
"nu-experimental",
|
||||
"nu-glob",
|
||||
"nu-path",
|
||||
"nu-protocol",
|
||||
"nu-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nu-experimental"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"itertools 0.14.0",
|
||||
"thiserror 2.0.12",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nu-glob"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
|
||||
[[package]]
|
||||
name = "nu-parser"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"bytesize",
|
||||
"chrono",
|
||||
@ -986,7 +1011,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-path"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"dirs",
|
||||
"omnipath",
|
||||
@ -996,7 +1021,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"log",
|
||||
"nix",
|
||||
@ -1010,7 +1035,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin-core"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"interprocess",
|
||||
"log",
|
||||
@ -1024,7 +1049,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin-engine"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"log",
|
||||
"nu-engine",
|
||||
@ -1039,7 +1064,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin-protocol"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"nu-protocol",
|
||||
"nu-utils",
|
||||
@ -1051,7 +1076,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin-test-support"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"nu-ansi-term",
|
||||
"nu-cmd-lang",
|
||||
@ -1067,7 +1092,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-protocol"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"brotli",
|
||||
"bytes",
|
||||
@ -1084,6 +1109,7 @@ dependencies = [
|
||||
"miette",
|
||||
"nix",
|
||||
"nu-derive-value",
|
||||
"nu-experimental",
|
||||
"nu-glob",
|
||||
"nu-path",
|
||||
"nu-system",
|
||||
@ -1104,7 +1130,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-system"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"itertools 0.14.0",
|
||||
@ -1122,13 +1148,16 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-utils"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"byteyarn",
|
||||
"crossterm",
|
||||
"crossterm_winapi",
|
||||
"fancy-regex",
|
||||
"lean_string",
|
||||
"log",
|
||||
"lscolors",
|
||||
"memchr",
|
||||
"nix",
|
||||
"num-format",
|
||||
"serde",
|
||||
@ -1203,6 +1232,25 @@ dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "objc2-core-foundation"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "objc2-io-kit"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "71c1c64d6120e51cd86033f67176b1cb66780c2efe34dec55176f77befd93c0a"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"objc2-core-foundation",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "omnipath"
|
||||
version = "0.1.6"
|
||||
@ -1278,7 +1326,7 @@ version = "0.2.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
|
||||
dependencies = [
|
||||
"zerocopy",
|
||||
"zerocopy 0.8.26",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1362,26 +1410,6 @@ dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rayon"
|
||||
version = "1.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
|
||||
dependencies = [
|
||||
"either",
|
||||
"rayon-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rayon-core"
|
||||
version = "1.12.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
|
||||
dependencies = [
|
||||
"crossbeam-deque",
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "recvmsg"
|
||||
version = "1.0.0"
|
||||
@ -1619,9 +1647,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "shadow-rs"
|
||||
version = "1.2.0"
|
||||
version = "1.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3f6fd27df794ced2ef39872879c93a9f87c012607318af8621cd56d2c3a8b3a2"
|
||||
checksum = "b8aa5c0570cd9654158bd39f0f8caba24edbc058313946e89f4648b1de1ecf49"
|
||||
dependencies = [
|
||||
"const_format",
|
||||
"is_debug",
|
||||
@ -1782,16 +1810,16 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "sysinfo"
|
||||
version = "0.33.1"
|
||||
version = "0.36.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01"
|
||||
checksum = "252800745060e7b9ffb7b2badbd8b31cfa4aa2e61af879d0a3bf2a317c20217d"
|
||||
dependencies = [
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
"memchr",
|
||||
"ntapi",
|
||||
"rayon",
|
||||
"windows 0.57.0",
|
||||
"objc2-core-foundation",
|
||||
"objc2-io-kit",
|
||||
"windows 0.61.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -2138,12 +2166,24 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windows"
|
||||
version = "0.57.0"
|
||||
version = "0.61.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143"
|
||||
checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893"
|
||||
dependencies = [
|
||||
"windows-core 0.57.0",
|
||||
"windows-targets 0.52.6",
|
||||
"windows-collections",
|
||||
"windows-core 0.61.2",
|
||||
"windows-future",
|
||||
"windows-link",
|
||||
"windows-numerics",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-collections"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8"
|
||||
dependencies = [
|
||||
"windows-core 0.61.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -2158,18 +2198,6 @@ dependencies = [
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-core"
|
||||
version = "0.57.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d"
|
||||
dependencies = [
|
||||
"windows-implement 0.57.0",
|
||||
"windows-interface 0.57.0",
|
||||
"windows-result 0.1.2",
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-core"
|
||||
version = "0.61.2"
|
||||
@ -2184,21 +2212,21 @@ dependencies = [
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-implement"
|
||||
version = "0.56.0"
|
||||
name = "windows-future"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b"
|
||||
checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"windows-core 0.61.2",
|
||||
"windows-link",
|
||||
"windows-threading",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-implement"
|
||||
version = "0.57.0"
|
||||
version = "0.56.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7"
|
||||
checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@ -2227,17 +2255,6 @@ dependencies = [
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-interface"
|
||||
version = "0.57.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-interface"
|
||||
version = "0.59.1"
|
||||
@ -2255,6 +2272,16 @@ version = "0.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
|
||||
|
||||
[[package]]
|
||||
name = "windows-numerics"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1"
|
||||
dependencies = [
|
||||
"windows-core 0.61.2",
|
||||
"windows-link",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-result"
|
||||
version = "0.1.2"
|
||||
@ -2365,6 +2392,15 @@ dependencies = [
|
||||
"windows_x86_64_msvc 0.53.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-threading"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6"
|
||||
dependencies = [
|
||||
"windows-link",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_gnullvm"
|
||||
version = "0.48.5"
|
||||
@ -2503,13 +2539,34 @@ version = "0.53.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.7.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
|
||||
dependencies = [
|
||||
"byteorder",
|
||||
"zerocopy-derive 0.7.35",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.8.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f"
|
||||
dependencies = [
|
||||
"zerocopy-derive",
|
||||
"zerocopy-derive 0.8.26",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.7.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -33,14 +33,14 @@ default = [
|
||||
]
|
||||
|
||||
[dependencies]
|
||||
nu-cmd-base = { version = "0.105.2", path = "../nushell/crates/nu-cmd-base" }
|
||||
nu-plugin = { version = "0.105.2", path = "../nushell/crates/nu-plugin" }
|
||||
nu-protocol = { version = "0.105.2", path = "../nushell/crates/nu-protocol" }
|
||||
nu-cmd-base = { version = "0.107.1", path = "../nushell/crates/nu-cmd-base" }
|
||||
nu-plugin = { version = "0.107.1", path = "../nushell/crates/nu-plugin" }
|
||||
nu-protocol = { version = "0.107.1", path = "../nushell/crates/nu-protocol" }
|
||||
digest = "0.10.7"
|
||||
ascon-hash = { version = "0.2.0", optional = true }
|
||||
ascon-hash = { version = "0.3.1", optional = true }
|
||||
belt-hash = { version = "0.1.1", optional = true }
|
||||
blake2 = { version = "0.10.6", optional = true }
|
||||
blake3 = { version = "1.6.1", optional = true, default-features = false, features = [
|
||||
blake3 = { version = "1.8.2", optional = true, default-features = false, features = [
|
||||
"std",
|
||||
"traits-preview",
|
||||
] }
|
||||
@ -55,7 +55,7 @@ sha1 = { version = "0.10.6", optional = true }
|
||||
sha2 = { version = "0.10.9", optional = true }
|
||||
sha3 = { version = "0.10.8", optional = true }
|
||||
shabal = { version = "0.4.1", optional = true }
|
||||
skein = { version = "0.1.0", optional = true }
|
||||
skein = { version = "0.1.1", optional = true }
|
||||
sm3 = { version = "0.4.2", optional = true }
|
||||
streebog = { version = "0.10.2", optional = true }
|
||||
tiger = { version = "0.2.1", optional = true }
|
||||
@ -63,10 +63,10 @@ whirlpool = { version = "0.10.4", optional = true }
|
||||
|
||||
[build-dependencies]
|
||||
digest = "0.10.7"
|
||||
ascon-hash = { version = "0.2.0", optional = true }
|
||||
ascon-hash = { version = "0.3.1", optional = true }
|
||||
belt-hash = { version = "0.1.1", optional = true }
|
||||
blake2 = { version = "0.10.6", optional = true }
|
||||
blake3 = { version = "1.6.1", optional = true, default-features = false, features = [
|
||||
blake3 = { version = "1.8.2", optional = true, default-features = false, features = [
|
||||
"std",
|
||||
"traits-preview",
|
||||
] }
|
||||
@ -78,19 +78,19 @@ md2 = { version = "0.10.2", optional = true }
|
||||
md4 = { version = "0.10.2", optional = true }
|
||||
ripemd = { version = "0.1.3", optional = true }
|
||||
sha1 = { version = "0.10.6", optional = true }
|
||||
sha2 = { version = "0.10.8", optional = true }
|
||||
sha2 = { version = "0.10.9", optional = true }
|
||||
sha3 = { version = "0.10.8", optional = true }
|
||||
shabal = { version = "0.4.1", optional = true }
|
||||
skein = { version = "0.1.0", optional = true }
|
||||
skein = { version = "0.1.1", optional = true }
|
||||
sm3 = { version = "0.4.2", optional = true }
|
||||
streebog = { version = "0.10.2", optional = true }
|
||||
tiger = { version = "0.2.1", optional = true }
|
||||
whirlpool = { version = "0.10.4", optional = true }
|
||||
|
||||
[dev-dependencies]
|
||||
nu-plugin-test-support = { version = "0.105.2", path = "../nushell/crates/nu-plugin-test-support" }
|
||||
nu-plugin-test-support = { version = "0.107.1", path = "../nushell/crates/nu-plugin-test-support" }
|
||||
|
||||
[profile.release]
|
||||
strip = true
|
||||
lto = true
|
||||
codegen-units = 1
|
||||
codegen-units = 1
|
@ -39,16 +39,9 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
#[cfg(feature = "ascon-hash")]
|
||||
GeneratedHasherImplMeta {
|
||||
crate_name: "ascon_hash",
|
||||
hasher_type_name: "AsconHash",
|
||||
hasher_type_name: "AsconHash256",
|
||||
hasher_command: "ascon",
|
||||
hasher: Box::new(ascon_hash::AsconHash::default()),
|
||||
},
|
||||
#[cfg(feature = "ascon-hash")]
|
||||
GeneratedHasherImplMeta {
|
||||
crate_name: "ascon_hash",
|
||||
hasher_type_name: "AsconAHash",
|
||||
hasher_command: "ascon-a",
|
||||
hasher: Box::new(ascon_hash::AsconAHash::default()),
|
||||
hasher: Box::new(ascon_hash::AsconHash256::default()),
|
||||
},
|
||||
#[cfg(feature = "belt-hash")]
|
||||
GeneratedHasherImplMeta {
|
||||
|
@ -99,7 +99,7 @@ where
|
||||
&self.description
|
||||
}
|
||||
|
||||
fn examples(&self) -> Vec<Example> {
|
||||
fn examples(&self) -> Vec<Example<'_>> {
|
||||
H::examples()
|
||||
}
|
||||
|
||||
|
480
nu_plugin_highlight/Cargo.lock
generated
480
nu_plugin_highlight/Cargo.lock
generated
@ -62,6 +62,12 @@ dependencies = [
|
||||
"rgb",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.100"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
|
||||
|
||||
[[package]]
|
||||
name = "arrayvec"
|
||||
version = "0.7.6"
|
||||
@ -82,11 +88,12 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
|
||||
|
||||
[[package]]
|
||||
name = "bat"
|
||||
version = "0.24.0"
|
||||
version = "0.25.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9dcc9e5637c2330d8eb7b920f2aa5d9e184446c258466f825ea1412c7614cc86"
|
||||
checksum = "2ab792c2ad113a666f08856c88cdec0a62d732559b1f3982eedf0142571e669a"
|
||||
dependencies = [
|
||||
"ansi_colours",
|
||||
"anyhow",
|
||||
"bincode",
|
||||
"bytesize",
|
||||
"clircle",
|
||||
@ -96,16 +103,24 @@ dependencies = [
|
||||
"flate2",
|
||||
"globset",
|
||||
"home",
|
||||
"nu-ansi-term 0.49.0",
|
||||
"indexmap",
|
||||
"itertools 0.13.0",
|
||||
"nu-ansi-term",
|
||||
"once_cell",
|
||||
"path_abs",
|
||||
"plist",
|
||||
"regex",
|
||||
"semver",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"serde_with",
|
||||
"serde_yaml",
|
||||
"syntect",
|
||||
"terminal-colorsaurus",
|
||||
"thiserror 1.0.69",
|
||||
"toml",
|
||||
"unicode-width 0.1.14",
|
||||
"walkdir",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -193,6 +208,15 @@ dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "buf-trait"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "21eaafc770e8c073d6c3facafe7617e774305d4954aa6351b9c452eb37ee17b4"
|
||||
dependencies = [
|
||||
"zerocopy",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bumpalo"
|
||||
version = "3.19.0"
|
||||
@ -229,6 +253,24 @@ version = "1.3.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2e93abca9e28e0a1b9877922aacb20576e05d4679ffa78c3d6dc22a26a216659"
|
||||
|
||||
[[package]]
|
||||
name = "byteyarn"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b93e51d26468a15ea59f8525e0c13dc405db43e644a0b1e6d44346c72cf4cf7b"
|
||||
dependencies = [
|
||||
"buf-trait",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "castaway"
|
||||
version = "0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a"
|
||||
dependencies = [
|
||||
"rustversion",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.2.27"
|
||||
@ -297,14 +339,12 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clircle"
|
||||
version = "0.4.0"
|
||||
version = "0.6.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c8e87cbed5354f17bd8ca8821a097fb62599787fe8f611743fad7ee156a0a600"
|
||||
checksum = "7d9334f725b46fb9bed8580b9b47a932587e044fadb344ed7fa98774b067ac1a"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"serde",
|
||||
"winapi",
|
||||
"windows 0.56.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -344,31 +384,6 @@ dependencies = [
|
||||
"cfg-if",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-deque"
|
||||
version = "0.8.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
|
||||
dependencies = [
|
||||
"crossbeam-epoch",
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-epoch"
|
||||
version = "0.9.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.8.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
|
||||
|
||||
[[package]]
|
||||
name = "crossterm"
|
||||
version = "0.28.1"
|
||||
@ -394,6 +409,41 @@ dependencies = [
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "darling"
|
||||
version = "0.21.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0"
|
||||
dependencies = [
|
||||
"darling_core",
|
||||
"darling_macro",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "darling_core"
|
||||
version = "0.21.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4"
|
||||
dependencies = [
|
||||
"fnv",
|
||||
"ident_case",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"strsim",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "darling_macro"
|
||||
version = "0.21.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81"
|
||||
dependencies = [
|
||||
"darling_core",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "deranged"
|
||||
version = "0.4.0"
|
||||
@ -479,9 +529,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "fancy-regex"
|
||||
version = "0.14.0"
|
||||
version = "0.16.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6e24cb5a94bcae1e5408b0effca5cd7172ea3c5755049c5f3af4cd283a165298"
|
||||
checksum = "998b056554fbe42e03ae0e152895cd1a7e1002aec800fdc6635d20270260c46f"
|
||||
dependencies = [
|
||||
"bit-set",
|
||||
"regex-automata",
|
||||
@ -597,13 +647,21 @@ dependencies = [
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "2.9.0"
|
||||
name = "ident_case"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
|
||||
checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "2.11.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5"
|
||||
dependencies = [
|
||||
"equivalent",
|
||||
"hashbrown",
|
||||
"serde",
|
||||
"serde_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -668,6 +726,18 @@ dependencies = [
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lean_string"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "962df00ba70ac8d5ca5c064e17e5c3d090c087fd8d21aa45096c716b169da514"
|
||||
dependencies = [
|
||||
"castaway",
|
||||
"itoa",
|
||||
"ryu",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.174"
|
||||
@ -755,7 +825,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "61183da5de8ba09a58e330d55e5ea796539d8443bd00fdeb863eac39724aa4ab"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"nu-ansi-term 0.50.1",
|
||||
"nu-ansi-term",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -886,15 +956,6 @@ dependencies = [
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nu-ansi-term"
|
||||
version = "0.49.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c073d3c1930d0751774acf49e66653acecb416c3a54c6ec095a9b11caddb5a68"
|
||||
dependencies = [
|
||||
"windows-sys 0.48.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nu-ansi-term"
|
||||
version = "0.50.1"
|
||||
@ -906,7 +967,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-derive-value"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"proc-macro-error2",
|
||||
@ -917,22 +978,32 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-engine"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"fancy-regex",
|
||||
"log",
|
||||
"nu-experimental",
|
||||
"nu-glob",
|
||||
"nu-path",
|
||||
"nu-protocol",
|
||||
"nu-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nu-experimental"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"itertools 0.14.0",
|
||||
"thiserror 2.0.12",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nu-glob"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
|
||||
[[package]]
|
||||
name = "nu-path"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"dirs",
|
||||
"omnipath",
|
||||
@ -942,7 +1013,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"log",
|
||||
"nix",
|
||||
@ -956,7 +1027,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin-core"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"interprocess",
|
||||
"log",
|
||||
@ -970,7 +1041,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin-protocol"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"nu-protocol",
|
||||
"nu-utils",
|
||||
@ -982,7 +1053,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-protocol"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"brotli",
|
||||
"bytes",
|
||||
@ -999,6 +1070,7 @@ dependencies = [
|
||||
"miette",
|
||||
"nix",
|
||||
"nu-derive-value",
|
||||
"nu-experimental",
|
||||
"nu-glob",
|
||||
"nu-path",
|
||||
"nu-system",
|
||||
@ -1019,7 +1091,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-system"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"itertools 0.14.0",
|
||||
@ -1037,13 +1109,16 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-utils"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"byteyarn",
|
||||
"crossterm",
|
||||
"crossterm_winapi",
|
||||
"fancy-regex",
|
||||
"lean_string",
|
||||
"log",
|
||||
"lscolors",
|
||||
"memchr",
|
||||
"nix",
|
||||
"num-format",
|
||||
"serde",
|
||||
@ -1060,7 +1135,7 @@ dependencies = [
|
||||
"ansi_colours",
|
||||
"bat",
|
||||
"mime_guess",
|
||||
"nu-ansi-term 0.50.1",
|
||||
"nu-ansi-term",
|
||||
"nu-path",
|
||||
"nu-plugin",
|
||||
"nu-protocol",
|
||||
@ -1093,6 +1168,25 @@ dependencies = [
|
||||
"autocfg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "objc2-core-foundation"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166"
|
||||
dependencies = [
|
||||
"bitflags 2.9.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "objc2-io-kit"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "71c1c64d6120e51cd86033f67176b1cb66780c2efe34dec55176f77befd93c0a"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"objc2-core-foundation",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "omnipath"
|
||||
version = "0.1.6"
|
||||
@ -1313,26 +1407,6 @@ dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rayon"
|
||||
version = "1.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
|
||||
dependencies = [
|
||||
"either",
|
||||
"rayon-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rayon-core"
|
||||
version = "1.12.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
|
||||
dependencies = [
|
||||
"crossbeam-deque",
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "recvmsg"
|
||||
version = "1.0.0"
|
||||
@ -1506,18 +1580,28 @@ checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0"
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.219"
|
||||
version = "1.0.225"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
|
||||
checksum = "fd6c24dee235d0da097043389623fb913daddf92c76e9f5a1db88607a0bcbd1d"
|
||||
dependencies = [
|
||||
"serde_core",
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_core"
|
||||
version = "1.0.225"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "659356f9a0cb1e529b24c01e43ad2bdf520ec4ceaf83047b83ddcc2251f96383"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.219"
|
||||
version = "1.0.225"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
|
||||
checksum = "0ea936adf78b1f766949a4977b91d2f5595825bd6ec079aa9543ad2685fc4516"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@ -1536,6 +1620,38 @@ dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_spanned"
|
||||
version = "0.6.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_with"
|
||||
version = "3.14.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c522100790450cf78eeac1507263d0a350d4d5b30df0c8e1fe051a10c22b376e"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"serde_with_macros",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_with_macros"
|
||||
version = "3.14.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "327ada00f7d64abaac1e55a6911e90cf665aa051b9a561c7006c157f4633135e"
|
||||
dependencies = [
|
||||
"darling",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_yaml"
|
||||
version = "0.9.34+deprecated"
|
||||
@ -1606,6 +1722,12 @@ dependencies = [
|
||||
"vte",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "strsim"
|
||||
version = "0.11.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
||||
|
||||
[[package]]
|
||||
name = "strum"
|
||||
version = "0.26.3"
|
||||
@ -1690,16 +1812,42 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "sysinfo"
|
||||
version = "0.33.1"
|
||||
version = "0.36.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01"
|
||||
checksum = "252800745060e7b9ffb7b2badbd8b31cfa4aa2e61af879d0a3bf2a317c20217d"
|
||||
dependencies = [
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
"memchr",
|
||||
"ntapi",
|
||||
"rayon",
|
||||
"windows 0.57.0",
|
||||
"objc2-core-foundation",
|
||||
"objc2-io-kit",
|
||||
"windows 0.61.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "terminal-colorsaurus"
|
||||
version = "0.4.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b7afe4c174a3cbfb52ebcb11b28965daf74fe9111d4e07e40689d05af06e26e8"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"memchr",
|
||||
"mio",
|
||||
"terminal-trx",
|
||||
"windows-sys 0.59.0",
|
||||
"xterm-color",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "terminal-trx"
|
||||
version = "0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "975b4233aefa1b02456d5e53b22c61653c743e308c51cf4181191d8ce41753ab"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1793,6 +1941,48 @@ dependencies = [
|
||||
"time-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml"
|
||||
version = "0.8.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"serde",
|
||||
"serde_spanned",
|
||||
"toml_datetime",
|
||||
"toml_edit",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_datetime"
|
||||
version = "0.6.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_edit"
|
||||
version = "0.22.27"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"serde",
|
||||
"serde_spanned",
|
||||
"toml_datetime",
|
||||
"toml_write",
|
||||
"winnow",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_write"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801"
|
||||
|
||||
[[package]]
|
||||
name = "typeid"
|
||||
version = "1.0.3"
|
||||
@ -2001,12 +2191,24 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windows"
|
||||
version = "0.57.0"
|
||||
version = "0.61.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143"
|
||||
checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893"
|
||||
dependencies = [
|
||||
"windows-core 0.57.0",
|
||||
"windows-targets 0.52.6",
|
||||
"windows-collections",
|
||||
"windows-core 0.61.2",
|
||||
"windows-future",
|
||||
"windows-link",
|
||||
"windows-numerics",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-collections"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8"
|
||||
dependencies = [
|
||||
"windows-core 0.61.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -2021,18 +2223,6 @@ dependencies = [
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-core"
|
||||
version = "0.57.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d"
|
||||
dependencies = [
|
||||
"windows-implement 0.57.0",
|
||||
"windows-interface 0.57.0",
|
||||
"windows-result 0.1.2",
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-core"
|
||||
version = "0.61.2"
|
||||
@ -2047,21 +2237,21 @@ dependencies = [
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-implement"
|
||||
version = "0.56.0"
|
||||
name = "windows-future"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b"
|
||||
checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"windows-core 0.61.2",
|
||||
"windows-link",
|
||||
"windows-threading",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-implement"
|
||||
version = "0.57.0"
|
||||
version = "0.56.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7"
|
||||
checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@ -2090,17 +2280,6 @@ dependencies = [
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-interface"
|
||||
version = "0.57.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-interface"
|
||||
version = "0.59.1"
|
||||
@ -2118,6 +2297,16 @@ version = "0.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
|
||||
|
||||
[[package]]
|
||||
name = "windows-numerics"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1"
|
||||
dependencies = [
|
||||
"windows-core 0.61.2",
|
||||
"windows-link",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-result"
|
||||
version = "0.1.2"
|
||||
@ -2228,6 +2417,15 @@ dependencies = [
|
||||
"windows_x86_64_msvc 0.53.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-threading"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6"
|
||||
dependencies = [
|
||||
"windows-link",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_gnullvm"
|
||||
version = "0.48.5"
|
||||
@ -2366,6 +2564,21 @@ version = "0.53.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
|
||||
|
||||
[[package]]
|
||||
name = "winnow"
|
||||
version = "0.7.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "xterm-color"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4de5f056fb9dc8b7908754867544e26145767187aaac5a98495e88ad7cb8a80f"
|
||||
|
||||
[[package]]
|
||||
name = "yaml-rust"
|
||||
version = "0.4.5"
|
||||
@ -2374,3 +2587,24 @@ checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85"
|
||||
dependencies = [
|
||||
"linked-hash-map",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.7.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
|
||||
dependencies = [
|
||||
"byteorder",
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.7.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
@ -12,13 +12,13 @@ categories = ["command-line-utilities", "development-tools", "value-formatting"]
|
||||
[workspace.dependencies]
|
||||
# share dependencies with build dependencies
|
||||
syntect = "5"
|
||||
bat = { version = "0.24", default-features = false }
|
||||
bat = { version = "0.25", default-features = false }
|
||||
|
||||
[dependencies]
|
||||
# nu
|
||||
nu-plugin = { version = "0.105.2", path = "../nushell/crates/nu-plugin" }
|
||||
nu-protocol = { version = "0.105.2", path = "../nushell/crates/nu-protocol" }
|
||||
nu-path = { version = "0.105.2", path = "../nushell/crates/nu-path" }
|
||||
nu-plugin = { version = "0.107.1", path = "../nushell/crates/nu-plugin" }
|
||||
nu-protocol = { version = "0.107.1", path = "../nushell/crates/nu-protocol" }
|
||||
nu-path = { version = "0.107.1", path = "../nushell/crates/nu-path" }
|
||||
|
||||
# highlighting
|
||||
syntect = { workspace = true }
|
||||
|
@ -2,6 +2,7 @@ use std::ops::Deref;
|
||||
use std::path::Path;
|
||||
|
||||
use bat::assets::HighlightingAssets;
|
||||
use bat::theme::{default_theme, ColorScheme};
|
||||
use syntect::easy::HighlightLines;
|
||||
use syntect::highlighting::ThemeSet;
|
||||
use syntect::parsing::{SyntaxReference, SyntaxSet};
|
||||
@ -23,7 +24,8 @@ impl Highlighter {
|
||||
/// Creates a new instance of the Highlighter.
|
||||
pub fn new() -> Self {
|
||||
Highlighter {
|
||||
syntax_set: syntect::dumps::from_uncompressed_data(SYNTAX_SET).unwrap(),
|
||||
syntax_set: syntect::dumps::from_uncompressed_data(SYNTAX_SET)
|
||||
.expect("Failed to load syntax set"),
|
||||
highlighting_assets: HighlightingAssets::from_binary(),
|
||||
custom_themes: None
|
||||
}
|
||||
@ -41,7 +43,7 @@ impl Highlighter {
|
||||
/// Lists all the available themes.
|
||||
pub fn list_themes(&self, user_default: Option<&str>) -> ListThemes {
|
||||
let ha = &self.highlighting_assets;
|
||||
let default_theme_id = user_default.unwrap_or(HighlightingAssets::default_theme());
|
||||
let default_theme_id = user_default.unwrap_or(default_theme(ColorScheme::Dark));
|
||||
|
||||
let mut themes: Vec<_> = ha
|
||||
.themes()
|
||||
@ -123,14 +125,13 @@ impl Highlighter {
|
||||
.unwrap_or(syntax_set.find_syntax_plain_text());
|
||||
|
||||
let theme_id = match theme {
|
||||
None => HighlightingAssets::default_theme(),
|
||||
None => default_theme(ColorScheme::Dark),
|
||||
Some(theme) => theme
|
||||
};
|
||||
let theme = self
|
||||
.custom_themes
|
||||
.as_ref()
|
||||
.map(|themes| themes.themes.get(theme_id))
|
||||
.flatten();
|
||||
.and_then(|themes| themes.themes.get(theme_id));
|
||||
let theme = theme.unwrap_or_else(|| self.highlighting_assets.get_theme(theme_id));
|
||||
|
||||
let mut highlighter = HighlightLines::new(syntax_ref, theme);
|
||||
@ -145,7 +146,8 @@ impl Highlighter {
|
||||
true => l.trim_end().to_owned()
|
||||
};
|
||||
|
||||
let styled_lines = highlighter.highlight_line(&l, &syntax_set).unwrap();
|
||||
let styled_lines = highlighter.highlight_line(&l, syntax_set)
|
||||
.expect("Failed to highlight line");
|
||||
styled_lines
|
||||
.iter()
|
||||
.map(|(style, s)| {
|
||||
|
@ -116,8 +116,8 @@ impl PluginCommand for Highlight {
|
||||
.map(Spanned::<String>::from_value)
|
||||
.transpose()?
|
||||
.or(config.theme);
|
||||
if let Some(theme) = &theme {
|
||||
if !highlighter.is_valid_theme(&theme.item) {
|
||||
if let Some(theme) = &theme
|
||||
&& !highlighter.is_valid_theme(&theme.item) {
|
||||
return Err(labeled_error(
|
||||
"use `highlight --list-themes` to list all themes",
|
||||
format!("Unknown passed theme {:?}", &theme.item),
|
||||
@ -125,7 +125,6 @@ impl PluginCommand for Highlight {
|
||||
None
|
||||
));
|
||||
}
|
||||
}
|
||||
let theme = theme.map(|spanned| spanned.item);
|
||||
let theme = theme.as_deref();
|
||||
|
||||
@ -150,7 +149,7 @@ impl PluginCommand for Highlight {
|
||||
vec!["syntax", "highlight", "highlighting"]
|
||||
}
|
||||
|
||||
fn examples(&self) -> Vec<Example> {
|
||||
fn examples(&self) -> Vec<Example<'_>> {
|
||||
const fn example<'e>(description: &'e str, example: &'e str) -> Example<'e>
|
||||
where
|
||||
'e: 'static
|
||||
|
502
nu_plugin_image/Cargo.lock
generated
502
nu_plugin_image/Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@ -3,26 +3,26 @@ slog = "2.7.0"
|
||||
termcolor = "1.4.1"
|
||||
ansi_colours = "1.2.3"
|
||||
crossterm = "0.29.0"
|
||||
image = "0.25.6"
|
||||
image = "0.25.8"
|
||||
imageproc = "0.25.0"
|
||||
include-flate = "0.3.0"
|
||||
ab_glyph = "0.2.29"
|
||||
include-flate = "0.3.1"
|
||||
ab_glyph = "0.2.31"
|
||||
vte = "0.15.0"
|
||||
lazy_static = "1.5.0"
|
||||
slog-term = "2.9.1"
|
||||
slog-term = "2.9.2"
|
||||
slog-async = "2.8.0"
|
||||
|
||||
[dependencies.clap]
|
||||
features = ["derive"]
|
||||
version = "4.5.40"
|
||||
version = "4.5.48"
|
||||
|
||||
[dependencies.nu-plugin]
|
||||
version = "0.105.2"
|
||||
version = "0.107.0"
|
||||
path = "../nushell/crates/nu-plugin"
|
||||
|
||||
[dependencies.nu-protocol]
|
||||
features = ["plugin"]
|
||||
version = "0.105.2"
|
||||
version = "0.107.0"
|
||||
path = "../nushell/crates/nu-protocol"
|
||||
|
||||
[features]
|
||||
|
@ -22,7 +22,7 @@ pub fn make_image(
|
||||
png_width: Option<u32>,
|
||||
input: &[u8],
|
||||
palette: Palette,
|
||||
) {
|
||||
) -> Result<(), Box<dyn std::error::Error>> {
|
||||
// let = FontFamily::default();
|
||||
|
||||
let font = font_family.regular;
|
||||
@ -67,5 +67,6 @@ pub fn make_image(
|
||||
|
||||
let image: RgbaImage = performer.into();
|
||||
|
||||
image.save(output_path).unwrap();
|
||||
image.save(output_path)?;
|
||||
Ok(())
|
||||
}
|
@ -167,7 +167,7 @@ fn parse_color(mode: &u16, iter: &mut Iter<&u16>) -> ColorType {
|
||||
5 => {
|
||||
let color = iter.next();
|
||||
if let Some(color) = color {
|
||||
let color = match color {
|
||||
match color {
|
||||
0 => ColorType::Normal(Color::Black),
|
||||
1 => ColorType::Normal(Color::Red),
|
||||
2 => ColorType::Normal(Color::Green),
|
||||
@ -191,24 +191,22 @@ fn parse_color(mode: &u16, iter: &mut Iter<&u16>) -> ColorType {
|
||||
|
||||
v => {
|
||||
warn!("[COLOR_PARSER] fixed color value out of range, parse_fixed_color(code: {})",v);
|
||||
return ColorType::PrimaryForeground;
|
||||
ColorType::PrimaryForeground
|
||||
}
|
||||
};
|
||||
return color;
|
||||
}
|
||||
} else {
|
||||
warn!(
|
||||
"[COLOR_PARSER] fixed color value not supplied, parse_fixed_color(code: null)"
|
||||
);
|
||||
|
||||
return ColorType::PrimaryForeground;
|
||||
ColorType::PrimaryForeground
|
||||
}
|
||||
}
|
||||
2 => match (iter.next(), iter.next(), iter.next()) {
|
||||
(Some(r), Some(g), Some(b)) => {
|
||||
let color = ColorType::Rgb {
|
||||
ColorType::Rgb {
|
||||
field1: (**r as u8, **g as u8, **b as u8),
|
||||
};
|
||||
return color;
|
||||
}
|
||||
}
|
||||
(r, g, b) => {
|
||||
warn!(
|
||||
@ -217,7 +215,7 @@ fn parse_color(mode: &u16, iter: &mut Iter<&u16>) -> ColorType {
|
||||
g.map(|i| i.to_string() ).unwrap_or("null".to_string()),
|
||||
b.map(|i| i.to_string() ).unwrap_or("null".to_string())
|
||||
);
|
||||
return ColorType::PrimaryForeground;
|
||||
ColorType::PrimaryForeground
|
||||
}
|
||||
},
|
||||
v => {
|
||||
@ -225,7 +223,7 @@ fn parse_color(mode: &u16, iter: &mut Iter<&u16>) -> ColorType {
|
||||
"[COLOR_PARSER] color mode is not supplied correctly, parse_color({}, ...)",
|
||||
v
|
||||
);
|
||||
return ColorType::PrimaryForeground;
|
||||
ColorType::PrimaryForeground
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -15,14 +15,16 @@ pub struct FontFamily<'a> {
|
||||
|
||||
impl FontFamily<'static> {
|
||||
fn all_fonts() -> Vec<(String, FontBuilder)> {
|
||||
let mut result: Vec<(String, FontBuilder)> = vec![];
|
||||
result.push(("SourceCodePro".to_string(), Self::source_code_pro));
|
||||
#[allow(unused_mut)]
|
||||
let mut result = vec![
|
||||
("SourceCodePro".to_string(), Self::source_code_pro as FontBuilder),
|
||||
];
|
||||
#[cfg(feature = "font-ubuntu")]
|
||||
result.push(("Ubuntu".to_string(), Self::ubuntu));
|
||||
result.push(("Ubuntu".to_string(), Self::ubuntu as FontBuilder));
|
||||
#[cfg(feature = "font-iosevka_term")]
|
||||
result.push(("IosevkaTerm".to_string(), Self::iosevka_term));
|
||||
result.push(("IosevkaTerm".to_string(), Self::iosevka_term as FontBuilder));
|
||||
#[cfg(feature = "font-anonymous_pro")]
|
||||
result.push(("AnonymousPro".to_string(), Self::anonymous_pro));
|
||||
result.push(("AnonymousPro".to_string(), Self::anonymous_pro as FontBuilder));
|
||||
result
|
||||
}
|
||||
pub fn list() -> Vec<String> {
|
||||
@ -35,7 +37,7 @@ impl FontFamily<'static> {
|
||||
return value.1();
|
||||
}
|
||||
}
|
||||
return Self::default();
|
||||
Self::default()
|
||||
}
|
||||
pub fn try_from_bytes(
|
||||
name: Option<String>,
|
||||
@ -50,7 +52,7 @@ impl FontFamily<'static> {
|
||||
let bold_italic = FontRef::try_from_slice(bold_italic);
|
||||
match (regular, bold, italic, bold_italic) {
|
||||
(Ok(regular), Ok(bold), Ok(italic), Ok(bold_italic)) => {
|
||||
return Some(FontFamily {
|
||||
Some(FontFamily {
|
||||
name: name.unwrap_or("Custom".to_string()),
|
||||
regular,
|
||||
bold,
|
||||
|
@ -17,11 +17,11 @@ pub struct InternalScale {
|
||||
// }
|
||||
// }
|
||||
|
||||
impl Into<PxScale> for InternalScale {
|
||||
fn into(self) -> PxScale {
|
||||
impl From<InternalScale> for PxScale {
|
||||
fn from(val: InternalScale) -> Self {
|
||||
PxScale {
|
||||
x: self.x,
|
||||
y: self.y,
|
||||
x: val.x,
|
||||
y: val.y,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
mod ansi_to_image;
|
||||
mod converter;
|
||||
mod color;
|
||||
// mod escape;
|
||||
mod escape_parser;
|
||||
|
@ -8,8 +8,8 @@ use nu_protocol::{LabeledError, Span, Value};
|
||||
use crate::FontFamily;
|
||||
|
||||
use super::{
|
||||
ansi_to_image::make_image,
|
||||
palette::{strhex_to_rgba, Palette},
|
||||
converter::make_image,
|
||||
palette::{strhex_to_rgba, Palette, PaletteColorOverrides},
|
||||
};
|
||||
|
||||
pub fn ansi_to_image(
|
||||
@ -34,10 +34,7 @@ pub fn ansi_to_image(
|
||||
}
|
||||
};
|
||||
let size = match call.get_flag_value("width") {
|
||||
Some(val) => match val.as_int().ok() {
|
||||
Some(value) => Some(value as u32),
|
||||
_ => None,
|
||||
},
|
||||
Some(val) => val.as_int().ok().map(|value| value as u32),
|
||||
_ => None,
|
||||
};
|
||||
let font: FontFamily<'_> = resolve_font(call);
|
||||
@ -61,7 +58,7 @@ pub fn ansi_to_image(
|
||||
}
|
||||
_ => {
|
||||
let now = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH);
|
||||
let current = engine.get_current_dir().map(|p| PathBuf::from(p));
|
||||
let current = engine.get_current_dir().map(PathBuf::from);
|
||||
if let (Ok(now), Ok(current)) = (now, current) {
|
||||
let current = &mut current.clone();
|
||||
current.push(PathBuf::from(format!("nu-image-{}.png", now.as_secs())));
|
||||
@ -71,9 +68,9 @@ pub fn ansi_to_image(
|
||||
}
|
||||
}
|
||||
};
|
||||
if let None = out {
|
||||
if out.is_none() {
|
||||
return Err(make_params_err(
|
||||
format!("cannot use time stamp as the file name timestamp please provide output path explicitly"),
|
||||
"cannot use time stamp as the file name timestamp please provide output path explicitly".to_string(),
|
||||
call.head,
|
||||
));
|
||||
}
|
||||
@ -93,8 +90,17 @@ pub fn ansi_to_image(
|
||||
};
|
||||
let theme = load_custom_theme(call, theme);
|
||||
|
||||
let path = PathBuf::from(out.unwrap());
|
||||
make_image(path.as_path(), font, size, i, theme);
|
||||
let path = out.ok_or_else(|| make_params_err(
|
||||
"Failed to determine output path".to_string(),
|
||||
call.head,
|
||||
))?;
|
||||
|
||||
if let Err(e) = make_image(path.as_path(), font, size, i, theme) {
|
||||
return Err(make_params_err(
|
||||
format!("Failed to save image: {}", e),
|
||||
call.head,
|
||||
));
|
||||
}
|
||||
|
||||
Ok(Value::string(
|
||||
path.to_str().unwrap_or("error reading path").to_owned(),
|
||||
@ -107,13 +113,7 @@ fn resolve_font(call: &EvaluatedCall) -> FontFamily<'static> {
|
||||
Value::String { val, .. } => Some(FontFamily::from_name(val)),
|
||||
_ => None,
|
||||
}) {
|
||||
Some(value) => {
|
||||
if let Some(font) = value {
|
||||
font
|
||||
} else {
|
||||
FontFamily::default()
|
||||
}
|
||||
}
|
||||
Some(value) => value.unwrap_or_default(),
|
||||
None => FontFamily::default(),
|
||||
};
|
||||
// TODO custom fonts disabled for now
|
||||
@ -149,8 +149,8 @@ fn resolve_font(call: &EvaluatedCall) -> FontFamily<'static> {
|
||||
fn load_file<'a>(path: Value) -> &'a [u8] {
|
||||
let path = path.as_str().unwrap();
|
||||
let mut file = File::open(PathBuf::from(path)).unwrap();
|
||||
let mut buffer: Box<Vec<u8>> = Box::new(vec![]);
|
||||
file.read_to_end(&mut *buffer).unwrap();
|
||||
let mut buffer: Box<Vec<u8>> = Box::default();
|
||||
file.read_to_end(&mut buffer).unwrap();
|
||||
Box::leak(buffer)
|
||||
}
|
||||
|
||||
@ -158,27 +158,28 @@ fn make_params_err(text: String, span: Span) -> LabeledError {
|
||||
LabeledError::new(text).with_label("faced an error when tried to parse the params", span)
|
||||
}
|
||||
fn load_custom_theme(call: &EvaluatedCall, theme: Palette) -> Palette {
|
||||
let result = theme.palette().copy_with(
|
||||
read_hex_to_array(call, "custom-theme-fg"),
|
||||
read_hex_to_array(call, "custom-theme-bg"),
|
||||
read_hex_to_array(call, "custom-theme-black"),
|
||||
read_hex_to_array(call, "custom-theme-red"),
|
||||
read_hex_to_array(call, "custom-theme-green"),
|
||||
read_hex_to_array(call, "custom-theme-yellow"),
|
||||
read_hex_to_array(call, "custom-theme-blue"),
|
||||
read_hex_to_array(call, "custom-theme-magenta"),
|
||||
read_hex_to_array(call, "custom-theme-cyan"),
|
||||
read_hex_to_array(call, "custom-theme-white"),
|
||||
read_hex_to_array(call, "custom-theme-bright_black"),
|
||||
read_hex_to_array(call, "custom-theme-bright_red"),
|
||||
read_hex_to_array(call, "custom-theme-bright_green"),
|
||||
read_hex_to_array(call, "custom-theme-bright_yellow"),
|
||||
read_hex_to_array(call, "custom-theme-bright_blue"),
|
||||
read_hex_to_array(call, "custom-theme-bright_magenta"),
|
||||
read_hex_to_array(call, "custom-theme-bright_cyan"),
|
||||
read_hex_to_array(call, "custom-theme-bright_white"),
|
||||
);
|
||||
Palette::Custom(result)
|
||||
let overrides = PaletteColorOverrides {
|
||||
primary_foreground: read_hex_to_array(call, "custom-theme-fg"),
|
||||
primary_background: read_hex_to_array(call, "custom-theme-bg"),
|
||||
black: read_hex_to_array(call, "custom-theme-black"),
|
||||
red: read_hex_to_array(call, "custom-theme-red"),
|
||||
green: read_hex_to_array(call, "custom-theme-green"),
|
||||
yellow: read_hex_to_array(call, "custom-theme-yellow"),
|
||||
blue: read_hex_to_array(call, "custom-theme-blue"),
|
||||
magenta: read_hex_to_array(call, "custom-theme-magenta"),
|
||||
cyan: read_hex_to_array(call, "custom-theme-cyan"),
|
||||
white: read_hex_to_array(call, "custom-theme-white"),
|
||||
bright_black: read_hex_to_array(call, "custom-theme-bright_black"),
|
||||
bright_red: read_hex_to_array(call, "custom-theme-bright_red"),
|
||||
bright_green: read_hex_to_array(call, "custom-theme-bright_green"),
|
||||
bright_yellow: read_hex_to_array(call, "custom-theme-bright_yellow"),
|
||||
bright_blue: read_hex_to_array(call, "custom-theme-bright_blue"),
|
||||
bright_magenta: read_hex_to_array(call, "custom-theme-bright_magenta"),
|
||||
bright_cyan: read_hex_to_array(call, "custom-theme-bright_cyan"),
|
||||
bright_white: read_hex_to_array(call, "custom-theme-bright_white"),
|
||||
};
|
||||
let result = theme.palette().copy_with(overrides);
|
||||
Palette::Custom(Box::new(result))
|
||||
}
|
||||
|
||||
fn read_hex_to_array(call: &EvaluatedCall, name: &str) -> Option<[u8; 4]> {
|
||||
|
@ -18,19 +18,41 @@ pub enum Palette {
|
||||
Win10,
|
||||
WinPs,
|
||||
Env,
|
||||
Custom(PaletteData),
|
||||
Custom(Box<PaletteData>),
|
||||
Test,
|
||||
}
|
||||
|
||||
impl Default for Palette {
|
||||
fn default() -> Self {
|
||||
if let Ok(_) = std::env::var("NU_PLUGIN_IMAGE_FG") {
|
||||
if std::env::var("NU_PLUGIN_IMAGE_FG").is_ok() {
|
||||
return Palette::Env;
|
||||
}
|
||||
return Palette::Vscode;
|
||||
Palette::Vscode
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct PaletteColorOverrides {
|
||||
pub primary_foreground: ColorOption,
|
||||
pub primary_background: ColorOption,
|
||||
pub black: ColorOption,
|
||||
pub red: ColorOption,
|
||||
pub green: ColorOption,
|
||||
pub yellow: ColorOption,
|
||||
pub blue: ColorOption,
|
||||
pub magenta: ColorOption,
|
||||
pub cyan: ColorOption,
|
||||
pub white: ColorOption,
|
||||
pub bright_black: ColorOption,
|
||||
pub bright_red: ColorOption,
|
||||
pub bright_green: ColorOption,
|
||||
pub bright_yellow: ColorOption,
|
||||
pub bright_blue: ColorOption,
|
||||
pub bright_magenta: ColorOption,
|
||||
pub bright_cyan: ColorOption,
|
||||
pub bright_white: ColorOption,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub struct PaletteData {
|
||||
pub primary_foreground: [u8; 4],
|
||||
@ -57,99 +79,77 @@ pub struct PaletteData {
|
||||
pub fixed: [[u8; 4]; 256],
|
||||
}
|
||||
impl PaletteData {
|
||||
pub fn copy_with(
|
||||
&self,
|
||||
primary_foreground: ColorOption,
|
||||
primary_background: ColorOption,
|
||||
|
||||
black: ColorOption,
|
||||
red: ColorOption,
|
||||
green: ColorOption,
|
||||
yellow: ColorOption,
|
||||
blue: ColorOption,
|
||||
magenta: ColorOption,
|
||||
cyan: ColorOption,
|
||||
white: ColorOption,
|
||||
|
||||
bright_black: ColorOption,
|
||||
bright_red: ColorOption,
|
||||
bright_green: ColorOption,
|
||||
bright_yellow: ColorOption,
|
||||
bright_blue: ColorOption,
|
||||
bright_magenta: ColorOption,
|
||||
bright_cyan: ColorOption,
|
||||
bright_white: ColorOption,
|
||||
) -> PaletteData {
|
||||
pub fn copy_with(&self, overrides: PaletteColorOverrides) -> PaletteData {
|
||||
let result = &mut self.clone();
|
||||
if let Some(fg) = primary_foreground {
|
||||
if let Some(fg) = overrides.primary_foreground {
|
||||
result.primary_foreground = fg;
|
||||
}
|
||||
|
||||
if let Some(bg) = primary_background {
|
||||
if let Some(bg) = overrides.primary_background {
|
||||
result.primary_background = bg;
|
||||
}
|
||||
|
||||
if let Some(color) = black {
|
||||
if let Some(color) = overrides.black {
|
||||
result.black = color;
|
||||
}
|
||||
|
||||
if let Some(color) = red {
|
||||
if let Some(color) = overrides.red {
|
||||
result.red = color;
|
||||
}
|
||||
|
||||
if let Some(color) = green {
|
||||
if let Some(color) = overrides.green {
|
||||
result.green = color;
|
||||
}
|
||||
|
||||
if let Some(color) = yellow {
|
||||
if let Some(color) = overrides.yellow {
|
||||
result.yellow = color;
|
||||
}
|
||||
|
||||
if let Some(color) = blue {
|
||||
if let Some(color) = overrides.blue {
|
||||
result.blue = color;
|
||||
}
|
||||
|
||||
if let Some(color) = magenta {
|
||||
if let Some(color) = overrides.magenta {
|
||||
result.magenta = color;
|
||||
}
|
||||
|
||||
if let Some(color) = cyan {
|
||||
if let Some(color) = overrides.cyan {
|
||||
result.cyan = color;
|
||||
}
|
||||
|
||||
if let Some(color) = white {
|
||||
if let Some(color) = overrides.white {
|
||||
result.white = color;
|
||||
}
|
||||
|
||||
if let Some(color) = bright_black {
|
||||
if let Some(color) = overrides.bright_black {
|
||||
result.bright_black = color;
|
||||
}
|
||||
|
||||
if let Some(color) = bright_red {
|
||||
if let Some(color) = overrides.bright_red {
|
||||
result.bright_red = color;
|
||||
}
|
||||
|
||||
if let Some(color) = bright_green {
|
||||
if let Some(color) = overrides.bright_green {
|
||||
result.bright_green = color;
|
||||
}
|
||||
|
||||
if let Some(color) = bright_yellow {
|
||||
if let Some(color) = overrides.bright_yellow {
|
||||
result.bright_yellow = color;
|
||||
}
|
||||
|
||||
if let Some(color) = bright_blue {
|
||||
if let Some(color) = overrides.bright_blue {
|
||||
result.bright_blue = color;
|
||||
}
|
||||
|
||||
if let Some(color) = bright_magenta {
|
||||
if let Some(color) = overrides.bright_magenta {
|
||||
result.bright_magenta = color;
|
||||
}
|
||||
|
||||
if let Some(color) = bright_cyan {
|
||||
if let Some(color) = overrides.bright_cyan {
|
||||
result.bright_cyan = color;
|
||||
}
|
||||
|
||||
if let Some(color) = bright_white {
|
||||
if let Some(color) = overrides.bright_white {
|
||||
result.bright_white = color;
|
||||
}
|
||||
|
||||
@ -172,7 +172,7 @@ impl Palette {
|
||||
Palette::WinPs => palette_win_power_shell(),
|
||||
Palette::Test => palette_test(),
|
||||
Palette::Env => palette_env(),
|
||||
Palette::Custom(p) => *p,
|
||||
Palette::Custom(p) => **p,
|
||||
}
|
||||
}
|
||||
pub(super) fn from_name(name: String) -> Option<Palette> {
|
||||
@ -867,7 +867,7 @@ pub(crate) fn strhex_to_rgba(hex: String) -> Option<[u8; 4]> {
|
||||
|
||||
let has_alpha = hex.len() == 8;
|
||||
|
||||
if let Ok(hex) = i64::from_str_radix(&hex, 16) {
|
||||
if let Ok(hex) = i64::from_str_radix(hex, 16) {
|
||||
let alpha = if has_alpha {
|
||||
Some((hex >> 24) as u8)
|
||||
} else {
|
||||
|
@ -119,12 +119,11 @@ impl<'a> Perform for Printer<'a> {
|
||||
|
||||
self.state.current_x += self.settings_internal.glyph_advance_width as u32;
|
||||
|
||||
if let Some(png_width) = self.settings_internal.png_width {
|
||||
if self.state.current_x > png_width {
|
||||
if let Some(png_width) = self.settings_internal.png_width
|
||||
&& self.state.current_x > png_width {
|
||||
self.state.current_x = 0;
|
||||
self.state.current_y += self.settings_internal.new_line_distance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn execute(&mut self, byte: u8) {
|
||||
|
@ -8,14 +8,14 @@ pub fn image_to_ansi(call: &EvaluatedCall, input: &Value) -> Result<Value, Label
|
||||
match build_params(call, input) {
|
||||
Ok(params) => {
|
||||
let img = PngDecoder::new(Cursor::new(params.file.as_slice()))
|
||||
.map(|img| image::DynamicImage::from_decoder(img));
|
||||
.map(image::DynamicImage::from_decoder);
|
||||
match img {
|
||||
Ok(img) => {
|
||||
let result = super::writer::lib::to_ansi(&img.unwrap(), ¶ms);
|
||||
|
||||
return result
|
||||
result
|
||||
.map(|value| Value::string(value, call.head))
|
||||
.map_err(|err| response_error(err, call.head));
|
||||
.map_err(|err| response_error(err, call.head))
|
||||
}
|
||||
Err(er) => Err(response_error(er.to_string(), call.head)),
|
||||
}
|
||||
@ -51,14 +51,8 @@ fn build_params(call: &EvaluatedCall, input: &Value) -> Result<IntoAnsiParams, L
|
||||
Ok(file) => params.file = file.to_owned(),
|
||||
Err(err) => return Err(make_params_err(err.to_string(), call.head)),
|
||||
};
|
||||
params.width = match load_u32(call, "width") {
|
||||
Ok(value) => Some(value),
|
||||
Err(_) => None,
|
||||
};
|
||||
params.height = match load_u32(call, "height") {
|
||||
Ok(value) => Some(value),
|
||||
Err(_) => None,
|
||||
};
|
||||
params.width = load_u32(call, "width").ok();
|
||||
params.height = load_u32(call, "height").ok();
|
||||
|
||||
Ok(params)
|
||||
}
|
||||
@ -83,10 +77,10 @@ fn load_u32(call: &EvaluatedCall, flag_name: &str) -> Result<u32, LabeledError>
|
||||
}
|
||||
|
||||
fn make_params_err(text: String, span: Span) -> LabeledError {
|
||||
return LabeledError::new(text)
|
||||
.with_label("faced an error when tried to parse the params", span);
|
||||
LabeledError::new(text)
|
||||
.with_label("faced an error when tried to parse the params", span)
|
||||
}
|
||||
|
||||
fn response_error(text: String, span: Span) -> LabeledError {
|
||||
return LabeledError::new(text).with_label("cannot create image", span);
|
||||
LabeledError::new(text).with_label("cannot create image", span)
|
||||
}
|
||||
|
@ -13,7 +13,7 @@ impl StringWriter {
|
||||
}
|
||||
pub fn read(&mut self) -> String {
|
||||
let result = String::from_utf8_lossy(self.inner_buf.as_slice());
|
||||
return result.to_string();
|
||||
result.to_string()
|
||||
}
|
||||
|
||||
fn write_str(&mut self, s: &str) -> io::Result<()> {
|
||||
@ -137,7 +137,7 @@ impl Write for StringWriter {
|
||||
|
||||
impl WriteColor for StringWriter {
|
||||
fn supports_color(&self) -> bool {
|
||||
return true;
|
||||
true
|
||||
}
|
||||
|
||||
fn set_color(&mut self, spec: &ColorSpec) -> io::Result<()> {
|
||||
@ -159,10 +159,10 @@ impl WriteColor for StringWriter {
|
||||
if spec.strikethrough() {
|
||||
self.write_str("\x1B[9m")?;
|
||||
}
|
||||
if let Some(ref c) = spec.fg() {
|
||||
if let Some(c) = spec.fg() {
|
||||
self.write_color(true, c, spec.intense())?;
|
||||
}
|
||||
if let Some(ref c) = spec.bg() {
|
||||
if let Some(c) = spec.bg() {
|
||||
self.write_color(false, c, spec.intense())?;
|
||||
}
|
||||
Ok(())
|
||||
|
@ -1,4 +1,4 @@
|
||||
use include_flate::lazy_static;
|
||||
use lazy_static::lazy_static;
|
||||
use slog::{Drain, Logger};
|
||||
use slog_async::Async;
|
||||
use slog_term::{CompactFormat, TermDecorator};
|
||||
@ -10,18 +10,18 @@ use std::sync::{
|
||||
use crate::logging::runtime_filter::RuntimeLevelFilter;
|
||||
|
||||
lazy_static! {
|
||||
pub static ref LOG_LEVEL: Arc<AtomicU8> = Arc::new(AtomicU8::new(0));
|
||||
pub static ref INTERNAL_LOGGER: Logger = {
|
||||
let decorator = TermDecorator::new().build();
|
||||
let drain = CompactFormat::new(decorator).build().fuse();
|
||||
let drain = RuntimeLevelFilter {
|
||||
drain: drain,
|
||||
drain,
|
||||
on: LOG_LEVEL.clone(),
|
||||
}
|
||||
.fuse();
|
||||
let drain = Async::new(drain).build().fuse();
|
||||
Logger::root(drain, slog::o!())
|
||||
};
|
||||
pub static ref LOG_LEVEL: Arc<AtomicU8> = Arc::new(AtomicU8::new(0));
|
||||
}
|
||||
|
||||
pub fn set_verbose(level: String) {
|
||||
|
@ -1,55 +1,55 @@
|
||||
#[macro_export]
|
||||
macro_rules! trace {
|
||||
( #$tag:expr, $($args:tt)+) => {
|
||||
slog::log!(crate::logging::logger::INTERNAL_LOGGER, slog::Level::Trace, $tag, $($args)+)
|
||||
slog::log!($crate::logging::logger::INTERNAL_LOGGER, slog::Level::Trace, $tag, $($args)+)
|
||||
};
|
||||
( $($args:tt)+) => {
|
||||
slog::log!(crate::logging::logger::INTERNAL_LOGGER, slog::Level::Trace, "", $($args)+)
|
||||
slog::log!($crate::logging::logger::INTERNAL_LOGGER, slog::Level::Trace, "", $($args)+)
|
||||
};
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! debug {
|
||||
( #$tag:expr, $($args:tt)+) => {
|
||||
slog::log!(crate::logging::logger::INTERNAL_LOGGER, slog::Level::Debug, $tag, $($args)+)
|
||||
slog::log!($crate::logging::logger::INTERNAL_LOGGER, slog::Level::Debug, $tag, $($args)+)
|
||||
};
|
||||
( $($args:tt)+) => {
|
||||
slog::log!(crate::logging::logger::INTERNAL_LOGGER, slog::Level::Debug, "", $($args)+)
|
||||
slog::log!($crate::logging::logger::INTERNAL_LOGGER, slog::Level::Debug, "", $($args)+)
|
||||
};
|
||||
}
|
||||
#[macro_export]
|
||||
macro_rules! info {
|
||||
( #$tag:expr, $($args:tt)+) => {
|
||||
slog::log!(crate::logging::logger::INTERNAL_LOGGER, slog::Level::Info, $tag, $($args)+)
|
||||
slog::log!($crate::logging::logger::INTERNAL_LOGGER, slog::Level::Info, $tag, $($args)+)
|
||||
};
|
||||
( $($args:tt)+) => {
|
||||
slog::log!(crate::logging::logger::INTERNAL_LOGGER, slog::Level::Info, "", $($args)+)
|
||||
slog::log!($crate::logging::logger::INTERNAL_LOGGER, slog::Level::Info, "", $($args)+)
|
||||
};
|
||||
}
|
||||
#[macro_export]
|
||||
macro_rules! warn(
|
||||
( #$tag:expr, $($args:tt)+) => {
|
||||
slog::log!(crate::logging::logger::INTERNAL_LOGGER, slog::Level::Warning, $tag, $($args)+)
|
||||
slog::log!($crate::logging::logger::INTERNAL_LOGGER, slog::Level::Warning, $tag, $($args)+)
|
||||
};
|
||||
( $($args:tt)+) => {
|
||||
slog::log!(crate::logging::logger::INTERNAL_LOGGER, slog::Level::Warning, "", $($args)+)
|
||||
slog::log!($crate::logging::logger::INTERNAL_LOGGER, slog::Level::Warning, "", $($args)+)
|
||||
};
|
||||
);
|
||||
#[macro_export]
|
||||
macro_rules! error {
|
||||
( #$tag:expr, $($args:tt)+) => {
|
||||
slog::log!(crate::logging::logger::INTERNAL_LOGGER, slog::Level::Error, $tag, $($args)+)
|
||||
slog::log!($crate::logging::logger::INTERNAL_LOGGER, slog::Level::Error, $tag, $($args)+)
|
||||
};
|
||||
( $($args:tt)+) => {
|
||||
slog::log!(crate::logging::logger::INTERNAL_LOGGER, slog::Level::Error, "", $($args)+)
|
||||
slog::log!($crate::logging::logger::INTERNAL_LOGGER, slog::Level::Error, "", $($args)+)
|
||||
};
|
||||
}
|
||||
#[macro_export]
|
||||
macro_rules! critical {
|
||||
( #$tag:expr, $($args:tt)+) => {
|
||||
slog::log!(crate::logging::logger::INTERNAL_LOGGER, slog::Level::Critical, $tag, $($args)+)
|
||||
slog::log!($crate::logging::logger::INTERNAL_LOGGER, slog::Level::Critical, $tag, $($args)+)
|
||||
};
|
||||
( $($args:tt)+) => {
|
||||
slog::log!(crate::logging::logger::INTERNAL_LOGGER, slog::Level::Critical, "", $($args)+)
|
||||
slog::log!($crate::logging::logger::INTERNAL_LOGGER, slog::Level::Critical, "", $($args)+)
|
||||
};
|
||||
}
|
||||
|
@ -171,7 +171,7 @@ impl SimplePluginCommand for ToPngCommand {
|
||||
|
||||
fn main() {
|
||||
nu_plugin::serve_plugin(
|
||||
&mut ImageConversionPlugin {},
|
||||
&ImageConversionPlugin {},
|
||||
nu_plugin::MsgPackSerializer {},
|
||||
)
|
||||
}
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit d0cc92e6f831d4a7e7d37c7293464f896385b95a
|
||||
Subproject commit 02870456387c94bfd68fd26f6bf0cfaf8b3accff
|
221
nu_plugin_port_extension/Cargo.lock
generated
221
nu_plugin_port_extension/Cargo.lock
generated
@ -91,9 +91,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "bindgen"
|
||||
version = "0.71.1"
|
||||
version = "0.72.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3"
|
||||
checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895"
|
||||
dependencies = [
|
||||
"bitflags 2.9.1",
|
||||
"cexpr",
|
||||
@ -157,6 +157,15 @@ dependencies = [
|
||||
"alloc-stdlib",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "buf-trait"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "21eaafc770e8c073d6c3facafe7617e774305d4954aa6351b9c452eb37ee17b4"
|
||||
dependencies = [
|
||||
"zerocopy",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bumpalo"
|
||||
version = "3.19.0"
|
||||
@ -175,6 +184,24 @@ version = "1.10.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
|
||||
|
||||
[[package]]
|
||||
name = "byteyarn"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b93e51d26468a15ea59f8525e0c13dc405db43e644a0b1e6d44346c72cf4cf7b"
|
||||
dependencies = [
|
||||
"buf-trait",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "castaway"
|
||||
version = "0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a"
|
||||
dependencies = [
|
||||
"rustversion",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.2.27"
|
||||
@ -254,31 +281,6 @@ dependencies = [
|
||||
"cfg-if",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-deque"
|
||||
version = "0.8.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
|
||||
dependencies = [
|
||||
"crossbeam-epoch",
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-epoch"
|
||||
version = "0.9.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.8.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
|
||||
|
||||
[[package]]
|
||||
name = "crossterm"
|
||||
version = "0.28.1"
|
||||
@ -442,9 +444,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "fancy-regex"
|
||||
version = "0.14.0"
|
||||
version = "0.16.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6e24cb5a94bcae1e5408b0effca5cd7172ea3c5755049c5f3af4cd283a165298"
|
||||
checksum = "998b056554fbe42e03ae0e152895cd1a7e1002aec800fdc6635d20270260c46f"
|
||||
dependencies = [
|
||||
"bit-set",
|
||||
"regex-automata",
|
||||
@ -545,9 +547,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "2.9.0"
|
||||
version = "2.11.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
|
||||
checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5"
|
||||
dependencies = [
|
||||
"equivalent",
|
||||
"hashbrown",
|
||||
@ -615,6 +617,18 @@ dependencies = [
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lean_string"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "962df00ba70ac8d5ca5c064e17e5c3d090c087fd8d21aa45096c716b169da514"
|
||||
dependencies = [
|
||||
"castaway",
|
||||
"itoa",
|
||||
"ryu",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.174"
|
||||
@ -820,11 +834,11 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "netstat2"
|
||||
version = "0.11.1"
|
||||
version = "0.11.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6422b6a8c7635e8a82323e4cdf07a90e91901e07f4c1f0f3a245d54b4637e55c"
|
||||
checksum = "496f264d3ead4870d6b366deb9d20597592d64aac2a907f3e7d07c2325ba4663"
|
||||
dependencies = [
|
||||
"bindgen 0.71.1",
|
||||
"bindgen 0.72.1",
|
||||
"bitflags 2.9.1",
|
||||
"byteorder",
|
||||
"netlink-packet-core",
|
||||
@ -878,7 +892,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-derive-value"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"proc-macro-error2",
|
||||
@ -889,22 +903,32 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-engine"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"fancy-regex",
|
||||
"log",
|
||||
"nu-experimental",
|
||||
"nu-glob",
|
||||
"nu-path",
|
||||
"nu-protocol",
|
||||
"nu-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nu-experimental"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"itertools 0.14.0",
|
||||
"thiserror 2.0.12",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nu-glob"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
|
||||
[[package]]
|
||||
name = "nu-path"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"dirs",
|
||||
"omnipath",
|
||||
@ -914,7 +938,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"log",
|
||||
"nix",
|
||||
@ -928,7 +952,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin-core"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"interprocess",
|
||||
"log",
|
||||
@ -942,7 +966,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin-protocol"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"nu-protocol",
|
||||
"nu-utils",
|
||||
@ -954,7 +978,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-protocol"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"brotli",
|
||||
"bytes",
|
||||
@ -971,6 +995,7 @@ dependencies = [
|
||||
"miette",
|
||||
"nix",
|
||||
"nu-derive-value",
|
||||
"nu-experimental",
|
||||
"nu-glob",
|
||||
"nu-path",
|
||||
"nu-system",
|
||||
@ -991,7 +1016,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-system"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"itertools 0.14.0",
|
||||
@ -1002,20 +1027,23 @@ dependencies = [
|
||||
"nix",
|
||||
"ntapi",
|
||||
"procfs",
|
||||
"sysinfo 0.33.1",
|
||||
"sysinfo 0.36.1",
|
||||
"web-time",
|
||||
"windows 0.56.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nu-utils"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"byteyarn",
|
||||
"crossterm",
|
||||
"crossterm_winapi",
|
||||
"fancy-regex",
|
||||
"lean_string",
|
||||
"log",
|
||||
"lscolors",
|
||||
"memchr",
|
||||
"nix",
|
||||
"num-format",
|
||||
"serde",
|
||||
@ -1027,14 +1055,14 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu_plugin_port_extension"
|
||||
version = "0.105.2"
|
||||
version = "0.107.0"
|
||||
dependencies = [
|
||||
"derive-getters",
|
||||
"derive_builder",
|
||||
"netstat2",
|
||||
"nu-plugin",
|
||||
"nu-protocol",
|
||||
"sysinfo 0.35.2",
|
||||
"sysinfo 0.37.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1240,26 +1268,6 @@ dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rayon"
|
||||
version = "1.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
|
||||
dependencies = [
|
||||
"either",
|
||||
"rayon-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rayon-core"
|
||||
version = "1.12.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
|
||||
dependencies = [
|
||||
"crossbeam-deque",
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "recvmsg"
|
||||
version = "1.0.0"
|
||||
@ -1581,23 +1589,23 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "sysinfo"
|
||||
version = "0.33.1"
|
||||
version = "0.36.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01"
|
||||
checksum = "252800745060e7b9ffb7b2badbd8b31cfa4aa2e61af879d0a3bf2a317c20217d"
|
||||
dependencies = [
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
"memchr",
|
||||
"ntapi",
|
||||
"rayon",
|
||||
"windows 0.57.0",
|
||||
"objc2-core-foundation",
|
||||
"objc2-io-kit",
|
||||
"windows 0.61.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sysinfo"
|
||||
version = "0.35.2"
|
||||
version = "0.37.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3c3ffa3e4ff2b324a57f7aeb3c349656c7b127c3c189520251a648102a92496e"
|
||||
checksum = "07cec4dc2d2e357ca1e610cfb07de2fa7a10fc3e9fe89f72545f3d244ea87753"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"memchr",
|
||||
@ -1848,16 +1856,6 @@ dependencies = [
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows"
|
||||
version = "0.57.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143"
|
||||
dependencies = [
|
||||
"windows-core 0.57.0",
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows"
|
||||
version = "0.61.3"
|
||||
@ -1892,18 +1890,6 @@ dependencies = [
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-core"
|
||||
version = "0.57.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d"
|
||||
dependencies = [
|
||||
"windows-implement 0.57.0",
|
||||
"windows-interface 0.57.0",
|
||||
"windows-result 0.1.2",
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-core"
|
||||
version = "0.61.2"
|
||||
@ -1939,17 +1925,6 @@ dependencies = [
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-implement"
|
||||
version = "0.57.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-implement"
|
||||
version = "0.60.0"
|
||||
@ -1972,17 +1947,6 @@ dependencies = [
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-interface"
|
||||
version = "0.57.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-interface"
|
||||
version = "0.59.1"
|
||||
@ -2266,3 +2230,24 @@ name = "windows_x86_64_msvc"
|
||||
version = "0.53.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.7.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
|
||||
dependencies = [
|
||||
"byteorder",
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.7.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.104",
|
||||
]
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "nu_plugin_port_extension"
|
||||
version = "0.105.2"
|
||||
version = "0.107.0"
|
||||
description = "A nushell plugin to list all active connections and scanning ports on a target address"
|
||||
homepage = "https://github.com/FMotalleb/nu_plugin_port_list"
|
||||
keywords = ["nushell", "network", "plugin"]
|
||||
@ -12,11 +12,11 @@ edition = "2024"
|
||||
[dependencies]
|
||||
derive_builder = "0.20.2"
|
||||
derive-getters = "0.5.0"
|
||||
netstat2 = "0.11.1"
|
||||
nu-plugin = { version = "0.105.2", path = "../nushell/crates/nu-plugin" }
|
||||
sysinfo = "0.35.2"
|
||||
netstat2 = "0.11.2"
|
||||
nu-plugin = { version = "0.107.1", path = "../nushell/crates/nu-plugin" }
|
||||
sysinfo = "0.37"
|
||||
|
||||
[dependencies.nu-protocol]
|
||||
features = ["plugin"]
|
||||
version = "0.105.2"
|
||||
version = "0.107.0"
|
||||
path = "../nushell/crates/nu-protocol"
|
||||
|
254
nu_plugin_qr_maker/Cargo.lock
generated
254
nu_plugin_qr_maker/Cargo.lock
generated
@ -125,6 +125,15 @@ dependencies = [
|
||||
"alloc-stdlib",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "buf-trait"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "21eaafc770e8c073d6c3facafe7617e774305d4954aa6351b9c452eb37ee17b4"
|
||||
dependencies = [
|
||||
"zerocopy",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bumpalo"
|
||||
version = "3.19.0"
|
||||
@ -143,6 +152,24 @@ version = "1.10.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
|
||||
|
||||
[[package]]
|
||||
name = "byteyarn"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b93e51d26468a15ea59f8525e0c13dc405db43e644a0b1e6d44346c72cf4cf7b"
|
||||
dependencies = [
|
||||
"buf-trait",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "castaway"
|
||||
version = "0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a"
|
||||
dependencies = [
|
||||
"rustversion",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.2.27"
|
||||
@ -222,31 +249,6 @@ dependencies = [
|
||||
"cfg-if",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-deque"
|
||||
version = "0.8.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
|
||||
dependencies = [
|
||||
"crossbeam-epoch",
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-epoch"
|
||||
version = "0.9.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.8.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
|
||||
|
||||
[[package]]
|
||||
name = "crossterm"
|
||||
version = "0.28.1"
|
||||
@ -333,9 +335,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "fancy-regex"
|
||||
version = "0.14.0"
|
||||
version = "0.16.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6e24cb5a94bcae1e5408b0effca5cd7172ea3c5755049c5f3af4cd283a165298"
|
||||
checksum = "998b056554fbe42e03ae0e152895cd1a7e1002aec800fdc6635d20270260c46f"
|
||||
dependencies = [
|
||||
"bit-set",
|
||||
"regex-automata",
|
||||
@ -424,9 +426,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "2.9.0"
|
||||
version = "2.11.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
|
||||
checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5"
|
||||
dependencies = [
|
||||
"equivalent",
|
||||
"hashbrown",
|
||||
@ -494,6 +496,18 @@ dependencies = [
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lean_string"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "962df00ba70ac8d5ca5c064e17e5c3d090c087fd8d21aa45096c716b169da514"
|
||||
dependencies = [
|
||||
"castaway",
|
||||
"itoa",
|
||||
"ryu",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.174"
|
||||
@ -690,7 +704,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-derive-value"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"proc-macro-error2",
|
||||
@ -701,22 +715,32 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-engine"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"fancy-regex",
|
||||
"log",
|
||||
"nu-experimental",
|
||||
"nu-glob",
|
||||
"nu-path",
|
||||
"nu-protocol",
|
||||
"nu-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nu-experimental"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"itertools 0.14.0",
|
||||
"thiserror 2.0.12",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nu-glob"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
|
||||
[[package]]
|
||||
name = "nu-path"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"dirs",
|
||||
"omnipath",
|
||||
@ -726,7 +750,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"log",
|
||||
"nix",
|
||||
@ -740,7 +764,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin-core"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"interprocess",
|
||||
"log",
|
||||
@ -754,7 +778,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-plugin-protocol"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"nu-protocol",
|
||||
"nu-utils",
|
||||
@ -766,7 +790,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-protocol"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"brotli",
|
||||
"bytes",
|
||||
@ -783,6 +807,7 @@ dependencies = [
|
||||
"miette",
|
||||
"nix",
|
||||
"nu-derive-value",
|
||||
"nu-experimental",
|
||||
"nu-glob",
|
||||
"nu-path",
|
||||
"nu-system",
|
||||
@ -803,7 +828,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-system"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"itertools 0.14.0",
|
||||
@ -821,13 +846,16 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nu-utils"
|
||||
version = "0.105.2"
|
||||
version = "0.107.1"
|
||||
dependencies = [
|
||||
"byteyarn",
|
||||
"crossterm",
|
||||
"crossterm_winapi",
|
||||
"fancy-regex",
|
||||
"lean_string",
|
||||
"log",
|
||||
"lscolors",
|
||||
"memchr",
|
||||
"nix",
|
||||
"num-format",
|
||||
"serde",
|
||||
@ -865,6 +893,25 @@ dependencies = [
|
||||
"autocfg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "objc2-core-foundation"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "objc2-io-kit"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "71c1c64d6120e51cd86033f67176b1cb66780c2efe34dec55176f77befd93c0a"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"objc2-core-foundation",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "omnipath"
|
||||
version = "0.1.6"
|
||||
@ -1025,26 +1072,6 @@ dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rayon"
|
||||
version = "1.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
|
||||
dependencies = [
|
||||
"either",
|
||||
"rayon-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rayon-core"
|
||||
version = "1.12.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
|
||||
dependencies = [
|
||||
"crossbeam-deque",
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "recvmsg"
|
||||
version = "1.0.0"
|
||||
@ -1343,16 +1370,16 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "sysinfo"
|
||||
version = "0.33.1"
|
||||
version = "0.36.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01"
|
||||
checksum = "252800745060e7b9ffb7b2badbd8b31cfa4aa2e61af879d0a3bf2a317c20217d"
|
||||
dependencies = [
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
"memchr",
|
||||
"ntapi",
|
||||
"rayon",
|
||||
"windows 0.57.0",
|
||||
"objc2-core-foundation",
|
||||
"objc2-io-kit",
|
||||
"windows 0.61.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1598,12 +1625,24 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windows"
|
||||
version = "0.57.0"
|
||||
version = "0.61.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143"
|
||||
checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893"
|
||||
dependencies = [
|
||||
"windows-core 0.57.0",
|
||||
"windows-targets 0.52.6",
|
||||
"windows-collections",
|
||||
"windows-core 0.61.2",
|
||||
"windows-future",
|
||||
"windows-link",
|
||||
"windows-numerics",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-collections"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8"
|
||||
dependencies = [
|
||||
"windows-core 0.61.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1618,18 +1657,6 @@ dependencies = [
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-core"
|
||||
version = "0.57.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d"
|
||||
dependencies = [
|
||||
"windows-implement 0.57.0",
|
||||
"windows-interface 0.57.0",
|
||||
"windows-result 0.1.2",
|
||||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-core"
|
||||
version = "0.61.2"
|
||||
@ -1644,21 +1671,21 @@ dependencies = [
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-implement"
|
||||
version = "0.56.0"
|
||||
name = "windows-future"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b"
|
||||
checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"windows-core 0.61.2",
|
||||
"windows-link",
|
||||
"windows-threading",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-implement"
|
||||
version = "0.57.0"
|
||||
version = "0.56.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7"
|
||||
checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@ -1687,17 +1714,6 @@ dependencies = [
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-interface"
|
||||
version = "0.57.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-interface"
|
||||
version = "0.59.1"
|
||||
@ -1715,6 +1731,16 @@ version = "0.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
|
||||
|
||||
[[package]]
|
||||
name = "windows-numerics"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1"
|
||||
dependencies = [
|
||||
"windows-core 0.61.2",
|
||||
"windows-link",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-result"
|
||||
version = "0.1.2"
|
||||
@ -1825,6 +1851,15 @@ dependencies = [
|
||||
"windows_x86_64_msvc 0.53.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-threading"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6"
|
||||
dependencies = [
|
||||
"windows-link",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_gnullvm"
|
||||
version = "0.48.5"
|
||||
@ -1962,3 +1997,24 @@ name = "windows_x86_64_msvc"
|
||||
version = "0.53.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.7.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
|
||||
dependencies = [
|
||||
"byteorder",
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.7.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
@ -11,6 +11,6 @@ edition = "2024"
|
||||
readme = "README.md"
|
||||
|
||||
[dependencies]
|
||||
nu-plugin = { version = "0.105.2", path = "../nushell/crates/nu-plugin" }
|
||||
nu-protocol = { version = "0.105.2", features = ["plugin"], path = "../nushell/crates/nu-protocol" }
|
||||
qr2term = { version = "0.3.1" }
|
||||
nu-plugin = { version = "0.107.1", path = "../nushell/crates/nu-plugin" }
|
||||
nu-protocol = { version = "0.107.1", features = ["plugin"], path = "../nushell/crates/nu-protocol" }
|
||||
qr2term = { version = "0.3.3" }
|
||||
|
@ -1,33 +0,0 @@
|
||||
[target.x86_64-pc-windows-msvc]
|
||||
# increase the default windows stack size
|
||||
# statically link the CRT so users don't have to install it
|
||||
rustflags = ["-C", "link-args=-stack:10000000", "-C", "target-feature=+crt-static"]
|
||||
|
||||
# keeping this but commentting out in case we need them in the future
|
||||
|
||||
# set a 2 gb stack size (0x80000000 = 2147483648 bytes = 2 GB)
|
||||
# [target.x86_64-unknown-linux-gnu]
|
||||
# rustflags = ["-C", "link-args=-Wl,-z stack-size=0x80000000"]
|
||||
|
||||
# set a 2 gb stack size (0x80000000 = 2147483648 bytes = 2 GB)
|
||||
# [target.x86_64-apple-darwin]
|
||||
# rustflags = ["-C", "link-args=-Wl,-stack_size,0x80000000"]
|
||||
|
||||
# How to use mold in linux and mac
|
||||
|
||||
# [target.x86_64-unknown-linux-gnu]
|
||||
# linker = "clang"
|
||||
# rustflags = ["-C", "link-arg=-fuse-ld=/usr/local/bin/mold"]
|
||||
|
||||
# [target.x86_64-apple-darwin]
|
||||
# linker = "clang"
|
||||
# rustflags = ["-C", "link-arg=-fuse-ld=mold"]
|
||||
|
||||
# [target.aarch64-apple-darwin]
|
||||
# linker = "clang"
|
||||
# rustflags = ["-C", "link-arg=-fuse-ld=mold"]
|
||||
|
||||
[target.aarch64-apple-darwin]
|
||||
# We can guarantee that this target will always run on a CPU with _at least_
|
||||
# these capabilities, so let's optimize for them
|
||||
rustflags = ["-Ctarget-cpu=apple-m1"]
|
2
nushell/.gitattributes
vendored
2
nushell/.gitattributes
vendored
@ -1,2 +0,0 @@
|
||||
# Example of a `.gitattributes` file which reclassifies `.nu` files as Nushell:
|
||||
*.nu linguist-language=Nushell
|
@ -1,5 +0,0 @@
|
||||
#!/usr/bin/env nu
|
||||
|
||||
use ../toolkit.nu fmt
|
||||
|
||||
fmt --check --verbose
|
@ -1,6 +0,0 @@
|
||||
#!/usr/bin/env nu
|
||||
|
||||
use ../toolkit.nu [fmt, clippy]
|
||||
|
||||
fmt --check --verbose
|
||||
clippy --verbose
|
@ -1 +0,0 @@
|
||||
This directory is intended for templates to automatically create issues with the [create-an-issue](https://github.com/JasonEtco/create-an-issue) action.
|
@ -1,16 +0,0 @@
|
||||
---
|
||||
name: Nightly build of release binaries failed
|
||||
about: Used to submit issues related to binaries release workflow
|
||||
title: 'Attention: Nightly build of release binaries failed'
|
||||
labels: ['build-package', 'priority']
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Nightly build of release binaries failed**
|
||||
|
||||
Hi there:
|
||||
|
||||
If you see me here that means there is a release failure for the nightly build
|
||||
|
||||
Please **click the status badge** to see more details: [](https://github.com/nushell/nushell/actions/workflows/nightly-build.yml)
|
50
nushell/.github/ISSUE_TEMPLATE/bug_report.yml
vendored
50
nushell/.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@ -1,50 +0,0 @@
|
||||
name: Bug Report
|
||||
description: Create a report to help us improve
|
||||
labels: ["needs-triage"]
|
||||
body:
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: Describe the bug
|
||||
description: Thank you for your bug report.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: repro
|
||||
attributes:
|
||||
label: How to reproduce
|
||||
description: Steps to reproduce the behavior (including succinct code examples or screenshots of the observed behavior)
|
||||
placeholder: |
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: expected
|
||||
attributes:
|
||||
label: Expected behavior
|
||||
description: A clear and concise description of what you expected to happen.
|
||||
placeholder: I expected nu to...
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: config
|
||||
attributes:
|
||||
label: Configuration
|
||||
description: "Please run `version | transpose key value | to md --pretty` and paste the output to show OS, features, etc."
|
||||
placeholder: |
|
||||
> version | transpose key value | to md --pretty
|
||||
| key | value |
|
||||
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| version | 0.40.0 |
|
||||
| build_os | linux-x86_64 |
|
||||
| rust_version | rustc 1.56.1 |
|
||||
| cargo_version | cargo 1.56.0 |
|
||||
| pkg_version | 0.40.0 |
|
||||
| build_time | 1980-01-01 00:00:00 +00:00 |
|
||||
| build_rust_channel | release |
|
||||
| features | clipboard-cli, ctrlc, dataframe, default, rustyline, term, trash, uuid, which, zip |
|
||||
| installed_plugins | binaryview, chart bar, chart line, fetch, from bson, from sqlite, inc, match, post, ps, query json, s3, selector, start, sys, textview, to bson, to sqlite, tree, xpath |
|
||||
validations:
|
||||
required: true
|
@ -1,35 +0,0 @@
|
||||
name: Feature Request
|
||||
description: "When you want a new feature for something that doesn't already exist"
|
||||
labels: ["needs-triage", "enhancement"]
|
||||
body:
|
||||
- type: textarea
|
||||
id: problem
|
||||
attributes:
|
||||
label: Related problem
|
||||
description: Thank you for your feature request.
|
||||
placeholder: |
|
||||
A clear and concise description of what the problem is.
|
||||
Example: I am trying to do [...] but [...]
|
||||
validations:
|
||||
required: false
|
||||
- type: textarea
|
||||
id: desired
|
||||
attributes:
|
||||
label: "Describe the solution you'd like"
|
||||
description: A clear and concise description of what you want to happen.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: alternatives
|
||||
attributes:
|
||||
label: "Describe alternatives you've considered"
|
||||
description: "A clear and concise description of any alternative solutions or features you've considered."
|
||||
validations:
|
||||
required: false
|
||||
- type: textarea
|
||||
id: context
|
||||
attributes:
|
||||
label: Additional context and details
|
||||
description: Add any other context or screenshots about the feature request here.
|
||||
validations:
|
||||
required: false
|
21
nushell/.github/ISSUE_TEMPLATE/question.yml
vendored
21
nushell/.github/ISSUE_TEMPLATE/question.yml
vendored
@ -1,21 +0,0 @@
|
||||
name: Question
|
||||
description: "When you have a question to ask"
|
||||
labels: "question"
|
||||
body:
|
||||
- type: textarea
|
||||
id: problem
|
||||
attributes:
|
||||
label: Question
|
||||
description: Leave your question here
|
||||
placeholder: |
|
||||
A clear and concise question
|
||||
Example: Is there any equivalent of bash's $CDPATH in Nu?
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: context
|
||||
attributes:
|
||||
label: Additional context and details
|
||||
description: Add any other context, screenshots or other media that will help us understand your question here, if needed.
|
||||
validations:
|
||||
required: false
|
40
nushell/.github/dependabot.yml
vendored
40
nushell/.github/dependabot.yml
vendored
@ -1,40 +0,0 @@
|
||||
# To get started with Dependabot version updates, you'll need to specify which
|
||||
# package ecosystems to update and where the package manifests are located.
|
||||
# Please see the documentation for all configuration options:
|
||||
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||
|
||||
# docs
|
||||
# https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "cargo"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
# We release on Tuesdays and open dependabot PRs will rebase after the
|
||||
# version bump and thus consume unnecessary workers during release, thus
|
||||
# let's open new ones on Wednesday
|
||||
day: "wednesday"
|
||||
ignore:
|
||||
- dependency-name: "*"
|
||||
update-types: ["version-update:semver-patch"]
|
||||
groups:
|
||||
# Only update polars as a whole as there are many subcrates that need to
|
||||
# be updated at once. We explicitly depend on some of them, so batch their
|
||||
# updates to not take up dependabot PR slots with dysfunctional PRs
|
||||
polars:
|
||||
patterns:
|
||||
- "polars"
|
||||
- "polars-*"
|
||||
# uutils/coreutils also versions all their workspace crates the same at the moment
|
||||
# Most of them have bleeding edge version requirements (some not)
|
||||
# see: https://github.com/uutils/coreutils/blob/main/Cargo.toml
|
||||
uutils:
|
||||
patterns:
|
||||
- "uucore"
|
||||
- "uu_*"
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
day: "wednesday"
|
40
nushell/.github/labeler.yml
vendored
40
nushell/.github/labeler.yml
vendored
@ -1,40 +0,0 @@
|
||||
# A bot for automatically labelling pull requests
|
||||
# See https://github.com/actions/labeler
|
||||
|
||||
dataframe:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- crates/nu_plugin_polars/**
|
||||
|
||||
std-library:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- crates/nu-std/**
|
||||
|
||||
ci:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- .github/workflows/**
|
||||
|
||||
|
||||
LSP:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- crates/nu-lsp/**
|
||||
|
||||
parser:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- crates/nu-parser/**
|
||||
|
||||
pr:plugins:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
# plugins API
|
||||
- crates/nu-plugin/**
|
||||
- crates/nu-plugin-core/**
|
||||
- crates/nu-plugin-engine/**
|
||||
- crates/nu-plugin-protocol/**
|
||||
- crates/nu-plugin-test-support/**
|
||||
# specific plugins (like polars)
|
||||
- crates/nu_plugin_*/**
|
40
nushell/.github/pull_request_template.md
vendored
40
nushell/.github/pull_request_template.md
vendored
@ -1,40 +0,0 @@
|
||||
<!--
|
||||
if this PR closes one or more issues, you can automatically link the PR with
|
||||
them by using one of the [*linking keywords*](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword), e.g.
|
||||
- this PR should close #xxxx
|
||||
- fixes #xxxx
|
||||
|
||||
you can also mention related issues, PRs or discussions!
|
||||
-->
|
||||
|
||||
# Description
|
||||
<!--
|
||||
Thank you for improving Nushell. Please, check our [contributing guide](../CONTRIBUTING.md) and talk to the core team before making major changes.
|
||||
|
||||
Description of your pull request goes here. **Provide examples and/or screenshots** if your changes affect the user experience.
|
||||
-->
|
||||
|
||||
# User-Facing Changes
|
||||
<!-- List of all changes that impact the user experience here. This helps us keep track of breaking changes. -->
|
||||
|
||||
# Tests + Formatting
|
||||
<!--
|
||||
Don't forget to add tests that cover your changes.
|
||||
|
||||
Make sure you've run and fixed any issues with these commands:
|
||||
|
||||
- `cargo fmt --all -- --check` to check standard code formatting (`cargo fmt --all` applies these changes)
|
||||
- `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used` to check that you're using the standard code style
|
||||
- `cargo test --workspace` to check that all tests pass (on Windows make sure to [enable developer mode](https://learn.microsoft.com/en-us/windows/apps/get-started/developer-mode-features-and-debugging))
|
||||
- `cargo run -- -c "use toolkit.nu; toolkit test stdlib"` to run the tests for the standard library
|
||||
|
||||
> **Note**
|
||||
> from `nushell` you can also use the `toolkit` as follows
|
||||
> ```bash
|
||||
> use toolkit.nu # or use an `env_change` hook to activate it automatically
|
||||
> toolkit check pr
|
||||
> ```
|
||||
-->
|
||||
|
||||
# After Submitting
|
||||
<!-- If your PR had any user-facing changes, update [the documentation](https://github.com/nushell/nushell.github.io) after the PR is merged, if necessary. This will help us keep the docs up to date. -->
|
25
nushell/.github/workflows/audit.yml
vendored
25
nushell/.github/workflows/audit.yml
vendored
@ -1,25 +0,0 @@
|
||||
name: Security audit
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- '**/Cargo.toml'
|
||||
- '**/Cargo.lock'
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
env:
|
||||
RUST_BACKTRACE: 1
|
||||
CARGO_TERM_COLOR: always
|
||||
CLICOLOR: 1
|
||||
|
||||
jobs:
|
||||
security_audit:
|
||||
runs-on: ubuntu-latest
|
||||
# Prevent sudden announcement of a new advisory from failing ci:
|
||||
continue-on-error: true
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.7
|
||||
- uses: rustsec/audit-check@v2.0.0
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
52
nushell/.github/workflows/beta-test.yml
vendored
52
nushell/.github/workflows/beta-test.yml
vendored
@ -1,52 +0,0 @@
|
||||
name: Test on Beta Toolchain
|
||||
# This workflow is made to run our tests on the beta toolchain to validate that
|
||||
# the beta toolchain works.
|
||||
# We do not intend to test here that we are working correctly but rather that
|
||||
# the beta toolchain works correctly.
|
||||
# The ci.yml handles our actual testing with our guarantees.
|
||||
|
||||
on:
|
||||
schedule:
|
||||
# If this workflow fails, GitHub notifications will go to the last person
|
||||
# who edited this line.
|
||||
# See: https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/monitoring-workflows/notifications-for-workflow-runs
|
||||
- cron: '0 0 * * *' # Runs daily at midnight UTC
|
||||
|
||||
env:
|
||||
NUSHELL_CARGO_PROFILE: ci
|
||||
NU_LOG_LEVEL: DEBUG
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.head_ref && github.ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build-and-test:
|
||||
# this job is more for testing the beta toolchain and not our tests, so if
|
||||
# this fails but the tests of the regular ci pass, then this is fine
|
||||
continue-on-error: true
|
||||
|
||||
strategy:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
platform: [windows-latest, macos-latest, ubuntu-22.04]
|
||||
|
||||
runs-on: ${{ matrix.platform }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- run: rustup update beta
|
||||
|
||||
- name: Tests
|
||||
run: cargo +beta test --workspace --profile ci --exclude nu_plugin_*
|
||||
- name: Check for clean repo
|
||||
shell: bash
|
||||
run: |
|
||||
if [ -n "$(git status --porcelain)" ]; then
|
||||
echo "there are changes";
|
||||
git status --porcelain
|
||||
exit 1
|
||||
else
|
||||
echo "no changes in working directory";
|
||||
fi
|
12
nushell/.github/workflows/check-msrv.nu
vendored
12
nushell/.github/workflows/check-msrv.nu
vendored
@ -1,12 +0,0 @@
|
||||
let toolchain_spec = open rust-toolchain.toml | get toolchain.channel
|
||||
let msrv_spec = open Cargo.toml | get package.rust-version
|
||||
|
||||
# This check is conservative in the sense that we use `rust-toolchain.toml`'s
|
||||
# override to ensure that this is the upper-bound for the minimum supported
|
||||
# rust version
|
||||
if $toolchain_spec != $msrv_spec {
|
||||
print -e "Mismatching rust compiler versions specified in `Cargo.toml` and `rust-toolchain.toml`"
|
||||
print -e $"Cargo.toml: ($msrv_spec)"
|
||||
print -e $"rust-toolchain.toml: ($toolchain_spec)"
|
||||
exit 1
|
||||
}
|
212
nushell/.github/workflows/ci.yml
vendored
212
nushell/.github/workflows/ci.yml
vendored
@ -1,212 +0,0 @@
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- 'patch-release-*'
|
||||
|
||||
name: continuous-integration
|
||||
|
||||
env:
|
||||
NUSHELL_CARGO_PROFILE: ci
|
||||
NU_LOG_LEVEL: DEBUG
|
||||
# If changing these settings also change toolkit.nu
|
||||
CLIPPY_OPTIONS: "-D warnings -D clippy::unwrap_used -D clippy::unchecked_duration_subtraction"
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.head_ref && github.ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
fmt-clippy:
|
||||
strategy:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
# Pinning to Ubuntu 22.04 because building on newer Ubuntu versions causes linux-gnu
|
||||
# builds to link against a too-new-for-many-Linux-installs glibc version. Consider
|
||||
# revisiting this when 22.04 is closer to EOL (June 2027)
|
||||
#
|
||||
# Using macOS 13 runner because 14 is based on the M1 and has half as much RAM (7 GB,
|
||||
# instead of 14 GB) which is too little for us right now. Revisit when `dfr` commands are
|
||||
# removed and we're only building the `polars` plugin instead
|
||||
platform: [windows-latest, macos-13, ubuntu-22.04]
|
||||
|
||||
runs-on: ${{ matrix.platform }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.7
|
||||
|
||||
- name: Setup Rust toolchain and cache
|
||||
uses: actions-rust-lang/setup-rust-toolchain@v1.12.0
|
||||
|
||||
- name: cargo fmt
|
||||
run: cargo fmt --all -- --check
|
||||
|
||||
# If changing these settings also change toolkit.nu
|
||||
- name: Clippy
|
||||
run: cargo clippy --workspace --exclude nu_plugin_* -- $CLIPPY_OPTIONS
|
||||
|
||||
# In tests we don't have to deny unwrap
|
||||
- name: Clippy of tests
|
||||
run: cargo clippy --tests --workspace --exclude nu_plugin_* -- -D warnings
|
||||
|
||||
- name: Clippy of benchmarks
|
||||
run: cargo clippy --benches --workspace --exclude nu_plugin_* -- -D warnings
|
||||
|
||||
tests:
|
||||
strategy:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
platform: [windows-latest, macos-latest, ubuntu-22.04]
|
||||
|
||||
runs-on: ${{ matrix.platform }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.7
|
||||
|
||||
- name: Setup Rust toolchain and cache
|
||||
uses: actions-rust-lang/setup-rust-toolchain@v1.12.0
|
||||
|
||||
- name: Tests
|
||||
run: cargo test --workspace --profile ci --exclude nu_plugin_*
|
||||
- name: Check for clean repo
|
||||
shell: bash
|
||||
run: |
|
||||
if [ -n "$(git status --porcelain)" ]; then
|
||||
echo "there are changes";
|
||||
git status --porcelain
|
||||
exit 1
|
||||
else
|
||||
echo "no changes in working directory";
|
||||
fi
|
||||
|
||||
std-lib-and-python-virtualenv:
|
||||
strategy:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
platform: [ubuntu-22.04, macos-latest, windows-latest]
|
||||
py:
|
||||
- py
|
||||
|
||||
runs-on: ${{ matrix.platform }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.7
|
||||
|
||||
- name: Setup Rust toolchain and cache
|
||||
uses: actions-rust-lang/setup-rust-toolchain@v1.12.0
|
||||
|
||||
- name: Install Nushell
|
||||
run: cargo install --path . --locked --force
|
||||
|
||||
- name: Standard library tests
|
||||
run: nu -c 'use crates/nu-std/testing.nu; testing run-tests --path crates/nu-std'
|
||||
|
||||
- name: Ensure that Cargo.toml MSRV and rust-toolchain.toml use the same version
|
||||
run: nu .github/workflows/check-msrv.nu
|
||||
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.10"
|
||||
|
||||
- name: Install virtualenv
|
||||
run: pip install virtualenv
|
||||
shell: bash
|
||||
|
||||
- name: Test Nushell in virtualenv
|
||||
run: nu scripts/test_virtualenv.nu
|
||||
shell: bash
|
||||
|
||||
- name: Check for clean repo
|
||||
shell: bash
|
||||
run: |
|
||||
if [ -n "$(git status --porcelain)" ]; then
|
||||
echo "there are changes";
|
||||
git status --porcelain
|
||||
exit 1
|
||||
else
|
||||
echo "no changes in working directory";
|
||||
fi
|
||||
|
||||
plugins:
|
||||
strategy:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
# Using macOS 13 runner because 14 is based on the M1 and has half as much RAM (7 GB,
|
||||
# instead of 14 GB) which is too little for us right now.
|
||||
#
|
||||
# Failure occurring with clippy for rust 1.77.2
|
||||
platform: [windows-latest, macos-13, ubuntu-22.04]
|
||||
|
||||
runs-on: ${{ matrix.platform }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.7
|
||||
|
||||
- name: Setup Rust toolchain and cache
|
||||
uses: actions-rust-lang/setup-rust-toolchain@v1.12.0
|
||||
|
||||
- name: Clippy
|
||||
run: cargo clippy --package nu_plugin_* -- $CLIPPY_OPTIONS
|
||||
|
||||
- name: Tests
|
||||
run: cargo test --profile ci --package nu_plugin_*
|
||||
|
||||
- name: Check for clean repo
|
||||
shell: bash
|
||||
run: |
|
||||
if [ -n "$(git status --porcelain)" ]; then
|
||||
echo "there are changes";
|
||||
git status --porcelain
|
||||
exit 1
|
||||
else
|
||||
echo "no changes in working directory";
|
||||
fi
|
||||
|
||||
wasm:
|
||||
env:
|
||||
WASM_OPTIONS: --no-default-features --target wasm32-unknown-unknown
|
||||
CLIPPY_CONF_DIR: ${{ github.workspace }}/clippy/wasm/
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
job:
|
||||
- name: Build WASM
|
||||
command: cargo build
|
||||
args:
|
||||
- name: Clippy WASM
|
||||
command: cargo clippy
|
||||
args: -- $CLIPPY_OPTIONS
|
||||
|
||||
name: ${{ matrix.job.name }}
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.7
|
||||
|
||||
- name: Setup Rust toolchain and cache
|
||||
uses: actions-rust-lang/setup-rust-toolchain@v1.12.0
|
||||
|
||||
- name: Add wasm32-unknown-unknown target
|
||||
run: rustup target add wasm32-unknown-unknown
|
||||
|
||||
- run: ${{ matrix.job.command }} -p nu-cmd-base $WASM_OPTIONS ${{ matrix.job.args }}
|
||||
- run: ${{ matrix.job.command }} -p nu-cmd-extra $WASM_OPTIONS ${{ matrix.job.args }}
|
||||
- run: ${{ matrix.job.command }} -p nu-cmd-lang $WASM_OPTIONS ${{ matrix.job.args }}
|
||||
- run: ${{ matrix.job.command }} -p nu-color-config $WASM_OPTIONS ${{ matrix.job.args }}
|
||||
- run: ${{ matrix.job.command }} -p nu-command $WASM_OPTIONS ${{ matrix.job.args }}
|
||||
- run: ${{ matrix.job.command }} -p nu-derive-value $WASM_OPTIONS ${{ matrix.job.args }}
|
||||
- run: ${{ matrix.job.command }} -p nu-engine $WASM_OPTIONS ${{ matrix.job.args }}
|
||||
- run: ${{ matrix.job.command }} -p nu-glob $WASM_OPTIONS ${{ matrix.job.args }}
|
||||
- run: ${{ matrix.job.command }} -p nu-json $WASM_OPTIONS ${{ matrix.job.args }}
|
||||
- run: ${{ matrix.job.command }} -p nu-parser $WASM_OPTIONS ${{ matrix.job.args }}
|
||||
- run: ${{ matrix.job.command }} -p nu-path $WASM_OPTIONS ${{ matrix.job.args }}
|
||||
- run: ${{ matrix.job.command }} -p nu-pretty-hex $WASM_OPTIONS ${{ matrix.job.args }}
|
||||
- run: ${{ matrix.job.command }} -p nu-protocol $WASM_OPTIONS ${{ matrix.job.args }}
|
||||
- run: ${{ matrix.job.command }} -p nu-std $WASM_OPTIONS ${{ matrix.job.args }}
|
||||
- run: ${{ matrix.job.command }} -p nu-system $WASM_OPTIONS ${{ matrix.job.args }}
|
||||
- run: ${{ matrix.job.command }} -p nu-table $WASM_OPTIONS ${{ matrix.job.args }}
|
||||
- run: ${{ matrix.job.command }} -p nu-term-grid $WASM_OPTIONS ${{ matrix.job.args }}
|
||||
- run: ${{ matrix.job.command }} -p nu-utils $WASM_OPTIONS ${{ matrix.job.args }}
|
||||
- run: ${{ matrix.job.command }} -p nuon $WASM_OPTIONS ${{ matrix.job.args }}
|
@ -1,25 +0,0 @@
|
||||
name: Comment on changes to the config
|
||||
on:
|
||||
pull_request_target:
|
||||
paths:
|
||||
- 'crates/nu-protocol/src/config/**'
|
||||
jobs:
|
||||
comment:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check if there is already a bot comment
|
||||
uses: peter-evans/find-comment@v3
|
||||
id: fc
|
||||
with:
|
||||
issue-number: ${{ github.event.pull_request.number }}
|
||||
comment-author: 'github-actions[bot]'
|
||||
body-includes: Hey, just a bot checking in!
|
||||
- name: Create comment if there is not
|
||||
if: steps.fc.outputs.comment-id == ''
|
||||
uses: peter-evans/create-or-update-comment@v4
|
||||
with:
|
||||
issue-number: ${{ github.event.pull_request.number }}
|
||||
body: |
|
||||
Hey, just a bot checking in! You edited files related to the configuration.
|
||||
If you changed any of the default values or added a new config option, don't forget to update the [`doc_config.nu`](https://github.com/nushell/nushell/blob/main/crates/nu-utils/src/default_files/doc_config.nu) which documents the options for our users including the defaults provided by the Rust implementation.
|
||||
If you didn't make a change here, you can just ignore me.
|
19
nushell/.github/workflows/labels.yml
vendored
19
nushell/.github/workflows/labels.yml
vendored
@ -1,19 +0,0 @@
|
||||
# Automatically labels PRs based on the configuration file
|
||||
# you are probably looking for 👉 `.github/labeler.yml`
|
||||
name: Label PRs
|
||||
|
||||
on:
|
||||
- pull_request_target
|
||||
|
||||
jobs:
|
||||
triage:
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
runs-on: ubuntu-latest
|
||||
if: github.repository_owner == 'nushell'
|
||||
steps:
|
||||
- uses: actions/labeler@v5
|
||||
with:
|
||||
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
sync-labels: true
|
30
nushell/.github/workflows/milestone.yml
vendored
30
nushell/.github/workflows/milestone.yml
vendored
@ -1,30 +0,0 @@
|
||||
# Description:
|
||||
# - Add milestone to a merged PR automatically
|
||||
# - Add milestone to a closed issue that has a merged PR fix (if any)
|
||||
|
||||
name: Milestone Action
|
||||
on:
|
||||
issues:
|
||||
types: [closed]
|
||||
pull_request_target:
|
||||
types: [closed]
|
||||
|
||||
jobs:
|
||||
update-milestone:
|
||||
runs-on: ubuntu-latest
|
||||
name: Milestone Update
|
||||
steps:
|
||||
- name: Set Milestone for PR
|
||||
uses: hustcer/milestone-action@main
|
||||
if: github.event.pull_request.merged == true
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
# Bind milestone to closed issue that has a merged PR fix
|
||||
- name: Set Milestone for Issue
|
||||
uses: hustcer/milestone-action@v2
|
||||
if: github.event.issue.state == 'closed'
|
||||
with:
|
||||
action: bind-issue
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
284
nushell/.github/workflows/nightly-build.yml
vendored
284
nushell/.github/workflows/nightly-build.yml
vendored
@ -1,284 +0,0 @@
|
||||
#
|
||||
# REF:
|
||||
# 1. https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategymatrixinclude
|
||||
# 2. https://github.com/JasonEtco/create-an-issue
|
||||
# 3. https://docs.github.com/en/actions/learn-github-actions/variables
|
||||
# 4. https://github.com/actions/github-script
|
||||
# 5. https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#jobsjob_idneeds
|
||||
#
|
||||
name: Nightly Build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- nightly # Just for test purpose only with the nightly repo
|
||||
# This schedule will run only from the default branch
|
||||
schedule:
|
||||
- cron: '15 0 * * *' # run at 00:15 AM UTC
|
||||
workflow_dispatch:
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
jobs:
|
||||
prepare:
|
||||
name: Prepare
|
||||
runs-on: ubuntu-latest
|
||||
# This job is required by the release job, so we should make it run both from Nushell repo and nightly repo
|
||||
# if: github.repository == 'nushell/nightly'
|
||||
# Map a step output to a job output
|
||||
outputs:
|
||||
skip: ${{ steps.vars.outputs.skip }}
|
||||
build_date: ${{ steps.vars.outputs.build_date }}
|
||||
nightly_tag: ${{ steps.vars.outputs.nightly_tag }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
if: github.repository == 'nushell/nightly'
|
||||
with:
|
||||
ref: main
|
||||
fetch-depth: 0
|
||||
# Configure PAT here: https://github.com/settings/tokens for the push operation in the following steps
|
||||
token: ${{ secrets.WORKFLOW_TOKEN }}
|
||||
|
||||
- name: Setup Nushell
|
||||
uses: hustcer/setup-nu@v3
|
||||
if: github.repository == 'nushell/nightly'
|
||||
with:
|
||||
version: 0.105.1
|
||||
|
||||
# Synchronize the main branch of nightly repo with the main branch of Nushell official repo
|
||||
- name: Prepare for Nightly Release
|
||||
shell: nu {0}
|
||||
if: github.repository == 'nushell/nightly'
|
||||
run: |
|
||||
cd $env.GITHUB_WORKSPACE
|
||||
git checkout main
|
||||
# We can't push if no user name and email are configured
|
||||
git config user.name 'hustcer'
|
||||
git config user.email 'hustcer@outlook.com'
|
||||
git pull origin main
|
||||
git remote add src https://github.com/nushell/nushell.git
|
||||
git fetch src main
|
||||
# All the changes will be overwritten by the upstream main branch
|
||||
git reset --hard src/main
|
||||
git push origin main -f
|
||||
|
||||
- name: Create Tag and Output Tag Name
|
||||
if: github.repository == 'nushell/nightly'
|
||||
id: vars
|
||||
shell: nu {0}
|
||||
run: |
|
||||
let date = date now | format date %m%d
|
||||
let version = open Cargo.toml | get package.version
|
||||
let sha_short = (git rev-parse --short origin/main | str trim | str substring 0..6)
|
||||
let latest_meta = http get https://api.github.com/repos/nushell/nightly/releases
|
||||
| sort-by -r created_at
|
||||
| where tag_name =~ nightly
|
||||
| get tag_name?.0? | default ''
|
||||
| parse '{version}-nightly.{build}+{hash}'
|
||||
if ($latest_meta.0?.hash? | default '') == $sha_short {
|
||||
print $'(ansi g)Latest nightly build is up-to-date, skip rebuilding.(ansi reset)'
|
||||
$'skip=true(char nl)' o>> $env.GITHUB_OUTPUT
|
||||
exit 0
|
||||
}
|
||||
let prev_ver = $latest_meta.0?.version? | default '0.0.0'
|
||||
let build = if ($latest_meta | is-empty) or ($version != $prev_ver) { 1 } else {
|
||||
($latest_meta | get build?.0? | default 0 | into int) + 1
|
||||
}
|
||||
let nightly_tag = $'($version)-nightly.($build)+($sha_short)'
|
||||
$'build_date=($date)(char nl)' o>> $env.GITHUB_OUTPUT
|
||||
$'nightly_tag=($nightly_tag)(char nl)' o>> $env.GITHUB_OUTPUT
|
||||
if (git ls-remote --tags origin $nightly_tag | is-empty) {
|
||||
ls **/Cargo.toml | each {|file|
|
||||
open --raw $file.name
|
||||
| str replace --all $'version = "($version)"' $'version = "($version)-nightly.($build)"'
|
||||
| save --force $file.name
|
||||
}
|
||||
# Disable the following two workflows for the automatic committed changes
|
||||
rm .github/workflows/ci.yml
|
||||
rm .github/workflows/audit.yml
|
||||
|
||||
git add .
|
||||
git commit -m $'Update version to ($version)-nightly.($build)'
|
||||
git tag -a $nightly_tag -m $'Nightly build from ($sha_short)'
|
||||
git push origin --tags
|
||||
git push origin main -f
|
||||
}
|
||||
|
||||
release:
|
||||
name: Nu
|
||||
needs: prepare
|
||||
if: needs.prepare.outputs.skip != 'true'
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target:
|
||||
- aarch64-apple-darwin
|
||||
- x86_64-apple-darwin
|
||||
- x86_64-pc-windows-msvc
|
||||
- aarch64-pc-windows-msvc
|
||||
- x86_64-unknown-linux-gnu
|
||||
- x86_64-unknown-linux-musl
|
||||
- aarch64-unknown-linux-gnu
|
||||
- aarch64-unknown-linux-musl
|
||||
- armv7-unknown-linux-gnueabihf
|
||||
- armv7-unknown-linux-musleabihf
|
||||
- riscv64gc-unknown-linux-gnu
|
||||
- loongarch64-unknown-linux-gnu
|
||||
- loongarch64-unknown-linux-musl
|
||||
include:
|
||||
- target: aarch64-apple-darwin
|
||||
os: macos-latest
|
||||
- target: x86_64-apple-darwin
|
||||
os: macos-latest
|
||||
- target: x86_64-pc-windows-msvc
|
||||
os: windows-latest
|
||||
- target: aarch64-pc-windows-msvc
|
||||
os: windows-11-arm
|
||||
- target: x86_64-unknown-linux-gnu
|
||||
os: ubuntu-22.04
|
||||
- target: x86_64-unknown-linux-musl
|
||||
os: ubuntu-22.04
|
||||
- target: aarch64-unknown-linux-gnu
|
||||
os: ubuntu-22.04
|
||||
- target: aarch64-unknown-linux-musl
|
||||
os: ubuntu-22.04
|
||||
- target: armv7-unknown-linux-gnueabihf
|
||||
os: ubuntu-22.04
|
||||
- target: armv7-unknown-linux-musleabihf
|
||||
os: ubuntu-22.04
|
||||
- target: riscv64gc-unknown-linux-gnu
|
||||
os: ubuntu-22.04
|
||||
- target: loongarch64-unknown-linux-gnu
|
||||
os: ubuntu-22.04
|
||||
- target: loongarch64-unknown-linux-musl
|
||||
os: ubuntu-22.04
|
||||
|
||||
runs-on: ${{matrix.os}}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: main
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Install Wix Toolset 6 for Windows
|
||||
shell: pwsh
|
||||
if: ${{ startsWith(matrix.os, 'windows') }}
|
||||
run: |
|
||||
dotnet tool install --global wix --version 6.0.0
|
||||
dotnet workload install wix
|
||||
$wixPath = "$env:USERPROFILE\.dotnet\tools"
|
||||
echo "$wixPath" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
$env:PATH = "$wixPath;$env:PATH"
|
||||
wix --version
|
||||
|
||||
- name: Update Rust Toolchain Target
|
||||
run: |
|
||||
echo "targets = ['${{matrix.target}}']" >> rust-toolchain.toml
|
||||
|
||||
- name: Setup Rust toolchain and cache
|
||||
uses: actions-rust-lang/setup-rust-toolchain@v1
|
||||
# WARN: Keep the rustflags to prevent from the winget submission error: `CAQuietExec: Error 0xc0000135`
|
||||
with:
|
||||
cache: false
|
||||
rustflags: ''
|
||||
|
||||
- name: Setup Nushell
|
||||
uses: hustcer/setup-nu@v3
|
||||
with:
|
||||
version: 0.105.1
|
||||
|
||||
- name: Release Nu Binary
|
||||
id: nu
|
||||
run: nu .github/workflows/release-pkg.nu
|
||||
env:
|
||||
OS: ${{ matrix.os }}
|
||||
REF: ${{ github.ref }}
|
||||
TARGET: ${{ matrix.target }}
|
||||
|
||||
- name: Create an Issue for Release Failure
|
||||
if: ${{ failure() }}
|
||||
uses: JasonEtco/create-an-issue@v2
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
update_existing: true
|
||||
search_existing: open
|
||||
filename: .github/AUTO_ISSUE_TEMPLATE/nightly-build-fail.md
|
||||
|
||||
# REF: https://github.com/marketplace/actions/gh-release
|
||||
# Create a release only in nushell/nightly repo
|
||||
- name: Publish Archive
|
||||
uses: softprops/action-gh-release@v2.0.9
|
||||
if: ${{ startsWith(github.repository, 'nushell/nightly') }}
|
||||
with:
|
||||
prerelease: true
|
||||
files: |
|
||||
${{ steps.nu.outputs.msi }}
|
||||
${{ steps.nu.outputs.archive }}
|
||||
tag_name: ${{ needs.prepare.outputs.nightly_tag }}
|
||||
name: ${{ needs.prepare.outputs.build_date }}-${{ needs.prepare.outputs.nightly_tag }}
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
sha256sum:
|
||||
needs: [prepare, release]
|
||||
name: Create Sha256sum
|
||||
runs-on: ubuntu-latest
|
||||
if: github.repository == 'nushell/nightly'
|
||||
steps:
|
||||
- name: Download Release Archives
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: >-
|
||||
gh release download ${{ needs.prepare.outputs.nightly_tag }}
|
||||
--repo ${{ github.repository }}
|
||||
--pattern '*'
|
||||
--dir release
|
||||
- name: Create Checksums
|
||||
run: cd release && shasum -a 256 * > ../SHA256SUMS
|
||||
- name: Publish Checksums
|
||||
uses: softprops/action-gh-release@v2.0.9
|
||||
with:
|
||||
draft: false
|
||||
prerelease: true
|
||||
files: SHA256SUMS
|
||||
tag_name: ${{ needs.prepare.outputs.nightly_tag }}
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
cleanup:
|
||||
name: Cleanup
|
||||
# Should only run in nushell/nightly repo
|
||||
if: github.repository == 'nushell/nightly'
|
||||
needs: [release, sha256sum]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: main
|
||||
|
||||
- name: Setup Nushell
|
||||
uses: hustcer/setup-nu@v3
|
||||
with:
|
||||
version: 0.105.1
|
||||
|
||||
# Keep the last a few releases
|
||||
- name: Delete Older Releases
|
||||
shell: nu {0}
|
||||
run: |
|
||||
let KEEP_COUNT = 10
|
||||
let deprecated = (http get https://api.github.com/repos/nushell/nightly/releases | sort-by -r created_at | select tag_name id | slice $KEEP_COUNT..)
|
||||
for release in $deprecated {
|
||||
print $'Deleting tag ($release.tag_name)'
|
||||
git push origin --delete $release.tag_name
|
||||
print $'Deleting release ($release.tag_name)'
|
||||
let delete_url = $'https://api.github.com/repos/nushell/nightly/releases/($release.id)'
|
||||
let version = "X-GitHub-Api-Version: 2022-11-28"
|
||||
let accept = "Accept: application/vnd.github+json"
|
||||
let auth = "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}"
|
||||
# http delete $delete_url -H $version -H $auth -H $accept
|
||||
curl -L -X DELETE -H $accept -H $auth -H $version $delete_url
|
||||
}
|
62
nushell/.github/workflows/release-msi.nu
vendored
62
nushell/.github/workflows/release-msi.nu
vendored
@ -1,62 +0,0 @@
|
||||
#!/usr/bin/env nu
|
||||
|
||||
# Created: 2025/05/21 19:05:20
|
||||
# Description:
|
||||
# A script to build Windows MSI packages for NuShell. Need wix 6.0 to be installed.
|
||||
# The script will download the specified NuShell release, extract it, and create an MSI package.
|
||||
# Can be run locally or in GitHub Actions.
|
||||
# To run this script locally:
|
||||
# load-env { TARGET: 'x86_64-pc-windows-msvc' REF: '0.103.0' GITHUB_REPOSITORY: 'nushell/nushell' }
|
||||
# nu .github/workflows/release-msi.nu
|
||||
|
||||
def build-msi [] {
|
||||
let target = $env.TARGET
|
||||
# We should read the version from the environment variable first
|
||||
# As we may build the MSI package for a specific version not the latest one
|
||||
let version = $env.MSI_VERSION? | default (open Cargo.toml | get package.version)
|
||||
let arch = if $nu.os-info.arch =~ 'x86_64' { 'x64' } else { 'arm64' }
|
||||
|
||||
print $'Building msi package for (ansi g)($target)(ansi reset) with version (ansi g)($version)(ansi reset) from tag (ansi g)($env.REF)(ansi reset)...'
|
||||
fetch-nu-pkg
|
||||
# Create extra Windows msi release package if dotnet and wix are available
|
||||
let installed = [dotnet wix] | all { (which $in | length) > 0 }
|
||||
if $installed and (wix --version | split row . | first | into int) >= 6 {
|
||||
|
||||
print $'(char nl)Start creating Windows msi package with the following contents...'
|
||||
cd wix; hr-line
|
||||
cp nu/README.txt .
|
||||
ls -f nu/* | print
|
||||
./nu/nu.exe -c $'NU_RELEASE_VERSION=($version) dotnet build -c Release -p:Platform=($arch)'
|
||||
glob **/*.msi | print
|
||||
# Workaround for https://github.com/softprops/action-gh-release/issues/280
|
||||
let wixRelease = (glob **/*.msi | where $it =~ bin | get 0 | str replace --all '\' '/')
|
||||
let msi = $'($wixRelease | path dirname)/nu-($version)-($target).msi'
|
||||
mv $wixRelease $msi
|
||||
print $'MSI archive: ---> ($msi)';
|
||||
# Run only in GitHub Actions
|
||||
if ($env.GITHUB_ACTIONS? | default false | into bool) {
|
||||
echo $"msi=($msi)(char nl)" o>> $env.GITHUB_OUTPUT
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
def fetch-nu-pkg [] {
|
||||
mkdir wix/nu
|
||||
# See: https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/store-information-in-variables#default-environment-variables
|
||||
gh release download $env.REF --repo $env.GITHUB_REPOSITORY --pattern $'*-($env.TARGET).zip' --dir wix/nu
|
||||
cd wix/nu
|
||||
let pkg = ls *.zip | get name.0
|
||||
unzip $pkg
|
||||
rm $pkg
|
||||
ls | print
|
||||
}
|
||||
|
||||
# Print a horizontal line marker
|
||||
def 'hr-line' [
|
||||
--blank-line(-b)
|
||||
] {
|
||||
print $'(ansi g)---------------------------------------------------------------------------->(ansi reset)'
|
||||
if $blank_line { char nl }
|
||||
}
|
||||
|
||||
alias main = build-msi
|
103
nushell/.github/workflows/release-msi.yml
vendored
103
nushell/.github/workflows/release-msi.yml
vendored
@ -1,103 +0,0 @@
|
||||
#
|
||||
# REF:
|
||||
# 1. https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategymatrixinclude
|
||||
#
|
||||
name: Build Windows MSI
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
tag:
|
||||
required: true
|
||||
description: 'Tag to Rebuild MSI'
|
||||
version:
|
||||
description: 'Version of Rebuild MSI'
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
packages: write
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
jobs:
|
||||
release:
|
||||
name: Nu
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target:
|
||||
- x86_64-pc-windows-msvc
|
||||
- aarch64-pc-windows-msvc
|
||||
extra: ['bin']
|
||||
|
||||
include:
|
||||
- target: x86_64-pc-windows-msvc
|
||||
os: windows-latest
|
||||
- target: aarch64-pc-windows-msvc
|
||||
os: windows-11-arm
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install Wix Toolset 6 for Windows
|
||||
shell: pwsh
|
||||
if: ${{ startsWith(matrix.os, 'windows') }}
|
||||
run: |
|
||||
dotnet tool install --global wix --version 6.0.0
|
||||
dotnet workload install wix
|
||||
$wixPath = "$env:USERPROFILE\.dotnet\tools"
|
||||
echo "$wixPath" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
$env:PATH = "$wixPath;$env:PATH"
|
||||
wix --version
|
||||
|
||||
- name: Setup Nushell
|
||||
uses: hustcer/setup-nu@v3
|
||||
with:
|
||||
version: 0.105.1
|
||||
|
||||
- name: Release MSI Packages
|
||||
id: nu
|
||||
run: nu .github/workflows/release-msi.nu
|
||||
env:
|
||||
OS: ${{ matrix.os }}
|
||||
REF: ${{ inputs.tag }}
|
||||
TARGET: ${{ matrix.target }}
|
||||
MSI_VERSION: ${{ inputs.version }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
# REF: https://github.com/marketplace/actions/gh-release
|
||||
- name: Publish Archive
|
||||
uses: softprops/action-gh-release@v2.0.5
|
||||
with:
|
||||
tag_name: ${{ inputs.tag }}
|
||||
files: ${{ steps.nu.outputs.msi }}
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
sha256sum:
|
||||
needs: release
|
||||
name: Create Sha256sum
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Download Release Archives
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: >-
|
||||
gh release download ${{ inputs.tag }}
|
||||
--repo ${{ github.repository }}
|
||||
--pattern '*'
|
||||
--dir release
|
||||
- name: Create Checksums
|
||||
run: cd release && rm -f SHA256SUMS && shasum -a 256 * > ../SHA256SUMS
|
||||
- name: Publish Checksums
|
||||
uses: softprops/action-gh-release@v2.0.5
|
||||
with:
|
||||
files: SHA256SUMS
|
||||
tag_name: ${{ inputs.tag }}
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
254
nushell/.github/workflows/release-pkg.nu
vendored
254
nushell/.github/workflows/release-pkg.nu
vendored
@ -1,254 +0,0 @@
|
||||
#!/usr/bin/env nu
|
||||
|
||||
# Created: 2022/05/26 19:05:20
|
||||
# Description:
|
||||
# A script to do the github release task, need nushell to be installed.
|
||||
# REF:
|
||||
# 1. https://github.com/volks73/cargo-wix
|
||||
|
||||
# Instructions for manually creating an MSI for Winget Releases when they fail
|
||||
# Added 2022-11-29 when Windows packaging wouldn't work
|
||||
# Updated again on 2023-02-23 because MSIs are still failing validation
|
||||
# To run this manual for windows here are the steps I take
|
||||
# checkout the release you want to publish
|
||||
# 1. git checkout 0.103.0
|
||||
# unset CARGO_TARGET_DIR if set (I have to do this in the parent shell to get it to work)
|
||||
# 2. $env:CARGO_TARGET_DIR = ""
|
||||
# 2. hide-env CARGO_TARGET_DIR
|
||||
# 3. $env.TARGET = 'x86_64-pc-windows-msvc'
|
||||
# 4. $env.GITHUB_WORKSPACE = 'D:\nushell'
|
||||
# 5. $env.GITHUB_OUTPUT = 'D:\nushell\output\out.txt'
|
||||
# 6. $env.OS = 'windows-latest'
|
||||
# make sure 7z.exe is in your path https://www.7-zip.org/download.html
|
||||
# 7. $env.Path = ($env.Path | append 'c:\apps\7-zip')
|
||||
# make sure aria2c.exe is in your path https://github.com/aria2/aria2
|
||||
# 8. $env.Path = ($env.Path | append 'c:\path\to\aria2c')
|
||||
# make sure you have the wix 6.0 installed: dotnet tool install --global wix --version 6.0.0
|
||||
# then build nu*.exe and the MSI installer by running:
|
||||
# 9. source .github\workflows\release-pkg.nu
|
||||
# After msi is generated, you have to update winget-pkgs repo, you'll need to patch the release
|
||||
# by deleting the existing msi and uploading this new msi. Then you'll need to update the hash
|
||||
# on the winget-pkgs PR. To generate the hash, run this command
|
||||
# 10. open wix\bin\x64\Release\nu-0.103.0-x86_64-pc-windows-msvc.msi | hash sha256
|
||||
# Then, just take the output and put it in the winget-pkgs PR for the hash on the msi
|
||||
|
||||
|
||||
# The main binary file to be released
|
||||
let bin = 'nu'
|
||||
let os = $env.OS
|
||||
let target = $env.TARGET
|
||||
# Repo source dir like `/home/runner/work/nushell/nushell`
|
||||
let src = $env.GITHUB_WORKSPACE
|
||||
let dist = $'($env.GITHUB_WORKSPACE)/output'
|
||||
let version = (open Cargo.toml | get package.version)
|
||||
|
||||
print $'Debugging info:'
|
||||
print { version: $version, bin: $bin, os: $os, target: $target, src: $src, dist: $dist }; hr-line -b
|
||||
|
||||
# $env
|
||||
|
||||
let USE_UBUNTU = $os starts-with ubuntu
|
||||
|
||||
print $'(char nl)Packaging ($bin) v($version) for ($target) in ($src)...'; hr-line -b
|
||||
if not ('Cargo.lock' | path exists) { cargo generate-lockfile }
|
||||
|
||||
print $'Start building ($bin)...'; hr-line
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Build for Ubuntu and macOS
|
||||
# ----------------------------------------------------------------------------
|
||||
if $os in ['macos-latest'] or $USE_UBUNTU {
|
||||
if $USE_UBUNTU {
|
||||
sudo apt update
|
||||
sudo apt-get install libxcb-composite0-dev -y
|
||||
}
|
||||
match $target {
|
||||
'aarch64-unknown-linux-gnu' => {
|
||||
sudo apt-get install gcc-aarch64-linux-gnu -y
|
||||
$env.CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER = 'aarch64-linux-gnu-gcc'
|
||||
cargo-build-nu
|
||||
}
|
||||
'riscv64gc-unknown-linux-gnu' => {
|
||||
sudo apt-get install gcc-riscv64-linux-gnu -y
|
||||
$env.CARGO_TARGET_RISCV64GC_UNKNOWN_LINUX_GNU_LINKER = 'riscv64-linux-gnu-gcc'
|
||||
cargo-build-nu
|
||||
}
|
||||
'armv7-unknown-linux-gnueabihf' => {
|
||||
sudo apt-get install pkg-config gcc-arm-linux-gnueabihf -y
|
||||
$env.CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER = 'arm-linux-gnueabihf-gcc'
|
||||
cargo-build-nu
|
||||
}
|
||||
'aarch64-unknown-linux-musl' => {
|
||||
aria2c https://github.com/nushell/integrations/releases/download/build-tools/aarch64-linux-musl-cross.tgz
|
||||
tar -xf aarch64-linux-musl-cross.tgz -C $env.HOME
|
||||
$env.PATH = ($env.PATH | split row (char esep) | prepend $'($env.HOME)/aarch64-linux-musl-cross/bin')
|
||||
$env.CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER = 'aarch64-linux-musl-gcc'
|
||||
cargo-build-nu
|
||||
}
|
||||
'armv7-unknown-linux-musleabihf' => {
|
||||
aria2c https://github.com/nushell/integrations/releases/download/build-tools/armv7r-linux-musleabihf-cross.tgz
|
||||
tar -xf armv7r-linux-musleabihf-cross.tgz -C $env.HOME
|
||||
$env.PATH = ($env.PATH | split row (char esep) | prepend $'($env.HOME)/armv7r-linux-musleabihf-cross/bin')
|
||||
$env.CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABIHF_LINKER = 'armv7r-linux-musleabihf-gcc'
|
||||
cargo-build-nu
|
||||
}
|
||||
'loongarch64-unknown-linux-gnu' => {
|
||||
aria2c https://github.com/loongson/build-tools/releases/download/2024.08.08/x86_64-cross-tools-loongarch64-binutils_2.43-gcc_14.2.0-glibc_2.40.tar.xz
|
||||
tar xf x86_64-cross-tools-loongarch64-*.tar.xz
|
||||
$env.PATH = ($env.PATH | split row (char esep) | prepend $'($env.PWD)/cross-tools/bin')
|
||||
$env.CARGO_TARGET_LOONGARCH64_UNKNOWN_LINUX_GNU_LINKER = 'loongarch64-unknown-linux-gnu-gcc'
|
||||
cargo-build-nu
|
||||
}
|
||||
'loongarch64-unknown-linux-musl' => {
|
||||
print $"(ansi g)Downloading LoongArch64 musl cross-compilation toolchain...(ansi reset)"
|
||||
aria2c -q https://github.com/LoongsonLab/oscomp-toolchains-for-oskernel/releases/download/loongarch64-linux-musl-cross-gcc-13.2.0/loongarch64-linux-musl-cross.tgz
|
||||
tar -xf loongarch64-linux-musl-cross.tgz
|
||||
$env.PATH = ($env.PATH | split row (char esep) | prepend $'($env.PWD)/loongarch64-linux-musl-cross/bin')
|
||||
$env.CARGO_TARGET_LOONGARCH64_UNKNOWN_LINUX_MUSL_LINKER = "loongarch64-linux-musl-gcc"
|
||||
cargo-build-nu
|
||||
}
|
||||
_ => {
|
||||
# musl-tools to fix 'Failed to find tool. Is `musl-gcc` installed?'
|
||||
# Actually just for x86_64-unknown-linux-musl target
|
||||
if $USE_UBUNTU { sudo apt install musl-tools -y }
|
||||
cargo-build-nu
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Build for Windows without static-link-openssl feature
|
||||
# ----------------------------------------------------------------------------
|
||||
if $os =~ 'windows' {
|
||||
cargo-build-nu
|
||||
}
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Prepare for the release archive
|
||||
# ----------------------------------------------------------------------------
|
||||
let suffix = if $os =~ 'windows' { '.exe' }
|
||||
# nu, nu_plugin_* were all included
|
||||
let executable = $'target/($target)/release/($bin)*($suffix)'
|
||||
print $'Current executable file: ($executable)'
|
||||
|
||||
cd $src; mkdir $dist;
|
||||
rm -rf ...(glob $'target/($target)/release/*.d') ...(glob $'target/($target)/release/nu_pretty_hex*')
|
||||
print $'(char nl)All executable files:'; hr-line
|
||||
# We have to use `print` here to make sure the command output is displayed
|
||||
print (ls -f ($executable | into glob)); sleep 1sec
|
||||
|
||||
print $'(char nl)Copying release files...'; hr-line
|
||||
"To use the included Nushell plugins, register the binaries with the `plugin add` command to tell Nu where to find the plugin.
|
||||
Then you can use `plugin use` to load the plugin into your session.
|
||||
For example:
|
||||
|
||||
> plugin add ./nu_plugin_query
|
||||
> plugin use query
|
||||
|
||||
For more information, refer to https://www.nushell.sh/book/plugins.html
|
||||
" | save $'($dist)/README.txt' -f
|
||||
[LICENSE ...(glob $executable)] | each {|it| cp -rv $it $dist } | flatten
|
||||
|
||||
print $'(char nl)Check binary release version detail:'; hr-line
|
||||
let ver = if $os =~ 'windows' {
|
||||
(do -i { .\output\nu.exe -c 'version' }) | default '' | str join
|
||||
} else {
|
||||
(do -i { ./output/nu -c 'version' }) | default '' | str join
|
||||
}
|
||||
if ($ver | str trim | is-empty) {
|
||||
print $'(ansi r)Incompatible Nu binary: The binary cross compiled is not runnable on current arch...(ansi reset)'
|
||||
} else { print $ver }
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Create a release archive and send it to output for the following steps
|
||||
# ----------------------------------------------------------------------------
|
||||
cd $dist; print $'(char nl)Creating release archive...'; hr-line
|
||||
if $os in ['macos-latest'] or $USE_UBUNTU {
|
||||
|
||||
let files = (ls | get name)
|
||||
let dest = $'($bin)-($version)-($target)'
|
||||
let archive = $'($dist)/($dest).tar.gz'
|
||||
|
||||
mkdir $dest
|
||||
$files | each {|it| cp -v $it $dest }
|
||||
|
||||
print $'(char nl)(ansi g)Archive contents:(ansi reset)'; hr-line; ls $dest | print
|
||||
|
||||
tar -czf $archive $dest
|
||||
print $'archive: ---> ($archive)'; ls $archive
|
||||
# REF: https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/
|
||||
echo $"archive=($archive)(char nl)" o>> $env.GITHUB_OUTPUT
|
||||
|
||||
} else if $os =~ 'windows' {
|
||||
|
||||
let releaseStem = $'($bin)-($version)-($target)'
|
||||
let arch = if $nu.os-info.arch =~ 'x86_64' { 'x64' } else { 'arm64' }
|
||||
fetch-less $arch
|
||||
|
||||
print $'(char nl)(ansi g)Archive contents:(ansi reset)'; hr-line; ls | print
|
||||
let archive = $'($dist)/($releaseStem).zip'
|
||||
7z a $archive ...(glob *)
|
||||
let pkg = (ls -f $archive | get name)
|
||||
if not ($pkg | is-empty) {
|
||||
# Workaround for https://github.com/softprops/action-gh-release/issues/280
|
||||
let archive = ($pkg | get 0 | str replace --all '\' '/')
|
||||
print $'archive: ---> ($archive)'
|
||||
echo $"archive=($archive)(char nl)" o>> $env.GITHUB_OUTPUT
|
||||
}
|
||||
|
||||
# Create extra Windows msi release package if dotnet and wix are available
|
||||
let installed = [dotnet wix] | all { (which $in | length) > 0 }
|
||||
if $installed and (wix --version | split row . | first | into int) >= 6 {
|
||||
|
||||
print $'(char nl)Start creating Windows msi package with the following contents...'
|
||||
cd $src; cd wix; hr-line; mkdir nu
|
||||
# Wix need the binaries be stored in nu folder
|
||||
cp -r ($'($dist)/*' | into glob) nu/
|
||||
cp $'($dist)/README.txt' .
|
||||
ls -f nu/* | print
|
||||
./nu/nu.exe -c $'NU_RELEASE_VERSION=($version) dotnet build -c Release -p:Platform=($arch)'
|
||||
glob **/*.msi | print
|
||||
# Workaround for https://github.com/softprops/action-gh-release/issues/280
|
||||
let wixRelease = (glob **/*.msi | where $it =~ bin | get 0 | str replace --all '\' '/')
|
||||
let msi = $'($wixRelease | path dirname)/nu-($version)-($target).msi'
|
||||
mv $wixRelease $msi
|
||||
print $'MSI archive: ---> ($msi)';
|
||||
echo $"msi=($msi)(char nl)" o>> $env.GITHUB_OUTPUT
|
||||
}
|
||||
}
|
||||
|
||||
def fetch-less [
|
||||
arch: string = 'x64' # The architecture to fetch
|
||||
] {
|
||||
let less_zip = $'less-($arch).zip'
|
||||
print $'Fetching less archive: (ansi g)($less_zip)(ansi reset)'
|
||||
let url = $'https://github.com/jftuga/less-Windows/releases/download/less-v668/($less_zip)'
|
||||
http get https://github.com/jftuga/less-Windows/blob/master/LICENSE | save -rf LICENSE-for-less.txt
|
||||
http get $url | save -rf $less_zip
|
||||
unzip $less_zip
|
||||
rm $less_zip lesskey.exe
|
||||
}
|
||||
|
||||
def 'cargo-build-nu' [] {
|
||||
if $os =~ 'windows' {
|
||||
cargo build --release --all --target $target
|
||||
} else {
|
||||
cargo build --release --all --target $target --features=static-link-openssl
|
||||
}
|
||||
}
|
||||
|
||||
# Print a horizontal line marker
|
||||
def 'hr-line' [
|
||||
--blank-line(-b)
|
||||
] {
|
||||
print $'(ansi g)---------------------------------------------------------------------------->(ansi reset)'
|
||||
if $blank_line { char nl }
|
||||
}
|
||||
|
||||
# Get the specified env key's value or ''
|
||||
def 'get-env' [
|
||||
key: string # The key to get it's env value
|
||||
default: string = '' # The default value for an empty env
|
||||
] {
|
||||
$env | get -i $key | default $default
|
||||
}
|
141
nushell/.github/workflows/release.yml
vendored
141
nushell/.github/workflows/release.yml
vendored
@ -1,141 +0,0 @@
|
||||
#
|
||||
# REF:
|
||||
# 1. https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategymatrixinclude
|
||||
#
|
||||
name: Create Release Draft
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
tags:
|
||||
- '[0-9]+.[0-9]+.[0-9]+*'
|
||||
- '!*nightly*' # Don't trigger release for nightly tags
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
jobs:
|
||||
release:
|
||||
name: Nu
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target:
|
||||
- aarch64-apple-darwin
|
||||
- x86_64-apple-darwin
|
||||
- x86_64-pc-windows-msvc
|
||||
- aarch64-pc-windows-msvc
|
||||
- x86_64-unknown-linux-gnu
|
||||
- x86_64-unknown-linux-musl
|
||||
- aarch64-unknown-linux-gnu
|
||||
- aarch64-unknown-linux-musl
|
||||
- armv7-unknown-linux-gnueabihf
|
||||
- armv7-unknown-linux-musleabihf
|
||||
- riscv64gc-unknown-linux-gnu
|
||||
- loongarch64-unknown-linux-gnu
|
||||
- loongarch64-unknown-linux-musl
|
||||
include:
|
||||
- target: aarch64-apple-darwin
|
||||
os: macos-latest
|
||||
- target: x86_64-apple-darwin
|
||||
os: macos-latest
|
||||
- target: x86_64-pc-windows-msvc
|
||||
os: windows-latest
|
||||
- target: aarch64-pc-windows-msvc
|
||||
os: windows-11-arm
|
||||
- target: x86_64-unknown-linux-gnu
|
||||
os: ubuntu-22.04
|
||||
- target: x86_64-unknown-linux-musl
|
||||
os: ubuntu-22.04
|
||||
- target: aarch64-unknown-linux-gnu
|
||||
os: ubuntu-22.04
|
||||
- target: aarch64-unknown-linux-musl
|
||||
os: ubuntu-22.04
|
||||
- target: armv7-unknown-linux-gnueabihf
|
||||
os: ubuntu-22.04
|
||||
- target: armv7-unknown-linux-musleabihf
|
||||
os: ubuntu-22.04
|
||||
- target: riscv64gc-unknown-linux-gnu
|
||||
os: ubuntu-22.04
|
||||
- target: loongarch64-unknown-linux-gnu
|
||||
os: ubuntu-22.04
|
||||
- target: loongarch64-unknown-linux-musl
|
||||
os: ubuntu-22.04
|
||||
|
||||
runs-on: ${{matrix.os}}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install Wix Toolset 6 for Windows
|
||||
shell: pwsh
|
||||
if: ${{ startsWith(matrix.os, 'windows') }}
|
||||
run: |
|
||||
dotnet tool install --global wix --version 6.0.0
|
||||
dotnet workload install wix
|
||||
$wixPath = "$env:USERPROFILE\.dotnet\tools"
|
||||
echo "$wixPath" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
$env:PATH = "$wixPath;$env:PATH"
|
||||
wix --version
|
||||
|
||||
- name: Update Rust Toolchain Target
|
||||
run: |
|
||||
echo "targets = ['${{matrix.target}}']" >> rust-toolchain.toml
|
||||
|
||||
- name: Setup Rust toolchain
|
||||
uses: actions-rust-lang/setup-rust-toolchain@v1.12.0
|
||||
# WARN: Keep the rustflags to prevent from the winget submission error: `CAQuietExec: Error 0xc0000135`
|
||||
with:
|
||||
cache: false
|
||||
rustflags: ''
|
||||
|
||||
- name: Setup Nushell
|
||||
uses: hustcer/setup-nu@v3
|
||||
with:
|
||||
version: 0.105.1
|
||||
|
||||
- name: Release Nu Binary
|
||||
id: nu
|
||||
run: nu .github/workflows/release-pkg.nu
|
||||
env:
|
||||
OS: ${{ matrix.os }}
|
||||
REF: ${{ github.ref }}
|
||||
TARGET: ${{ matrix.target }}
|
||||
|
||||
# WARN: Don't upgrade this action due to the release per asset issue.
|
||||
# See: https://github.com/softprops/action-gh-release/issues/445
|
||||
- name: Publish Archive
|
||||
uses: softprops/action-gh-release@v2.0.5
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/') }}
|
||||
with:
|
||||
draft: true
|
||||
files: |
|
||||
${{ steps.nu.outputs.msi }}
|
||||
${{ steps.nu.outputs.archive }}
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
sha256sum:
|
||||
needs: release
|
||||
name: Create Sha256sum
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Download Release Archives
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: >-
|
||||
gh release download ${{ github.ref_name }}
|
||||
--repo ${{ github.repository }}
|
||||
--pattern '*'
|
||||
--dir release
|
||||
- name: Create Checksums
|
||||
run: cd release && shasum -a 256 * > ../SHA256SUMS
|
||||
- name: Publish Checksums
|
||||
uses: softprops/action-gh-release@v2.0.5
|
||||
with:
|
||||
draft: true
|
||||
files: SHA256SUMS
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
13
nushell/.github/workflows/typos.yml
vendored
13
nushell/.github/workflows/typos.yml
vendored
@ -1,13 +0,0 @@
|
||||
name: Typos
|
||||
on: [pull_request]
|
||||
|
||||
jobs:
|
||||
run:
|
||||
name: Spell Check with Typos
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Actions Repository
|
||||
uses: actions/checkout@v4.1.7
|
||||
|
||||
- name: Check spelling
|
||||
uses: crate-ci/typos@v1.33.1
|
34
nushell/.github/workflows/winget-submission.yml
vendored
34
nushell/.github/workflows/winget-submission.yml
vendored
@ -1,34 +0,0 @@
|
||||
name: Submit Nushell package to Windows Package Manager Community Repository
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [released]
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
tag_name:
|
||||
description: 'Specific tag name'
|
||||
required: true
|
||||
type: string
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
packages: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
|
||||
winget:
|
||||
name: Publish winget package
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Submit package to Windows Package Manager Community Repository
|
||||
uses: vedantmgoyal2009/winget-releaser@v2
|
||||
with:
|
||||
identifier: Nushell.Nushell
|
||||
# Exclude all `*-msvc-full.msi` full release files,
|
||||
# and only the default `*msvc.msi` files will be included
|
||||
installers-regex: 'msvc\.msi$'
|
||||
version: ${{ inputs.tag_name || github.event.release.tag_name }}
|
||||
release-tag: ${{ inputs.tag_name || github.event.release.tag_name }}
|
||||
token: ${{ secrets.NUSHELL_PAT }}
|
||||
fork-user: nushell
|
55
nushell/.gitignore
vendored
55
nushell/.gitignore
vendored
@ -1,55 +0,0 @@
|
||||
/target
|
||||
/scratch
|
||||
**/*.rs.bk
|
||||
history.txt
|
||||
tests/fixtures/nuplayground
|
||||
crates/*/target
|
||||
.mailmap
|
||||
|
||||
# Debian/Ubuntu
|
||||
debian/.debhelper/
|
||||
debian/debhelper-build-stamp
|
||||
debian/files
|
||||
debian/nu.substvars
|
||||
debian/nu/
|
||||
|
||||
# macOS junk
|
||||
.DS_Store
|
||||
|
||||
# JetBrains' IDE items
|
||||
.idea/*
|
||||
|
||||
# VSCode's IDE items
|
||||
.vscode/*
|
||||
|
||||
# JetBrains' Fleet IDE
|
||||
.fleet/*
|
||||
|
||||
# Visual Studio Extension SourceGear Rust items
|
||||
VSWorkspaceSettings.json
|
||||
unstable_cargo_features.txt
|
||||
|
||||
# Helix configuration folder
|
||||
.helix/*
|
||||
.helix
|
||||
wix/bin/
|
||||
wix/obj/
|
||||
wix/nu/
|
||||
|
||||
# Coverage tools
|
||||
lcov.info
|
||||
tarpaulin-report.html
|
||||
|
||||
# Visual Studio
|
||||
.vs/*
|
||||
*.rsproj
|
||||
*.rsproj.user
|
||||
*.sln
|
||||
*.code-workspace
|
||||
|
||||
# direnv
|
||||
.direnv/
|
||||
.envrc
|
||||
|
||||
# pre-commit-hooks
|
||||
.pre-commit-config.yaml
|
@ -1,26 +0,0 @@
|
||||
cff-version: 1.2.0
|
||||
title: 'Nushell'
|
||||
message: >-
|
||||
If you use this software and wish to cite it,
|
||||
you can use the metadata from this file.
|
||||
type: software
|
||||
authors:
|
||||
- name: "The Nushell Project Team"
|
||||
identifiers:
|
||||
- type: url
|
||||
value: 'https://github.com/nushell/nushell'
|
||||
description: Repository
|
||||
repository-code: 'https://github.com/nushell/nushell'
|
||||
url: 'https://www.nushell.sh/'
|
||||
abstract: >-
|
||||
The goal of the Nushell project is to take the Unix
|
||||
philosophy of shells, where pipes connect simple commands
|
||||
together, and bring it to the modern style of development.
|
||||
Thus, rather than being either a shell, or a programming
|
||||
language, Nushell connects both by bringing a rich
|
||||
programming language and a full-featured shell together
|
||||
into one package.
|
||||
keywords:
|
||||
- nushell
|
||||
- shell
|
||||
license: MIT
|
@ -1,76 +0,0 @@
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as
|
||||
contributors and maintainers pledge to make participation in our project and
|
||||
our community a harassment-free experience for everyone, regardless of age, body
|
||||
size, disability, ethnicity, sex characteristics, gender identity and expression,
|
||||
level of experience, education, socio-economic status, nationality, personal
|
||||
appearance, race, religion, or sexual identity and orientation.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment
|
||||
include:
|
||||
|
||||
* Using welcoming and inclusive language
|
||||
* Being respectful of differing viewpoints and experiences
|
||||
* Gracefully accepting constructive criticism
|
||||
* Focusing on what is best for the community
|
||||
* Showing empathy towards other community members
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
|
||||
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||
advances
|
||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or electronic
|
||||
address, without explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Our Responsibilities
|
||||
|
||||
Project maintainers are responsible for clarifying the standards of acceptable
|
||||
behavior and are expected to take appropriate and fair corrective action in
|
||||
response to any instances of unacceptable behavior.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or
|
||||
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||
permanently any contributor for other behaviors that they deem inappropriate,
|
||||
threatening, offensive, or harmful.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies within all project spaces, and it also applies when
|
||||
an individual is representing the project or its community in public spaces.
|
||||
Examples of representing a project or community include using an official
|
||||
project e-mail address, posting via an official social media account, or acting
|
||||
as an appointed representative at an online or offline event. Representation of
|
||||
a project may be further defined and clarified by project maintainers.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported by contacting the project team at wycats@gmail.com via email or by reaching out to @jturner, @gedge, or @andras_io on discord. All
|
||||
complaints will be reviewed and investigated and will result in a response that
|
||||
is deemed necessary and appropriate to the circumstances. The project team is
|
||||
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||
Further details of specific enforcement policies may be posted separately.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||
faith may face temporary or permanent repercussions as determined by other
|
||||
members of the project's leadership.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||
available at <https://www.contributor-covenant.org/version/1/4/code-of-conduct.html>
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
|
||||
For answers to common questions about this code of conduct, see
|
||||
<https://www.contributor-covenant.org/faq>
|
@ -1,236 +0,0 @@
|
||||
# Contributing
|
||||
|
||||
Welcome to Nushell and thank you for considering contributing!
|
||||
|
||||
## Table of contents
|
||||
- [Proposing design changes](#proposing-design-changes)
|
||||
- [Developing](#developing)
|
||||
- [Setup](#setup)
|
||||
- [Tests](#tests)
|
||||
- [Useful commands](#useful-commands)
|
||||
- [Debugging tips](#debugging-tips)
|
||||
- [Git etiquette](#git-etiquette)
|
||||
- [License](#license)
|
||||
|
||||
## Other helpful resources
|
||||
|
||||
More resources can be found in the nascent [developer documentation](devdocs/README.md) in this repo.
|
||||
|
||||
- [Developer FAQ](devdocs/FAQ.md)
|
||||
- [Platform support policy](devdocs/PLATFORM_SUPPORT.md)
|
||||
- [Our Rust style](devdocs/rust_style.md)
|
||||
|
||||
## Proposing design changes
|
||||
|
||||
First of all, before diving into the code, if you want to create a new feature, change something significantly, and especially if the change is user-facing, it is a good practice to first get an approval from the core team before starting to work on it.
|
||||
This saves both your and our time if we realize the change needs to go another direction before spending time on it.
|
||||
So, please, reach out and tell us what you want to do.
|
||||
This will significantly increase the chance of your PR being accepted.
|
||||
|
||||
The review process can be summarized as follows:
|
||||
1. You want to make some change to Nushell that is more involved than simple bug-fixing.
|
||||
2. Go to [Discord](https://discordapp.com/invite/NtAbbGn) or a [GitHub issue](https://github.com/nushell/nushell/issues/new/choose) and chat with some core team members and/or other contributors about it.
|
||||
3. After getting a green light from the core team, implement the feature, open a pull request (PR) and write a concise but comprehensive description of the change.
|
||||
4. If your PR includes any user-facing features (such as adding a flag to a command), clearly list them in the PR description.
|
||||
5. Then, core team members and other regular contributors will review the PR and suggest changes.
|
||||
6. When we all agree, the PR will be merged.
|
||||
7. If your PR includes any user-facing features, make sure the changes are also reflected in [the documentation](https://github.com/nushell/nushell.github.io) after the PR is merged.
|
||||
8. Congratulate yourself, you just improved Nushell! :-)
|
||||
|
||||
## Developing
|
||||
|
||||
### Setup
|
||||
|
||||
Nushell requires a recent Rust toolchain and some dependencies; [refer to the Nu Book for up-to-date requirements](https://www.nushell.sh/book/installation.html#build-from-source). After installing dependencies, you should be able to clone+build Nu like any other Rust project:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/nushell/nushell
|
||||
cd nushell
|
||||
cargo build
|
||||
```
|
||||
|
||||
### Tests
|
||||
|
||||
It is good practice to cover your changes with a test. Also, try to think about corner cases and various ways how your changes could break. Cover those in the tests as well.
|
||||
|
||||
Tests can be found in different places:
|
||||
* `/tests`
|
||||
* command examples
|
||||
* crate-specific tests
|
||||
|
||||
Most of the tests are built upon the `nu-test-support` crate. For testing specific features, such as running Nushell in a REPL mode, we have so called "testbins". For simple tests, you can find `run_test()` and `fail_test()` functions.
|
||||
|
||||
### Useful Commands
|
||||
|
||||
As Nushell is built using a cargo workspace consisting of multiple crates keep in mind that you may need to pass additional flags compared to how you may be used to it from a single crate project.
|
||||
Read cargo's documentation for more details: https://doc.rust-lang.org/cargo/reference/workspaces.html
|
||||
|
||||
- Build and run Nushell:
|
||||
|
||||
```nushell
|
||||
cargo run
|
||||
```
|
||||
|
||||
- Run Clippy on Nushell:
|
||||
|
||||
```nushell
|
||||
cargo clippy --workspace -- -D warnings -D clippy::unwrap_used
|
||||
```
|
||||
or via the `toolkit.nu` command:
|
||||
```nushell
|
||||
use toolkit.nu clippy
|
||||
clippy
|
||||
```
|
||||
|
||||
- Run all tests:
|
||||
|
||||
```nushell
|
||||
cargo test --workspace
|
||||
```
|
||||
|
||||
or via the `toolkit.nu` command:
|
||||
```nushell
|
||||
use toolkit.nu test
|
||||
test
|
||||
```
|
||||
|
||||
- Run all tests for a specific command
|
||||
|
||||
```nushell
|
||||
cargo test --package nu-cli --test main -- commands::<command_name_here>
|
||||
```
|
||||
|
||||
- Check to see if there are code formatting issues
|
||||
|
||||
```nushell
|
||||
cargo fmt --all -- --check
|
||||
```
|
||||
or via the `toolkit.nu` command:
|
||||
```nushell
|
||||
use toolkit.nu fmt
|
||||
fmt --check
|
||||
```
|
||||
|
||||
- Format the code in the project
|
||||
|
||||
```nushell
|
||||
cargo fmt --all
|
||||
```
|
||||
or via the `toolkit.nu` command:
|
||||
```nushell
|
||||
use toolkit.nu fmt
|
||||
fmt
|
||||
```
|
||||
|
||||
- Set up `git` hooks to check formatting and run `clippy` before committing and pushing:
|
||||
|
||||
```nushell
|
||||
use toolkit.nu setup-git-hooks
|
||||
setup-git-hooks
|
||||
```
|
||||
_Unfortunately, this hook isn't available on Windows._
|
||||
|
||||
### Debugging Tips
|
||||
|
||||
- To view verbose logs when developing, enable the `trace` log level.
|
||||
|
||||
```nushell
|
||||
cargo run --release -- --log-level trace
|
||||
```
|
||||
|
||||
- To redirect trace logs to a file, enable the `--log-target file` switch.
|
||||
```nushell
|
||||
cargo run --release -- --log-level trace --log-target file
|
||||
open $"($nu.temp-path)/nu-($nu.pid).log"
|
||||
```
|
||||
|
||||
## Git etiquette
|
||||
|
||||
As nushell thrives on its broad base of volunteer contributors and maintainers with different backgrounds we have a few guidelines for how we best utilize git and GitHub for our contributions. We strive to balance three goals with those recommendations:
|
||||
|
||||
1. The **volunteer maintainers and contributors** can easily follow the changes you propose, gauge the impact, and come to help you or make a decision.
|
||||
2. **You as a contributor** can focus most of your time on improving the quality of the nushell project and contributing your expertise to the code or documentation.
|
||||
3. Making sure we can trace back *why* decisions were made in the past.
|
||||
This includes discarded approaches. Also we want to quickly identify regressions and fix when something broke.
|
||||
|
||||
### How we merge PRs
|
||||
|
||||
In general the maintainers **squash** all changes of your PR into a single commit when merging.
|
||||
|
||||
This keeps a clean enough linear history, while not forcing you to conform to a too strict style while iterating in your PR or fixing small problems. As an added benefit the commits on the `main` branch are tied to the discussion that happened in the PR through their `#1234` issue number.
|
||||
|
||||
> **Note**
|
||||
> **Pro advice:** In some circumstances, we can agree on rebase-merging a particularly large but connected PR as a series of atomic commits onto the `main` branch to ensure we can more easily revert or bisect particular aspects.
|
||||
|
||||
### A good PR makes a change!
|
||||
|
||||
As a result of this PR-centric strategy and the general goal that the reviewers should easily understand your change, the **PR title and description matters** a great deal!
|
||||
|
||||
Make sure your description is **concise** but contains all relevant information and context.
|
||||
This means demonstrating what changes, ideally through nushell code or output **examples**.
|
||||
Furthermore links to technical documentation or instructions for folks that want to play with your change make the review process much easier.
|
||||
|
||||
> **Note**
|
||||
> Try to follow the suggestions in our PR message template to make sure we can quickly focus on the technical merits and impact on the users.
|
||||
|
||||
#### A PR should limit itself to a single functional change or related set of same changes.
|
||||
|
||||
Mixing different changes in the same PR will make the review process much harder. A PR might get stuck on one aspect while we would actually like to land another change. Furthermore, if we are forced to revert a change, mixing and matching different aspects makes fixing bugs or regressions much harder.
|
||||
|
||||
Thus, please try to **separate out unrelated changes**!
|
||||
**Don't** mix unrelated refactors with a potentially contested change.
|
||||
Stylistic fixes and housekeeping can be bundled up into singular PRs.
|
||||
|
||||
#### Guidelines for the PR title
|
||||
|
||||
The PR title should be concise but contain everything for a contributor to know if they should help out in the review of this particular change.
|
||||
|
||||
**DON'T**
|
||||
- `Update file/in/some/deeply/nested/path.rs`
|
||||
- Why are you making this change?
|
||||
- `Fix 2134`
|
||||
- What has to be fixed?
|
||||
- Hard to follow when not online on GitHub.
|
||||
- ``Ignore `~` expansion``
|
||||
- In what context should this change take effect?
|
||||
- `[feature] refactor the whole parser and also make nushell indentation-sensitive, upgrade to using Cpython. Let me know what you think!`
|
||||
- Be concise
|
||||
- Maybe break up into smaller commits or PRs if the title already appears too long?
|
||||
|
||||
**DO**
|
||||
- Mention the nushell feature or command that is affected.
|
||||
- ``Fix URL parsing in `http get` (issue #1234)``
|
||||
- You can mention the issue number if other context is there.
|
||||
- In general, mention all related issues in the description to crosslink (e.g. `Fixes #1234`, `Closes #6789`)
|
||||
- For internal changes mention the area or symbols affected if it helps to clarify
|
||||
- ``Factor out `quote_string()` from parser to reuse in `explore` ``
|
||||
|
||||
### Review process / Merge conflicts
|
||||
|
||||
> **Note**
|
||||
> Keep in mind that the maintainers are volunteers that need to allocate their attention to several different areas and active PRs. We will try to get back to you as soon as possible.
|
||||
|
||||
You can help us to make the review process a smooth experience:
|
||||
- Testing:
|
||||
- We generally review in detail after all the tests pass. Let us know if there is a problem you want to discuss to fix a test failure or forces us to accept a breaking change.
|
||||
- If you fix a bug, it is highly recommended that you add a test that reproduces the original issue/panic in a minimal form.
|
||||
- In general, added tests help us to understand which assumptions go into a particular addition/change.
|
||||
- Try to also test corner cases where those assumptions might break. This can be more valuable than simply adding many similar tests.
|
||||
- Commit history inside a PR during code review:
|
||||
- Good **atomic commits** can help follow larger changes, but we are not pedantic.
|
||||
- We don't shame fixup commits while you try to figure out a problem. They can help others see what you tried and what didn't work. (see our [squash policy](#how-we-merge-prs))
|
||||
- During active review constant **force pushing** just to amend changes can be confusing!
|
||||
- GitHub's UI presents reviewers with less options to compare diffs
|
||||
- fetched branches for experimentation become invalid!
|
||||
- the notification a maintainer receives has a low signal-to-noise ratio
|
||||
- Git pros *can* use their judgement to rebase/squash to clean up the history *if it aids the understanding* of a larger change during review
|
||||
- Merge conflicts:
|
||||
- In general you should take care of resolving merge conflicts.
|
||||
- Use your judgement whether to `git merge main` or to `git rebase main`
|
||||
- Choose what simplifies having confidence in the conflict resolution and the review. **Merge commits in your branch are OK** in the squash model.
|
||||
- Feel free to notify your reviewers or affected PR authors if your change might cause larger conflicts with another change.
|
||||
- During the rollup of multiple PRs, we may choose to resolve merge conflicts and CI failures ourselves. (Allow maintainers to push to your branch to enable us to do this quickly.)
|
||||
|
||||
## License
|
||||
|
||||
We use the [MIT License](https://github.com/nushell/nushell/blob/main/LICENSE) in all of our Nushell projects. If you are including or referencing a crate that uses the [GPL License](https://www.gnu.org/licenses/gpl-3.0.en.html#license-text) unfortunately we will not be able to accept your PR.
|
8867
nushell/Cargo.lock
generated
8867
nushell/Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@ -1,344 +0,0 @@
|
||||
[package]
|
||||
authors = ["The Nushell Project Developers"]
|
||||
build = "scripts/build.rs"
|
||||
default-run = "nu"
|
||||
description = "A new type of shell"
|
||||
documentation = "https://www.nushell.sh/book/"
|
||||
edition = "2024"
|
||||
exclude = ["images"]
|
||||
homepage = "https://www.nushell.sh"
|
||||
license = "MIT"
|
||||
name = "nu"
|
||||
repository = "https://github.com/nushell/nushell"
|
||||
#rust-version = "1.85.1"
|
||||
version = "0.105.2"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[package.metadata.binstall]
|
||||
pkg-url = "{ repo }/releases/download/{ version }/{ name }-{ version }-{ target }.{ archive-format }"
|
||||
pkg-fmt = "tgz"
|
||||
|
||||
[package.metadata.binstall.overrides.x86_64-pc-windows-msvc]
|
||||
pkg-fmt = "zip"
|
||||
|
||||
[workspace]
|
||||
members = [
|
||||
"crates/nu-cli",
|
||||
"crates/nu-engine",
|
||||
"crates/nu-parser",
|
||||
"crates/nu-system",
|
||||
"crates/nu-cmd-base",
|
||||
"crates/nu-cmd-extra",
|
||||
"crates/nu-cmd-lang",
|
||||
"crates/nu-cmd-plugin",
|
||||
"crates/nu-command",
|
||||
"crates/nu-color-config",
|
||||
"crates/nu-explore",
|
||||
"crates/nu-json",
|
||||
"crates/nu-lsp",
|
||||
"crates/nu-pretty-hex",
|
||||
"crates/nu-protocol",
|
||||
"crates/nu-derive-value",
|
||||
"crates/nu-plugin",
|
||||
"crates/nu-plugin-core",
|
||||
"crates/nu-plugin-engine",
|
||||
"crates/nu-plugin-protocol",
|
||||
"crates/nu-plugin-test-support",
|
||||
"crates/nu_plugin_inc",
|
||||
"crates/nu_plugin_gstat",
|
||||
"crates/nu_plugin_example",
|
||||
"crates/nu_plugin_query",
|
||||
"crates/nu_plugin_custom_values",
|
||||
"crates/nu_plugin_formats",
|
||||
"crates/nu_plugin_polars",
|
||||
"crates/nu_plugin_stress_internals",
|
||||
"crates/nu-std",
|
||||
"crates/nu-table",
|
||||
"crates/nu-term-grid",
|
||||
"crates/nu-test-support",
|
||||
"crates/nu-utils",
|
||||
"crates/nuon",
|
||||
]
|
||||
|
||||
[workspace.dependencies]
|
||||
alphanumeric-sort = "1.5"
|
||||
ansi-str = "0.9"
|
||||
anyhow = "1.0.82"
|
||||
base64 = "0.22.1"
|
||||
bracoxide = "0.1.6"
|
||||
brotli = "7.0"
|
||||
byteorder = "1.5"
|
||||
bytes = "1"
|
||||
bytesize = "1.3.3"
|
||||
calamine = "0.28"
|
||||
chardetng = "0.1.17"
|
||||
chrono = { default-features = false, version = "0.4.34" }
|
||||
chrono-humanize = "0.2.3"
|
||||
chrono-tz = "0.10"
|
||||
crossbeam-channel = "0.5.8"
|
||||
crossterm = "0.28.1"
|
||||
csv = "1.3"
|
||||
ctrlc = "3.4"
|
||||
devicons = "0.6.12"
|
||||
dialoguer = { default-features = false, version = "0.11" }
|
||||
digest = { default-features = false, version = "0.10" }
|
||||
dirs = "5.0"
|
||||
dirs-sys = "0.4"
|
||||
dtparse = "2.0"
|
||||
encoding_rs = "0.8"
|
||||
fancy-regex = "0.14"
|
||||
filesize = "0.2"
|
||||
filetime = "0.2"
|
||||
heck = "0.5.0"
|
||||
human-date-parser = "0.3.0"
|
||||
indexmap = "2.9"
|
||||
indicatif = "0.17"
|
||||
interprocess = "2.2.0"
|
||||
is_executable = "1.0"
|
||||
itertools = "0.14"
|
||||
libc = "0.2"
|
||||
libproc = "0.14"
|
||||
log = "0.4"
|
||||
lru = "0.12"
|
||||
lscolors = { version = "0.20", default-features = false }
|
||||
lsp-server = "0.7.8"
|
||||
lsp-types = { version = "0.97.0", features = ["proposed"] }
|
||||
lsp-textdocument = "0.4.2"
|
||||
mach2 = "0.4"
|
||||
md5 = { version = "0.10", package = "md-5" }
|
||||
miette = "7.6"
|
||||
mime = "0.3.17"
|
||||
mime_guess = "2.0"
|
||||
mockito = { version = "1.7", default-features = false }
|
||||
multipart-rs = "0.1.13"
|
||||
native-tls = "0.2"
|
||||
nix = { version = "0.29", default-features = false }
|
||||
notify-debouncer-full = { version = "0.3", default-features = false }
|
||||
nu-ansi-term = "0.50.1"
|
||||
nucleo-matcher = "0.3"
|
||||
num-format = "0.4"
|
||||
num-traits = "0.2"
|
||||
oem_cp = "2.0.0"
|
||||
omnipath = "0.1"
|
||||
open = "5.3"
|
||||
os_pipe = { version = "1.2", features = ["io_safety"] }
|
||||
pathdiff = "0.2"
|
||||
percent-encoding = "2"
|
||||
pretty_assertions = "1.4"
|
||||
print-positions = "0.6"
|
||||
proc-macro-error2 = "2.0"
|
||||
proc-macro2 = "1.0"
|
||||
procfs = "0.17.0"
|
||||
pwd = "1.3"
|
||||
quick-xml = "0.37.0"
|
||||
quickcheck = "1.0"
|
||||
quickcheck_macros = "1.1"
|
||||
quote = "1.0"
|
||||
rand = "0.9"
|
||||
getrandom = "0.2" # pick same version that rand requires
|
||||
rand_chacha = "0.9"
|
||||
ratatui = "0.29"
|
||||
rayon = "1.10"
|
||||
reedline = "0.40.0"
|
||||
rmp = "0.8"
|
||||
rmp-serde = "1.3"
|
||||
roxmltree = "0.20"
|
||||
rstest = { version = "0.23", default-features = false }
|
||||
rstest_reuse = "0.7"
|
||||
rusqlite = "0.31"
|
||||
rust-embed = "8.7.0"
|
||||
rustls = { version = "0.23", default-features = false, features = ["std", "tls12"] }
|
||||
rustls-native-certs = "0.8"
|
||||
scopeguard = { version = "1.2.0" }
|
||||
serde = { version = "1.0" }
|
||||
serde_json = "1.0.97"
|
||||
serde_urlencoded = "0.7.1"
|
||||
serde_yaml = "0.9.33"
|
||||
sha2 = "0.10"
|
||||
strip-ansi-escapes = "0.2.0"
|
||||
strum = "0.26"
|
||||
strum_macros = "0.26"
|
||||
syn = "2.0"
|
||||
sysinfo = "0.33"
|
||||
tabled = { version = "0.20", default-features = false }
|
||||
tempfile = "3.20"
|
||||
titlecase = "3.6"
|
||||
toml = "0.8"
|
||||
trash = "5.2"
|
||||
update-informer = { version = "1.2.0", default-features = false, features = ["github", "ureq"] }
|
||||
umask = "2.1"
|
||||
unicode-segmentation = "1.12"
|
||||
unicode-width = "0.2"
|
||||
ureq = { version = "2.12", default-features = false, features = ["socks-proxy"] }
|
||||
url = "2.2"
|
||||
uu_cp = "0.0.30"
|
||||
uu_mkdir = "0.0.30"
|
||||
uu_mktemp = "0.0.30"
|
||||
uu_mv = "0.0.30"
|
||||
uu_touch = "0.0.30"
|
||||
uu_whoami = "0.0.30"
|
||||
uu_uname = "0.0.30"
|
||||
uucore = "0.0.30"
|
||||
uuid = "1.16.0"
|
||||
v_htmlescape = "0.15.0"
|
||||
wax = "0.6"
|
||||
web-time = "1.1.0"
|
||||
which = "7.0.3"
|
||||
windows = "0.56"
|
||||
windows-sys = "0.48"
|
||||
winreg = "0.52"
|
||||
memchr = "2.7.4"
|
||||
webpki-roots = "1.0"
|
||||
|
||||
[workspace.lints.clippy]
|
||||
# Warning: workspace lints affect library code as well as tests, so don't enable lints that would be too noisy in tests like that.
|
||||
# todo = "warn"
|
||||
unchecked_duration_subtraction = "warn"
|
||||
used_underscore_binding = "warn"
|
||||
|
||||
[lints]
|
||||
workspace = true
|
||||
|
||||
[dependencies]
|
||||
nu-cli = { path = "./crates/nu-cli", version = "0.105.2" }
|
||||
nu-cmd-base = { path = "./crates/nu-cmd-base", version = "0.105.2" }
|
||||
nu-cmd-lang = { path = "./crates/nu-cmd-lang", version = "0.105.2" }
|
||||
nu-cmd-plugin = { path = "./crates/nu-cmd-plugin", version = "0.105.2", optional = true }
|
||||
nu-cmd-extra = { path = "./crates/nu-cmd-extra", version = "0.105.2" }
|
||||
nu-command = { path = "./crates/nu-command", version = "0.105.2", default-features = false, features = ["os"] }
|
||||
nu-engine = { path = "./crates/nu-engine", version = "0.105.2" }
|
||||
nu-explore = { path = "./crates/nu-explore", version = "0.105.2" }
|
||||
nu-lsp = { path = "./crates/nu-lsp/", version = "0.105.2" }
|
||||
nu-parser = { path = "./crates/nu-parser", version = "0.105.2" }
|
||||
nu-path = { path = "./crates/nu-path", version = "0.105.2" }
|
||||
nu-plugin-engine = { path = "./crates/nu-plugin-engine", optional = true, version = "0.105.2" }
|
||||
nu-protocol = { path = "./crates/nu-protocol", version = "0.105.2" }
|
||||
nu-std = { path = "./crates/nu-std", version = "0.105.2" }
|
||||
nu-system = { path = "./crates/nu-system", version = "0.105.2" }
|
||||
nu-utils = { path = "./crates/nu-utils", version = "0.105.2" }
|
||||
reedline = { workspace = true, features = ["bashisms", "sqlite"] }
|
||||
|
||||
crossterm = { workspace = true }
|
||||
ctrlc = { workspace = true }
|
||||
dirs = { workspace = true }
|
||||
log = { workspace = true }
|
||||
miette = { workspace = true, features = ["fancy-no-backtrace", "fancy"] }
|
||||
multipart-rs = { workspace = true }
|
||||
serde_json = { workspace = true }
|
||||
simplelog = "0.12"
|
||||
time = "0.3"
|
||||
|
||||
[target.'cfg(not(target_os = "windows"))'.dependencies]
|
||||
# Our dependencies don't use OpenSSL on Windows
|
||||
openssl = { version = "0.10", features = ["vendored"], optional = true }
|
||||
|
||||
[target.'cfg(windows)'.build-dependencies]
|
||||
winresource = "0.1"
|
||||
|
||||
[target.'cfg(target_family = "unix")'.dependencies]
|
||||
nix = { workspace = true, default-features = false, features = [
|
||||
"signal",
|
||||
"process",
|
||||
"fs",
|
||||
"term",
|
||||
] }
|
||||
|
||||
[dev-dependencies]
|
||||
nu-test-support = { path = "./crates/nu-test-support", version = "0.105.2" }
|
||||
nu-plugin-protocol = { path = "./crates/nu-plugin-protocol", version = "0.105.2" }
|
||||
nu-plugin-core = { path = "./crates/nu-plugin-core", version = "0.105.2" }
|
||||
assert_cmd = "2.0"
|
||||
dirs = { workspace = true }
|
||||
tango-bench = "0.6"
|
||||
pretty_assertions = { workspace = true }
|
||||
fancy-regex = { workspace = true }
|
||||
rstest = { workspace = true, default-features = false }
|
||||
serial_test = "3.2"
|
||||
tempfile = { workspace = true }
|
||||
|
||||
[features]
|
||||
# Enable all features while still avoiding mutually exclusive features.
|
||||
# Use this if `--all-features` fails.
|
||||
full = ["plugin", "rustls-tls", "system-clipboard", "trash-support", "sqlite"]
|
||||
|
||||
plugin = [
|
||||
# crates
|
||||
"dep:nu-cmd-plugin",
|
||||
"dep:nu-plugin-engine",
|
||||
|
||||
# features
|
||||
"nu-cli/plugin",
|
||||
"nu-cmd-lang/plugin",
|
||||
"nu-command/plugin",
|
||||
"nu-engine/plugin",
|
||||
"nu-engine/plugin",
|
||||
"nu-parser/plugin",
|
||||
"nu-protocol/plugin",
|
||||
]
|
||||
|
||||
native-tls = ["nu-command/native-tls"]
|
||||
rustls-tls = ["nu-command/rustls-tls"]
|
||||
|
||||
default = [
|
||||
"plugin",
|
||||
"trash-support",
|
||||
"sqlite",
|
||||
"rustls-tls"
|
||||
]
|
||||
stable = ["default"]
|
||||
# NOTE: individual features are also passed to `nu-cmd-lang` that uses them to generate the feature matrix in the `version` command
|
||||
|
||||
# Enable to statically link OpenSSL (perl is required, to build OpenSSL https://docs.rs/openssl/latest/openssl/);
|
||||
# otherwise the system version will be used. Not enabled by default because it takes a while to build
|
||||
static-link-openssl = ["dep:openssl"]
|
||||
|
||||
# Optional system clipboard support in `reedline`, this behavior has problematic compatibility with some systems.
|
||||
# Missing X server/ Wayland can cause issues
|
||||
system-clipboard = [
|
||||
"reedline/system_clipboard",
|
||||
"nu-cli/system-clipboard",
|
||||
]
|
||||
|
||||
# Stable (Default)
|
||||
trash-support = ["nu-command/trash-support"]
|
||||
|
||||
# SQLite commands for nushell
|
||||
sqlite = ["nu-command/sqlite", "nu-std/sqlite"]
|
||||
|
||||
[profile.release]
|
||||
opt-level = "s" # Optimize for size
|
||||
strip = "debuginfo"
|
||||
lto = "thin"
|
||||
|
||||
# build with `cargo build --profile profiling`
|
||||
# to analyze performance with tooling like linux perf
|
||||
[profile.profiling]
|
||||
inherits = "release"
|
||||
strip = false
|
||||
debug = true
|
||||
|
||||
# build with `cargo build --profile ci`
|
||||
# to analyze performance with tooling like linux perf
|
||||
[profile.ci]
|
||||
inherits = "dev"
|
||||
strip = false
|
||||
debug = false
|
||||
|
||||
# Main nu binary
|
||||
[[bin]]
|
||||
name = "nu"
|
||||
path = "src/main.rs"
|
||||
bench = false
|
||||
|
||||
# To use a development version of a dependency please use a global override here
|
||||
# changing versions in each sub-crate of the workspace is tedious
|
||||
[patch.crates-io]
|
||||
# reedline = { git = "https://github.com/nushell/reedline", branch = "main" }
|
||||
# nu-ansi-term = {git = "https://github.com/nushell/nu-ansi-term.git", branch = "main"}
|
||||
|
||||
# Run all benchmarks with `cargo bench`
|
||||
# Run individual benchmarks like `cargo bench -- <regex>` e.g. `cargo bench -- parse`
|
||||
[[bench]]
|
||||
name = "benchmarks"
|
||||
harness = false
|
@ -1,18 +0,0 @@
|
||||
# Configuration for cross-rs: https://github.com/cross-rs/cross
|
||||
# Run cross-rs like this:
|
||||
# cross build --target aarch64-unknown-linux-gnu --release
|
||||
# or
|
||||
# cross build --target aarch64-unknown-linux-musl --release --features=static-link-openssl
|
||||
|
||||
[target.aarch64-unknown-linux-gnu]
|
||||
pre-build = [
|
||||
"dpkg --add-architecture $CROSS_DEB_ARCH",
|
||||
"apt-get update && apt-get install --assume-yes libssl-dev:$CROSS_DEB_ARCH clang"
|
||||
]
|
||||
|
||||
# NOTE: for musl you will need to build with --features=static-link-openssl
|
||||
[target.aarch64-unknown-linux-musl]
|
||||
pre-build = [
|
||||
"dpkg --add-architecture $CROSS_DEB_ARCH",
|
||||
"apt-get update && apt-get install --assume-yes clang"
|
||||
]
|
@ -1,21 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2019 - 2025 The Nushell Project Developers
|
||||
|
||||
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,237 +0,0 @@
|
||||
# Nushell <!-- omit in toc -->
|
||||
[](https://crates.io/crates/nu)
|
||||
[](https://github.com/nushell/nushell/actions)
|
||||
[](https://github.com/nushell/nushell/actions/workflows/nightly-build.yml)
|
||||
[](https://discord.gg/NtAbbGn)
|
||||
[](https://changelog.com/podcast/363)
|
||||
[](https://github.com/nushell/nushell/graphs/commit-activity)
|
||||
[](https://github.com/nushell/nushell/graphs/contributors)
|
||||
|
||||
A new type of shell.
|
||||
|
||||

|
||||
|
||||
## Table of Contents <!-- omit in toc -->
|
||||
|
||||
- [Status](#status)
|
||||
- [Learning About Nu](#learning-about-nu)
|
||||
- [Installation](#installation)
|
||||
- [Configuration](#configuration)
|
||||
- [Philosophy](#philosophy)
|
||||
- [Pipelines](#pipelines)
|
||||
- [Opening files](#opening-files)
|
||||
- [Plugins](#plugins)
|
||||
- [Goals](#goals)
|
||||
- [Officially Supported By](#officially-supported-by)
|
||||
- [Contributing](#contributing)
|
||||
- [License](#license)
|
||||
|
||||
## Status
|
||||
|
||||
This project has reached a minimum-viable-product level of quality. Many people use it as their daily driver, but it may be unstable for some commands. Nu's design is subject to change as it matures.
|
||||
|
||||
## Learning About Nu
|
||||
|
||||
The [Nushell book](https://www.nushell.sh/book/) is the primary source of Nushell documentation. You can find [a full list of Nu commands in the book](https://www.nushell.sh/commands/), and we have many examples of using Nu in our [cookbook](https://www.nushell.sh/cookbook/).
|
||||
|
||||
We're also active on [Discord](https://discord.gg/NtAbbGn); come and chat with us!
|
||||
|
||||
## Installation
|
||||
|
||||
To quickly install Nu:
|
||||
|
||||
```bash
|
||||
# Linux and macOS
|
||||
brew install nushell
|
||||
# Windows
|
||||
winget install nushell
|
||||
```
|
||||
|
||||
To use `Nu` in GitHub Action, check [setup-nu](https://github.com/marketplace/actions/setup-nu) for more detail.
|
||||
|
||||
Detailed installation instructions can be found in the [installation chapter of the book](https://www.nushell.sh/book/installation.html). Nu is available via many package managers:
|
||||
|
||||
[](https://repology.org/project/nushell/versions)
|
||||
|
||||
For details about which platforms the Nushell team actively supports, see [our platform support policy](devdocs/PLATFORM_SUPPORT.md).
|
||||
|
||||
## Configuration
|
||||
|
||||
The default configurations can be found at [sample_config](crates/nu-utils/src/default_files)
|
||||
which are the configuration files one gets when they startup Nushell for the first time.
|
||||
|
||||
It sets all of the default configuration to run Nushell. From here one can
|
||||
then customize this file for their specific needs.
|
||||
|
||||
To see where *config.nu* is located on your system simply type this command.
|
||||
|
||||
```rust
|
||||
$nu.config-path
|
||||
```
|
||||
|
||||
Please see our [book](https://www.nushell.sh) for all of the Nushell documentation.
|
||||
|
||||
|
||||
## Philosophy
|
||||
|
||||
Nu draws inspiration from projects like PowerShell, functional programming languages, and modern CLI tools.
|
||||
Rather than thinking of files and data as raw streams of text, Nu looks at each input as something with structure.
|
||||
For example, when you list the contents of a directory what you get back is a table of rows, where each row represents an item in that directory.
|
||||
These values can be piped through a series of steps, in a series of commands called a 'pipeline'.
|
||||
|
||||
### Pipelines
|
||||
|
||||
In Unix, it's common to pipe between commands to split up a sophisticated command over multiple steps.
|
||||
Nu takes this a step further and builds heavily on the idea of _pipelines_.
|
||||
As in the Unix philosophy, Nu allows commands to output to stdout and read from stdin.
|
||||
Additionally, commands can output structured data (you can think of this as a third kind of stream).
|
||||
Commands that work in the pipeline fit into one of three categories:
|
||||
|
||||
- Commands that produce a stream (e.g., `ls`)
|
||||
- Commands that filter a stream (e.g., `where type == "dir"`)
|
||||
- Commands that consume the output of the pipeline (e.g., `table`)
|
||||
|
||||
Commands are separated by the pipe symbol (`|`) to denote a pipeline flowing left to right.
|
||||
|
||||
```shell
|
||||
ls | where type == "dir" | table
|
||||
# => ╭────┬──────────┬──────┬─────────┬───────────────╮
|
||||
# => │ # │ name │ type │ size │ modified │
|
||||
# => ├────┼──────────┼──────┼─────────┼───────────────┤
|
||||
# => │ 0 │ .cargo │ dir │ 0 B │ 9 minutes ago │
|
||||
# => │ 1 │ assets │ dir │ 0 B │ 2 weeks ago │
|
||||
# => │ 2 │ crates │ dir │ 4.0 KiB │ 2 weeks ago │
|
||||
# => │ 3 │ docker │ dir │ 0 B │ 2 weeks ago │
|
||||
# => │ 4 │ docs │ dir │ 0 B │ 2 weeks ago │
|
||||
# => │ 5 │ images │ dir │ 0 B │ 2 weeks ago │
|
||||
# => │ 6 │ pkg_mgrs │ dir │ 0 B │ 2 weeks ago │
|
||||
# => │ 7 │ samples │ dir │ 0 B │ 2 weeks ago │
|
||||
# => │ 8 │ src │ dir │ 4.0 KiB │ 2 weeks ago │
|
||||
# => │ 9 │ target │ dir │ 0 B │ a day ago │
|
||||
# => │ 10 │ tests │ dir │ 4.0 KiB │ 2 weeks ago │
|
||||
# => │ 11 │ wix │ dir │ 0 B │ 2 weeks ago │
|
||||
# => ╰────┴──────────┴──────┴─────────┴───────────────╯
|
||||
```
|
||||
|
||||
Because most of the time you'll want to see the output of a pipeline, `table` is assumed.
|
||||
We could have also written the above:
|
||||
|
||||
```shell
|
||||
ls | where type == "dir"
|
||||
```
|
||||
|
||||
Being able to use the same commands and compose them differently is an important philosophy in Nu.
|
||||
For example, we could use the built-in `ps` command to get a list of the running processes, using the same `where` as above.
|
||||
|
||||
```shell
|
||||
ps | where cpu > 0
|
||||
# => ╭───┬───────┬───────────┬───────┬───────────┬───────────╮
|
||||
# => │ # │ pid │ name │ cpu │ mem │ virtual │
|
||||
# => ├───┼───────┼───────────┼───────┼───────────┼───────────┤
|
||||
# => │ 0 │ 2240 │ Slack.exe │ 16.40 │ 178.3 MiB │ 232.6 MiB │
|
||||
# => │ 1 │ 16948 │ Slack.exe │ 16.32 │ 205.0 MiB │ 197.9 MiB │
|
||||
# => │ 2 │ 17700 │ nu.exe │ 3.77 │ 26.1 MiB │ 8.8 MiB │
|
||||
# => ╰───┴───────┴───────────┴───────┴───────────┴───────────╯
|
||||
```
|
||||
|
||||
### Opening files
|
||||
|
||||
Nu can load file and URL contents as raw text or structured data (if it recognizes the format).
|
||||
For example, you can load a .toml file as structured data and explore it:
|
||||
|
||||
```shell
|
||||
open Cargo.toml
|
||||
# => ╭──────────────────┬────────────────────╮
|
||||
# => │ bin │ [table 1 row] │
|
||||
# => │ dependencies │ {record 25 fields} │
|
||||
# => │ dev-dependencies │ {record 8 fields} │
|
||||
# => │ features │ {record 10 fields} │
|
||||
# => │ package │ {record 13 fields} │
|
||||
# => │ patch │ {record 1 field} │
|
||||
# => │ profile │ {record 3 fields} │
|
||||
# => │ target │ {record 3 fields} │
|
||||
# => │ workspace │ {record 1 field} │
|
||||
# => ╰──────────────────┴────────────────────╯
|
||||
```
|
||||
|
||||
We can pipe this into a command that gets the contents of one of the columns:
|
||||
|
||||
```shell
|
||||
open Cargo.toml | get package
|
||||
# => ╭───────────────┬────────────────────────────────────╮
|
||||
# => │ authors │ [list 1 item] │
|
||||
# => │ default-run │ nu │
|
||||
# => │ description │ A new type of shell │
|
||||
# => │ documentation │ https://www.nushell.sh/book/ │
|
||||
# => │ edition │ 2018 │
|
||||
# => │ exclude │ [list 1 item] │
|
||||
# => │ homepage │ https://www.nushell.sh │
|
||||
# => │ license │ MIT │
|
||||
# => │ metadata │ {record 1 field} │
|
||||
# => │ name │ nu │
|
||||
# => │ repository │ https://github.com/nushell/nushell │
|
||||
# => │ rust-version │ 1.60 │
|
||||
# => │ version │ 0.72.0 │
|
||||
# => ╰───────────────┴────────────────────────────────────╯
|
||||
```
|
||||
|
||||
And if needed we can drill down further:
|
||||
|
||||
```shell
|
||||
open Cargo.toml | get package.version
|
||||
# => 0.72.0
|
||||
```
|
||||
|
||||
### Plugins
|
||||
|
||||
Nu supports plugins that offer additional functionality to the shell and follow the same structured data model that built-in commands use. There are a few examples in the `crates/nu_plugins_*` directories.
|
||||
|
||||
Plugins are binaries that are available in your path and follow a `nu_plugin_*` naming convention.
|
||||
These binaries interact with nu via a simple JSON-RPC protocol where the command identifies itself and passes along its configuration, making it available for use.
|
||||
If the plugin is a filter, data streams to it one element at a time, and it can stream data back in return via stdin/stdout.
|
||||
If the plugin is a sink, it is given the full vector of final data and is given free reign over stdin/stdout to use as it pleases.
|
||||
|
||||
The [awesome-nu repo](https://github.com/nushell/awesome-nu#plugins) lists a variety of nu-plugins while the [showcase repo](https://github.com/nushell/showcase) *shows* off informative blog posts that have been written about Nushell along with videos that highlight technical
|
||||
topics that have been presented.
|
||||
|
||||
## Goals
|
||||
|
||||
Nu adheres closely to a set of goals that make up its design philosophy. As features are added, they are checked against these goals.
|
||||
|
||||
- First and foremost, Nu is cross-platform. Commands and techniques should work across platforms and Nu has [first-class support for Windows, macOS, and Linux](devdocs/PLATFORM_SUPPORT.md).
|
||||
|
||||
- Nu ensures compatibility with existing platform-specific executables.
|
||||
|
||||
- Nu's workflow and tools should have the usability expected of modern software in 2022 (and beyond).
|
||||
|
||||
- Nu views data as either structured or unstructured. It is a structured shell like PowerShell.
|
||||
|
||||
- Finally, Nu views data functionally. Rather than using mutation, pipelines act as a means to load, change, and save data without mutable state.
|
||||
|
||||
## Officially Supported By
|
||||
|
||||
Please submit an issue or PR to be added to this list.
|
||||
|
||||
- [zoxide](https://github.com/ajeetdsouza/zoxide)
|
||||
- [starship](https://github.com/starship/starship)
|
||||
- [oh-my-posh](https://ohmyposh.dev)
|
||||
- [Couchbase Shell](https://couchbase.sh)
|
||||
- [virtualenv](https://github.com/pypa/virtualenv)
|
||||
- [atuin](https://github.com/ellie/atuin)
|
||||
- [clap](https://github.com/clap-rs/clap/tree/master/clap_complete_nushell)
|
||||
- [Dorothy](http://github.com/bevry/dorothy)
|
||||
- [Direnv](https://github.com/direnv/direnv/blob/master/docs/hook.md#nushell)
|
||||
- [x-cmd](https://x-cmd.com/mod/nu)
|
||||
- [vfox](https://github.com/version-fox/vfox)
|
||||
|
||||
## Contributing
|
||||
|
||||
See [Contributing](CONTRIBUTING.md) for details. Thanks to all the people who already contributed!
|
||||
|
||||
<a href="https://github.com/nushell/nushell/graphs/contributors">
|
||||
<img src="https://contributors-img.web.app/image?repo=nushell/nushell&max=750&columns=20" />
|
||||
</a>
|
||||
|
||||
## License
|
||||
|
||||
The project is made available under the MIT license. See the `LICENSE` file for more information.
|
@ -1,29 +0,0 @@
|
||||
# Security Policy
|
||||
|
||||
As a shell and programming language Nushell provides you with great powers and the potential to do dangerous things to your computer and data. Whenever there is a risk that a malicious actor can abuse a bug or a violation of documented behavior/assumptions in Nushell to harm you this is a *security* risk.
|
||||
We want to fix those issues without exposing our users to unnecessary risk. Thus we want to explain our security policy.
|
||||
Additional issues may be part of *safety* where the behavior of Nushell as designed and implemented can cause unintended harm or a bug causes damage without the involvement of a third party.
|
||||
|
||||
## Supported Versions
|
||||
|
||||
As Nushell is still under very active pre-stable development, the only version the core team prioritizes for security and safety fixes is the [most recent version as published on GitHub](https://github.com/nushell/nushell/releases/latest).
|
||||
Only if you provide a strong reasoning and the necessary resources, will we consider blessing a backported fix with an official patch release for a previous version.
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
If you suspect that a bug or behavior of Nushell can affect security or may be potentially exploitable, please report the issue to us in private.
|
||||
Either reach out to the core team on [our Discord server](https://discord.gg/NtAbbGn) to arrange a private channel or use the [GitHub vulnerability reporting form](https://github.com/nushell/nushell/security/advisories/new).
|
||||
Please try to answer the following questions:
|
||||
- How can we reach you for further questions?
|
||||
- What is the bug? Which system of Nushell may be affected?
|
||||
- Do you have proof-of-concept for a potential exploit or have you observed an exploit in the wild?
|
||||
- What is your assessment of the severity based on what could be impacted should the bug be exploited?
|
||||
- Are additional people aware of the issue or deserve credit for identifying the issue?
|
||||
|
||||
We will try to get back to you within a week with:
|
||||
- acknowledging the receipt of the report
|
||||
- an initial plan of how we want to address this including the primary points of contact for further communication
|
||||
- our preliminary assessment of how severe we judge the issue
|
||||
- a proposal for how we can coordinate responsible disclosure (e.g. how we ship the bugfix, if we need to coordinate with distribution maintainers, when you can release a blog post if you want to etc.)
|
||||
|
||||
For purely *safety* related issues where the impact is severe by direct user action instead of malicious input or third parties, feel free to open a regular issue. If we deem that there may be an additional *security* risk on a *safety* issue we may continue discussions in a restricted forum.
|
Binary file not shown.
Before Width: | Height: | Size: 3.6 KiB |
Binary file not shown.
Before Width: | Height: | Size: 7.3 KiB |
Binary file not shown.
Before Width: | Height: | Size: 1.2 MiB |
@ -1,7 +0,0 @@
|
||||
# Divan benchmarks
|
||||
|
||||
These are benchmarks using [Divan](https://github.com/nvzqz/divan), a microbenchmarking tool for Rust.
|
||||
|
||||
Run all benchmarks with `cargo bench`
|
||||
|
||||
Or run individual benchmarks like `cargo bench -- <regex>` e.g. `cargo bench -- parse`
|
@ -1,541 +0,0 @@
|
||||
use nu_cli::{eval_source, evaluate_commands};
|
||||
use nu_plugin_core::{Encoder, EncodingType};
|
||||
use nu_plugin_protocol::{PluginCallResponse, PluginOutput};
|
||||
use nu_protocol::{
|
||||
PipelineData, Signals, Span, Spanned, Value,
|
||||
engine::{EngineState, Stack},
|
||||
};
|
||||
use nu_std::load_standard_library;
|
||||
use nu_utils::{get_default_config, get_default_env};
|
||||
use std::{
|
||||
fmt::Write,
|
||||
hint::black_box,
|
||||
rc::Rc,
|
||||
sync::{Arc, atomic::AtomicBool},
|
||||
};
|
||||
use tango_bench::{IntoBenchmarks, benchmark_fn, tango_benchmarks, tango_main};
|
||||
|
||||
fn load_bench_commands() -> EngineState {
|
||||
nu_command::add_shell_command_context(nu_cmd_lang::create_default_context())
|
||||
}
|
||||
|
||||
fn setup_engine() -> EngineState {
|
||||
let mut engine_state = load_bench_commands();
|
||||
let cwd = std::env::current_dir()
|
||||
.unwrap()
|
||||
.into_os_string()
|
||||
.into_string()
|
||||
.unwrap();
|
||||
|
||||
// parsing config.nu breaks without PWD set, so set a valid path
|
||||
engine_state.add_env_var("PWD".into(), Value::string(cwd, Span::test_data()));
|
||||
|
||||
engine_state.generate_nu_constant();
|
||||
|
||||
engine_state
|
||||
}
|
||||
|
||||
fn setup_stack_and_engine_from_command(command: &str) -> (Stack, EngineState) {
|
||||
let mut engine = setup_engine();
|
||||
let commands = Spanned {
|
||||
span: Span::unknown(),
|
||||
item: command.to_string(),
|
||||
};
|
||||
|
||||
let mut stack = Stack::new();
|
||||
|
||||
evaluate_commands(
|
||||
&commands,
|
||||
&mut engine,
|
||||
&mut stack,
|
||||
PipelineData::empty(),
|
||||
Default::default(),
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
(stack, engine)
|
||||
}
|
||||
|
||||
// generate a new table data with `row_cnt` rows, `col_cnt` columns.
|
||||
fn encoding_test_data(row_cnt: usize, col_cnt: usize) -> Value {
|
||||
let record = Value::test_record(
|
||||
(0..col_cnt)
|
||||
.map(|x| (format!("col_{x}"), Value::test_int(x as i64)))
|
||||
.collect(),
|
||||
);
|
||||
|
||||
Value::list(vec![record; row_cnt], Span::test_data())
|
||||
}
|
||||
|
||||
fn bench_command(
|
||||
name: impl Into<String>,
|
||||
command: impl Into<String> + Clone,
|
||||
stack: Stack,
|
||||
engine: EngineState,
|
||||
) -> impl IntoBenchmarks {
|
||||
let commands = Spanned {
|
||||
span: Span::unknown(),
|
||||
item: command.into(),
|
||||
};
|
||||
[benchmark_fn(name, move |b| {
|
||||
let commands = commands.clone();
|
||||
let stack = stack.clone();
|
||||
let engine = engine.clone();
|
||||
b.iter(move || {
|
||||
let mut stack = stack.clone();
|
||||
let mut engine = engine.clone();
|
||||
#[allow(clippy::unit_arg)]
|
||||
black_box(
|
||||
evaluate_commands(
|
||||
&commands,
|
||||
&mut engine,
|
||||
&mut stack,
|
||||
PipelineData::empty(),
|
||||
Default::default(),
|
||||
)
|
||||
.unwrap(),
|
||||
);
|
||||
})
|
||||
})]
|
||||
}
|
||||
|
||||
fn bench_eval_source(
|
||||
name: &str,
|
||||
fname: String,
|
||||
source: Vec<u8>,
|
||||
stack: Stack,
|
||||
engine: EngineState,
|
||||
) -> impl IntoBenchmarks {
|
||||
[benchmark_fn(name, move |b| {
|
||||
let stack = stack.clone();
|
||||
let engine = engine.clone();
|
||||
let fname = fname.clone();
|
||||
let source = source.clone();
|
||||
b.iter(move || {
|
||||
let mut stack = stack.clone();
|
||||
let mut engine = engine.clone();
|
||||
let fname: &str = &fname.clone();
|
||||
let source: &[u8] = &source.clone();
|
||||
black_box(eval_source(
|
||||
&mut engine,
|
||||
&mut stack,
|
||||
source,
|
||||
fname,
|
||||
PipelineData::empty(),
|
||||
false,
|
||||
));
|
||||
})
|
||||
})]
|
||||
}
|
||||
|
||||
/// Load the standard library into the engine.
|
||||
fn bench_load_standard_lib() -> impl IntoBenchmarks {
|
||||
[benchmark_fn("load_standard_lib", move |b| {
|
||||
let engine = setup_engine();
|
||||
b.iter(move || {
|
||||
let mut engine = engine.clone();
|
||||
load_standard_library(&mut engine)
|
||||
})
|
||||
})]
|
||||
}
|
||||
|
||||
fn create_flat_record_string(n: usize) -> String {
|
||||
let mut s = String::from("let record = { ");
|
||||
for i in 0..n {
|
||||
write!(s, "col_{i}: {i}, ").unwrap();
|
||||
}
|
||||
s.push('}');
|
||||
s
|
||||
}
|
||||
|
||||
fn create_nested_record_string(depth: usize) -> String {
|
||||
let mut s = String::from("let record = {");
|
||||
for _ in 0..depth {
|
||||
s.push_str("col: {");
|
||||
}
|
||||
s.push_str("col_final: 0");
|
||||
for _ in 0..depth {
|
||||
s.push('}');
|
||||
}
|
||||
s.push('}');
|
||||
s
|
||||
}
|
||||
|
||||
fn create_example_table_nrows(n: usize) -> String {
|
||||
let mut s = String::from("let table = [[foo bar baz]; ");
|
||||
for i in 0..n {
|
||||
s.push_str(&format!("[0, 1, {i}]"));
|
||||
if i < n - 1 {
|
||||
s.push_str(", ");
|
||||
}
|
||||
}
|
||||
s.push(']');
|
||||
s
|
||||
}
|
||||
|
||||
fn bench_record_create(n: usize) -> impl IntoBenchmarks {
|
||||
bench_command(
|
||||
format!("record_create_{n}"),
|
||||
create_flat_record_string(n),
|
||||
Stack::new(),
|
||||
setup_engine(),
|
||||
)
|
||||
}
|
||||
|
||||
fn bench_record_flat_access(n: usize) -> impl IntoBenchmarks {
|
||||
let setup_command = create_flat_record_string(n);
|
||||
let (stack, engine) = setup_stack_and_engine_from_command(&setup_command);
|
||||
bench_command(
|
||||
format!("record_flat_access_{n}"),
|
||||
"$record.col_0 | ignore",
|
||||
stack,
|
||||
engine,
|
||||
)
|
||||
}
|
||||
|
||||
fn bench_record_nested_access(n: usize) -> impl IntoBenchmarks {
|
||||
let setup_command = create_nested_record_string(n);
|
||||
let (stack, engine) = setup_stack_and_engine_from_command(&setup_command);
|
||||
let nested_access = ".col".repeat(n);
|
||||
bench_command(
|
||||
format!("record_nested_access_{n}"),
|
||||
format!("$record{} | ignore", nested_access),
|
||||
stack,
|
||||
engine,
|
||||
)
|
||||
}
|
||||
|
||||
fn bench_record_insert(n: usize, m: usize) -> impl IntoBenchmarks {
|
||||
let setup_command = create_flat_record_string(n);
|
||||
let (stack, engine) = setup_stack_and_engine_from_command(&setup_command);
|
||||
let mut insert = String::from("$record");
|
||||
for i in n..(n + m) {
|
||||
write!(insert, " | insert col_{i} {i}").unwrap();
|
||||
}
|
||||
insert.push_str(" | ignore");
|
||||
bench_command(format!("record_insert_{n}_{m}"), insert, stack, engine)
|
||||
}
|
||||
|
||||
fn bench_table_create(n: usize) -> impl IntoBenchmarks {
|
||||
bench_command(
|
||||
format!("table_create_{n}"),
|
||||
create_example_table_nrows(n),
|
||||
Stack::new(),
|
||||
setup_engine(),
|
||||
)
|
||||
}
|
||||
|
||||
fn bench_table_get(n: usize) -> impl IntoBenchmarks {
|
||||
let setup_command = create_example_table_nrows(n);
|
||||
let (stack, engine) = setup_stack_and_engine_from_command(&setup_command);
|
||||
bench_command(
|
||||
format!("table_get_{n}"),
|
||||
"$table | get bar | math sum | ignore",
|
||||
stack,
|
||||
engine,
|
||||
)
|
||||
}
|
||||
|
||||
fn bench_table_select(n: usize) -> impl IntoBenchmarks {
|
||||
let setup_command = create_example_table_nrows(n);
|
||||
let (stack, engine) = setup_stack_and_engine_from_command(&setup_command);
|
||||
bench_command(
|
||||
format!("table_select_{n}"),
|
||||
"$table | select foo baz | ignore",
|
||||
stack,
|
||||
engine,
|
||||
)
|
||||
}
|
||||
|
||||
fn bench_table_insert_row(n: usize, m: usize) -> impl IntoBenchmarks {
|
||||
let setup_command = create_example_table_nrows(n);
|
||||
let (stack, engine) = setup_stack_and_engine_from_command(&setup_command);
|
||||
let mut insert = String::from("$table");
|
||||
for i in n..(n + m) {
|
||||
write!(insert, " | insert {i} {{ foo: 0, bar: 1, baz: {i} }}").unwrap();
|
||||
}
|
||||
insert.push_str(" | ignore");
|
||||
bench_command(format!("table_insert_row_{n}_{m}"), insert, stack, engine)
|
||||
}
|
||||
|
||||
fn bench_table_insert_col(n: usize, m: usize) -> impl IntoBenchmarks {
|
||||
let setup_command = create_example_table_nrows(n);
|
||||
let (stack, engine) = setup_stack_and_engine_from_command(&setup_command);
|
||||
let mut insert = String::from("$table");
|
||||
for i in 0..m {
|
||||
write!(insert, " | insert col_{i} {i}").unwrap();
|
||||
}
|
||||
insert.push_str(" | ignore");
|
||||
bench_command(format!("table_insert_col_{n}_{m}"), insert, stack, engine)
|
||||
}
|
||||
|
||||
fn bench_eval_interleave(n: usize) -> impl IntoBenchmarks {
|
||||
let engine = setup_engine();
|
||||
let stack = Stack::new();
|
||||
bench_command(
|
||||
format!("eval_interleave_{n}"),
|
||||
format!("seq 1 {n} | wrap a | interleave {{ seq 1 {n} | wrap b }} | ignore"),
|
||||
stack,
|
||||
engine,
|
||||
)
|
||||
}
|
||||
|
||||
fn bench_eval_interleave_with_interrupt(n: usize) -> impl IntoBenchmarks {
|
||||
let mut engine = setup_engine();
|
||||
engine.set_signals(Signals::new(Arc::new(AtomicBool::new(false))));
|
||||
let stack = Stack::new();
|
||||
bench_command(
|
||||
format!("eval_interleave_with_interrupt_{n}"),
|
||||
format!("seq 1 {n} | wrap a | interleave {{ seq 1 {n} | wrap b }} | ignore"),
|
||||
stack,
|
||||
engine,
|
||||
)
|
||||
}
|
||||
|
||||
fn bench_eval_for(n: usize) -> impl IntoBenchmarks {
|
||||
let engine = setup_engine();
|
||||
let stack = Stack::new();
|
||||
bench_command(
|
||||
format!("eval_for_{n}"),
|
||||
format!("(for $x in (1..{n}) {{ 1 }}) | ignore"),
|
||||
stack,
|
||||
engine,
|
||||
)
|
||||
}
|
||||
|
||||
fn bench_eval_each(n: usize) -> impl IntoBenchmarks {
|
||||
let engine = setup_engine();
|
||||
let stack = Stack::new();
|
||||
bench_command(
|
||||
format!("eval_each_{n}"),
|
||||
format!("(1..{n}) | each {{|_| 1 }} | ignore"),
|
||||
stack,
|
||||
engine,
|
||||
)
|
||||
}
|
||||
|
||||
fn bench_eval_par_each(n: usize) -> impl IntoBenchmarks {
|
||||
let engine = setup_engine();
|
||||
let stack = Stack::new();
|
||||
bench_command(
|
||||
format!("eval_par_each_{n}"),
|
||||
format!("(1..{}) | par-each -t 2 {{|_| 1 }} | ignore", n),
|
||||
stack,
|
||||
engine,
|
||||
)
|
||||
}
|
||||
|
||||
fn bench_eval_default_config() -> impl IntoBenchmarks {
|
||||
let default_env = get_default_config().as_bytes().to_vec();
|
||||
let fname = "default_config.nu".to_string();
|
||||
bench_eval_source(
|
||||
"eval_default_config",
|
||||
fname,
|
||||
default_env,
|
||||
Stack::new(),
|
||||
setup_engine(),
|
||||
)
|
||||
}
|
||||
|
||||
fn bench_eval_default_env() -> impl IntoBenchmarks {
|
||||
let default_env = get_default_env().as_bytes().to_vec();
|
||||
let fname = "default_env.nu".to_string();
|
||||
bench_eval_source(
|
||||
"eval_default_env",
|
||||
fname,
|
||||
default_env,
|
||||
Stack::new(),
|
||||
setup_engine(),
|
||||
)
|
||||
}
|
||||
|
||||
fn encode_json(row_cnt: usize, col_cnt: usize) -> impl IntoBenchmarks {
|
||||
let test_data = Rc::new(PluginOutput::CallResponse(
|
||||
0,
|
||||
PluginCallResponse::value(encoding_test_data(row_cnt, col_cnt)),
|
||||
));
|
||||
let encoder = Rc::new(EncodingType::try_from_bytes(b"json").unwrap());
|
||||
|
||||
[benchmark_fn(
|
||||
format!("encode_json_{}_{}", row_cnt, col_cnt),
|
||||
move |b| {
|
||||
let encoder = encoder.clone();
|
||||
let test_data = test_data.clone();
|
||||
b.iter(move || {
|
||||
let mut res = Vec::new();
|
||||
encoder.encode(&*test_data, &mut res).unwrap();
|
||||
})
|
||||
},
|
||||
)]
|
||||
}
|
||||
|
||||
fn encode_msgpack(row_cnt: usize, col_cnt: usize) -> impl IntoBenchmarks {
|
||||
let test_data = Rc::new(PluginOutput::CallResponse(
|
||||
0,
|
||||
PluginCallResponse::value(encoding_test_data(row_cnt, col_cnt)),
|
||||
));
|
||||
let encoder = Rc::new(EncodingType::try_from_bytes(b"msgpack").unwrap());
|
||||
|
||||
[benchmark_fn(
|
||||
format!("encode_msgpack_{}_{}", row_cnt, col_cnt),
|
||||
move |b| {
|
||||
let encoder = encoder.clone();
|
||||
let test_data = test_data.clone();
|
||||
b.iter(move || {
|
||||
let mut res = Vec::new();
|
||||
encoder.encode(&*test_data, &mut res).unwrap();
|
||||
})
|
||||
},
|
||||
)]
|
||||
}
|
||||
|
||||
fn decode_json(row_cnt: usize, col_cnt: usize) -> impl IntoBenchmarks {
|
||||
let test_data = PluginOutput::CallResponse(
|
||||
0,
|
||||
PluginCallResponse::value(encoding_test_data(row_cnt, col_cnt)),
|
||||
);
|
||||
let encoder = EncodingType::try_from_bytes(b"json").unwrap();
|
||||
let mut res = vec![];
|
||||
encoder.encode(&test_data, &mut res).unwrap();
|
||||
|
||||
[benchmark_fn(
|
||||
format!("decode_json_{}_{}", row_cnt, col_cnt),
|
||||
move |b| {
|
||||
let res = res.clone();
|
||||
b.iter(move || {
|
||||
let mut binary_data = std::io::Cursor::new(res.clone());
|
||||
binary_data.set_position(0);
|
||||
let _: Result<Option<PluginOutput>, _> =
|
||||
black_box(encoder.decode(&mut binary_data));
|
||||
})
|
||||
},
|
||||
)]
|
||||
}
|
||||
|
||||
fn decode_msgpack(row_cnt: usize, col_cnt: usize) -> impl IntoBenchmarks {
|
||||
let test_data = PluginOutput::CallResponse(
|
||||
0,
|
||||
PluginCallResponse::value(encoding_test_data(row_cnt, col_cnt)),
|
||||
);
|
||||
let encoder = EncodingType::try_from_bytes(b"msgpack").unwrap();
|
||||
let mut res = vec![];
|
||||
encoder.encode(&test_data, &mut res).unwrap();
|
||||
|
||||
[benchmark_fn(
|
||||
format!("decode_msgpack_{}_{}", row_cnt, col_cnt),
|
||||
move |b| {
|
||||
let res = res.clone();
|
||||
b.iter(move || {
|
||||
let mut binary_data = std::io::Cursor::new(res.clone());
|
||||
binary_data.set_position(0);
|
||||
let _: Result<Option<PluginOutput>, _> =
|
||||
black_box(encoder.decode(&mut binary_data));
|
||||
})
|
||||
},
|
||||
)]
|
||||
}
|
||||
|
||||
tango_benchmarks!(
|
||||
bench_load_standard_lib(),
|
||||
// Data types
|
||||
// Record
|
||||
bench_record_create(1),
|
||||
bench_record_create(10),
|
||||
bench_record_create(100),
|
||||
bench_record_create(1_000),
|
||||
bench_record_flat_access(1),
|
||||
bench_record_flat_access(10),
|
||||
bench_record_flat_access(100),
|
||||
bench_record_flat_access(1_000),
|
||||
bench_record_nested_access(1),
|
||||
bench_record_nested_access(2),
|
||||
bench_record_nested_access(4),
|
||||
bench_record_nested_access(8),
|
||||
bench_record_nested_access(16),
|
||||
bench_record_nested_access(32),
|
||||
bench_record_nested_access(64),
|
||||
bench_record_nested_access(128),
|
||||
bench_record_insert(1, 1),
|
||||
bench_record_insert(10, 1),
|
||||
bench_record_insert(100, 1),
|
||||
bench_record_insert(1000, 1),
|
||||
bench_record_insert(1, 10),
|
||||
bench_record_insert(10, 10),
|
||||
bench_record_insert(100, 10),
|
||||
bench_record_insert(1000, 10),
|
||||
// Table
|
||||
bench_table_create(1),
|
||||
bench_table_create(10),
|
||||
bench_table_create(100),
|
||||
bench_table_create(1_000),
|
||||
bench_table_get(1),
|
||||
bench_table_get(10),
|
||||
bench_table_get(100),
|
||||
bench_table_get(1_000),
|
||||
bench_table_select(1),
|
||||
bench_table_select(10),
|
||||
bench_table_select(100),
|
||||
bench_table_select(1_000),
|
||||
bench_table_insert_row(1, 1),
|
||||
bench_table_insert_row(10, 1),
|
||||
bench_table_insert_row(100, 1),
|
||||
bench_table_insert_row(1000, 1),
|
||||
bench_table_insert_row(1, 10),
|
||||
bench_table_insert_row(10, 10),
|
||||
bench_table_insert_row(100, 10),
|
||||
bench_table_insert_row(1000, 10),
|
||||
bench_table_insert_col(1, 1),
|
||||
bench_table_insert_col(10, 1),
|
||||
bench_table_insert_col(100, 1),
|
||||
bench_table_insert_col(1000, 1),
|
||||
bench_table_insert_col(1, 10),
|
||||
bench_table_insert_col(10, 10),
|
||||
bench_table_insert_col(100, 10),
|
||||
bench_table_insert_col(1000, 10),
|
||||
// Eval
|
||||
// Interleave
|
||||
bench_eval_interleave(100),
|
||||
bench_eval_interleave(1_000),
|
||||
bench_eval_interleave(10_000),
|
||||
bench_eval_interleave_with_interrupt(100),
|
||||
bench_eval_interleave_with_interrupt(1_000),
|
||||
bench_eval_interleave_with_interrupt(10_000),
|
||||
// For
|
||||
bench_eval_for(1),
|
||||
bench_eval_for(10),
|
||||
bench_eval_for(100),
|
||||
bench_eval_for(1_000),
|
||||
bench_eval_for(10_000),
|
||||
// Each
|
||||
bench_eval_each(1),
|
||||
bench_eval_each(10),
|
||||
bench_eval_each(100),
|
||||
bench_eval_each(1_000),
|
||||
bench_eval_each(10_000),
|
||||
// Par-Each
|
||||
bench_eval_par_each(1),
|
||||
bench_eval_par_each(10),
|
||||
bench_eval_par_each(100),
|
||||
bench_eval_par_each(1_000),
|
||||
bench_eval_par_each(10_000),
|
||||
// Config
|
||||
bench_eval_default_config(),
|
||||
// Env
|
||||
bench_eval_default_env(),
|
||||
// Encode
|
||||
// Json
|
||||
encode_json(100, 5),
|
||||
encode_json(10000, 15),
|
||||
// MsgPack
|
||||
encode_msgpack(100, 5),
|
||||
encode_msgpack(10000, 15),
|
||||
// Decode
|
||||
// Json
|
||||
decode_json(100, 5),
|
||||
decode_json(10000, 15),
|
||||
// MsgPack
|
||||
decode_msgpack(100, 5),
|
||||
decode_msgpack(10000, 15)
|
||||
);
|
||||
|
||||
tango_main!();
|
@ -1,3 +0,0 @@
|
||||
[[disallowed-types]]
|
||||
path = "std::time::Instant"
|
||||
reason = "WASM panics if used, use `web_time::Instant` instead"
|
@ -1,13 +0,0 @@
|
||||
# Nushell core libraries and plugins
|
||||
|
||||
These sub-crates form both the foundation for Nu and a set of plugins which extend Nu with additional functionality.
|
||||
|
||||
Foundational libraries are split into two kinds of crates:
|
||||
|
||||
* Core crates - those crates that work together to build the Nushell language engine
|
||||
* Support crates - a set of crates that support the engine with additional features like JSON support, ANSI support, and more.
|
||||
|
||||
Plugins are likewise also split into two types:
|
||||
|
||||
* Core plugins - plugins that provide part of the default experience of Nu, including access to the system properties, processes, and web-connectivity features.
|
||||
* Extra plugins - these plugins run a wide range of different capabilities like working with different file types, charting, viewing binary data, and more.
|
@ -1,54 +0,0 @@
|
||||
[package]
|
||||
authors = ["The Nushell Project Developers"]
|
||||
description = "CLI-related functionality for Nushell"
|
||||
repository = "https://github.com/nushell/nushell/tree/main/crates/nu-cli"
|
||||
edition = "2024"
|
||||
license = "MIT"
|
||||
name = "nu-cli"
|
||||
version = "0.105.2"
|
||||
|
||||
[lib]
|
||||
bench = false
|
||||
|
||||
[dev-dependencies]
|
||||
nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.105.2" }
|
||||
nu-command = { path = "../nu-command", version = "0.105.2" }
|
||||
nu-std = { path = "../nu-std", version = "0.105.2" }
|
||||
nu-test-support = { path = "../nu-test-support", version = "0.105.2" }
|
||||
rstest = { workspace = true, default-features = false }
|
||||
tempfile = { workspace = true }
|
||||
|
||||
[dependencies]
|
||||
nu-cmd-base = { path = "../nu-cmd-base", version = "0.105.2" }
|
||||
nu-engine = { path = "../nu-engine", version = "0.105.2", features = ["os"] }
|
||||
nu-glob = { path = "../nu-glob", version = "0.105.2" }
|
||||
nu-path = { path = "../nu-path", version = "0.105.2" }
|
||||
nu-parser = { path = "../nu-parser", version = "0.105.2" }
|
||||
nu-plugin-engine = { path = "../nu-plugin-engine", version = "0.105.2", optional = true }
|
||||
nu-protocol = { path = "../nu-protocol", version = "0.105.2", features = ["os"] }
|
||||
nu-utils = { path = "../nu-utils", version = "0.105.2" }
|
||||
nu-color-config = { path = "../nu-color-config", version = "0.105.2" }
|
||||
nu-ansi-term = { workspace = true }
|
||||
reedline = { workspace = true, features = ["bashisms", "sqlite"] }
|
||||
|
||||
chrono = { default-features = false, features = ["std"], workspace = true }
|
||||
crossterm = { workspace = true }
|
||||
fancy-regex = { workspace = true }
|
||||
is_executable = { workspace = true }
|
||||
log = { workspace = true }
|
||||
lscolors = { workspace = true, default-features = false, features = ["nu-ansi-term"] }
|
||||
miette = { workspace = true, features = ["fancy-no-backtrace"] }
|
||||
nucleo-matcher = { workspace = true }
|
||||
percent-encoding = { workspace = true }
|
||||
sysinfo = { workspace = true }
|
||||
strum = { workspace = true }
|
||||
unicode-segmentation = { workspace = true }
|
||||
uuid = { workspace = true, features = ["v4"] }
|
||||
which = { workspace = true }
|
||||
|
||||
[features]
|
||||
plugin = ["nu-plugin-engine"]
|
||||
system-clipboard = ["reedline/system_clipboard"]
|
||||
|
||||
[lints]
|
||||
workspace = true
|
@ -1,21 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2019 - 2023 The Nushell Project Developers
|
||||
|
||||
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,7 +0,0 @@
|
||||
This crate implements the core functionality of the interactive Nushell REPL and interfaces with `reedline`.
|
||||
Currently implements the syntax highlighting and completions logic.
|
||||
Furthermore includes a few commands that are specific to `reedline`
|
||||
|
||||
## Internal Nushell crate
|
||||
|
||||
This crate implements components of Nushell and is not designed to support plugin authors or other users directly.
|
@ -1,35 +0,0 @@
|
||||
use nu_engine::command_prelude::*;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Commandline;
|
||||
|
||||
impl Command for Commandline {
|
||||
fn name(&self) -> &str {
|
||||
"commandline"
|
||||
}
|
||||
|
||||
fn signature(&self) -> Signature {
|
||||
Signature::build("commandline")
|
||||
.input_output_types(vec![(Type::Nothing, Type::String)])
|
||||
.category(Category::Core)
|
||||
}
|
||||
|
||||
fn description(&self) -> &str {
|
||||
"View the current command line input buffer."
|
||||
}
|
||||
|
||||
fn search_terms(&self) -> Vec<&str> {
|
||||
vec!["repl", "interactive"]
|
||||
}
|
||||
|
||||
fn run(
|
||||
&self,
|
||||
engine_state: &EngineState,
|
||||
_stack: &mut Stack,
|
||||
call: &Call,
|
||||
_input: PipelineData,
|
||||
) -> Result<PipelineData, ShellError> {
|
||||
let repl = engine_state.repl_state.lock().expect("repl state mutex");
|
||||
Ok(Value::string(repl.buffer.clone(), call.head).into_pipeline_data())
|
||||
}
|
||||
}
|
@ -1,66 +0,0 @@
|
||||
use nu_engine::command_prelude::*;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct CommandlineEdit;
|
||||
|
||||
impl Command for CommandlineEdit {
|
||||
fn name(&self) -> &str {
|
||||
"commandline edit"
|
||||
}
|
||||
|
||||
fn signature(&self) -> Signature {
|
||||
Signature::build(self.name())
|
||||
.input_output_types(vec![(Type::Nothing, Type::Nothing)])
|
||||
.switch(
|
||||
"append",
|
||||
"appends the string to the end of the buffer",
|
||||
Some('a'),
|
||||
)
|
||||
.switch(
|
||||
"insert",
|
||||
"inserts the string into the buffer at the cursor position",
|
||||
Some('i'),
|
||||
)
|
||||
.switch(
|
||||
"replace",
|
||||
"replaces the current contents of the buffer (default)",
|
||||
Some('r'),
|
||||
)
|
||||
.required(
|
||||
"str",
|
||||
SyntaxShape::String,
|
||||
"The string to perform the operation with.",
|
||||
)
|
||||
.category(Category::Core)
|
||||
}
|
||||
|
||||
fn description(&self) -> &str {
|
||||
"Modify the current command line input buffer."
|
||||
}
|
||||
|
||||
fn search_terms(&self) -> Vec<&str> {
|
||||
vec!["repl", "interactive"]
|
||||
}
|
||||
|
||||
fn run(
|
||||
&self,
|
||||
engine_state: &EngineState,
|
||||
stack: &mut Stack,
|
||||
call: &Call,
|
||||
_input: PipelineData,
|
||||
) -> Result<PipelineData, ShellError> {
|
||||
let str: String = call.req(engine_state, stack, 0)?;
|
||||
let mut repl = engine_state.repl_state.lock().expect("repl state mutex");
|
||||
if call.has_flag(engine_state, stack, "append")? {
|
||||
repl.buffer.push_str(&str);
|
||||
} else if call.has_flag(engine_state, stack, "insert")? {
|
||||
let cursor_pos = repl.cursor_pos;
|
||||
repl.buffer.insert_str(cursor_pos, &str);
|
||||
repl.cursor_pos += str.len();
|
||||
} else {
|
||||
repl.buffer = str;
|
||||
repl.cursor_pos = repl.buffer.len();
|
||||
}
|
||||
Ok(Value::nothing(call.head).into_pipeline_data())
|
||||
}
|
||||
}
|
@ -1,52 +0,0 @@
|
||||
use nu_engine::command_prelude::*;
|
||||
use unicode_segmentation::UnicodeSegmentation;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct CommandlineGetCursor;
|
||||
|
||||
impl Command for CommandlineGetCursor {
|
||||
fn name(&self) -> &str {
|
||||
"commandline get-cursor"
|
||||
}
|
||||
|
||||
fn signature(&self) -> Signature {
|
||||
Signature::build(self.name())
|
||||
.input_output_types(vec![(Type::Nothing, Type::Int)])
|
||||
.allow_variants_without_examples(true)
|
||||
.category(Category::Core)
|
||||
}
|
||||
|
||||
fn description(&self) -> &str {
|
||||
"Get the current cursor position."
|
||||
}
|
||||
|
||||
fn search_terms(&self) -> Vec<&str> {
|
||||
vec!["repl", "interactive"]
|
||||
}
|
||||
|
||||
fn run(
|
||||
&self,
|
||||
engine_state: &EngineState,
|
||||
_stack: &mut Stack,
|
||||
call: &Call,
|
||||
_input: PipelineData,
|
||||
) -> Result<PipelineData, ShellError> {
|
||||
let repl = engine_state.repl_state.lock().expect("repl state mutex");
|
||||
let char_pos = repl
|
||||
.buffer
|
||||
.grapheme_indices(true)
|
||||
.chain(std::iter::once((repl.buffer.len(), "")))
|
||||
.position(|(i, _c)| i == repl.cursor_pos)
|
||||
.expect("Cursor position isn't on a grapheme boundary");
|
||||
match i64::try_from(char_pos) {
|
||||
Ok(pos) => Ok(Value::int(pos, call.head).into_pipeline_data()),
|
||||
Err(e) => Err(ShellError::GenericError {
|
||||
error: "Failed to convert cursor position to int".to_string(),
|
||||
msg: e.to_string(),
|
||||
span: None,
|
||||
help: None,
|
||||
inner: vec![],
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
mod commandline_;
|
||||
mod edit;
|
||||
mod get_cursor;
|
||||
mod set_cursor;
|
||||
|
||||
pub use commandline_::Commandline;
|
||||
pub use edit::CommandlineEdit;
|
||||
pub use get_cursor::CommandlineGetCursor;
|
||||
pub use set_cursor::CommandlineSetCursor;
|
@ -1,65 +0,0 @@
|
||||
use nu_engine::command_prelude::*;
|
||||
|
||||
use unicode_segmentation::UnicodeSegmentation;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct CommandlineSetCursor;
|
||||
|
||||
impl Command for CommandlineSetCursor {
|
||||
fn name(&self) -> &str {
|
||||
"commandline set-cursor"
|
||||
}
|
||||
|
||||
fn signature(&self) -> Signature {
|
||||
Signature::build(self.name())
|
||||
.input_output_types(vec![(Type::Nothing, Type::Nothing)])
|
||||
.switch(
|
||||
"end",
|
||||
"set the current cursor position to the end of the buffer",
|
||||
Some('e'),
|
||||
)
|
||||
.optional("pos", SyntaxShape::Int, "Cursor position to be set.")
|
||||
.category(Category::Core)
|
||||
}
|
||||
|
||||
fn description(&self) -> &str {
|
||||
"Set the current cursor position."
|
||||
}
|
||||
|
||||
fn search_terms(&self) -> Vec<&str> {
|
||||
vec!["repl", "interactive"]
|
||||
}
|
||||
|
||||
fn run(
|
||||
&self,
|
||||
engine_state: &EngineState,
|
||||
stack: &mut Stack,
|
||||
call: &Call,
|
||||
_input: PipelineData,
|
||||
) -> Result<PipelineData, ShellError> {
|
||||
let mut repl = engine_state.repl_state.lock().expect("repl state mutex");
|
||||
if let Some(pos) = call.opt::<i64>(engine_state, stack, 0)? {
|
||||
repl.cursor_pos = if pos <= 0 {
|
||||
0usize
|
||||
} else {
|
||||
repl.buffer
|
||||
.grapheme_indices(true)
|
||||
.map(|(i, _c)| i)
|
||||
.nth(pos as usize)
|
||||
.unwrap_or(repl.buffer.len())
|
||||
};
|
||||
Ok(Value::nothing(call.head).into_pipeline_data())
|
||||
} else if call.has_flag(engine_state, stack, "end")? {
|
||||
repl.cursor_pos = repl.buffer.len();
|
||||
Ok(Value::nothing(call.head).into_pipeline_data())
|
||||
} else {
|
||||
Err(ShellError::GenericError {
|
||||
error: "Required a positional argument or a flag".to_string(),
|
||||
msg: "".to_string(),
|
||||
span: None,
|
||||
help: None,
|
||||
inner: vec![],
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
@ -1,36 +0,0 @@
|
||||
use crate::commands::*;
|
||||
use nu_protocol::engine::{EngineState, StateWorkingSet};
|
||||
|
||||
pub fn add_cli_context(mut engine_state: EngineState) -> EngineState {
|
||||
let delta = {
|
||||
let mut working_set = StateWorkingSet::new(&engine_state);
|
||||
|
||||
macro_rules! bind_command {
|
||||
( $( $command:expr ),* $(,)? ) => {
|
||||
$( working_set.add_decl(Box::new($command)); )*
|
||||
};
|
||||
}
|
||||
|
||||
bind_command! {
|
||||
Commandline,
|
||||
CommandlineEdit,
|
||||
CommandlineGetCursor,
|
||||
CommandlineSetCursor,
|
||||
History,
|
||||
HistoryImport,
|
||||
HistorySession,
|
||||
Keybindings,
|
||||
KeybindingsDefault,
|
||||
KeybindingsList,
|
||||
KeybindingsListen,
|
||||
};
|
||||
|
||||
working_set.render()
|
||||
};
|
||||
|
||||
if let Err(err) = engine_state.merge_delta(delta) {
|
||||
eprintln!("Error creating CLI command context: {err:?}");
|
||||
}
|
||||
|
||||
engine_state
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
// Each const is named after a HistoryItem field, and the value is the field name to be displayed to
|
||||
// the user (or accept during import).
|
||||
pub const COMMAND_LINE: &str = "command";
|
||||
pub const START_TIMESTAMP: &str = "start_timestamp";
|
||||
pub const HOSTNAME: &str = "hostname";
|
||||
pub const CWD: &str = "cwd";
|
||||
pub const EXIT_STATUS: &str = "exit_status";
|
||||
pub const DURATION: &str = "duration";
|
||||
pub const SESSION_ID: &str = "session_id";
|
@ -1,206 +0,0 @@
|
||||
use nu_engine::command_prelude::*;
|
||||
use nu_protocol::{
|
||||
HistoryFileFormat,
|
||||
shell_error::{self, io::IoError},
|
||||
};
|
||||
use reedline::{
|
||||
FileBackedHistory, History as ReedlineHistory, HistoryItem, SearchDirection, SearchQuery,
|
||||
SqliteBackedHistory,
|
||||
};
|
||||
|
||||
use super::fields;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct History;
|
||||
|
||||
impl Command for History {
|
||||
fn name(&self) -> &str {
|
||||
"history"
|
||||
}
|
||||
|
||||
fn description(&self) -> &str {
|
||||
"Get the command history."
|
||||
}
|
||||
|
||||
fn signature(&self) -> nu_protocol::Signature {
|
||||
Signature::build("history")
|
||||
.input_output_types(vec![(Type::Nothing, Type::Any)])
|
||||
.allow_variants_without_examples(true)
|
||||
.switch("clear", "Clears out the history entries", Some('c'))
|
||||
.switch(
|
||||
"long",
|
||||
"Show long listing of entries for sqlite history",
|
||||
Some('l'),
|
||||
)
|
||||
.category(Category::History)
|
||||
}
|
||||
|
||||
fn run(
|
||||
&self,
|
||||
engine_state: &EngineState,
|
||||
stack: &mut Stack,
|
||||
call: &Call,
|
||||
_input: PipelineData,
|
||||
) -> Result<PipelineData, ShellError> {
|
||||
let head = call.head;
|
||||
|
||||
let Some(history) = engine_state.history_config() else {
|
||||
return Ok(PipelineData::empty());
|
||||
};
|
||||
// todo for sqlite history this command should be an alias to `open ~/.config/nushell/history.sqlite3 | get history`
|
||||
let Some(history_path) = history.file_path() else {
|
||||
return Err(ShellError::ConfigDirNotFound { span: Some(head) });
|
||||
};
|
||||
|
||||
if call.has_flag(engine_state, stack, "clear")? {
|
||||
let _ = std::fs::remove_file(history_path);
|
||||
// TODO: FIXME also clear the auxiliary files when using sqlite
|
||||
return Ok(PipelineData::empty());
|
||||
}
|
||||
|
||||
let long = call.has_flag(engine_state, stack, "long")?;
|
||||
let signals = engine_state.signals().clone();
|
||||
let history_reader: Option<Box<dyn ReedlineHistory>> = match history.file_format {
|
||||
HistoryFileFormat::Sqlite => {
|
||||
SqliteBackedHistory::with_file(history_path.clone(), None, None)
|
||||
.map(|inner| {
|
||||
let boxed: Box<dyn ReedlineHistory> = Box::new(inner);
|
||||
boxed
|
||||
})
|
||||
.ok()
|
||||
}
|
||||
HistoryFileFormat::Plaintext => {
|
||||
FileBackedHistory::with_file(history.max_size as usize, history_path.clone())
|
||||
.map(|inner| {
|
||||
let boxed: Box<dyn ReedlineHistory> = Box::new(inner);
|
||||
boxed
|
||||
})
|
||||
.ok()
|
||||
}
|
||||
};
|
||||
match history.file_format {
|
||||
HistoryFileFormat::Plaintext => Ok(history_reader
|
||||
.and_then(|h| {
|
||||
h.search(SearchQuery::everything(SearchDirection::Forward, None))
|
||||
.ok()
|
||||
})
|
||||
.map(move |entries| {
|
||||
entries.into_iter().enumerate().map(move |(idx, entry)| {
|
||||
Value::record(
|
||||
record! {
|
||||
fields::COMMAND_LINE => Value::string(entry.command_line, head),
|
||||
// TODO: This name is inconsistent with create_history_record.
|
||||
"index" => Value::int(idx as i64, head),
|
||||
},
|
||||
head,
|
||||
)
|
||||
})
|
||||
})
|
||||
.ok_or(IoError::new(
|
||||
shell_error::io::ErrorKind::FileNotFound,
|
||||
head,
|
||||
history_path,
|
||||
))?
|
||||
.into_pipeline_data(head, signals)),
|
||||
HistoryFileFormat::Sqlite => Ok(history_reader
|
||||
.and_then(|h| {
|
||||
h.search(SearchQuery::everything(SearchDirection::Forward, None))
|
||||
.ok()
|
||||
})
|
||||
.map(move |entries| {
|
||||
entries.into_iter().enumerate().map(move |(idx, entry)| {
|
||||
create_sqlite_history_record(idx, entry, long, head)
|
||||
})
|
||||
})
|
||||
.ok_or(IoError::new(
|
||||
shell_error::io::ErrorKind::FileNotFound,
|
||||
head,
|
||||
history_path,
|
||||
))?
|
||||
.into_pipeline_data(head, signals)),
|
||||
}
|
||||
}
|
||||
|
||||
fn examples(&self) -> Vec<Example> {
|
||||
vec![
|
||||
Example {
|
||||
example: "history | length",
|
||||
description: "Get current history length",
|
||||
result: None,
|
||||
},
|
||||
Example {
|
||||
example: "history | last 5",
|
||||
description: "Show last 5 commands you have ran",
|
||||
result: None,
|
||||
},
|
||||
Example {
|
||||
example: "history | where command =~ cargo | get command",
|
||||
description: "Search all the commands from history that contains 'cargo'",
|
||||
result: None,
|
||||
},
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
fn create_sqlite_history_record(idx: usize, entry: HistoryItem, long: bool, head: Span) -> Value {
|
||||
//1. Format all the values
|
||||
//2. Create a record of either short or long columns and values
|
||||
|
||||
let item_id_value = Value::int(
|
||||
entry
|
||||
.id
|
||||
.and_then(|id| id.to_string().parse::<i64>().ok())
|
||||
.unwrap_or_default(),
|
||||
head,
|
||||
);
|
||||
let start_timestamp_value = Value::date(
|
||||
entry.start_timestamp.unwrap_or_default().fixed_offset(),
|
||||
head,
|
||||
);
|
||||
let command_value = Value::string(entry.command_line, head);
|
||||
let session_id_value = Value::int(
|
||||
entry
|
||||
.session_id
|
||||
.and_then(|id| id.to_string().parse::<i64>().ok())
|
||||
.unwrap_or_default(),
|
||||
head,
|
||||
);
|
||||
let hostname_value = Value::string(entry.hostname.unwrap_or_default(), head);
|
||||
let cwd_value = Value::string(entry.cwd.unwrap_or_default(), head);
|
||||
let duration_value = Value::duration(
|
||||
entry
|
||||
.duration
|
||||
.and_then(|d| d.as_nanos().try_into().ok())
|
||||
.unwrap_or(0),
|
||||
head,
|
||||
);
|
||||
let exit_status_value = Value::int(entry.exit_status.unwrap_or(0), head);
|
||||
let index_value = Value::int(idx as i64, head);
|
||||
if long {
|
||||
Value::record(
|
||||
record! {
|
||||
"item_id" => item_id_value,
|
||||
fields::START_TIMESTAMP => start_timestamp_value,
|
||||
fields::COMMAND_LINE => command_value,
|
||||
fields::SESSION_ID => session_id_value,
|
||||
fields::HOSTNAME => hostname_value,
|
||||
fields::CWD => cwd_value,
|
||||
fields::DURATION => duration_value,
|
||||
fields::EXIT_STATUS => exit_status_value,
|
||||
"idx" => index_value,
|
||||
},
|
||||
head,
|
||||
)
|
||||
} else {
|
||||
Value::record(
|
||||
record! {
|
||||
fields::START_TIMESTAMP => start_timestamp_value,
|
||||
fields::COMMAND_LINE => command_value,
|
||||
fields::CWD => cwd_value,
|
||||
fields::DURATION => duration_value,
|
||||
fields::EXIT_STATUS => exit_status_value,
|
||||
},
|
||||
head,
|
||||
)
|
||||
}
|
||||
}
|
@ -1,440 +0,0 @@
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
use nu_engine::command_prelude::*;
|
||||
use nu_protocol::{
|
||||
HistoryFileFormat,
|
||||
shell_error::{self, io::IoError},
|
||||
};
|
||||
|
||||
use reedline::{
|
||||
FileBackedHistory, History, HistoryItem, ReedlineError, SearchQuery, SqliteBackedHistory,
|
||||
};
|
||||
|
||||
use super::fields;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct HistoryImport;
|
||||
|
||||
impl Command for HistoryImport {
|
||||
fn name(&self) -> &str {
|
||||
"history import"
|
||||
}
|
||||
|
||||
fn description(&self) -> &str {
|
||||
"Import command line history."
|
||||
}
|
||||
|
||||
fn extra_description(&self) -> &str {
|
||||
r#"Can import history from input, either successive command lines or more detailed records. If providing records, available fields are:
|
||||
command, start_timestamp, hostname, cwd, duration, exit_status.
|
||||
|
||||
If no input is provided, will import all history items from existing history in the other format: if current history is stored in sqlite, it will store it in plain text and vice versa.
|
||||
|
||||
Note that history item IDs are ignored when importing from file."#
|
||||
}
|
||||
|
||||
fn signature(&self) -> nu_protocol::Signature {
|
||||
Signature::build("history import")
|
||||
.category(Category::History)
|
||||
.input_output_types(vec![
|
||||
(Type::Nothing, Type::Nothing),
|
||||
(Type::String, Type::Nothing),
|
||||
(Type::List(Box::new(Type::String)), Type::Nothing),
|
||||
(Type::table(), Type::Nothing),
|
||||
])
|
||||
}
|
||||
|
||||
fn examples(&self) -> Vec<Example> {
|
||||
vec![
|
||||
Example {
|
||||
example: "history import",
|
||||
description: "Append all items from history in the other format to the current history",
|
||||
result: None,
|
||||
},
|
||||
Example {
|
||||
example: "echo foo | history import",
|
||||
description: "Append `foo` to the current history",
|
||||
result: None,
|
||||
},
|
||||
Example {
|
||||
example: "[[ command_line cwd ]; [ foo /home ]] | history import",
|
||||
description: "Append `foo` ran from `/home` to the current history",
|
||||
result: None,
|
||||
},
|
||||
]
|
||||
}
|
||||
|
||||
fn run(
|
||||
&self,
|
||||
engine_state: &EngineState,
|
||||
_stack: &mut Stack,
|
||||
call: &Call,
|
||||
input: PipelineData,
|
||||
) -> Result<PipelineData, ShellError> {
|
||||
let span = call.head;
|
||||
let ok = Ok(Value::nothing(call.head).into_pipeline_data());
|
||||
|
||||
let Some(history) = engine_state.history_config() else {
|
||||
return ok;
|
||||
};
|
||||
let Some(current_history_path) = history.file_path() else {
|
||||
return Err(ShellError::ConfigDirNotFound { span: span.into() });
|
||||
};
|
||||
if let Some(bak_path) = backup(¤t_history_path, span)? {
|
||||
println!("Backed history to {}", bak_path.display());
|
||||
}
|
||||
match input {
|
||||
PipelineData::Empty => {
|
||||
let other_format = match history.file_format {
|
||||
HistoryFileFormat::Sqlite => HistoryFileFormat::Plaintext,
|
||||
HistoryFileFormat::Plaintext => HistoryFileFormat::Sqlite,
|
||||
};
|
||||
let src = new_backend(other_format, None)?;
|
||||
let mut dst = new_backend(history.file_format, Some(current_history_path))?;
|
||||
let items = src
|
||||
.search(SearchQuery::everything(
|
||||
reedline::SearchDirection::Forward,
|
||||
None,
|
||||
))
|
||||
.map_err(error_from_reedline)?
|
||||
.into_iter()
|
||||
.map(Ok);
|
||||
import(dst.as_mut(), items)
|
||||
}
|
||||
_ => {
|
||||
let input = input.into_iter().map(item_from_value);
|
||||
import(
|
||||
new_backend(history.file_format, Some(current_history_path))?.as_mut(),
|
||||
input,
|
||||
)
|
||||
}
|
||||
}?;
|
||||
|
||||
ok
|
||||
}
|
||||
}
|
||||
|
||||
fn new_backend(
|
||||
format: HistoryFileFormat,
|
||||
path: Option<PathBuf>,
|
||||
) -> Result<Box<dyn History>, ShellError> {
|
||||
let path = match path {
|
||||
Some(path) => path,
|
||||
None => {
|
||||
let Some(mut path) = nu_path::nu_config_dir() else {
|
||||
return Err(ShellError::ConfigDirNotFound { span: None });
|
||||
};
|
||||
path.push(format.default_file_name());
|
||||
path.into_std_path_buf()
|
||||
}
|
||||
};
|
||||
|
||||
fn map(
|
||||
result: Result<impl History + 'static, ReedlineError>,
|
||||
) -> Result<Box<dyn History>, ShellError> {
|
||||
result
|
||||
.map(|x| Box::new(x) as Box<dyn History>)
|
||||
.map_err(error_from_reedline)
|
||||
}
|
||||
match format {
|
||||
// Use a reasonably large value for maximum capacity.
|
||||
HistoryFileFormat::Plaintext => map(FileBackedHistory::with_file(0xfffffff, path)),
|
||||
HistoryFileFormat::Sqlite => map(SqliteBackedHistory::with_file(path, None, None)),
|
||||
}
|
||||
}
|
||||
|
||||
fn import(
|
||||
dst: &mut dyn History,
|
||||
src: impl Iterator<Item = Result<HistoryItem, ShellError>>,
|
||||
) -> Result<(), ShellError> {
|
||||
for item in src {
|
||||
let mut item = item?;
|
||||
item.id = None;
|
||||
dst.save(item).map_err(error_from_reedline)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn error_from_reedline(e: ReedlineError) -> ShellError {
|
||||
// TODO: Should we add a new ShellError variant?
|
||||
ShellError::GenericError {
|
||||
error: "Reedline error".to_owned(),
|
||||
msg: format!("{e}"),
|
||||
span: None,
|
||||
help: None,
|
||||
inner: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
fn item_from_value(v: Value) -> Result<HistoryItem, ShellError> {
|
||||
let span = v.span();
|
||||
match v {
|
||||
Value::Record { val, .. } => item_from_record(val.into_owned(), span),
|
||||
Value::String { val, .. } => Ok(HistoryItem {
|
||||
command_line: val,
|
||||
id: None,
|
||||
start_timestamp: None,
|
||||
session_id: None,
|
||||
hostname: None,
|
||||
cwd: None,
|
||||
duration: None,
|
||||
exit_status: None,
|
||||
more_info: None,
|
||||
}),
|
||||
_ => Err(ShellError::UnsupportedInput {
|
||||
msg: "Only list and record inputs are supported".to_owned(),
|
||||
input: v.get_type().to_string(),
|
||||
msg_span: span,
|
||||
input_span: span,
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
fn item_from_record(mut rec: Record, span: Span) -> Result<HistoryItem, ShellError> {
|
||||
let cmd = match rec.remove(fields::COMMAND_LINE) {
|
||||
Some(v) => v.as_str()?.to_owned(),
|
||||
None => {
|
||||
return Err(ShellError::TypeMismatch {
|
||||
err_message: format!("missing column: {}", fields::COMMAND_LINE),
|
||||
span,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
fn get<T>(
|
||||
rec: &mut Record,
|
||||
field: &'static str,
|
||||
f: impl FnOnce(Value) -> Result<T, ShellError>,
|
||||
) -> Result<Option<T>, ShellError> {
|
||||
rec.remove(field).map(f).transpose()
|
||||
}
|
||||
|
||||
let rec = &mut rec;
|
||||
let item = HistoryItem {
|
||||
command_line: cmd,
|
||||
id: None,
|
||||
start_timestamp: get(rec, fields::START_TIMESTAMP, |v| Ok(v.as_date()?.to_utc()))?,
|
||||
hostname: get(rec, fields::HOSTNAME, |v| Ok(v.as_str()?.to_owned()))?,
|
||||
cwd: get(rec, fields::CWD, |v| Ok(v.as_str()?.to_owned()))?,
|
||||
exit_status: get(rec, fields::EXIT_STATUS, |v| v.as_int())?,
|
||||
duration: get(rec, fields::DURATION, |v| duration_from_value(v, span))?,
|
||||
more_info: None,
|
||||
// TODO: Currently reedline doesn't let you create session IDs.
|
||||
session_id: None,
|
||||
};
|
||||
|
||||
if !rec.is_empty() {
|
||||
let cols = rec.columns().map(|s| s.as_str()).collect::<Vec<_>>();
|
||||
return Err(ShellError::TypeMismatch {
|
||||
err_message: format!("unsupported column names: {}", cols.join(", ")),
|
||||
span,
|
||||
});
|
||||
}
|
||||
Ok(item)
|
||||
}
|
||||
|
||||
fn duration_from_value(v: Value, span: Span) -> Result<std::time::Duration, ShellError> {
|
||||
chrono::Duration::nanoseconds(v.as_duration()?)
|
||||
.to_std()
|
||||
.map_err(|_| ShellError::NeedsPositiveValue { span })
|
||||
}
|
||||
|
||||
fn find_backup_path(path: &Path, span: Span) -> Result<PathBuf, ShellError> {
|
||||
let Ok(mut bak_path) = path.to_path_buf().into_os_string().into_string() else {
|
||||
// This isn't fundamentally problem, but trying to work with OsString is a nightmare.
|
||||
return Err(ShellError::GenericError {
|
||||
error: "History path not UTF-8".to_string(),
|
||||
msg: "History path must be representable as UTF-8".to_string(),
|
||||
span: Some(span),
|
||||
help: None,
|
||||
inner: vec![],
|
||||
});
|
||||
};
|
||||
bak_path.push_str(".bak");
|
||||
if !Path::new(&bak_path).exists() {
|
||||
return Ok(bak_path.into());
|
||||
}
|
||||
let base_len = bak_path.len();
|
||||
for i in 1..100 {
|
||||
use std::fmt::Write;
|
||||
bak_path.truncate(base_len);
|
||||
write!(&mut bak_path, ".{i}").unwrap();
|
||||
if !Path::new(&bak_path).exists() {
|
||||
return Ok(PathBuf::from(bak_path));
|
||||
}
|
||||
}
|
||||
Err(ShellError::GenericError {
|
||||
error: "Too many backup files".to_string(),
|
||||
msg: "Found too many existing backup files".to_string(),
|
||||
span: Some(span),
|
||||
help: None,
|
||||
inner: vec![],
|
||||
})
|
||||
}
|
||||
|
||||
fn backup(path: &Path, span: Span) -> Result<Option<PathBuf>, ShellError> {
|
||||
match path.metadata() {
|
||||
Ok(md) if md.is_file() => (),
|
||||
Ok(_) => {
|
||||
return Err(IoError::new_with_additional_context(
|
||||
shell_error::io::ErrorKind::NotAFile,
|
||||
span,
|
||||
PathBuf::from(path),
|
||||
"history path exists but is not a file",
|
||||
)
|
||||
.into());
|
||||
}
|
||||
Err(e) if e.kind() == std::io::ErrorKind::NotFound => return Ok(None),
|
||||
Err(e) => {
|
||||
return Err(IoError::new_internal(
|
||||
e,
|
||||
"Could not get metadata",
|
||||
nu_protocol::location!(),
|
||||
)
|
||||
.into());
|
||||
}
|
||||
}
|
||||
let bak_path = find_backup_path(path, span)?;
|
||||
std::fs::copy(path, &bak_path).map_err(|err| {
|
||||
IoError::new_internal(
|
||||
err.not_found_as(NotFound::File),
|
||||
"Could not copy backup",
|
||||
nu_protocol::location!(),
|
||||
)
|
||||
})?;
|
||||
Ok(Some(bak_path))
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use chrono::DateTime;
|
||||
use rstest::rstest;
|
||||
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_item_from_value_string() -> Result<(), ShellError> {
|
||||
let item = item_from_value(Value::string("foo", Span::unknown()))?;
|
||||
assert_eq!(
|
||||
item,
|
||||
HistoryItem {
|
||||
command_line: "foo".to_string(),
|
||||
id: None,
|
||||
start_timestamp: None,
|
||||
session_id: None,
|
||||
hostname: None,
|
||||
cwd: None,
|
||||
duration: None,
|
||||
exit_status: None,
|
||||
more_info: None
|
||||
}
|
||||
);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_item_from_value_record() {
|
||||
let span = Span::unknown();
|
||||
let rec = new_record(&[
|
||||
("command", Value::string("foo", span)),
|
||||
(
|
||||
"start_timestamp",
|
||||
Value::date(
|
||||
DateTime::parse_from_rfc3339("1996-12-19T16:39:57-08:00").unwrap(),
|
||||
span,
|
||||
),
|
||||
),
|
||||
("hostname", Value::string("localhost", span)),
|
||||
("cwd", Value::string("/home/test", span)),
|
||||
("duration", Value::duration(100_000_000, span)),
|
||||
("exit_status", Value::int(42, span)),
|
||||
]);
|
||||
let item = item_from_value(rec).unwrap();
|
||||
assert_eq!(
|
||||
item,
|
||||
HistoryItem {
|
||||
command_line: "foo".to_string(),
|
||||
id: None,
|
||||
start_timestamp: Some(
|
||||
DateTime::parse_from_rfc3339("1996-12-19T16:39:57-08:00")
|
||||
.unwrap()
|
||||
.to_utc()
|
||||
),
|
||||
hostname: Some("localhost".to_string()),
|
||||
cwd: Some("/home/test".to_string()),
|
||||
duration: Some(std::time::Duration::from_nanos(100_000_000)),
|
||||
exit_status: Some(42),
|
||||
|
||||
session_id: None,
|
||||
more_info: None
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_item_from_value_record_extra_field() {
|
||||
let span = Span::unknown();
|
||||
let rec = new_record(&[
|
||||
("command_line", Value::string("foo", span)),
|
||||
("id_nonexistent", Value::int(1, span)),
|
||||
]);
|
||||
assert!(item_from_value(rec).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_item_from_value_record_bad_type() {
|
||||
let span = Span::unknown();
|
||||
let rec = new_record(&[
|
||||
("command_line", Value::string("foo", span)),
|
||||
("id", Value::string("one".to_string(), span)),
|
||||
]);
|
||||
assert!(item_from_value(rec).is_err());
|
||||
}
|
||||
|
||||
fn new_record(rec: &[(&'static str, Value)]) -> Value {
|
||||
let span = Span::unknown();
|
||||
let rec = Record::from_raw_cols_vals(
|
||||
rec.iter().map(|(col, _)| col.to_string()).collect(),
|
||||
rec.iter().map(|(_, val)| val.clone()).collect(),
|
||||
span,
|
||||
span,
|
||||
)
|
||||
.unwrap();
|
||||
Value::record(rec, span)
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
#[case::no_backup(&["history.dat"], "history.dat.bak")]
|
||||
#[case::backup_exists(&["history.dat", "history.dat.bak"], "history.dat.bak.1")]
|
||||
#[case::multiple_backups_exists( &["history.dat", "history.dat.bak", "history.dat.bak.1"], "history.dat.bak.2")]
|
||||
fn test_find_backup_path(#[case] existing: &[&str], #[case] want: &str) {
|
||||
let dir = tempfile::tempdir().unwrap();
|
||||
for name in existing {
|
||||
std::fs::File::create_new(dir.path().join(name)).unwrap();
|
||||
}
|
||||
let got = find_backup_path(&dir.path().join("history.dat"), Span::test_data()).unwrap();
|
||||
assert_eq!(got, dir.path().join(want))
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_backup() {
|
||||
let dir = tempfile::tempdir().unwrap();
|
||||
let mut history = std::fs::File::create_new(dir.path().join("history.dat")).unwrap();
|
||||
use std::io::Write;
|
||||
write!(&mut history, "123").unwrap();
|
||||
let want_bak_path = dir.path().join("history.dat.bak");
|
||||
assert_eq!(
|
||||
backup(&dir.path().join("history.dat"), Span::test_data()),
|
||||
Ok(Some(want_bak_path.clone()))
|
||||
);
|
||||
let got_data = String::from_utf8(std::fs::read(want_bak_path).unwrap()).unwrap();
|
||||
assert_eq!(got_data, "123");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_backup_no_file() {
|
||||
let dir = tempfile::tempdir().unwrap();
|
||||
let bak_path = backup(&dir.path().join("history.dat"), Span::test_data()).unwrap();
|
||||
assert!(bak_path.is_none());
|
||||
}
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
use nu_engine::command_prelude::*;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct HistorySession;
|
||||
|
||||
impl Command for HistorySession {
|
||||
fn name(&self) -> &str {
|
||||
"history session"
|
||||
}
|
||||
|
||||
fn description(&self) -> &str {
|
||||
"Get the command history session."
|
||||
}
|
||||
|
||||
fn signature(&self) -> nu_protocol::Signature {
|
||||
Signature::build("history session")
|
||||
.category(Category::History)
|
||||
.input_output_types(vec![(Type::Nothing, Type::Int)])
|
||||
}
|
||||
|
||||
fn examples(&self) -> Vec<Example> {
|
||||
vec![Example {
|
||||
example: "history session",
|
||||
description: "Get current history session",
|
||||
result: None,
|
||||
}]
|
||||
}
|
||||
|
||||
fn run(
|
||||
&self,
|
||||
engine_state: &EngineState,
|
||||
_stack: &mut Stack,
|
||||
call: &Call,
|
||||
_input: PipelineData,
|
||||
) -> Result<PipelineData, ShellError> {
|
||||
Ok(Value::int(engine_state.history_session_id, call.head).into_pipeline_data())
|
||||
}
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
mod fields;
|
||||
mod history_;
|
||||
mod history_import;
|
||||
mod history_session;
|
||||
|
||||
pub use history_::History;
|
||||
pub use history_import::HistoryImport;
|
||||
pub use history_session::HistorySession;
|
@ -1,41 +0,0 @@
|
||||
use nu_engine::{command_prelude::*, get_full_help};
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Keybindings;
|
||||
|
||||
impl Command for Keybindings {
|
||||
fn name(&self) -> &str {
|
||||
"keybindings"
|
||||
}
|
||||
|
||||
fn signature(&self) -> Signature {
|
||||
Signature::build(self.name())
|
||||
.category(Category::Platform)
|
||||
.input_output_types(vec![(Type::Nothing, Type::String)])
|
||||
}
|
||||
|
||||
fn description(&self) -> &str {
|
||||
"Keybindings related commands."
|
||||
}
|
||||
|
||||
fn extra_description(&self) -> &str {
|
||||
r#"You must use one of the following subcommands. Using this command as-is will only produce this help message.
|
||||
|
||||
For more information on input and keybindings, check:
|
||||
https://www.nushell.sh/book/line_editor.html"#
|
||||
}
|
||||
|
||||
fn search_terms(&self) -> Vec<&str> {
|
||||
vec!["shortcut", "hotkey"]
|
||||
}
|
||||
|
||||
fn run(
|
||||
&self,
|
||||
engine_state: &EngineState,
|
||||
stack: &mut Stack,
|
||||
call: &Call,
|
||||
_input: PipelineData,
|
||||
) -> Result<PipelineData, ShellError> {
|
||||
Ok(Value::string(get_full_help(self, engine_state, stack), call.head).into_pipeline_data())
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user