Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,7 @@

# EasyWork local files (do not commit)
easywork.conf
.easywork/config
.easywork/manifest
*.tmp
*.bak
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ easywork <命令> [参数] [选项]
| `uninstall` | 卸载全部组件 |
| `uninstall <模块名>` | 卸载指定组件 |
| `config` | 查看配置文件内容及元信息 |
| `config edit` | 编辑配置文件(`~/.easywork.conf`) |
| `config edit` | 编辑配置文件(`~/.easywork/config`) |
| `version` | 查看版本、安装日期和已安装组件 |
| `update` | 检查并升级到最新版本 |
| `help` | 显示帮助信息 |
Expand Down Expand Up @@ -329,7 +329,7 @@ easywork <命令> [参数] [选项]

## 配置说明

EasyWork 的配置文件位于 `~/.easywork.conf`。当你运行 `easywork git` 并选择 personal 或 work 身份后,EasyWork 会自动将身份信息写回该配置文件,下次无需重新输入。
EasyWork 的配置文件位于 `~/.easywork/config`。当你运行 `easywork git` 并选择 personal 或 work 身份后,EasyWork 会自动将身份信息写回该配置文件,下次无需重新输入。

示例配置内容:

Expand Down
46 changes: 27 additions & 19 deletions bin/easywork
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ fi
if $IS_PIPED; then
EASYWORK_RAW_URL="${EASYWORK_RAW_URL:-https://raw.githubusercontent.com/EasyIndie/EasyWork/main}"
else
EASYWORK_RAW_URL="${EASYWORK_RAW_URL:-https://raw.githubusercontent.com/EasyIndie/EasyWork/v${EASYWORK_VERSION}}"
EASYWORK_RAW_URL="${EASYWORK_RAW_URL:-https://raw.githubusercontent.com/EasyIndie/EasyWork/${EASYWORK_VERSION}}"
fi

# ─── Source Common Library ────────────────────────────────────
Expand All @@ -45,30 +45,38 @@ else
_CACHE_DIR="$HOME/.easywork/lib/v${EASYWORK_VERSION}"
mkdir -p "$_CACHE_DIR"

_download_common() {
curl -fsSL --proto '=https' --tlsv1.2 --retry 3 \
-o "$_CACHE_DIR/common.sh" \
"${EASYWORK_RAW_URL}/lib/common.sh" 2> /dev/null
}
# Check cache first — avoids re-downloading on every invocation
if [[ -f "$_CACHE_DIR/common.sh" ]]; then
source "$_CACHE_DIR/common.sh"
LIB_DIR="$_CACHE_DIR"
else
mkdir -p "$_CACHE_DIR"

_download_common() {
curl -fsSL --proto '=https' --tlsv1.2 --retry 3 \
-o "$_CACHE_DIR/common.sh" \
"${EASYWORK_RAW_URL}/lib/common.sh" 2> /dev/null
}

if ! _download_common; then
# Fallback: version tag doesn't exist → use main branch
echo "[WARN] 版本 tag 不存在,使用 main 分支" >&2
EASYWORK_RAW_URL="https://raw.githubusercontent.com/EasyIndie/EasyWork/main"
if ! _download_common; then
echo "[ERROR] 无法下载 common.sh,请检查网络连接"
echo "[INFO] URL: ${EASYWORK_RAW_URL}/lib/common.sh"
exit 2
# Fallback: version tag doesn't exist → use main branch
echo "[WARN] 版本 tag 不存在,使用 main 分支" >&2
EASYWORK_RAW_URL="https://raw.githubusercontent.com/EasyIndie/EasyWork/main"
if ! _download_common; then
echo "[ERROR] 无法下载 common.sh,请检查网络连接"
echo "[INFO] URL: ${EASYWORK_RAW_URL}/lib/common.sh"
exit 2
fi
fi
fi

source "$_CACHE_DIR/common.sh"
LIB_DIR="$_CACHE_DIR"
source "$_CACHE_DIR/common.sh"
LIB_DIR="$_CACHE_DIR"
fi
fi

