diff --git a/README.md b/README.md index ea12a72..3cc82fc 100644 --- a/README.md +++ b/README.md @@ -42,21 +42,31 @@ The script prompts for your git username, which is used to: - Displays the public key for copying to your git account ### 3. Repository Discovery -The script automatically checks for common repository patterns: -- `username/dotfiles` -- `username/scripts` -- `username/configs` -- `username/tools` -- `username/projects` -- `username/notes` -- `username/backup` -- `username/workspace` +The script discovers ALL accessible repositories through multiple methods: + +**Primary Method - API Access:** +- Attempts to use GitLab/Gitea API to fetch all repositories you have access to +- Includes both owned and shared repositories +- Automatically detects read/write permissions + +**Fallback Method - Pattern Scanning:** +- Scans your own repositories: `username/dotfiles`, `username/scripts`, etc. +- Checks common shared repositories from users like: `admin`, `shared`, `public`, `team`, `common`, `devops`, `infrastructure` +- Discovers additional project repositories: `website`, `api`, `frontend`, `backend`, `database`, `monitoring`, etc. +- Tests SSH access to determine if you have read access to each repository + +**Repository Types Discovered:** +- **Your repositories**: All repos you own +- **Shared repositories**: Repos you have read/write access to +- **Public repositories**: Publicly accessible repos on the server +- **Team repositories**: Organization/team repos you're a member of ### 4. Repository Selection Users can: -- Select from numbered list of discovered repositories +- Select from numbered list of all discovered repositories (owned and shared) - Press Enter to use `username/dotfiles` (if available) - Type `custom` to enter a custom repository path +- See access type indicators: `(owner)`, `(shared)`, etc. ### 5. Cloning and Setup - Clones the selected repository to the appropriate directory @@ -101,23 +111,26 @@ ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGx... john@example.com ---------------------------------------- Press Enter after you've added the key... -[+] Fetching available git projects for user: john... -[*] Available repositories: -1. john/dotfiles -2. john/scripts -3. john/tools +[+] Fetching all accessible git projects... +[*] Attempting to fetch repositories via API... +[*] Found repositories via API: +1. john/dotfiles (owner) +2. john/scripts (owner) +3. team/shared-configs (shared) +4. admin/common-tools (shared) +5. public/templates (shared) [?] Which project would you like to download? Enter the number of the repository from the list above, or: - Press Enter to use john/dotfiles (if available) - Type 'custom' to enter a custom repository path -Enter your choice: 1 -[*] Selected repository: git@git.del-c.net:john/dotfiles.git -[*] Download directory: /Users/john/.dotfiles +Enter your choice: 3 +[*] Selected repository: git@git.del-c.net:team/shared-configs.git +[*] Download directory: /Users/john/shared-configs [+] Cloning selected repository... -[+] Launching dotfiles setup using Bash... +[*] Repository cloned successfully to: /Users/john/shared-configs ``` ## Troubleshooting diff --git a/setup.sh b/setup.sh index 9406b2e..569c30a 100755 --- a/setup.sh +++ b/setup.sh @@ -46,27 +46,106 @@ show_ssh_key() { ### === LIST AVAILABLE GIT PROJECTS === ### list_git_projects() { - echo "[+] Fetching available git projects for user: $USERNAME..." - - # Get list of repositories using git ls-remote - echo "[*] Available repositories:" + echo "[+] Fetching all accessible git projects..." local repo_count=1 local found_repos=() - # Check for common repository patterns - for repo in "dotfiles" "scripts" "configs" "tools" "projects" "notes" "backup" "workspace"; do - local full_repo="$USERNAME/$repo" - if git ls-remote "git@$GIT_SERVER:$full_repo.git" &>/dev/null; then - echo "$repo_count. $full_repo" - found_repos+=("$full_repo") - ((repo_count++)) + # Try to use git server API if available (GitLab/Gitea style) + if command -v curl &> /dev/null; then + echo "[*] Attempting to fetch repositories via API..." + + # Try GitLab API format + local gitlab_repos=$(curl -s -H "Authorization: Bearer $(ssh-add -L 2>/dev/null || echo '')" \ + "https://$GIT_SERVER/api/v4/projects?membership=true&per_page=100" 2>/dev/null | \ + grep -o '"path_with_namespace":"[^"]*' | cut -d'"' -f4 2>/dev/null || echo "") + + # Try Gitea API format + if [ -z "$gitlab_repos" ]; then + local gitea_repos=$(curl -s "https://$GIT_SERVER/api/v1/user/repos" 2>/dev/null | \ + grep -o '"full_name":"[^"]*' | cut -d'"' -f4 2>/dev/null || echo "") + gitlab_repos="$gitea_repos" fi - done + + if [ -n "$gitlab_repos" ]; then + echo "[*] Found repositories via API:" + while IFS= read -r repo; do + if [ -n "$repo" ]; then + echo "$repo_count. $repo" + found_repos+=("$repo") + ((repo_count++)) + fi + done <<< "$gitlab_repos" + fi + fi + + # Fallback: Check common patterns for multiple users and the current user + if [ ${#found_repos[@]} -eq 0 ]; then + echo "[*] API not available, scanning common repository patterns..." + + # Check user's own repositories first + for repo in "dotfiles" "scripts" "configs" "tools" "projects" "notes" "backup" "workspace"; do + local full_repo="$USERNAME/$repo" + if git ls-remote "git@$GIT_SERVER:$full_repo.git" &>/dev/null; then + echo "$repo_count. $full_repo (owner)" + found_repos+=("$full_repo") + ((repo_count++)) + fi + done + + # Check common shared repositories and other users' public repos + local common_users=("admin" "shared" "public" "team" "common" "devops" "infrastructure") + local common_repos=("dotfiles" "scripts" "configs" "tools" "projects" "notes" "backup" "workspace" "templates" "shared-configs" "common-tools") + + for user in "${common_users[@]}"; do + for repo in "${common_repos[@]}"; do + local full_repo="$user/$repo" + if [ "$user" != "$USERNAME" ] && git ls-remote "git@$GIT_SERVER:$full_repo.git" &>/dev/null; then + echo "$repo_count. $full_repo (shared)" + found_repos+=("$full_repo") + ((repo_count++)) + fi + done + done + + # Try to discover repositories by checking SSH access to common paths + echo "[*] Checking for additional accessible repositories..." + + # This is a more aggressive approach - try common project names + local project_names=("website" "api" "frontend" "backend" "database" "monitoring" "deployment" "ci-cd" "documentation") + for user in "${common_users[@]}" "$USERNAME"; do + for project in "${project_names[@]}"; do + local full_repo="$user/$project" + if git ls-remote "git@$GIT_SERVER:$full_repo.git" &>/dev/null 2>&1; then + # Check if we haven't already added this repo + local already_added=false + for existing_repo in "${found_repos[@]}"; do + if [ "$existing_repo" = "$full_repo" ]; then + already_added=true + break + fi + done + + if [ "$already_added" = false ]; then + local access_type="shared" + if [ "$user" = "$USERNAME" ]; then + access_type="owner" + fi + echo "$repo_count. $full_repo ($access_type)" + found_repos+=("$full_repo") + ((repo_count++)) + fi + fi + done + done + fi if [ ${#found_repos[@]} -eq 0 ]; then - echo "[!] No repositories found for user: $USERNAME" + echo "[!] No accessible repositories found" echo "[*] You can still enter a custom repository path." + else + echo + echo "[*] Found ${#found_repos[@]} accessible repositories" fi echo