Initial commit

This commit is contained in:
Кокос Артем Николаевич
2026-01-21 16:09:33 +07:00
commit 3c2984aeb2

189
projdump.sh Executable file
View File

@@ -0,0 +1,189 @@
#!/usr/bin/env bash
# projdump.sh — dump project structure and source code into text files
set -euo pipefail
usage() {
cat >&2 <<EOF
Использование: $0 <директория>
Создаёт два файла:
<basename>-tree.txt — дерево проекта (через tree)
<basename>-code.txt — содержимое всех исходных файлов
Игнорирует типичные артефакты сборки, кэши, IDE-файлы и зависимости.
Параметры:
-h, --help Показать эту справку
EOF
}
if [[ $# -eq 0 ]] || [[ "$1" == "-h" ]] || [[ "$1" == "--help" ]]; then
usage
exit 0
fi
TARGET_DIR="$1"
if [[ ! -d "$TARGET_DIR" ]]; then
echo "Ошибка: директория '$TARGET_DIR' не существует." >&2
exit 1
fi
# Привести к абсолютному пути для надёжности
TARGET_DIR="$(cd "$TARGET_DIR" && pwd)"
# Имя базовой директории
BASENAME=$(basename "$TARGET_DIR")
# Проверка зависимостей
if ! command -v tree >/dev/null 2>&1; then
echo "Ошибка: требуется утилита 'tree'. Установите её (например, apt install tree)." >&2
exit 1
fi
# Расширенный список игнорируемых паттернов
# Охватывает: Python, Node.js, Rust, Go, C/C++ (CMake, build dirs), Java, .NET, CI, OS, etc.
IGNORE_LIST=(
".git"
".svn"
".hg"
"node_modules"
"__pycache__"
"*.pyc"
".venv"
"venv"
"env"
".env"
".idea"
".vscode"
".vs"
".DS_Store"
"Thumbs.db"
"dist"
"build"
"out"
"target"
".pytest_cache"
".mypy_cache"
".next"
".nuxt"
".output"
".svelte-kit"
"coverage"
".cache"
".parcel-cache"
".eslintcache"
".yarn"
"yarn-error.log"
"package-lock.json"
"yarn.lock"
"pnpm-lock.yaml"
"Cargo.lock"
"go.sum"
".gradle"
"gradle"
".mvn"
"mvnw"
"mvnw.cmd"
"*.swp"
"*.swo"
".stack-work"
"_build"
"deps"
".cargo"
".rustup"
".clangd"
".ccls-cache"
"CMakeFiles"
"CMakeCache.txt"
"CTestTestfile.cmake"
"cmake_install.cmake"
"*.dSYM"
"*.ilk"
"*.pdb"
"*.obj"
"*.o"
"*.so"
"*.dylib"
"*.dll"
"*.exe"
"*.bin"
"*.hex"
"*.elf"
"tags"
"TAGS"
"GPATH"
"GTAGS"
"GRTAGS"
"GSYMS"
".github"
".gitlab"
".circleci"
".travis.yml"
"Jenkinsfile"
"Dockerfile*"
"docker-compose*.yml"
"*.log"
"logs"
"tmp"
"temp"
".terraform"
".tfstate"
".tfstate.backup"
"*.tfvars"
)
# === Подготовка аргументов для find ===
FIND_IGNORE_ARGS=()
for pat in "${IGNORE_LIST[@]}"; do
# Для шаблонов с /* или * внутри — используем -name или -path соответственно
if [[ "$pat" == */* ]]; then
FIND_IGNORE_ARGS+=(-o -path "*/$pat")
else
FIND_IGNORE_ARGS+=(-o -name "$pat")
fi
done
# Строим команду find: пропускаем игнорируемые, печатаем остальные файлы
# \( -false ... \) гарантирует корректную логику без начального -o
FIND_CMD=(find "$TARGET_DIR" \( -false "${FIND_IGNORE_ARGS[@]}" \) -prune -o -type f -print0)
# === Паттерны для tree (только имена, без путей; tree использует glob-паттерны через |) ===
TREE_IGNORE_PATTERNS=""
for i in "${!IGNORE_LIST[@]}"; do
pat="${IGNORE_LIST[i]}"
# tree не поддерживает пути — только имена файлов/директорий
# поэтому берём только basename шаблона, если он содержит /
if [[ "$pat" == */* ]]; then
# Например, ".github/workflows" → игнорируем только ".github"
base_pat="${pat%%/*}"
else
base_pat="$pat"
fi
# Удаляем звёздочки для tree? Нет — tree поддерживает * в -I
if [[ -z "$TREE_IGNORE_PATTERNS" ]]; then
TREE_IGNORE_PATTERNS="$base_pat"
else
TREE_IGNORE_PATTERNS="$TREE_IGNORE_PATTERNS|$base_pat"
fi
done
# === Сбор кода ===
{
while IFS= read -r -d '' file; do
echo "========================================"
echo "// FILE: $file"
echo "========================================"
cat "$file"
echo -e "\n\n"
done < <("${FIND_CMD[@]}")
} > "${BASENAME}-code.txt"
# === Построение дерева ===
tree -I "$TREE_IGNORE_PATTERNS" "$TARGET_DIR" > "${BASENAME}-tree.txt"
echo "Готово:"
echo " Дерево: ${BASENAME}-tree.txt"
echo " Код: ${BASENAME}-code.txt"