Enhance repository discovery in README and setup script. Implement API access for fetching all accessible repositories, including owned, shared, and public repos. Add fallback method for pattern scanning and improve user feedback during repository selection.

This commit is contained in:
2025-07-14 11:03:27 +01:00
parent b37592e99d
commit a7d4e6ec0e
2 changed files with 124 additions and 32 deletions

View File

@@ -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

105
setup.sh
View File

@@ -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