The test hardcoded 'refs/heads/main' for update-ref, but without
init.defaultBranch config (as in nix sandbox), git defaults to 'master'.
This caused the signed commit to be on a different branch than HEAD,
so arc log showed the unsigned commit instead.
Use 'git symbolic-ref HEAD' to get the actual branch name.
Also fix missing blank line separator between header and body.
Detect GPG vs SSH signatures when displaying commits. GPG-signed
commits from cloned/migrated git repos now show as valid with the
issuer key ID instead of failing SSH signature verification.
- Extract git commit signatures (gpgsig) during clone, migrate, and pull
- Sign git commits on push/sync when a signing key is configured
- Add tests for signature preservation and signed push
- Replace rmp-serde with bincode 1.x in Cargo.toml
- Update store.rs serialization/deserialization and ID hashing
- Rename model.rs helpers from to_msgpack/from_msgpack to to_bytes/from_bytes
- Consolidate MsgPack/MsgPackDecode error variants into single Bincode variant
- Remove skip_serializing_if on ssh_signature (incompatible with bincode)
- Update all documentation to reflect bincode storage format
The imported counter was incrementing once per ref processed, not once
per commit converted. Since git_to_arc recursively walks the entire
ancestor chain, a single ref import would convert all reachable commits
but only count as 1.
Fix by measuring the growth of the git-to-arc map before and after the
import loop. Also strengthen tests to assert exact counts for commits,
bookmarks, and tags.
Replace the boolean verbose flag with a u8 counter using
clap's ArgAction::Count. The debug! macro now accepts an
optional level as its first argument.
Level 1 (-v): command dispatch, high-level operations
Level 2 (-vv): internal ops (scanning, resolving, merging)
Level 3 (-vvv): low-level I/O (commit objects, hashing, trees)
the credential callback had no attempt counter, causing libgit2 to
retry indefinitely when ssh-agent auth failed (hanging on clone).
it also had no fallback to key files on disk, failing when the agent
wasn't running.
replace the stateless cred_callback with make_cred_callback() which
caps retries at 4, tries ssh-agent first then falls back to reading
~/.ssh/id_ed25519, id_rsa, id_ecdsa directly, and returns an error
instead of sending empty credentials for plaintext auth.
Add a centralized ui module with Arc's visual identity: colored commit
IDs (magenta), bookmarks (cyan), tags (yellow), status symbols, and
diff highlighting. Update all command output and tests accordingly.
Extract shared cred_callback for SSH agent authentication and use it
in clone, push, and pull. Wrap clone in an outer function that removes
the target directory if it was freshly created and cloning fails.
- Add ssh-key crate dependency for SSHSIG format signing/verification
- Add signing module with sign, verify, and fingerprint functions
- Add ssh_signature field to Commit model (optional, backward-compatible)
- Integrate signing into commit flow (signs when user.key is configured)
- Show [signed] tag in log output for signed commits
- Show signature fingerprint and verification status in show output
- Gracefully degrade if key is missing/invalid (warns, commits unsigned)
- Add openssh to nix flake nativeCheckInputs for ssh-keygen in tests
- Add comprehensive signing tests covering signed/unsigned commits
- config set/get/show/unset commands with dotted key paths (user.name, default.bookmark, aliases.c, etc.)
- local config overrides global config per rule 21
- alias expansion at CLI level before dispatch per rule 23
- InvalidConfigKey error variant
- 28 tests covering all config operations, global/local resolution, and alias expansion
Add named stash support with create, use, push, pop, rm, and list
commands. Stashes are stored as YAML in .arc/stashes/named/ with a
stack-based push/pop model. Active stash tracked in state.yml.
- stash push saves dirty changes and resets worktree to clean state
- stash pop requires clean worktree and matching HEAD base commit
- 28 integration tests covering all commands and edge cases
- new error variants: StashAlreadyExists, StashNotFound, NoActiveStash,
NothingToStash, StashEmpty, StashBaseMismatch
- Add reset command to discard worktree changes (all or specific files)
- Add revert command to create inverse commits (preserving immutability)
- Add merge command with three-way merge and conflict detection
- Add graft command to cherry-pick commits onto bookmarks
- Create merge.rs with file-level and line-level three-way merge engine
- Create modify.rs orchestrating undo/modification operations
- Add MergeConflicts and NoMergeBase error variants
- Make refs utility functions (write_tree, clean_tracked_files) public
- Make inspect::myers_diff public for reuse in merge engine
- Add comprehensive tests for all four commands
Add validate_ref_name() to reject ref names with separators, .., or
leading dots. Add validate_repo_path() to reject absolute paths and
parent-directory traversal in repo-relative paths.
- Add src/refs.rs with mark_add/rm/list/rename, tag_add/rm/list, switch
- Bookmarks stored as YAML RefTarget files in .arc/bookmarks/
- Tags stored as YAML RefTarget files in .arc/tags/ (immutable)
- Switch reconstructs worktree from delta chain, checks for dirty state
- Add error variants: BookmarkNotFound, BookmarkAlreadyExists, TagNotFound,
TagAlreadyExists, CannotRemoveActiveMark, DirtyWorktree
- Wire up CLI dispatch for mark, tag, and switch commands
- Fix cli.rs tests to run mark/tag list within a repo context
- Add 35 new tests across tests/mark.rs, tests/tag.rs, tests/switch.rs
- arc log: shows commit history newest-first with optional range support
- arc show: displays commit details by bookmark/tag/commit-id/prefix
- arc history: blame-style line attribution using Myers diff algorithm
- New resolve module for target resolution (bookmark → tag → commit prefix)
- New inspect module with timestamp formatting (no extra deps)
- Tests for all three commands (17 new tests, 82 total)
- Add commit command with auto-change detection (no staging area)
- Add status command showing added/modified/deleted files
- Add diff command with unified diff output
- Store commits as ZSTD-compressed MessagePack in .arc/commits/<id>.zst
- Generate commit/delta IDs via SHA-256 hashing
- Reconstruct committed state by replaying delta chains
- Add ignore pattern matching with glob support (.arcignore/.ignore)
- Always exclude .arc/ directory from worktree scanning
- Update HEAD and bookmark refs on commit
- Add NothingToCommit error variant
- Add zstd, sha2, hex dependencies
- Add 30 new tests across commit, status, diff, and tracking