From 916b16e77c04a6a2319897e4701902532ada1b18 Mon Sep 17 00:00:00 2001 From: ionfwsrijan Date: Tue, 11 Aug 2026 08:52:29 +0530 Subject: [PATCH] fix: default github export to private and stop blind-pushing on 422 (issue #1872) --- src/routes/main_routes.py | 19 +++++++--- src/templates/project.html | 8 ++++- tests/test_basic.py | 74 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 92 insertions(+), 9 deletions(-) diff --git a/src/routes/main_routes.py b/src/routes/main_routes.py index 3b669195..9837a70a 100644 --- a/src/routes/main_routes.py +++ b/src/routes/main_routes.py @@ -436,18 +436,29 @@ def export_github(project_id): username = user_resp.json().get('login') # 2. Create the repository + # Visibility defaults to private unless the user explicitly opts in to public. + visibility = (request.form.get("visibility") or "").strip().lower() + if visibility not in ("public", "private"): + visibility = "private" + repo_payload = { "name": repo_name, "description": f"Starter code for DevPath project: {project['title']}", - "private": False, + "private": visibility != "public", "auto_init": False } create_resp = requests.post("https://api.github.com/user/repos", json=repo_payload, headers=headers) if create_resp.status_code == 422: - # 422 usually means the repository already exists - pass + # 422 means the repository already exists. Refuse to blind-push into an + # existing repository the user did not explicitly target. + flash( + f"Repository {repo_name} already exists on your GitHub account. " + "Rename or remove it, then try exporting again.", + "error", + ) + return redirect(url_for('main.project_detail', project_id=project_id)) elif create_resp.status_code == 403: flash("GitHub API rate limit exceeded or lack of permissions. Please try again later.", "error") return redirect(url_for('main.project_detail', project_id=project_id)) @@ -458,8 +469,6 @@ def export_github(project_id): elif create_resp.status_code != 201: flash(f"Failed to create repository. GitHub API responded with {create_resp.status_code}.", "error") return redirect(url_for('main.project_detail', project_id=project_id)) - - # If 422, the repo might already exist, which is fine, we can try to push the file anyway. # 3. Create the file in the repository file_payload = { diff --git a/src/templates/project.html b/src/templates/project.html index 6bc8854b..e8f1196f 100644 --- a/src/templates/project.html +++ b/src/templates/project.html @@ -111,8 +111,14 @@

{{ project.title }}

Download Starter Code -
+ + +