diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 68df2f6f498b..5d9a735d379f 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -38,6 +38,93 @@ "command": "${config:python.pythonPath}", }, "problemMatcher": [] + }, + { + "label": "Create query change note", + "type": "process", + "command": "python3", + "args": [ + "misc/scripts/create-change-note.py", + "${input:language}", + "src", + "${input:name}", + "${input:categoryQuery}" + ], + "presentation": { + "reveal": "never", + "close": true + }, + "problemMatcher": [] + }, + { + "label": "Create library change note", + "type": "process", + "command": "python3", + "args": [ + "misc/scripts/create-change-note.py", + "${input:language}", + "lib", + "${input:name}", + "${input:categoryLibrary}" + ], + "presentation": { + "reveal": "never", + "close": true + }, + "problemMatcher": [] + } + ], + "inputs": [ + { + "type": "pickString", + "id": "language", + "description": "Language", + "options": + [ + "go", + "java", + "javascript", + "cpp", + "csharp", + "python", + "ruby", + "rust", + "swift", + ] + }, + { + "type": "promptString", + "id": "name", + "description": "Short name (kebab-case)" + }, + { + "type": "pickString", + "id": "categoryQuery", + "description": "Category (query change)", + "options": + [ + "breaking", + "deprecated", + "newQuery", + "queryMetadata", + "majorAnalysis", + "minorAnalysis", + "fix", + ] + }, + { + "type": "pickString", + "id": "categoryLibrary", + "description": "Category (library change)", + "options": + [ + "breaking", + "deprecated", + "feature", + "majorAnalysis", + "minorAnalysis", + "fix", + ] } ] } diff --git a/misc/scripts/create-change-note.py b/misc/scripts/create-change-note.py new file mode 100644 index 000000000000..548fa4e87fb0 --- /dev/null +++ b/misc/scripts/create-change-note.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 + +# Creates a change note and opens it in VSCode for editing. + +# Expects to receive the following arguments: +# - What language the change note is for +# - Whether it's a query or library change (the string `src` or `lib`) +# - The name of the change note (in kebab-case) +# - The category of the change. + +# The change note will be created in the `{language}/ql/{subdir}/change-notes` directory, where `subdir` is either `src` or `lib`. + +# The format of the change note filename is `{current_date}-{change_note_name}.md` with the date in +# the format `YYYY-MM-DD`. + +import sys +import os + +# Read the given arguments +language = sys.argv[1] +subdir = sys.argv[2] +change_note_name = sys.argv[3] +change_category = sys.argv[4] + +# Find the root of the repository. The current script should be located in `misc/scripts`. +root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +# Go to the repo root +os.chdir(root) + +output_dir = f"{language}/ql/{subdir}/change-notes" + +# Abort if the output directory doesn't exist +if not os.path.exists(output_dir): + print(f"Output directory {output_dir} does not exist") + sys.exit(1) + +# Get the current date +import datetime +current_date = datetime.datetime.now().strftime("%Y-%m-%d") + +# Create the change note file +change_note_file = f"{output_dir}/{current_date}-{change_note_name}.md" + +change_note = f""" +--- +category: {change_category} +--- +* """.lstrip() + +with open(change_note_file, "w") as f: + f.write(change_note) + +# Open the change note file in VSCode, reusing the existing window if possible +os.system(f"code -r {change_note_file}")