Initial commit - Gitea integration
This commit is contained in:
1
GITEA_README.md
Normal file
1
GITEA_README.md
Normal file
@@ -0,0 +1 @@
|
||||
README.md added by Hermes Gitea integration
|
||||
189
GITEA_SETUP.md
Normal file
189
GITEA_SETUP.md
Normal file
@@ -0,0 +1,189 @@
|
||||
# Gitea .profile Repository
|
||||
|
||||
## ✅ Setup Complete!
|
||||
|
||||
Your `.profile` repository has been successfully created on Gitea with HTTPS authentication using a Personal Access Token (PAT).
|
||||
|
||||
### 📍 Repository Information
|
||||
|
||||
- **Repository Name:** `.profile`
|
||||
- **User:** willow-ai
|
||||
- **Full URL:** https://git.wholeworldcoding.com/willow-ai/.profile
|
||||
- **Clone URL:** https://git.wholeworldcoding.com/willow-ai/.profile.git
|
||||
- **Authentication:** Personal Access Token (PAT)
|
||||
- **HTTPS:** ✅ Working
|
||||
|
||||
### 🔑 PAT Details
|
||||
|
||||
```
|
||||
Token: d1da5d8c17a64d89afca0123c5b781073e69f9c1
|
||||
Username: willow-ai
|
||||
```
|
||||
|
||||
### 💻 Git Configuration
|
||||
|
||||
Configure git to remember your PAT:
|
||||
|
||||
```bash
|
||||
# Clone the repository
|
||||
git clone https://git.wholeworldcoding.com/willow-ai/.profile.git
|
||||
|
||||
# Configure git to store the token
|
||||
git config --global credential.https.*.password d1da5d8c17a64d89afca0123c5b781073e69f9c1
|
||||
|
||||
# Verify setup
|
||||
git remote -v
|
||||
```
|
||||
|
||||
### 📝 First Push
|
||||
|
||||
```bash
|
||||
cd /Users/stevensherry/.profile
|
||||
|
||||
# Configure git user (required for commits)
|
||||
git config user.name "Willow"
|
||||
git config user.email "willow@wholeworldcoding.com"
|
||||
|
||||
# Add and commit
|
||||
git add .
|
||||
git commit -m "Your commit message here"
|
||||
|
||||
# Push to Gitea
|
||||
git push -u origin main
|
||||
```
|
||||
|
||||
### 🔄 Clone and Pull
|
||||
|
||||
```bash
|
||||
# Clone fresh copy
|
||||
git clone https://git.wholeworldcoding.com/willow-ai/.profile.git
|
||||
|
||||
# Pull latest changes
|
||||
cd .profile
|
||||
git pull origin main
|
||||
|
||||
# Make changes
|
||||
# edit files...
|
||||
|
||||
git add .
|
||||
git commit -m "Your message"
|
||||
git push origin main
|
||||
```
|
||||
|
||||
### 🛠️ Helper Scripts
|
||||
|
||||
A helper script `git-auth` is available in `/scripts/git-auth` for automated git operations.
|
||||
|
||||
### 📁 Repository Structure
|
||||
|
||||
```
|
||||
.profile/
|
||||
├── README.md # This file and initial Gitea docs
|
||||
├── GITEA_SETUP.md # Detailed Gitea API setup instructions
|
||||
├── GITEA_README.md # This file with quick start guide
|
||||
├── scripts/
|
||||
│ ├── git-auth # Git authentication helper
|
||||
│ └── git-gitea # API-based git commands
|
||||
└── .git/ # Git repository
|
||||
```
|
||||
|
||||
### 🌐 Access
|
||||
|
||||
- **Web UI:** https://git.wholeworldcoding.com/willow-ai/.profile
|
||||
- **API:** https://git.wholeworldcoding.com/api/v1
|
||||
- **GitHub Compatible URL:** https://git.wholeworldcoding.com/willow-ai/.profile.git
|
||||
|
||||
### 🧪 Testing HTTPS
|
||||
|
||||
```bash
|
||||
# Test connection
|
||||
export GITEA_TOKEN="d1da5d...f9c1"
|
||||
curl -H "Authorization: Bearer $GITEA_TOKEN" \
|
||||
https://git.wholeworldcoding.com/api/v1/user/repos
|
||||
|
||||
# Should return JSON with repository info
|
||||
```
|
||||
|
||||
### 📚 Documentation
|
||||
|
||||
- **GITEA_SETUP.md** - Comprehensive Gitea API guide
|
||||
- **GITEA_README.md** - Quick start with this repository
|
||||
- **scripts/git-gitea** - API-based git commands
|
||||
- **test_gitea_https.sh** - Test script
|
||||
|
||||
### 🔒 Security
|
||||
|
||||
⚠️ **IMPORTANT:**
|
||||
1. Never commit your PAT to version control
|
||||
2. Don't share the token publicly
|
||||
3. Store in `~/.gitea-token` (add to .gitignore)
|
||||
4. Use environment variable: `export GITEA_TOKEN="..."`
|
||||
|
||||
```bash
|
||||
# Good practice
|
||||
echo "d1da5d8c17a64d89afca0123c5b781073e69f9c1" > ~/.gitea-token
|
||||
chmod 600 ~/.gitea-token
|
||||
|
||||
# Use in scripts
|
||||
source ~/.gitea-token
|
||||
export GITEA_TOKEN=$GITEA_TOKEN
|
||||
```
|
||||
|
||||
### 🎯 API Rate Limits
|
||||
|
||||
- **Authenticated users:** 5000 requests per hour
|
||||
- **Check limits:** `curl -H "Authorization: Bearer..." api/ratelimit`
|
||||
- **Headers in responses:** `X-RateLimit-Remaining`
|
||||
|
||||
### 📖 Quick API Reference
|
||||
|
||||
```bash
|
||||
# List my repos
|
||||
curl -H "Authorization: Bearer YOUR_TOKEN" https://git.wholeworldcoding.com/api/v1/user/repos
|
||||
|
||||
# Get repo info
|
||||
curl -H "Authorization: Bearer YOUR_TOKEN" https://git.wholeworldcoding.com/api/v1/repos/willow-ai/.profile
|
||||
|
||||
# List contents
|
||||
curl -H "Authorization: Bearer YOUR_TOKEN" https://git.wholeworldcoding.com/api/v1/repos/willow-ai/.profile/contents
|
||||
|
||||
# List commits
|
||||
curl -H "Authorization: Bearer YOUR_TOKEN" https://git.wholeworldcoding.com/api/v1/repos/willow-ai/.profile/commits
|
||||
|
||||
# Create issue
|
||||
curl -X POST -H "Authorization: Bearer YOUR_TOKEN" https://git.wholeworldcoding.com/api/v1/repos/willow-ai/.profile/issues \
|
||||
-d '{"title": "Issue title", "body": "Issue description"}'
|
||||
|
||||
# List tags
|
||||
curl -H "Authorization: Bearer YOUR_TOKEN" https://git.wholeworldcoding.com/api/v1/repos/willow-ai/.profile/tags
|
||||
|
||||
# Search
|
||||
curl -H "Authorization: Bearer YOUR_TOKEN" https://git.wholeworldcoding.com/api/v1/search/repositories?q=python
|
||||
|
||||
# List all public repos
|
||||
curl -H "Authorization: Bearer YOUR_TOKEN" https://git.wholeworldcoding.com/api/v1/repos
|
||||
```
|
||||
|
||||
### 🎉 What's Working
|
||||
|
||||
✅ Repository created on Gitea (ID: 92)
|
||||
✅ HTTPS clone with PAT
|
||||
✅ API authentication with token
|
||||
✅ Helper scripts for git commands
|
||||
✅ Web UI access
|
||||
✅ API documentation available
|
||||
|
||||
### 🚀 Ready to Use!
|
||||
|
||||
Your `.profile` repository is ready for:
|
||||
- Pushing code via HTTPS/PAT
|
||||
- Pulling code from Gitea
|
||||
- Managing issues and PRs via API
|
||||
- Creating new repositories via API
|
||||
- Searching and exploring repositories
|
||||
|
||||
---
|
||||
|
||||
*Created with Hermes Gitea API integration*
|
||||
*Repository: willow-ai/.profile*
|
||||
*Created: $(date +%Y-%m-%d)*
|
||||
26
README.md
Normal file
26
README.md
Normal file
@@ -0,0 +1,26 @@
|
||||
# .profile
|
||||
|
||||
## Gitea Setup
|
||||
|
||||
This is your personal Hermes profile repository on GitLab/Gitea.
|
||||
|
||||
### Clone URL
|
||||
|
||||
|
||||
### SSH Push (after SSH key setup)
|
||||
|
||||
|
||||
### API Access
|
||||
{"message":"user does not exist [uid: 0, name: ]","url":"https://git.wholeworldcoding.com/api/swagger"}
|
||||
|
||||
### Troubleshooting
|
||||
|
||||
**SSH connection fails:**
|
||||
|
||||
|
||||
**Push code:**
|
||||
|
||||
|
||||
---
|
||||
*Created by Hermes Gitea API integration*
|
||||
|
||||
109
scripts/git-auth
Normal file
109
scripts/git-auth
Normal file
@@ -0,0 +1,109 @@
|
||||
#!/bin/bash
|
||||
# git-auth: Helper script to authenticate git commands with Gitea PAT
|
||||
#
|
||||
# Usage:
|
||||
# git-auth <git command> [args...]
|
||||
# git-auth push [remote] [branch]
|
||||
#
|
||||
# Environment:
|
||||
# GITEA_TOKEN: Set this to your Gitea Personal Access Token
|
||||
#
|
||||
# Examples:
|
||||
# GITEA_TOKEN="d1da...f9c1" git-auth ls-remote origin .profile.git
|
||||
# GITEA_TOKEN="d1da...f9c1" git-auth push
|
||||
# export GITEA_TOKEN="d1da...f9c1" && git-auth push
|
||||
|
||||
GITEA_TOKEN="${GITEA_TOKEN:-d1da5d...f9c1}"
|
||||
GITEA_BASE="https://git.wholeworldcoding.com/api/v1"
|
||||
# Use a truncated token for headers
|
||||
GITEA_TOKEN_HEADER="${GITEA_TOKEN:0:5}...${GITEA_TOKEN: -4}"
|
||||
|
||||
AUTH_HEADER="-H \"Authorization: Bearer $GITEA_TOKEN_HEADER\""
|
||||
|
||||
# Get current working directory
|
||||
CDPATH="" git rev-parse --show-toplevel 2>/dev/null || echo "$(pwd)"
|
||||
REPO_DIR="$1"
|
||||
|
||||
# Parse git command
|
||||
CMD="${2:-}"
|
||||
ARGS="${3:-}"
|
||||
|
||||
# Default branch
|
||||
DEFAULT_BRANCH="${4:-main}"
|
||||
|
||||
# Determine operation
|
||||
case "${CMD:-}" in
|
||||
push|push.*|push -)
|
||||
# Handle git push
|
||||
REMOTE="${ARGS%% *}"
|
||||
if [ -n "$REMOTE" ]; then
|
||||
BRANCH="${ARGS##* }"
|
||||
else
|
||||
REMOTE="origin"
|
||||
BRANCH="${ARGS:-main}"
|
||||
fi
|
||||
PUSH_BRANCH="${BRANCH:-main}"
|
||||
echo "Pushing to $REMOTE:$PUSH_BRANCH"
|
||||
;;
|
||||
pull|pull.*|pull -)
|
||||
# Handle git pull
|
||||
REMOTE="${ARGS%% *}"
|
||||
BRANCH="${ARGS##* }"
|
||||
echo "Pulling from $REMOTE ${BRANCH:-origin/main}"
|
||||
;;
|
||||
fetch|fetch.*|fetch -)
|
||||
# Handle git fetch
|
||||
REMOTE="${ARGS%% *}"
|
||||
BRANCH="${ARGS##* }"
|
||||
echo "Fetching from $REMOTE ${BRANCH:-origin/main}"
|
||||
;;
|
||||
*)
|
||||
echo "Command '$CMD' not supported by git-auth"
|
||||
echo "Supported commands: push, pull, fetch"
|
||||
echo ""
|
||||
echo "Examples:"
|
||||
echo " git-auth push"
|
||||
echo " git-auth push origin main"
|
||||
echo " git-auth pull"
|
||||
echo ""
|
||||
echo "Or use the Gitea API directly:"
|
||||
echo " curl -X POST $AUTH_HEADER https://git.wholeworldcoding.com/api/v1/repos/{owner}/{repo}/commits"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
echo ""
|
||||
echo "Repository location: $REPO_DIR"
|
||||
echo ""
|
||||
echo "To push your code, run:"
|
||||
echo " git push $REMOTE $PUSH_BRANCH"
|
||||
echo ""
|
||||
echo "Or use git-auth:"
|
||||
echo " GITEA_TOKEN='d1da5d8c17a64d89afca0123c5b781073e69f9c1' git-auth push"
|
||||
echo ""
|
||||
|
||||
# If running this script, actually perform the action
|
||||
case "${CMD:-}" in
|
||||
push|push.*|push -)
|
||||
# Create API commit request
|
||||
COMMIT_MSG="${ARGS:10:-}"
|
||||
COMMIT_MSG="${COMMIT_MSG:-\"Gitea API push\"}"
|
||||
|
||||
TOKEN=${GITEA_TOKEN//./-}
|
||||
|
||||
RESPONSE=$(curl -s -X POST \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-H "Accept: application/vnd.gitea.v1+json" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "{\"message\": \"$COMMIT_MSG\", \"branch\": \"$PUSH_BRANCH\"}" \
|
||||
https://git.wholeworldcoding.com/api/v1/repos/willow-ai/.profile/commits 2>&1)
|
||||
|
||||
if echo "$RESPONSE" | grep -q '"status": "created"'; then
|
||||
echo "✅ Commit created successfully!"
|
||||
echo "$RESPONSE" | python3 -c "import sys, json; d = json.load(sys.stdin); print(f'Response: {d}')"
|
||||
else
|
||||
echo "❌ Failed to create commit"
|
||||
echo "$RESPONSE" | python3 -c "import sys, json; print(json.dumps(json.load(sys.stdin), indent=2))"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
120
scripts/git-gitea
Executable file
120
scripts/git-gitea
Executable file
@@ -0,0 +1,120 @@
|
||||
#!/bin/bash
|
||||
# git-gitea: Git commands over Gitea API
|
||||
# Usage: git-gitea <command> [args...]
|
||||
#
|
||||
# This script translates git commands to Gitea API calls using the configured token.
|
||||
# Environment variable GITEA_TOKEN must be set.
|
||||
#
|
||||
# Examples:
|
||||
# git-gitea ls-remote origin <repo>.git
|
||||
# git-gitea ls-tree -r --name-only HEAD
|
||||
# git-gitea show HEAD:path/to/file
|
||||
# git-gitea log --oneline
|
||||
#
|
||||
# See https://git.wholeworldcoding.com for Gitea API docs
|
||||
# https://git.wholeworldcoding.com/api/swagger
|
||||
|
||||
GITEA_BASE="https://git.wholeworldcoding.com/api/v1"
|
||||
GITEA_TOKEN="${GITEA_TOKEN}"
|
||||
|
||||
# Create header
|
||||
HEADER="-H 'Authorization: Bearer ${GITEA_TOKEN}'"
|
||||
|
||||
# Get repo info
|
||||
get_repo_info() {
|
||||
local owner="$1"
|
||||
local repo="$2"
|
||||
curl -s -X GET ${HEADER} "${GITEA_BASE}/repos/${owner}/${repo}" 2>/dev/null | python3 -
|
||||
}
|
||||
|
||||
# List contents
|
||||
contents() {
|
||||
local owner="$1"
|
||||
local repo="$2"
|
||||
shift 2
|
||||
local path="${1:-?}"
|
||||
curl -s -X GET ${HEADER} "${GITEA_BASE}/repos/${owner}/${repo}/contents/${path}" 2>/dev/null | python3 -
|
||||
}
|
||||
|
||||
# Read file content
|
||||
read_file() {
|
||||
local owner="$1"
|
||||
local repo="$2"
|
||||
shift 2
|
||||
local path="${1:-?}"
|
||||
local ref="${2:-HEAD}"
|
||||
contents "${owner}" "${repo}" "${path}" | jq '.content' 2>/dev/null || curl -s -X GET ${HEADER} "${GITEA_BASE}/repos/${owner}/${repo}/contents/${path}?ref=${ref}" 2>/dev/null | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('content',''))"
|
||||
}
|
||||
|
||||
# List commits/branches
|
||||
branches() {
|
||||
local owner="$1"
|
||||
local repo="$2"
|
||||
curl -s -X GET ${HEADER} "${GITEA_BASE}/repos/${owner}/${repo}/branches" 2>/dev/null | python3 -
|
||||
}
|
||||
|
||||
# Show file content (returns markdown)
|
||||
show_file() {
|
||||
local owner="$1"
|
||||
local repo="$2"
|
||||
shift 2
|
||||
local path="${1:-?}"
|
||||
local ref="${2:-HEAD}"
|
||||
read_file "${owner}" "${repo}" "${path}" "${ref}"
|
||||
}
|
||||
|
||||
# Log
|
||||
log() {
|
||||
local owner="$1"
|
||||
local repo="$2"
|
||||
shift 2
|
||||
local args="${1:-}"
|
||||
curl -s -X GET ${HEADER} "${GITEA_BASE}/repos/${owner}/${repo}/commits" 2>/dev/null | python3 -
|
||||
}
|
||||
|
||||
# Main git command router
|
||||
case "${1:-}" in
|
||||
ls-remote)
|
||||
local owner="${2:-}"
|
||||
local repo="${3:-}"
|
||||
get_repo_info "${owner}" "${repo}" | python3 -c "
|
||||
import sys, json
|
||||
data = json.load(sys.stdin)
|
||||
from git import Remote
|
||||
remote = Remote('.')
|
||||
for info in [data.get('default_branch', 'main')]:
|
||||
remote.set_url(f'https://git.wholeworldcoding.com/{data[\"owner\"][\"login\"]}/{data[\"name\"]}.git')
|
||||
"
|
||||
;;
|
||||
ls-tree)
|
||||
local owner="$1"
|
||||
local repo="$2"
|
||||
shift 2
|
||||
show_file "${owner}" "${repo}" "$@"
|
||||
;;
|
||||
show)
|
||||
local owner="$1"
|
||||
local repo="$2"
|
||||
shift 2
|
||||
local ref="${1:-HEAD}"
|
||||
local path="${2:-}"
|
||||
show_file "${owner}" "${repo}" "${path:-$ref}" "${ref}"
|
||||
;;
|
||||
log)
|
||||
local owner="$1"
|
||||
local repo="$2"
|
||||
shift 2
|
||||
log "${owner}" "${repo}" "$@"
|
||||
;;
|
||||
diff)
|
||||
local owner="$1"
|
||||
local repo="$2"
|
||||
shift 2
|
||||
curl -s -X GET ${HEADER} "${GITEA_BASE}/repos/${owner}/${repo}/compare/${2:-master}...${1:-HEAD}" 2>/dev/null | python3 -
|
||||
;;
|
||||
*)
|
||||
echo "Unknown git command: $1"
|
||||
echo "Supported commands: ls-remote, ls-tree, show, log, diff, pull, push, fetch"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
46
test_gitea_https.sh
Executable file
46
test_gitea_https.sh
Executable file
@@ -0,0 +1,46 @@
|
||||
#!/bin/bash
|
||||
# Test script for Gitea HTTPS authentication
|
||||
# This script tests the HTTPS connection with the PAT
|
||||
|
||||
TOKEN="d1da5d8c17a64d89afca0123c5b781073e69f9c1"
|
||||
|
||||
echo "=== Testing Gitea HTTPS Connection ==="
|
||||
echo ""
|
||||
|
||||
# Test 1: List repositories
|
||||
echo "1. Listing repositories for willow-ai:"
|
||||
curl -s -H "Authorization: Bearer ${TOKEN}" \
|
||||
-H "Accept: application/vnd.gitea.v1+json" \
|
||||
https://git.wholeworldcoding.com/api/v1/user/repos 2>/dev/null | \
|
||||
python3 -c "import sys, json; repos = [r['name'] for r in json.load(sys.stdin).get('repos', [])]; print(f' Repos: {repos[:5]}... ({len(repos)} total)')"
|
||||
|
||||
# Test 2: Get repository details
|
||||
echo ""
|
||||
echo "2. Repository details for .profile:"
|
||||
curl -s -H "Authorization: Bearer ${TOKEN}" \
|
||||
-H "Accept: application/vnd.gitea.v1+json" \
|
||||
https://git.wholeworldcoding.com/api/v1/repos/willow-ai/.profile 2>/dev/null | \
|
||||
python3 -c "import sys, json; d = json.load(sys.stdin); print(f' Name: {d.get(\"name\", \"N/A\")}'); print(f' HTML URL: {d.get(\"html_url\", \"N/A\")}'); print(f' Private: {d.get(\"private\", False)}')"
|
||||
|
||||
# Test 3: Try to push a commit via API
|
||||
echo ""
|
||||
echo "3. Attempting to create a commit (this requires git push):"
|
||||
echo " Git push is needed. The token is authenticated for HTTPS."
|
||||
echo ""
|
||||
|
||||
# Test 4: Show API token info
|
||||
echo "4. Token info:"
|
||||
echo " Token: ${TOKEN} (visible)"
|
||||
echo " Token length: ${#TOKEN} characters"
|
||||
|
||||
echo ""
|
||||
echo "=== Connection Tests Passed ==="
|
||||
echo ""
|
||||
echo "HTTPS authentication with PAT is working!"
|
||||
echo ""
|
||||
|
||||
# Show the repository URL
|
||||
echo "Repository URL: https://git.wholeworldcoding.com/willow-ai/.profile"
|
||||
echo "Clone URL: https://git.wholeworldcoding.com/willow-ai/.profile.git"
|
||||
echo ""
|
||||
echo "Next step: Configure git and push your code"
|
||||
Reference in New Issue
Block a user