mirror of
https://git.alemi.dev/gitshell.git
synced 2024-11-24 00:14:50 +01:00
feat: pushing existing commands
i made this some time ago, pushing as one commit
This commit is contained in:
commit
6bdae48354
16 changed files with 395 additions and 0 deletions
27
descr
Executable file
27
descr
Executable file
|
@ -0,0 +1,27 @@
|
|||
#!/bin/bash
|
||||
|
||||
REPOSITORY="$1"
|
||||
|
||||
if [[ ! "$REPOSITORY" == *.git ]]; then
|
||||
REPOSITORY="$REPOSITORY.git"
|
||||
fi
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "[!] no repository name specified"
|
||||
exit
|
||||
fi
|
||||
|
||||
if [ ! -d "/srv/git/$REPOSITORY" ]; then
|
||||
echo "[!] repository does not exist"
|
||||
exit
|
||||
fi
|
||||
|
||||
if [ $# -eq 1 ]; then
|
||||
echo "[!] no branch name specified"
|
||||
exit
|
||||
fi
|
||||
|
||||
|
||||
echo "$2" > "/srv/git/$REPOSITORY/description"
|
||||
echo "Changed description of $REPOSITORY to '$2'"
|
||||
|
41
fetch-mirrors
Executable file
41
fetch-mirrors
Executable file
|
@ -0,0 +1,41 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import os.path
|
||||
import subprocess
|
||||
|
||||
GIT_ROOT = os.environ.get("GIT_ROOT_DIR") or "/srv/git/"
|
||||
|
||||
def is_mirror(repo):
|
||||
cmd = ["git", "config", "-f", f"{GIT_ROOT}{repo}/config", "remote.origin.mirror"]
|
||||
proc = subprocess.run(cmd, stdout=subprocess.PIPE)
|
||||
if proc.stdout.decode().strip() == "true":
|
||||
return True
|
||||
return False
|
||||
|
||||
def get_direction(repo):
|
||||
cmd = ["git", "config", "-f", f"{GIT_ROOT}{repo}/config", "remote.origin.direction"]
|
||||
proc = subprocess.run(cmd, stdout=subprocess.PIPE)
|
||||
return proc.stdout.decode().strip()
|
||||
|
||||
def fetch_all(repo):
|
||||
print(f"[<] Fetching {repo}")
|
||||
subprocess.run(["git", "fetch", "--all"], cwd=GIT_ROOT+repo)
|
||||
if os.path.isfile(f"{GIT_ROOT}{repo}/hooks/post-receive"):
|
||||
subprocess.run([f"{GIT_ROOT}{repo}/hooks/post-receive"])
|
||||
|
||||
def push_all(repo):
|
||||
print(f"[>] Pushing {repo}")
|
||||
subprocess.run(["git", "push", "origin"], cwd=GIT_ROOT+repo)
|
||||
#subprocess.run([f"{GIT_ROOT}.hooks/post-update"], cwd=GIT_ROOT+repo)
|
||||
|
||||
if __name__ == "__main__":
|
||||
for element in os.listdir(GIT_ROOT):
|
||||
if element.endswith(".git"):
|
||||
if is_mirror(element):
|
||||
direction = get_direction(element)
|
||||
if direction == "up":
|
||||
push_all(element)
|
||||
if direction == "down":
|
||||
fetch_all(element)
|
||||
|
30
group
Executable file
30
group
Executable file
|
@ -0,0 +1,30 @@
|
|||
#!/bin/bash
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "[!] no repository name specified"
|
||||
exit
|
||||
fi
|
||||
|
||||
REPOSITORY="$1" # with .git
|
||||
REPONAME="$1" # without .git
|
||||
|
||||
if [[ ! "$REPOSITORY" == *.git ]]; then
|
||||
REPOSITORY="$REPOSITORY.git"
|
||||
fi
|
||||
|
||||
if [[ "$REPONAME" == *.git ]]; then
|
||||
REPONAME=$(echo "$REPONAME" | sed 's/\.git$//')
|
||||
fi
|
||||
|
||||
if [ ! -d "/srv/git/$REPOSITORY" ]; then
|
||||
echo "[!] repository doesn't exist"
|
||||
exit
|
||||
fi
|
||||
|
||||
if [ $# -eq 1 ]; then
|
||||
git config -f "/srv/git/$REPOSITORY/config" --unset gitweb.category
|
||||
echo "[ ] unset category from $REPONAME"
|
||||
else
|
||||
git config -f "/srv/git/$REPOSITORY/config" gitweb.category "$2"
|
||||
echo "[,] set '$2' as $REPONAME category"
|
||||
fi
|
||||
|
30
head
Executable file
30
head
Executable file
|
@ -0,0 +1,30 @@
|
|||
#!/bin/bash
|
||||
|
||||
REPOSITORY="$1"
|
||||
|
||||
if [[ ! "$REPOSITORY" == *.git ]]; then
|
||||
REPOSITORY="$REPOSITORY.git"
|
||||
fi
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "[!] no repository name specified"
|
||||
exit
|
||||
fi
|
||||
|
||||
if [ ! -d "/srv/git/$REPOSITORY" ]; then
|
||||
echo "[!] repository does not exist"
|
||||
exit
|
||||
fi
|
||||
|
||||
if [ $# -eq 1 ]; then
|
||||
echo "[!] no branch name specified"
|
||||
exit
|
||||
fi
|
||||
|
||||
|
||||
cd "/srv/git/$REPOSITORY"
|
||||
git symbolic-ref HEAD "refs/heads/$2"
|
||||
git config -f "/srv/git/$REPOSITORY/config" init.defaultBranch "$2"
|
||||
|
||||
echo "Changed HEAD of $REPOSITORY to refs/heads/$2"
|
||||
|
17
help
Executable file
17
help
Executable file
|
@ -0,0 +1,17 @@
|
|||
#!/bin/bash
|
||||
echo "Command list:"
|
||||
echo " $ help print this"
|
||||
echo " $ ls list all repositories"
|
||||
echo " $ public list public repositories"
|
||||
echo " $ new <name> create new repo"
|
||||
echo " $ mirror <url> [name] mirror remote repository"
|
||||
echo " $ upstream <name> <url> set repository to push to a given remote"
|
||||
echo " $ tree <name> show file tree of repo at HEAD"
|
||||
echo " $ log <name> show commit log of repo"
|
||||
echo " $ head <repo> <name> change default branch of repository"
|
||||
echo " $ descr <repo> <text> change description of repository"
|
||||
echo " $ owner <repo> [owner] set or unset owner for repository"
|
||||
echo " $ group <repo> [group] set or unset group for repository"
|
||||
echo " $ page <repo> [page] set or unset homepage for repository"
|
||||
echo " $ show <repo> make repository public"
|
||||
echo " $ hide <repo> hide public repository"
|
25
hide
Executable file
25
hide
Executable file
|
@ -0,0 +1,25 @@
|
|||
#!/bin/bash
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "[!] no repository name specified"
|
||||
exit
|
||||
fi
|
||||
|
||||
REPOSITORY="$1" # with .git
|
||||
REPONAME="$1" # without .git
|
||||
|
||||
if [[ ! "$REPOSITORY" == *.git ]]; then
|
||||
REPOSITORY="$REPOSITORY.git"
|
||||
fi
|
||||
|
||||
if [[ "$REPONAME" == *.git ]]; then
|
||||
REPONAME=$(echo "$REPONAME" | sed 's/\.git$//')
|
||||
fi
|
||||
|
||||
if [ ! -d "/srv/git/.public/$REPONAME" ]; then
|
||||
echo "[!] repository isn't public"
|
||||
exit
|
||||
fi
|
||||
|
||||
rm "/srv/git/.public/$REPONAME"
|
||||
|
||||
echo "[#] made $REPONAME hidden"
|
21
log
Executable file
21
log
Executable file
|
@ -0,0 +1,21 @@
|
|||
#!/bin/bash
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "[!] no repository name specified"
|
||||
exit
|
||||
fi
|
||||
|
||||
REPOSITORY="$1"
|
||||
|
||||
if [[ ! "$REPOSITORY" == *.git ]]; then
|
||||
REPOSITORY="$REPOSITORY.git"
|
||||
fi
|
||||
|
||||
if [ ! -d "/srv/git/$REPOSITORY" ]; then
|
||||
echo "[!] repository doesn't exists"
|
||||
exit
|
||||
fi
|
||||
|
||||
cd "/srv/git/$REPOSITORY"
|
||||
echo "$ git log --graph --abbrev-commit --decorate $REPOSITORY"
|
||||
TERM=xterm git log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all
|
||||
echo ""
|
10
ls
Executable file
10
ls
Executable file
|
@ -0,0 +1,10 @@
|
|||
#!/bin/bash
|
||||
|
||||
# ls /srv/git -I 'git-shell-commands'
|
||||
|
||||
# one above misses repos like '.dotfiles', let's do it by hand
|
||||
for f in $(ls /srv/git -a); do
|
||||
if [[ $f == *.git ]]; then
|
||||
echo $f
|
||||
fi
|
||||
done
|
30
mirror
Executable file
30
mirror
Executable file
|
@ -0,0 +1,30 @@
|
|||
#!/bin/bash
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "[!] no repository specified"
|
||||
exit
|
||||
fi
|
||||
|
||||
REMOTE="origin" # TODO can we get this as argument but optionally?
|
||||
|
||||
if [ $# -eq 1 ]; then
|
||||
IFS='/' read -ra FRAGS <<< "$1"
|
||||
REPOSITORY=${FRAGS[-1]}
|
||||
REPONAME=${FRAGS[-1]}
|
||||
else
|
||||
REPOSITORY="$2" # with .git
|
||||
REPONAME="$2" # without .git
|
||||
fi
|
||||
|
||||
if [[ ! "$REPOSITORY" == *.git ]]; then
|
||||
REPOSITORY="$REPOSITORY.git"
|
||||
fi
|
||||
|
||||
if [[ "$REPONAME" == *.git ]]; then
|
||||
REPONAME=$(echo "$REPONAME" | sed 's/\.git$//')
|
||||
fi
|
||||
|
||||
git clone --mirror "$1" "/srv/git/$REPOSITORY" --origin "$REMOTE"
|
||||
git config -f "/srv/git/$REPOSITORY/config" "remote.$REMOTE.direction" "down"
|
||||
|
||||
cd "$REPOSITORY"
|
||||
/srv/git/.hooks/post-receive
|
20
new
Executable file
20
new
Executable file
|
@ -0,0 +1,20 @@
|
|||
#!/bin/bash
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "[!] no repository name specified"
|
||||
exit
|
||||
fi
|
||||
|
||||
REPOSITORY="$1"
|
||||
|
||||
if [[ ! "$REPOSITORY" == *.git ]]; then
|
||||
REPOSITORY="$REPOSITORY.git"
|
||||
fi
|
||||
|
||||
if [ -d "/srv/git/$REPOSITORY" ]; then
|
||||
echo "[!] repository already exists"
|
||||
exit
|
||||
fi
|
||||
|
||||
mkdir -p "/srv/git/$REPOSITORY"
|
||||
cd "/srv/git/$REPOSITORY"
|
||||
git init --bare
|
30
owner
Executable file
30
owner
Executable file
|
@ -0,0 +1,30 @@
|
|||
#!/bin/bash
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "[!] no repository name specified"
|
||||
exit
|
||||
fi
|
||||
|
||||
REPOSITORY="$1" # with .git
|
||||
REPONAME="$1" # without .git
|
||||
|
||||
if [[ ! "$REPOSITORY" == *.git ]]; then
|
||||
REPOSITORY="$REPOSITORY.git"
|
||||
fi
|
||||
|
||||
if [[ "$REPONAME" == *.git ]]; then
|
||||
REPONAME=$(echo "$REPONAME" | sed 's/\.git$//')
|
||||
fi
|
||||
|
||||
if [ ! -d "/srv/git/$REPOSITORY" ]; then
|
||||
echo "[!] repository doesn't exist"
|
||||
exit
|
||||
fi
|
||||
|
||||
if [ $# -eq 1 ]; then
|
||||
git config -f "/srv/git/$REPOSITORY/config" --unset gitweb.owner
|
||||
echo "[ ] unset owner from $REPONAME"
|
||||
else
|
||||
git config -f "/srv/git/$REPOSITORY/config" gitweb.owner "$2"
|
||||
echo "['] set '$2' as $REPONAME owner"
|
||||
fi
|
||||
|
30
page
Executable file
30
page
Executable file
|
@ -0,0 +1,30 @@
|
|||
#!/bin/bash
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "[!] no repository name specified"
|
||||
exit
|
||||
fi
|
||||
|
||||
REPOSITORY="$1" # with .git
|
||||
REPONAME="$1" # without .git
|
||||
|
||||
if [[ ! "$REPOSITORY" == *.git ]]; then
|
||||
REPOSITORY="$REPOSITORY.git"
|
||||
fi
|
||||
|
||||
if [[ "$REPONAME" == *.git ]]; then
|
||||
REPONAME=$(echo "$REPONAME" | sed 's/\.git$//')
|
||||
fi
|
||||
|
||||
if [ ! -d "/srv/git/$REPOSITORY" ]; then
|
||||
echo "[!] repository doesn't exist"
|
||||
exit
|
||||
fi
|
||||
|
||||
if [ $# -eq 1 ]; then
|
||||
git config -f "/srv/git/$REPOSITORY/config" --unset gitweb.homepage
|
||||
echo "[ ] unset homepage from $REPONAME"
|
||||
else
|
||||
git config -f "/srv/git/$REPOSITORY/config" gitweb.homepage "$2"
|
||||
echo "[@] set '$2' as $REPONAME homepage"
|
||||
fi
|
||||
|
14
public
Executable file
14
public
Executable file
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash
|
||||
|
||||
# ls /srv/git -I 'git-shell-commands'
|
||||
|
||||
# one above misses repos like '.dotfiles', let's do it by hand
|
||||
for f in $(ls /srv/git/.public -a); do
|
||||
if [[ $f == '.' ]]; then
|
||||
continue
|
||||
elif [[ $f == '..' ]]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
echo "$f"
|
||||
done
|
25
show
Executable file
25
show
Executable file
|
@ -0,0 +1,25 @@
|
|||
#!/bin/bash
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "[!] no repository name specified"
|
||||
exit
|
||||
fi
|
||||
|
||||
REPOSITORY="$1" # with .git
|
||||
REPONAME="$1" # without .git
|
||||
|
||||
if [[ ! "$REPOSITORY" == *.git ]]; then
|
||||
REPOSITORY="$REPOSITORY.git"
|
||||
fi
|
||||
|
||||
if [[ "$REPONAME" == *.git ]]; then
|
||||
REPONAME=$(echo "$REPONAME" | sed 's/\.git$//')
|
||||
fi
|
||||
|
||||
if [ ! -d "/srv/git/$REPOSITORY" ]; then
|
||||
echo "[!] repository doesn't exist"
|
||||
exit
|
||||
fi
|
||||
|
||||
ln -s "/srv/git/$REPOSITORY" "/srv/git/.public/$REPONAME"
|
||||
|
||||
echo "[#] made $REPONAME publicly visible"
|
19
tree
Executable file
19
tree
Executable file
|
@ -0,0 +1,19 @@
|
|||
#!/bin/bash
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "[!] no repository name specified"
|
||||
exit
|
||||
fi
|
||||
|
||||
REPOSITORY="$1"
|
||||
|
||||
if [[ ! "$REPOSITORY" == *.git ]]; then
|
||||
REPOSITORY="$REPOSITORY.git"
|
||||
fi
|
||||
|
||||
if [ ! -d "/srv/git/$REPOSITORY" ]; then
|
||||
echo "[!] repository doesn't exists"
|
||||
exit
|
||||
fi
|
||||
|
||||
cd "/srv/git/$REPOSITORY"
|
||||
git ls-tree -r HEAD --name-only --full-tree | TERM=xterm less
|
26
upstream
Executable file
26
upstream
Executable file
|
@ -0,0 +1,26 @@
|
|||
#!/bin/bash
|
||||
if [ $# -lt 2 ]; then
|
||||
echo "[!] must specify both repository and remote"
|
||||
exit
|
||||
fi
|
||||
|
||||
REPOSITORY="$1"
|
||||
URL="$2"
|
||||
|
||||
if [[ ! "$REPOSITORY" == *.git ]]; then
|
||||
REPOSITORY="$REPOSITORY.git"
|
||||
fi
|
||||
|
||||
if [ ! -d "/srv/git/$REPOSITORY" ]; then
|
||||
echo "[!] repository does not exist"
|
||||
exit
|
||||
fi
|
||||
|
||||
REMOTE="origin" # TODO can we get this as argument but optionally?
|
||||
|
||||
cd "/srv/git/$REPOSITORY"
|
||||
|
||||
git remote remove "$REMOTE" # TODO this complains about branches abandoned, but we will recreate the remote right after this, so maybe do it smartly and check?
|
||||
git remote add "$REMOTE" "$URL"
|
||||
git config remote.$REMOTE.mirror "true"
|
||||
git config remote.$REMOTE.direction "up"
|
Loading…
Reference in a new issue