From 6621736f8e8363a472661e1c4cb707f3ab854d84 Mon Sep 17 00:00:00 2001 From: noam987 <50681033+noam987@users.noreply.github.com> Date: Wed, 5 Jun 2024 21:57:42 -0700 Subject: [PATCH 1/5] =?UTF-8?q?=F0=9F=90=9BApplies=20liblvgl=20without=20e?= =?UTF-8?q?xperimental=20features=20(#360)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pros/conductor/conductor.py | 43 +++++++++++++----------------- pros/conductor/project/__init__.py | 2 +- 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/pros/conductor/conductor.py b/pros/conductor/conductor.py index 6c1f4e2c..53129cf3 100644 --- a/pros/conductor/conductor.py +++ b/pros/conductor/conductor.py @@ -85,8 +85,8 @@ def __init__(self, file=None): self.early_access_local_templates: Set[LocalTemplate] = set() self.depots: Dict[str, Depot] = {} self.default_target: str = 'v5' - self.default_libraries: Dict[str, List[str]] = None - self.early_access_libraries: Dict[str, List[str]] = None + self.pros_3_default_libraries: Dict[str, List[str]] = None + self.pros_4_default_libraries: Dict[str, List[str]] = None self.use_early_access = False self.warn_early_access = False super(Conductor, self).__init__(file) @@ -105,29 +105,29 @@ def __init__(self, file=None): if self.default_target is None: self.default_target = 'v5' needs_saving = True - if self.default_libraries is None: - self.default_libraries = { - 'v5': ['okapilib', 'liblvgl'], + if self.pros_3_default_libraries is None: + self.pros_3_default_libraries = { + 'v5': ['okapilib'], 'cortex': [] } needs_saving = True - if self.early_access_libraries is None or len(self.early_access_libraries['v5']) != 2: - self.early_access_libraries = { - 'v5': ['liblvgl', 'okapilib'], + if self.pros_4_default_libraries is None: + self.pros_4_default_libraries = { + 'v5': ['liblvgl'], 'cortex': [] } needs_saving = True - if 'v5' not in self.default_libraries: - self.default_libraries['v5'] = [] + if 'v5' not in self.pros_3_default_libraries: + self.pros_3_default_libraries['v5'] = ['okapilib'] needs_saving = True - if 'cortex' not in self.default_libraries: - self.default_libraries['cortex'] = [] + if 'cortex' not in self.pros_3_default_libraries: + self.pros_3_default_libraries['cortex'] = [] needs_saving = True - if 'v5' not in self.early_access_libraries: - self.early_access_libraries['v5'] = [] + if 'v5' not in self.pros_4_default_libraries: + self.pros_4_default_libraries['v5'] = ['liblvgl'] needs_saving = True - if 'cortex' not in self.early_access_libraries: - self.early_access_libraries['cortex'] = [] + if 'cortex' not in self.pros_4_default_libraries: + self.pros_4_default_libraries['cortex'] = [] needs_saving = True if needs_saving: self.save() @@ -381,16 +381,9 @@ def new_project(self, path: str, no_default_libs: bool = False, **kwargs) -> Pro proj.save() if not no_default_libs: - libraries = self.early_access_libraries if proj.use_early_access and (kwargs.get("version", ">").startswith("4") or kwargs.get("version", ">").startswith(">")) else self.default_libraries - - version = kwargs['version'][0] + major_version = proj.kernel[0] + libraries = self.pros_4_default_libraries if major_version == '4' else self.pros_3_default_libraries for library in libraries[proj.target]: - if version == '>' or version == '4': - if library == "okapilib": - continue - if version != '>' and version != '4': - if library == "liblvgl": - continue try: # remove kernel version so that latest template satisfying query is correctly selected if 'version' in kwargs: diff --git a/pros/conductor/project/__init__.py b/pros/conductor/project/__init__.py index c71fcd1f..575f9c4d 100644 --- a/pros/conductor/project/__init__.py +++ b/pros/conductor/project/__init__.py @@ -34,7 +34,7 @@ def __init__(self, path: str = '.', create: bool = False, raise_on_error: bool = if defaults is None: defaults = {} - self.target: str = defaults.get('target', 'cortex').lower() # VEX Hardware target (V5/Cortex) + self.target: str = defaults.get('target', 'v5').lower() # VEX Hardware target (V5/Cortex) self.templates: Dict[str, Template] = defaults.get('templates', {}) self.upload_options: Dict = defaults.get('upload_options', {}) self.project_name: str = defaults.get('project_name', None) From a075f9455ef9f738fc806f963ec678238998348a Mon Sep 17 00:00:00 2001 From: THERocky <101498190+Rocky14683@users.noreply.github.com> Date: Thu, 6 Jun 2024 12:58:55 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=F0=9F=90=9B=20Fix=20upload=20--name=20flag?= =?UTF-8?q?=20(#361)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix issue #308 * delete the first --name option --- pros/cli/upload.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pros/cli/upload.py b/pros/cli/upload.py index 5a50f3bd..8c234ed8 100644 --- a/pros/cli/upload.py +++ b/pros/cli/upload.py @@ -25,8 +25,6 @@ def upload_cli(): @click.option('-af', '--after', type=click.Choice(['run','screen','none']), default=None, help='Action to perform on the brain after upload.', cls=PROSOption, group='V5 Options') @click.option('--quirk', type=int, default=0) -@click.option('--name', 'remote_name', type=str, default=None, required=False, help='Remote program name.', - cls=PROSOption, group='V5 Options') @click.option('--slot', default=None, type=click.IntRange(min=1, max=8), help='Program slot on the GUI.', cls=PROSOption, group='V5 Options') @click.option('--icon', type=click.Choice(['pros','pizza','planet','alien','ufo','robot','clawbot','question','X','power']), default='pros', @@ -39,7 +37,7 @@ def upload_cli(): help='Compress the program binary before uploading.') @click.option('--description', default="Made with PROS", type=str, cls=PROSOption, group='V5 Options', help='Change the description displayed for the program.') -@click.option('--name', default=None, type=str, cls=PROSOption, group='V5 Options', +@click.option('--name', 'remote_name', default=None, type=str, cls=PROSOption, group='V5 Options', help='Change the name of the program.') @default_options @@ -114,7 +112,7 @@ def upload(path: Optional[str], project: Optional[c.Project], port: str, **kwarg if not port: raise dont_send(click.UsageError('No port provided or located. Make sure to specify --target if needed.')) if kwargs['target'] == 'v5': - kwargs['remote_name'] = kwargs['name'] if kwargs.get("name",None) else kwargs['remote_name'] + kwargs['remote_name'] = kwargs['name'] if kwargs.get('name',None) else kwargs['remote_name'] if kwargs['remote_name'] is None: kwargs['remote_name'] = os.path.splitext(os.path.basename(path))[0] kwargs['remote_name'] = kwargs['remote_name'].replace('@', '_') From 81c6654a56b789e8e15060281a611c610ab90ab4 Mon Sep 17 00:00:00 2001 From: Mayank Patibandla <34776435+mayankpatibandla@users.noreply.github.com> Date: Thu, 6 Jun 2024 00:59:34 -0400 Subject: [PATCH 3/5] =?UTF-8?q?=E2=9C=A8=20Setup=20Autocomplete=20(#341)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * WIP setup-autocomplete command * WIP writing to file * Autocomplete for bash and zsh * Autocomplete for fish * Add comments * Add error messages if writing completion script fails * Error handling for fish * Improved error handling * Add confirmation prompt * Autocomplete for PowerShell and Windows PowerShell * Config file errors for PowerShell * Cross platform profile path * Run in shell * Formatting * Skip confirmation prompts * Better profile path for PowerShell * Bash on windows * WIP cross platform compatibility * Move scripts to separate files * Fix relative path * Use pathlib * Expand user * Formatting * Enable shell mode * Shorten help message * Save autocomplete script in PROS directory * Disable completion for bash < 4 * Surround script path in " " * Disable nosort on bash 3 * Add more comments --- pros/autocomplete/.pros-complete.bash | 26 ++++ pros/autocomplete/.pros-complete.zsh | 31 ++++ pros/autocomplete/pros-complete.ps1 | 45 ++++++ pros/autocomplete/pros.fish | 14 ++ pros/cli/misc_commands.py | 206 ++++++++++++++++++++------ 5 files changed, 280 insertions(+), 42 deletions(-) create mode 100644 pros/autocomplete/.pros-complete.bash create mode 100644 pros/autocomplete/.pros-complete.zsh create mode 100644 pros/autocomplete/pros-complete.ps1 create mode 100644 pros/autocomplete/pros.fish diff --git a/pros/autocomplete/.pros-complete.bash b/pros/autocomplete/.pros-complete.bash new file mode 100644 index 00000000..4c466464 --- /dev/null +++ b/pros/autocomplete/.pros-complete.bash @@ -0,0 +1,26 @@ +_pros_completion() { + local IFS=$'\n' + local response + response=$(env COMP_WORDS="${COMP_WORDS[*]}" COMP_CWORD=$COMP_CWORD _PROS_COMPLETE=bash_complete $1) + for completion in $response; do + IFS=',' read type value <<<"$completion" + if [[ $type == 'dir' ]]; then + COMPREPLY=() + compopt -o dirnames + elif [[ $type == 'file' ]]; then + COMPREPLY=() + compopt -o default + elif [[ $type == 'plain' ]]; then + COMPREPLY+=($value) + fi + done + return 0 +} +_pros_completion_setup() { + if [[ ${BASH_VERSINFO[0]} -ge 4 ]]; then + complete -o nosort -F _pros_completion pros + else + complete -F _pros_completion pros + fi +} +_pros_completion_setup diff --git a/pros/autocomplete/.pros-complete.zsh b/pros/autocomplete/.pros-complete.zsh new file mode 100644 index 00000000..754a0bef --- /dev/null +++ b/pros/autocomplete/.pros-complete.zsh @@ -0,0 +1,31 @@ +_pros_completion() { + local -a completions + local -a completions_with_descriptions + local -a response + (( ! $+commands[pros] )) && return 1 + response=("${(@f)$(env COMP_WORDS="${words[*]}" COMP_CWORD=$((CURRENT-1)) _PROS_COMPLETE=zsh_complete pros)}") + for type key descr in ${response}; do + if [[ "$type" == "plain" ]]; then + if [[ "$descr" == "_" ]]; then + completions+=("$key") + else + completions_with_descriptions+=("$key":"$descr") + fi + elif [[ "$type" == "dir" ]]; then + _path_files -/ + elif [[ "$type" == "file" ]]; then + _path_files -f + fi + done + if [ -n "$completions_with_descriptions" ]; then + _describe -V unsorted completions_with_descriptions -U + fi + if [ -n "$completions" ]; then + compadd -U -V unsorted -a completions + fi +} +if [[ $zsh_eval_context[-1] == loadautofunc ]]; then + _pros_completion "$@" +else + compdef _pros_completion pros +fi \ No newline at end of file diff --git a/pros/autocomplete/pros-complete.ps1 b/pros/autocomplete/pros-complete.ps1 new file mode 100644 index 00000000..319aba26 --- /dev/null +++ b/pros/autocomplete/pros-complete.ps1 @@ -0,0 +1,45 @@ +# Modified from https://github.com/StephLin/click-pwsh/blob/main/click_pwsh/shell_completion.py#L11 +Register-ArgumentCompleter -Native -CommandName pros -ScriptBlock { + param($wordToComplete, $commandAst, $cursorPosition) + $env:COMP_WORDS = $commandAst + $env:COMP_WORDS = $env:COMP_WORDS.replace('\\', '/') + $incompleteCommand = $commandAst.ToString() + $myCursorPosition = $cursorPosition + if ($myCursorPosition -gt $incompleteCommand.Length) { + $myCursorPosition = $incompleteCommand.Length + } + $env:COMP_CWORD = @($incompleteCommand.substring(0, $myCursorPosition).Split(" ") | Where-Object { $_ -ne "" }).Length + if ( $wordToComplete.Length -gt 0) { $env:COMP_CWORD -= 1 } + $env:_PROS_COMPLETE = "powershell_complete" + pros | ForEach-Object { + $type, $value, $help = $_.Split(",", 3) + if ( ($type -eq "plain") -and ![string]::IsNullOrEmpty($value) ) { + [System.Management.Automation.CompletionResult]::new($value, $value, "ParameterValue", $value) + } + elseif ( ($type -eq "file") -or ($type -eq "dir") ) { + if ([string]::IsNullOrEmpty($wordToComplete)) { + $dir = "./" + } + else { + $dir = $wordToComplete.replace('\\', '/') + } + if ( (Test-Path -Path $dir) -and ((Get-Item $dir) -is [System.IO.DirectoryInfo]) ) { + [System.Management.Automation.CompletionResult]::new($dir, $dir, "ParameterValue", $dir) + } + Get-ChildItem -Path $dir | Resolve-Path -Relative | ForEach-Object { + $path = $_.ToString().replace('\\', '/').replace('Microsoft.PowerShell.Core/FileSystem::', '') + $isDir = $false + if ((Get-Item $path) -is [System.IO.DirectoryInfo]) { + $path = $path + "/" + $isDir = $true + } + if ( ($type -eq "file") -or ( ($type -eq "dir") -and $isDir ) ) { + [System.Management.Automation.CompletionResult]::new($path, $path, "ParameterValue", $path) + } + } + } + } + $env:COMP_WORDS = $null | Out-Null + $env:COMP_CWORD = $null | Out-Null + $env:_PROS_COMPLETE = $null | Out-Null +} diff --git a/pros/autocomplete/pros.fish b/pros/autocomplete/pros.fish new file mode 100644 index 00000000..73fc051c --- /dev/null +++ b/pros/autocomplete/pros.fish @@ -0,0 +1,14 @@ +function _pros_completion; + set -l response (env _PROS_COMPLETE=fish_complete COMP_WORDS=(commandline -cp) COMP_CWORD=(commandline -t) pros); + for completion in $response; + set -l metadata (string split "," $completion); + if test $metadata[1] = "dir"; + __fish_complete_directories $metadata[2]; + else if test $metadata[1] = "file"; + __fish_complete_path $metadata[2]; + else if test $metadata[1] = "plain"; + echo $metadata[2]; + end; + end; +end; +complete --no-files --command pros --arguments "(_pros_completion)"; \ No newline at end of file diff --git a/pros/cli/misc_commands.py b/pros/cli/misc_commands.py index 8566456a..93fe0dd7 100644 --- a/pros/cli/misc_commands.py +++ b/pros/cli/misc_commands.py @@ -1,42 +1,164 @@ -import pros.common.ui as ui -from pros.cli.common import * -from pros.ga.analytics import analytics - -@pros_root -def misc_commands_cli(): - pass - - -@misc_commands_cli.command() -@click.option('--force-check', default=False, is_flag=True, - help='Force check for updates, disregarding auto-check frequency') -@click.option('--no-install', default=False, is_flag=True, - help='Only check if a new version is available, do not attempt to install') -@default_options -def upgrade(force_check, no_install): - """ - Check for updates to the PROS CLI - """ - with ui.Notification(): - ui.echo('The "pros upgrade" command is currently non-functioning. Did you mean to run "pros c upgrade"?', color='yellow') - - return # Dead code below - - analytics.send("upgrade") - from pros.upgrade import UpgradeManager - manager = UpgradeManager() - manifest = manager.get_manifest(force_check) - ui.logger(__name__).debug(repr(manifest)) - if manager.has_stale_manifest: - ui.logger(__name__).error('Failed to get latest upgrade information. ' - 'Try running with --debug for more information') - return -1 - if not manager.needs_upgrade: - ui.finalize('upgradeInfo', 'PROS CLI is up to date') - else: - ui.finalize('upgradeInfo', manifest) - if not no_install: - if not manager.can_perform_upgrade: - ui.logger(__name__).error(f'This manifest cannot perform the upgrade.') - return -3 - ui.finalize('upgradeComplete', manager.perform_upgrade()) +import os +from pathlib import Path +import subprocess + +from click.shell_completion import CompletionItem, add_completion_class, ZshComplete + +import pros.common.ui as ui +from pros.cli.common import * +from pros.ga.analytics import analytics + +@pros_root +def misc_commands_cli(): + pass + + +@misc_commands_cli.command() +@click.option('--force-check', default=False, is_flag=True, + help='Force check for updates, disregarding auto-check frequency') +@click.option('--no-install', default=False, is_flag=True, + help='Only check if a new version is available, do not attempt to install') +@default_options +def upgrade(force_check, no_install): + """ + Check for updates to the PROS CLI + """ + with ui.Notification(): + ui.echo('The "pros upgrade" command is currently non-functioning. Did you mean to run "pros c upgrade"?', color='yellow') + + return # Dead code below + + analytics.send("upgrade") + from pros.upgrade import UpgradeManager + manager = UpgradeManager() + manifest = manager.get_manifest(force_check) + ui.logger(__name__).debug(repr(manifest)) + if manager.has_stale_manifest: + ui.logger(__name__).error('Failed to get latest upgrade information. ' + 'Try running with --debug for more information') + return -1 + if not manager.needs_upgrade: + ui.finalize('upgradeInfo', 'PROS CLI is up to date') + else: + ui.finalize('upgradeInfo', manifest) + if not no_install: + if not manager.can_perform_upgrade: + ui.logger(__name__).error(f'This manifest cannot perform the upgrade.') + return -3 + ui.finalize('upgradeComplete', manager.perform_upgrade()) + + +# Script files for each shell +_SCRIPT_FILES = { + 'bash': '.pros-complete.bash', + 'zsh': '.pros-complete.zsh', + 'fish': 'pros.fish', + 'pwsh': 'pros-complete.ps1', + 'powershell': 'pros-complete.ps1', +} + + +def _get_shell_script(shell: str) -> str: + """Get the shell script for the specified shell.""" + script_file = Path(__file__).parent.parent / 'autocomplete' / _SCRIPT_FILES[shell] + with script_file.open('r') as f: + return f.read() + + +@add_completion_class +class PowerShellComplete(ZshComplete): # Identical to ZshComplete except comma delimited instead of newline + """Shell completion for PowerShell and Windows PowerShell.""" + + name = "powershell" + source_template = _get_shell_script("powershell") + + def format_completion(self, item: CompletionItem) -> str: + return super().format_completion(item).replace("\n", ",") + + +@misc_commands_cli.command() +@click.argument('shell', type=click.Choice(['bash', 'zsh', 'fish', 'pwsh', 'powershell']), required=True) +@click.argument('config_path', type=click.Path(resolve_path=True), default=None, required=False) +@click.option('--force', '-f', is_flag=True, default=False, help='Skip confirmation prompts') +@default_options +def setup_autocomplete(shell, config_path, force): + """ + Set up autocomplete for PROS CLI + + SHELL: The shell to set up autocomplete for + + CONFIG_PATH: The configuration path to add the autocomplete script to. If not specified, the default configuration + file for the shell will be used. + + Example: pros setup-autocomplete bash ~/.bashrc + """ + + # https://click.palletsprojects.com/en/8.1.x/shell-completion/ + + default_config_paths = { # Default config paths for each shell + 'bash': '~/.bashrc', + 'zsh': '~/.zshrc', + 'fish': '~/.config/fish/completions/', + 'pwsh': None, + 'powershell': None, + } + + # Get the powershell profile path if not specified + if shell in ('pwsh', 'powershell') and config_path is None: + try: + profile_command = f'{shell} -NoLogo -NoProfile -Command "Write-Output $PROFILE"' if os.name == 'nt' else f"{shell} -NoLogo -NoProfile -Command 'Write-Output $PROFILE'" + default_config_paths[shell] = subprocess.run(profile_command, shell=True, capture_output=True, check=True, text=True).stdout.strip() + except subprocess.CalledProcessError as exc: + raise click.UsageError("Failed to determine the PowerShell profile path. Please specify a valid config file.") from exc + + # Use default config path if not specified + if config_path is None: + config_path = default_config_paths[shell] + ui.echo(f"Using default config path {config_path}. To specify a different config path, run 'pros setup-autocomplete {shell} [CONFIG_PATH]'.\n") + config_path = Path(config_path).expanduser().resolve() + + if shell in ('bash', 'zsh', 'pwsh', 'powershell'): + if config_path.is_dir(): + raise click.UsageError(f"Config file {config_path} is a directory. Please specify a valid config file.") + if not config_path.exists(): + raise click.UsageError(f"Config file {config_path} does not exist. Please specify a valid config file.") + + # Write the autocomplete script to a shell script file + script_file = Path(click.get_app_dir("PROS")) / "autocomplete" / _SCRIPT_FILES[shell] + script_file.parent.mkdir(exist_ok=True) + with script_file.open('w') as f: + f.write(_get_shell_script(shell)) + + # Source the autocomplete script in the config file + if shell in ('bash', 'zsh'): + source_autocomplete = f'. "{script_file.as_posix()}"\n' + elif shell in ('pwsh', 'powershell'): + source_autocomplete = f'"{script_file}" | Invoke-Expression\n' + if force or ui.confirm(f"Add the autocomplete script to {config_path}?", default=True): + with config_path.open('r+') as f: + # Only append if the source command is not already in the file + if source_autocomplete not in f.readlines(): + f.write("\n# PROS CLI autocomplete\n") + f.write(source_autocomplete) + else: + ui.echo(f"Autocomplete script written to {script_file}.") + ui.echo(f"Add the following line to {config_path} then restart your shell to enable autocomplete:\n") + ui.echo(source_autocomplete) + return + elif shell == 'fish': + # Check if the config path is a directory or file and set the script directory and file accordingly + if config_path.is_file(): + script_dir = config_path.parent + script_file = config_path + else: + script_dir = config_path + script_file = config_path / _SCRIPT_FILES[shell] + + if not script_dir.exists(): + raise click.UsageError(f"Completions directory {script_dir} does not exist. Please specify a valid completions file or directory.") + + # Write the autocomplete script to a shell script file + with script_file.open('w') as f: + f.write(_get_shell_script(shell)) + + ui.echo(f"Succesfully set up autocomplete for {shell} in {config_path}. Restart your shell to apply changes.") From c321f20a2bcbbcc442cc8ed0faed8353de6d5044 Mon Sep 17 00:00:00 2001 From: Mayank Patibandla <34776435+mayankpatibandla@users.noreply.github.com> Date: Thu, 6 Jun 2024 01:56:50 -0400 Subject: [PATCH 4/5] =?UTF-8?q?=F0=9F=92=9A=20Add=20autocomplete=20scripts?= =?UTF-8?q?=20to=20PyInstaller=20(#363)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pros.spec | 2 +- pros/autocomplete/{.pros-complete.bash => pros-complete.bash} | 0 pros/autocomplete/{.pros-complete.zsh => pros-complete.zsh} | 0 pros/cli/misc_commands.py | 4 ++-- 4 files changed, 3 insertions(+), 3 deletions(-) rename pros/autocomplete/{.pros-complete.bash => pros-complete.bash} (100%) rename pros/autocomplete/{.pros-complete.zsh => pros-complete.zsh} (100%) diff --git a/pros.spec b/pros.spec index b8279220..9910e946 100644 --- a/pros.spec +++ b/pros.spec @@ -15,7 +15,7 @@ a = Analysis( ['pros/cli/main.py'], pathex=[], binaries=[], - datas=[], + datas=[('pros/autocomplete/*', 'pros/autocomplete')], hiddenimports=[], hookspath=[], hooksconfig={}, diff --git a/pros/autocomplete/.pros-complete.bash b/pros/autocomplete/pros-complete.bash similarity index 100% rename from pros/autocomplete/.pros-complete.bash rename to pros/autocomplete/pros-complete.bash diff --git a/pros/autocomplete/.pros-complete.zsh b/pros/autocomplete/pros-complete.zsh similarity index 100% rename from pros/autocomplete/.pros-complete.zsh rename to pros/autocomplete/pros-complete.zsh diff --git a/pros/cli/misc_commands.py b/pros/cli/misc_commands.py index 93fe0dd7..d00fbfd3 100644 --- a/pros/cli/misc_commands.py +++ b/pros/cli/misc_commands.py @@ -50,8 +50,8 @@ def upgrade(force_check, no_install): # Script files for each shell _SCRIPT_FILES = { - 'bash': '.pros-complete.bash', - 'zsh': '.pros-complete.zsh', + 'bash': 'pros-complete.bash', + 'zsh': 'pros-complete.zsh', 'fish': 'pros.fish', 'pwsh': 'pros-complete.ps1', 'powershell': 'pros-complete.ps1', From a7b99c6f7ceed1a195c0c74242f6f6f12efd552f Mon Sep 17 00:00:00 2001 From: Mayank Patibandla <34776435+mayankpatibandla@users.noreply.github.com> Date: Thu, 6 Jun 2024 01:58:17 -0400 Subject: [PATCH 5/5] Update versions --- pip_version | 2 +- version | 2 +- win_version | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pip_version b/pip_version index 678fd88a..e5b8a844 100644 --- a/pip_version +++ b/pip_version @@ -1 +1 @@ -3.5.3 \ No newline at end of file +3.5.4 \ No newline at end of file diff --git a/version b/version index 678fd88a..e5b8a844 100644 --- a/version +++ b/version @@ -1 +1 @@ -3.5.3 \ No newline at end of file +3.5.4 \ No newline at end of file diff --git a/win_version b/win_version index 1067a669..2770e01e 100644 --- a/win_version +++ b/win_version @@ -1 +1 @@ -3.5.3.0 \ No newline at end of file +3.5.4.0 \ No newline at end of file