parent
0a61371d58
commit
e15d9a0860
@ -0,0 +1,174 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Install dsync from https://git.ai.infran.ru/ilyukhin/dsync.git
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# ./install_dsync.sh # install to ~/.local/bin (default)
|
||||||
|
# ./install_dsync.sh --system # install to /usr/local/bin (requires sudo)
|
||||||
|
# ./install_dsync.sh -d DIR # install to custom DIR
|
||||||
|
# ./install_dsync.sh -f # force overwrite if target exists
|
||||||
|
# ./install_dsync.sh -h # show help
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
REPO_URL="https://git.ai.infran.ru/ilyukhin/dsync.git"
|
||||||
|
RAW_BASE="https://git.ai.infran.ru/ilyukhin/dsync/-/raw" # raw URL pattern: $RAW_BASE/<branch>/dsync
|
||||||
|
DEFAULT_USER_DIR="$HOME/.local/bin"
|
||||||
|
|
||||||
|
DEST_DIR="$DEFAULT_USER_DIR"
|
||||||
|
FORCE=0
|
||||||
|
|
||||||
|
print_help() {
|
||||||
|
cat <<EOF
|
||||||
|
Install dsync from ${REPO_URL}
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-s, --system install into /usr/local/bin (system-wide; may use sudo)
|
||||||
|
-d DIR, --dest DIR install into DIR
|
||||||
|
-f, --force overwrite existing file without asking
|
||||||
|
-h, --help show this help
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
# parse options
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case "$1" in
|
||||||
|
-s|--system)
|
||||||
|
DEST_DIR="/usr/local/bin"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-d|--dest)
|
||||||
|
if [[ -z "${2:-}" ]]; then
|
||||||
|
echo "Error: missing argument for $1" >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
DEST_DIR="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-f|--force)
|
||||||
|
FORCE=1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-h|--help)
|
||||||
|
print_help
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
--)
|
||||||
|
shift
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
-*)
|
||||||
|
echo "Unknown option: $1" >&2
|
||||||
|
print_help
|
||||||
|
exit 2
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
DEST_PATH="$DEST_DIR/dsync"
|
||||||
|
|
||||||
|
# create temporary dir and ensure cleanup
|
||||||
|
TMPDIR="$(mktemp -d)"
|
||||||
|
trap 'rm -rf "$TMPDIR"' EXIT
|
||||||
|
|
||||||
|
echo "Installing dsync to: $DEST_DIR"
|
||||||
|
|
||||||
|
# ensure target directory exists (create with sudo if system dir)
|
||||||
|
if [[ ! -d "$DEST_DIR" ]]; then
|
||||||
|
echo "Target directory $DEST_DIR does not exist — attempting to create it..."
|
||||||
|
if ! mkdir -p "$DEST_DIR" 2>/dev/null; then
|
||||||
|
echo "No permission to create $DEST_DIR, trying with sudo..."
|
||||||
|
if ! command -v sudo >/dev/null 2>&1; then
|
||||||
|
echo "sudo not available — cannot create $DEST_DIR" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
sudo mkdir -p "$DEST_DIR"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
FOUND=""
|
||||||
|
|
||||||
|
# 1) Try to clone repo with git (if git available)
|
||||||
|
if command -v git >/dev/null 2>&1; then
|
||||||
|
echo "git found — attempting shallow clone..."
|
||||||
|
if git clone --depth 1 "$REPO_URL" "$TMPDIR/repo" >/dev/null 2>&1; then
|
||||||
|
echo "Repository cloned."
|
||||||
|
else
|
||||||
|
echo "Shallow clone failed, attempting normal clone (may show output)..."
|
||||||
|
git clone --depth 1 "$REPO_URL" "$TMPDIR/repo" || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -d "$TMPDIR/repo" ]]; then
|
||||||
|
FOUND="$(find "$TMPDIR/repo" -maxdepth 6 -type f -name dsync -print -quit || true)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2) If git did not find the file, try to download raw file via curl (main/master)
|
||||||
|
if [[ -z "$FOUND" ]]; then
|
||||||
|
if command -v curl >/dev/null 2>&1; then
|
||||||
|
for BR in main master; do
|
||||||
|
RAW_URL="$RAW_BASE/$BR/dsync"
|
||||||
|
echo "Trying to download raw file: $RAW_URL"
|
||||||
|
if curl --fail -L --max-redirs 5 -o "$TMPDIR/dsync" "$RAW_URL"; then
|
||||||
|
# check that downloaded file looks like text/script, not HTML error
|
||||||
|
if file "$TMPDIR/dsync" | grep -qE 'text|python|ASCII'; then
|
||||||
|
FOUND="$TMPDIR/dsync"
|
||||||
|
break
|
||||||
|
else
|
||||||
|
echo "Downloaded file from $RAW_URL does not look like a script - skipping."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Failed to download $RAW_URL (404 or error)."
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
else
|
||||||
|
echo "curl not installed and git did not yield a dsync file — cannot download." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z "$FOUND" ]]; then
|
||||||
|
echo "Could not locate dsync in the repository and raw download failed."
|
||||||
|
echo "Repository may be private. If it's private, ensure you have access (SSH keys or credentials)."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Found source file at: $FOUND"
|
||||||
|
|
||||||
|
# Warn if target exists
|
||||||
|
if [[ -e "$DEST_PATH" && "$FORCE" -ne 1 ]]; then
|
||||||
|
echo "Error: $DEST_PATH already exists. Use --force to overwrite." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# copy into destination (use sudo if target dir is not writable)
|
||||||
|
if touch "$DEST_DIR/.write_test" >/dev/null 2>&1; then
|
||||||
|
rm -f "$DEST_DIR/.write_test"
|
||||||
|
cp -f "$FOUND" "$DEST_PATH"
|
||||||
|
chmod +x "$DEST_PATH"
|
||||||
|
echo "Installed: $DEST_PATH"
|
||||||
|
else
|
||||||
|
echo "No write permission to $DEST_DIR — using sudo to copy and set executable bit."
|
||||||
|
if ! command -v sudo >/dev/null 2>&1; then
|
||||||
|
echo "sudo is not available — cannot write to $DEST_DIR" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
sudo cp -f "$FOUND" "$DEST_PATH"
|
||||||
|
sudo chmod +x "$DEST_PATH"
|
||||||
|
echo "Installed (via sudo): $DEST_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# quick PATH check
|
||||||
|
echo
|
||||||
|
echo "PATH check:"
|
||||||
|
if command -v dsync >/dev/null 2>&1; then
|
||||||
|
echo "dsync is found: $(command -v dsync)"
|
||||||
|
else
|
||||||
|
echo "dsync was installed to $DEST_PATH but is not found in current PATH."
|
||||||
|
echo "Make sure $DEST_DIR is in your PATH (add to ~/.profile, ~/.bashrc or ~/.zshrc if needed):"
|
||||||
|
echo " export PATH=\"$DEST_DIR:\$PATH\""
|
||||||
|
echo "Then run 'hash -r' (bash) or 'rehash' (zsh) or restart your shell."
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Done."
|
||||||
Loading…
Reference in new issue