-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinit.sh
More file actions
executable file
·138 lines (116 loc) · 4.88 KB
/
Copy pathinit.sh
File metadata and controls
executable file
·138 lines (116 loc) · 4.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#!/usr/bin/env bash
set -e
# Init Project Helper
# Usage: ./init.sh new_project_name
if [ -z "$1" ]; then
echo "❌ Error: Project name not provided."
echo "Usage: ./init.sh <new_project_name>"
exit 1
fi
INPUT_NAME="$1"
# 1. Setup Cross-Platform sed_inplace function
if [[ "$OSTYPE" == "darwin"* ]]; then
sed_inplace() { sed -i "" "$@"; }
else
sed_inplace() { sed -i "$@"; }
fi
# 2. Sanitise names
# Distribution name (dashes allowed, e.g. my-awesome-app)
NEW_NAME_DASH=$(echo "$INPUT_NAME" | tr '_' '-')
# Python package name (only underscores, e.g. my_awesome_app)
NEW_NAME_SNAKE=$(echo "$INPUT_NAME" | tr '-' '_')
# Validate Python package name
if [[ ! "$NEW_NAME_SNAKE" =~ ^[a-zA-Z_][a-zA-Z0-9_]*$ ]]; then
echo "❌ Error: The project name '$INPUT_NAME' generates an invalid Python package name '$NEW_NAME_SNAKE'."
echo "Python package names must start with a letter or underscore, and contain only alphanumeric characters and underscores."
exit 1
fi
# 3. Dynamically detect old names
# Get the snake_case folder name inside src/
OLD_NAME_SNAKE=$(find src -mindepth 1 -maxdepth 1 -type d -not -name "__pycache__" -exec basename {} \; | head -n1)
if [ -z "$OLD_NAME_SNAKE" ]; then
echo "❌ Error: Could not find current python package directory in src/"
exit 1
fi
# Get old distribution name from pyproject.toml
OLD_NAME_DASH=$(grep 'name =' pyproject.toml | head -n1 | cut -d'"' -f2)
if [ -z "$OLD_NAME_DASH" ]; then
OLD_NAME_DASH="my-backend-project"
fi
echo "🚀 Renaming project from: "
echo " - Distribution name: $OLD_NAME_DASH -> $NEW_NAME_DASH"
echo " - Python package: $OLD_NAME_SNAKE -> $NEW_NAME_SNAKE"
# 4. Rename Source Directory
if [ -d "src/$OLD_NAME_SNAKE" ] && [ "$OLD_NAME_SNAKE" != "$NEW_NAME_SNAKE" ]; then
mv "src/$OLD_NAME_SNAKE" "src/$NEW_NAME_SNAKE"
echo "✅ Renamed src directory to src/$NEW_NAME_SNAKE"
fi
# 5. Update pyproject.toml
sed_inplace "s/name = \"$OLD_NAME_DASH\"/name = \"$NEW_NAME_DASH\"/" pyproject.toml
sed_inplace "s/packages = \[\"src\/$OLD_NAME_SNAKE\"\]/packages = \[\"src\/$NEW_NAME_SNAKE\"\]/" pyproject.toml
sed_inplace "s/\"$OLD_NAME_SNAKE.main:main\"/\"$NEW_NAME_SNAKE.main:main\"/" pyproject.toml
echo "✅ Updated pyproject.toml"
# 6. Update all python files (source, tests, and alembic configs) to use the new package name imports
if [[ "$OSTYPE" == "darwin"* ]]; then
find "src/$NEW_NAME_SNAKE" -type f -name "*.py" -exec sed -i "" "s/$OLD_NAME_SNAKE/$NEW_NAME_SNAKE/g" {} +
find "tests" -type f -name "*.py" -exec sed -i "" "s/$OLD_NAME_SNAKE/$NEW_NAME_SNAKE/g" {} +
if [ -d "alembic" ]; then
find "alembic" -type f -name "*.py" -exec sed -i "" "s/$OLD_NAME_SNAKE/$NEW_NAME_SNAKE/g" {} +
fi
else
find "src/$NEW_NAME_SNAKE" -type f -name "*.py" -exec sed -i "s/$OLD_NAME_SNAKE/$NEW_NAME_SNAKE/g" {} +
find "tests" -type f -name "*.py" -exec sed -i "s/$OLD_NAME_SNAKE/$NEW_NAME_SNAKE/g" {} +
if [ -d "alembic" ]; then
find "alembic" -type f -name "*.py" -exec sed -i "s/$OLD_NAME_SNAKE/$NEW_NAME_SNAKE/g" {} +
fi
fi
echo "✅ Updated Python source, test, and alembic files imports"
# 7. Update Docker Compose and environment config files
if [ -f "docker-compose.yml" ]; then
sed_inplace "s/${OLD_NAME_SNAKE}_db/${NEW_NAME_SNAKE}_db/g" docker-compose.yml
sed_inplace "s/${OLD_NAME_SNAKE}_web/${NEW_NAME_SNAKE}_web/g" docker-compose.yml
echo "✅ Updated docker-compose.yml"
fi
if [ -f ".env.example" ]; then
sed_inplace "s/$OLD_NAME_SNAKE/$NEW_NAME_SNAKE/g" .env.example
echo "✅ Updated .env.example"
fi
if [ -f ".env" ]; then
sed_inplace "s/$OLD_NAME_SNAKE/$NEW_NAME_SNAKE/g" .env
echo "✅ Updated .env"
fi
# 8. Clean up old locks and venv to ensure fresh start
rm -rf .venv uv.lock
echo "🗑️ Cleaned up old environment"
# 9. Re-generate lock and install
echo "📦 Generating new uv.lock..."
nix develop --command uv lock
echo "📦 Installing dependencies..."
nix develop --command uv sync --all-extras
# 10. Reset Git (with Interactivity Check & Confirmation)
SHOULD_RESET_GIT=true
if [ -d ".git" ]; then
if [ -t 0 ]; then
echo "⚠️ Warning: A Git repository is already initialized."
read -p "Do you want to reset Git history for this new project? (y/N): " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
SHOULD_RESET_GIT=false
fi
else
# Non-interactive: keep git history to prevent hanging
SHOULD_RESET_GIT=false
fi
fi
if [ "$SHOULD_RESET_GIT" = true ]; then
rm -rf .git
git init
git add .
git commit -m "Initial commit for $NEW_NAME_DASH"
echo "✅ Reset Git repository and created initial commit"
else
echo "⏭️ Skipped Git reset. Keeping current history."
fi
echo "🎉 Project $NEW_NAME_DASH is ready!"
echo "👉 Run 'nix develop' or 'direnv allow' to enter."
echo "👉 Run 'just dev' to launch the app."
echo "👉 Run 'just --list' to see all available commands."