# Channel: dev (development) or empty (release)
# Local checkout or main-branch URL → dev; standalone with version tag → release
if $IS_PIPED || [[ "${EASYWORK_RAW_URL:-}" == *"/main" ]] || [[ -d "${EASYWORK_ROOT:-}/.git" ]]; then
# Piped or local git checkout → dev; installed release binary → release
if $IS_PIPED || [[ -d "${EASYWORK_ROOT:-}/.git" ]]; then
EASYWORK_CHANNEL="dev"
else
EASYWORK_CHANNEL=""
Expand Down Expand Up @@ -662,7 +670,7 @@ _finalize_uninstall() {
else
local answer="y"
if [[ "${YES_MODE:-false}" != "true" ]]; then
read -r -p " 保留 ~/.easywork.conf 以便将来使用?[Y/n] " answer
read -r -p " 保留 $(config_path) 以便将来使用?[Y/n] " answer
elif [[ "${REMOVE_CONFIG:-false}" == "true" ]]; then
answer="n"
else
Expand Down
4 changes: 2 additions & 2 deletions easywork.conf.example
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# ── EasyWork 配置文件 ────────────────────────────────────
# 复制为 ~/.easywork.conf 即可生效:
# cp easywork.conf.example ~/.easywork.conf
# 复制为 ~/.easywork/config 即可生效:
# cp easywork.conf.example ~/.easywork/config
#
# 配置文件由 easywork config 命令管理,支持:
# easywork config 查看配置内容
Expand Down
16 changes: 14 additions & 2 deletions lib/common.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,16 @@ set -euo pipefail
# Version (set by bin/easywork; default for standalone module usage)
EASYWORK_VERSION="${EASYWORK_VERSION:-1.0.0}"

# EasyWork home directory — centralizes all CLI config, manifest, cache, and completions
EASYWORK_HOME="${HOME}/.easywork"

# Ensure the home directory exists
_ensure_easywork_home() {
if [[ ! -d "$EASYWORK_HOME" ]]; then
mkdir -p "$EASYWORK_HOME"
fi
}

# ─── Exit Codes ───────────────────────────────────────────────
export EXIT_SUCCESS=0
export EXIT_ERROR=1
Expand Down Expand Up @@ -216,7 +226,7 @@ replace_managed_section() {
}

# ─── Manifest Management ──────────────────────────────────────
MANIFEST_FILE="$HOME/.easywork.manifest"
MANIFEST_FILE="${EASYWORK_HOME}/manifest"

manifest_file() { echo "$MANIFEST_FILE"; }

Expand Down Expand Up @@ -259,6 +269,7 @@ manifest_list_installed() {

manifest_init() {
local version="$1"
_ensure_easywork_home
cat > "$MANIFEST_FILE" << EOF
# EasyWork Manifest — auto-generated, do not edit
easywork_version=${version}
Expand Down Expand Up @@ -411,7 +422,7 @@ manifest_read_section_key() {
}

# ─── Config File Management ───────────────────────────────────
CONFIG_FILE="${HOME}/.easywork.conf"
CONFIG_FILE="${EASYWORK_HOME}/config"
CONFIG_EXAMPLE="${EASYWORK_ROOT:-.}/easywork.conf.example"

config_path() { echo "$CONFIG_FILE"; }
Expand All @@ -426,6 +437,7 @@ config_load() {
}

config_init() {
_ensure_easywork_home
if ! config_exists; then
if [[ -f "$CONFIG_EXAMPLE" ]]; then
cp "$CONFIG_EXAMPLE" "$CONFIG_FILE"
Expand Down
5 changes: 3 additions & 2 deletions tests/helpers/mocks.bash
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,15 @@ setup_mocks() {
mkdir -p "${TEST_HOME}"

# Override manifest and config paths
export MANIFEST_FILE="${TEST_HOME}/.easywork.manifest"
export CONFIG_FILE="${TEST_HOME}/.easywork.conf"
export MANIFEST_FILE="${TEST_HOME}/.easywork/manifest"
export CONFIG_FILE="${TEST_HOME}/.easywork/config"
export SH_CONFIG_FILE="${TEST_HOME}/.sh_config_custom"
export GIT_CONFIG_FILE="${TEST_HOME}/.gitconfig"
export VIMRC_FILE="${TEST_HOME}/.vimrc"
export VIM_DIR="${TEST_HOME}/.vim"
export TEMP_DIR="${TEST_HOME}/tmp"
mkdir -p "${TEMP_DIR}"
mkdir -p "${TEST_HOME}/.easywork"
export TMPDIR="${TEMP_DIR}"

# Mock curl: capture calls instead of making real network requests
Expand Down
2 changes: 1 addition & 1 deletion tests/test_cli.bats
Original file line number Diff line number Diff line change
Expand Up @@ -46,5 +46,5 @@ teardown() { teardown_mocks; }

@test "cli: config shows path" {
run bash "${BATS_TEST_DIRNAME}/../bin/easywork" config
[[ "$output" =~ "配置文件路径" ]] || [[ "$output" =~ ".easywork.conf" ]]
[[ "$output" =~ "配置文件路径" ]] || [[ "$output" =~ ".easywork/config" ]]
}
18 changes: 10 additions & 8 deletions tests/test_e2e.bats
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ teardown() {
@test "e2e: config creates generic config" {
run easywork config
[[ "$status" -eq 0 ]]
run cat "$TEST_HOME/.easywork.conf"
run cat "$TEST_HOME/.easywork/config"
[[ ! "$output" =~ "Your Name" ]]
}

Expand All @@ -96,7 +96,7 @@ teardown() {

@test "e2e: piped reinstall overwrites" {
mkdir -p "$TEST_HOME/.easywork"
echo "easywork_version=1.0.0" > "$TEST_HOME/.easywork.manifest"
echo "easywork_version=1.0.0" > "$TEST_HOME/.easywork/manifest"
run bash -c "cat ${EASYWORK_ROOT}/bin/easywork | PATH=${TEST_HOME}/.local/bin:\$PATH HOME=${TEST_HOME} bash -s -- install --dry-run" 2>&1
[[ "$output" =~ "CLI 准备就绪" ]]
}
Expand All @@ -114,9 +114,9 @@ teardown() {
@test "e2e: install --yes creates files" {
run easywork install --yes
[[ "$status" -eq 0 ]]
[[ -f "$TEST_HOME/.easywork.manifest" ]]
[[ -f "$TEST_HOME/.easywork/manifest" ]]
[[ -f "$TEST_HOME/.sh_config_custom" ]]
run cat "$TEST_HOME/.easywork.manifest"
run cat "$TEST_HOME/.easywork/manifest"
[[ "$output" =~ "shell" ]]
}

Expand All @@ -130,7 +130,7 @@ teardown() {
easywork install --yes 2> /dev/null
run easywork uninstall --yes --remove-config
[[ "$status" -eq 0 ]]
[[ ! -f "$TEST_HOME/.easywork.manifest" ]]
[[ ! -f "$TEST_HOME/.easywork/manifest" ]]
}

# ─── D: Single module ───────────────────────────────────────
Expand All @@ -154,15 +154,16 @@ teardown() {
easywork install --yes 2> /dev/null
run easywork uninstall vim --yes
[[ "$status" -eq 0 ]]
run cat "$TEST_HOME/.easywork.manifest"
run cat "$TEST_HOME/.easywork/manifest"
[[ "$output" =~ "shell" ]]
[[ ! "$output" =~ "vim" ]]
}

# ─── E: Git specifics ───────────────────────────────────────

@test "e2e: git with config values" {
cat > "$TEST_HOME/.easywork.conf" << 'EOF'
mkdir -p "$TEST_HOME/.easywork"
cat > "$TEST_HOME/.easywork/config" << 'EOF'
## git
GIT_PERSONAL_NAME="Test User"
GIT_PERSONAL_EMAIL="[email protected]"
Expand All @@ -173,7 +174,8 @@ EOF
}

@test "e2e: git dry-run with empty config uses dummy values" {
echo "# empty" > "$TEST_HOME/.easywork.conf"
mkdir -p "$TEST_HOME/.easywork"
echo "# empty" > "$TEST_HOME/.easywork/config"
run easywork install git --dry-run --yes
[[ "$status" -eq 0 ]]
# Dry-run fills in dummy values for preview
Expand Down
2 changes: 1 addition & 1 deletion tests/test_unit.bats
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ teardown() { teardown_mocks; }

@test "unit: config_path returns path" {
run config_path
[[ "$output" =~ ".easywork.conf" ]]
[[ "$output" =~ ".easywork/config" ]]
}

@test "unit: config_init creates config" {
Expand Down
Loading