Skip to content

Instantly share code, notes, and snippets.

@ilyasotkov
Last active June 2, 2024 12:34
Show Gist options
  • Save ilyasotkov/27e77fd4a1a045bb17f5bcf7f20c1f2e to your computer and use it in GitHub Desktop.
Save ilyasotkov/27e77fd4a1a045bb17f5bcf7f20c1f2e to your computer and use it in GitHub Desktop.

Deprecation

See microsoft/vscode-remote-release#2133 (comment)

Usage

Assuming the script is named make_devcontainer_folder_uri.py, is executable, and is in your $PATH:

# Open . in dev container
code --folder-uri $(make_devcontainer_folder_uri.py)

# Open ./myapp in dev container
code --folder-uri $(make_devcontainer_folder_uri.py ./myapp)

LICENSE

MIT No Attribution

Copyright 2022 (c) Ilya Sotkov

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.

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.
#!/usr/bin/env python3
import os
import re
import sys
def main():
workspace_path = os.path.abspath(sys.argv[1] if len(sys.argv) > 1 else ".")
devcontainer_config_file_path = find_devcontainer_config_file_path(workspace_path)
remote_workspace_folder = get_remote_workspace_folder(devcontainer_config_file_path)
workspace_path_hex = workspace_path.encode().hex()
folder_uri = "vscode-remote://dev-container+" + workspace_path_hex + remote_workspace_folder
print(folder_uri)
def find_devcontainer_config_file_path(workspace_path):
paths = [
os.path.join(workspace_path, ".devcontainer.json"),
os.path.join(workspace_path, ".devcontainer", "devcontainer.json"),
]
for path in paths:
if os.path.isfile(path):
return path
raise OSError("Could not find dev container config file in any of: " + ", ".join(paths))
def get_remote_workspace_folder(config_path):
config = open(config_path).read()
pattern = r'"workspaceFolder"\s*:\s*"(.+)"'
found = re.search(pattern, config)
if not found:
raise KeyError(
"Could not find 'workspaceFolder' setting in your dev container config file!"
)
return found.group(1)
if __name__ == "__main__":
main()
@ngirard
Copy link

ngirard commented Mar 29, 2021

Hey there,
thanks for your script !
I was missing the ability to pass a directory as an argument to the script, so I added it in my own fork: https://gist.github.com/ngirard/50793e66e1a9f0cd4aaf41c2ab3ffab5
Would you mind adding this change to your own gist, so I can remove my fork ?
Thanks in advance,
cheers

@ilyasotkov
Copy link
Author

@ngirard Thanks for the suggestion. Needed to make a few changes to your code to make it work. I've now updated my gist.

@ngirard
Copy link

ngirard commented Mar 29, 2021

Great, thanks !
Deleting my fork.

@cassava
Copy link

cassava commented Aug 1, 2022

Hey @ilyasotkov, thanks for this script; would it be possible for you to add a license header to the file? (Without a license I'm unable to re-use your gist in my own project.)

@ilyasotkov
Copy link
Author

@cassava This script is deprecated because this functionality is now included with the Remote - Containers extension: microsoft/vscode-remote-release#2133 (comment)

Regardless, I've added a license text to the gist. It's MIT-0 so you're free to use this code without worrying about including a copyright notice.

@cassava
Copy link

cassava commented Aug 2, 2022

Hey @ilyasotkov thanks for addition and thanks for the heads-up!

@hhansen-bdai
Copy link

Just want to comment that the devcontainer open command is actually not implemented (and may not be, according to this discussion), so this script is still useful.

@tuunit
Copy link

tuunit commented Oct 28, 2023

Thanks a lot for sharing this script!
It make my workflow way easier by just calling an alias like devcontainer in my directory instead of dealing with the whole Reopen and rebuild UI fiasco in VSCode!

alias devcontainer="/usr/bin/code --folder-uri \$(python3 /workspace/dev-setup/make_devcontainer_folder_uri.py)"

@claudioparram
Copy link

claudioparram commented May 31, 2024

Hi, Thanks to everyone for the input, based on the idea of the alias, I wrote a function in my .bashrc to be able to pass the path to the script:

devcon () { /usr/bin/code --folder-uri $(python3 /path/to/your/script.py "$@"); }

@tuunit
Copy link

tuunit commented Jun 2, 2024

Hi @claudioparram,

I did something similar. On top of that I added a zsh shell completion script as well:

https://github.com/tuunit/dotfiles/blob/9ed10e4778735c395ff0d9ea1d0d18246e9e11d4/.zshrc#L63-L77

All my devcontainer specs live in a separate repository. This way when I enter devcontainer and press TAB my shell shows a list of all directories / devcontainers.

$ devcontainer <TAB>
devcon1 devcon2 devcon3

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment