git-ents.gitmain
⌘K
foforge
commit b3de641
chore: add project scaffolding
Joseph D. Carpinelli · 2 months ago
tree browse at HEAD · root commit · comment on this commit

Reviews

No reviews of this commit yet — record a verdict below.

Start a review

verdict

.config/clippy.toml @@ -1,0 +1,5 @@ +allow-indexing-slicing-in-tests = true +allow-panic-in-tests = true +allow-unwrap-in-tests = true +allow-expect-in-tests = true +allow-dbg-in-tests = true
.config/committed.toml @@ -1,0 +1,24 @@ +subject_length = 90 +subject_capitalized = false +subject_not_punctuated = true +imperative_subject = true +hard_line_length = 0 +line_length = 230 +style = "conventional" +allowed_types = [ + "fix", + "feat", + "chore", + "docs", + "style", + "refactor", + "revert", + "perf", + "test", +] +allowed_scopes = [ + "checks", + "release", +] +merge_commit = false +no_fixup = false
.config/deny.toml @@ -1,0 +1,7 @@ +[licenses] + +allow = [ + "MIT", + "Apache-2.0", + "Unicode-3.0", +]
.config/pre-commit.yaml @@ -1,0 +1,40 @@ +exclude: ^(.*/)?(CHANGELOG\.md)$ +default_install_hook_types: [pre-commit, commit-msg] +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v6.0.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-json + - id: check-added-large-files + - repo: https://github.com/rvben/rumdl-pre-commit + rev: v0.1.25 + hooks: + - id: rumdl + args: [--config, .config/rumdl.toml, --fix] + - repo: https://github.com/crate-ci/typos + rev: v1.43.5 + hooks: + - id: typos + args: [--write-changes, --force-exclude, --config, .config/typos.toml] + - repo: https://github.com/crate-ci/committed + rev: v1.1.10 + hooks: + - id: committed + args: [--config, .config/committed.toml, --commit-file] + - repo: local + hooks: + - id: fmt + name: cargo fmt + language: system + entry: cargo fmt --all -- + types: [rust] + pass_filenames: false + - id: clippy + name: cargo clippy + language: system + entry: cargo clippy --config .config/clippy.toml --all-targets --all-features -- -D warnings + types: [rust] + pass_filenames: false
.config/release-please-config.json @@ -1,0 +1,16 @@ +{ + "pull-request-header": "Release Notes", + "changelog-path": "CHANGELOG.md", + "draft": false, + "include-component-in-tag": true, + "include-v-in-tag": true, + "release-type": "rust", + "initial-version": "0.0.1", + "draft-pull-request": true, + "pull-request-footer": "This release was generated with [Release Please](https://github.com/googleapis/release-please).", + "packages": { + "crates/git-ents-server": {} + }, + "plugins": [{ "type": "sentence-case" }, { "type": "cargo-workspace" }], + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json" +}
.config/release-please-manifest.json @@ -1,0 +1,3 @@ +{ + "crates/git-ents-server": "0.0.0" +}
.config/rumdl.toml @@ -1,0 +1,16 @@ +[global] +line-length = -1 +force-exclude = true + +exclude = [ + ".git", + "dist", + "build", + "CHANGELOG.md", +] + +respect-gitignore = true + +[MD013] +reflow = true +reflow-mode = "sentence-per-line"
.config/typos.toml @@ -1,0 +1,40 @@ +[files] + +extend-exclude = [ + "CHANGELOG.md" +] + +# Enable checking of hidden files, dot files, and respect no ignore files +# to catch maximum errors +ignore-hidden = false +ignore-files = false +ignore-dot = false +ignore-vcs = false +ignore-global = false +ignore-parent = false + +[default] + +# Check binary files as text to catch errors everywhere +binary = true + +# Enable all checks +check-filename = true +check-file = true + +# Enable unicode support for comprehensive identifier checking +unicode = true + +# Keep hex checking disabled to avoid false positives in code +ignore-hex = true + +# Disable leading digits to catch more identifier errors +identifier-leading-digits = false + +# Use specific locale for stricter checking (en-us for consistency) +locale = "en-us" + +# Keep these empty to not ignore anything by default +extend-ignore-identifiers-re = [] +extend-ignore-words-re = [] +extend-ignore-re = []
.github/workflows/CD.yml @@ -1,0 +1,63 @@ +name: CD + +on: + release: + types: [released, prereleased] + workflow_dispatch: + +permissions: + contents: read + +jobs: + check-tag: + name: Check release tag + if: github.event_name == 'workflow_dispatch' || github.event_name == 'release' + runs-on: ubuntu-latest + outputs: + should-publish: ${{ github.event_name == 'workflow_dispatch' || steps.check.outputs.match == 'true' }} + steps: + - name: Match semver tag + id: check + if: github.event_name == 'release' + run: | + TAG="${{ github.event.release.tag_name }}" + if [[ "$TAG" =~ ^git-vendor-v[0-9]+\.[0-9]+\.[0-9]+(-.*)?$ ]]; then + echo "match=true" >> "$GITHUB_OUTPUT" + else + echo "match=false" >> "$GITHUB_OUTPUT" + fi + + release: + name: Release + needs: check-tag + if: needs.check-tag.outputs.should-publish == 'true' + runs-on: ubuntu-latest + permissions: + # Used to sign the release artifacts + id-token: write + # Used to upload release artifacts + contents: write + # Used to generate artifact attestation + attestations: write + steps: + - uses: actions/checkout@v4 + - uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + cache: true + toolchain: stable + - name: Package crates + run: cargo package --workspace + - name: Generate artifact attestation + uses: actions/attest-build-provenance@v2 + with: + subject-path: "target/package/*.crate" + - name: Publish to crates.io + env: + CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} + IS_PRERELEASE: ${{ github.event.release.prerelease }} + run: | + if [ "$IS_PRERELEASE" = "true" ]; then + cargo publish --workspace --dry-run + else + cargo publish --workspace --token "$CARGO_REGISTRY_TOKEN" + fi
.github/workflows/CI.yml @@ -1,0 +1,156 @@ +name: CI + +on: + push: + branches: + - main + pull_request: + types: + - opened + - reopened + - review_requested + - ready_for_review + - synchronize + workflow_dispatch: + +permissions: + contents: read + +jobs: + linux: + runs-on: ${{ matrix.platform.runner }} + if: ${{ github.event_name == 'workflow_dispatch' || github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.pull_request.draft == false) }} + strategy: + matrix: + platform: + - runner: ubuntu-24.04 + target: x86_64 + - runner: ubuntu-24.04 + target: aarch64 + - runner: ubuntu-24.04 + target: armv7 + - runner: ubuntu-24.04 + target: s390x + - runner: ubuntu-24.04 + target: ppc64le + steps: + - uses: actions/checkout@v4 + - uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + cache: true + - uses: taiki-e/install-action@nextest + - name: Build and compile project + run: cargo nextest run --workspace --all-features --no-run + - name: Run tests + run: cargo nextest run --workspace --all-features + - name: Run doctests + run: cargo test --doc --workspace --all-features + + musllinux: + runs-on: ${{ matrix.platform.runner }} + if: ${{ github.event_name == 'workflow_dispatch' || github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.pull_request.draft == false) }} + strategy: + matrix: + platform: + - runner: ubuntu-24.04 + target: x86_64 + - runner: ubuntu-24.04 + target: aarch64 + - runner: ubuntu-24.04 + target: armv7 + steps: + - uses: actions/checkout@v4 + - uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + cache: true + - uses: taiki-e/install-action@nextest + - name: Build and compile project + run: cargo nextest run --workspace --all-features --no-run + - name: Run tests + run: cargo nextest run --workspace --all-features + - name: Run doctests + run: cargo test --doc --workspace --all-features + + windows: + runs-on: ${{ matrix.platform.runner }} + if: ${{ github.event_name == 'workflow_dispatch' || github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.pull_request.draft == false) }} + strategy: + matrix: + platform: + - runner: windows-latest + target: x64 + steps: + - uses: actions/checkout@v4 + - uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + cache: true + - uses: taiki-e/install-action@nextest + - name: Build and compile project + run: cargo nextest run --workspace --all-features --no-run + - name: Run tests + run: cargo nextest run --workspace --all-features + - name: Run doctests + run: cargo test --doc --workspace --all-features + + macos: + runs-on: ${{ matrix.platform.runner }} + if: ${{ github.event_name == 'workflow_dispatch' || github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.pull_request.draft == false) }} + strategy: + matrix: + platform: + - runner: macos-14 + target: aarch64 + steps: + - uses: actions/checkout@v4 + - uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + cache: true + - uses: taiki-e/install-action@nextest + - name: Build and compile project + run: cargo nextest run --workspace --all-features --no-run + - name: Run tests + run: cargo nextest run --workspace --all-features + - name: Run doctests + run: cargo test --doc --workspace --all-features + + man: + name: man-generation + runs-on: ubuntu-24.04 + if: ${{ github.event_name == 'workflow_dispatch' || github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.pull_request.draft == false) }} + steps: + - uses: actions/checkout@v6 + - uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + cache: true + - name: Cache Cargo registry + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-registry- + - name: Cache Cargo build + uses: actions/cache@v4 + with: + path: target + key: ${{ runner.os }}-cargo-build-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-build- + - name: Generate man pages + run: | + cargo run --package git-vendor -- --generate-man target/debug/man + cargo run --package git-set-attr -- --generate-man target/debug/man + + ci: + name: CI + if: ${{ always() && (github.event_name == 'workflow_dispatch' || github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.pull_request.draft == false)) }} + needs: [linux, musllinux, windows, macos, man] + runs-on: ubuntu-latest + steps: + - run: | + result="${{ (contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled')) && 'failure' || 'success' }}" + echo "result: $result" + [[ "$result" == "success" ]] || exit 1
.github/workflows/Lint.yml @@ -1,0 +1,164 @@ +name: Lint + +on: + pull_request: + types: + - opened + - review_requested + - ready_for_review + - reopened + - synchronize + - edited + workflow_dispatch: + +permissions: + contents: read + pull-requests: read + +jobs: + pre-commit: + name: Run pre-commit checks + runs-on: ubuntu-latest + if: ${{ !github.event.pull_request.draft }} + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.x" + + - name: Install uv + uses: astral-sh/setup-uv@v7 + with: + enable-cache: true + + - name: Install pre-commit and hooks + run: | + uv tool install pre-commit + pre-commit install-hooks -c .config/pre-commit.yaml + + - name: Run pre-commit on all files + run: pre-commit run -a -c .config/pre-commit.yaml + + validate-pr-title: + name: Validate squash commit message + runs-on: ubuntu-latest + if: ${{ github.event.pull_request && github.event.pull_request.draft == false }} + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.x" + + - name: Install uv + uses: astral-sh/setup-uv@v7 + with: + enable-cache: true + + - name: Cache pre-commit + uses: actions/cache@v4 + with: + path: ~/.cache/pre-commit + key: pre-commit-${{ hashFiles('.config/pre-commit.yaml') }} + restore-keys: | + pre-commit- + + - name: Install pre-commit and hooks + run: | + uv tool install pre-commit + pre-commit install-hooks -c .config/pre-commit.yaml + + - name: Create commit message from PR + run: | + cat > /tmp/commit-msg.txt << 'EOF' + ${{ github.event.pull_request.title }} + + ${{ github.event.pull_request.body }} + EOF + echo "--- Commit message to validate ---" + cat /tmp/commit-msg.txt + echo "--- End of commit message ---" + + - name: Find and validate with committed + run: | + # Find the committed binary in pre-commit cache + COMMITTED_BIN=$(find ~/.cache/pre-commit -type f -name committed | head -n 1) + if [ -z "$COMMITTED_BIN" ]; then + echo "Error: committed binary not found in pre-commit cache" + exit 1 + fi + echo "Using committed binary: $COMMITTED_BIN" + "$COMMITTED_BIN" --config .config/committed.toml --commit-file /tmp/commit-msg.txt + + cargo-deny: + name: Run cargo-deny + runs-on: ubuntu-latest + if: ${{ !github.event.pull_request.draft }} + strategy: + matrix: + checks: + - advisories + - bans licenses sources + continue-on-error: ${{ matrix.checks == 'advisories' }} + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Run cargo-deny + uses: EmbarkStudios/cargo-deny-action@v2 + with: + arguments: --all-features + command: check + command-arguments: ${{ matrix.checks }} -c .config/deny.toml + + semver-checks: + name: Semver checks + runs-on: ubuntu-latest + if: | + startsWith(github.head_ref, 'release-please--') && + !github.event.pull_request.draft + steps: + - uses: actions/checkout@v4 + - uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + cache: true + - name: Install cargo-semver-checks + uses: taiki-e/install-action@v2 + with: + tool: cargo-semver-checks + - name: Run semver checks for published crates + run: | + crate_names=$(cargo metadata --no-deps --format-version 1 | jq -r '.packages[].name') + published_pkgs=() + for crate in $crate_names; do + status=$(curl -s -o /dev/null -w "%{http_code}" \ + -H "User-Agent: github-actions-semver-check" \ + "https://crates.io/api/v1/crates/$crate") + if [ "$status" = "200" ]; then + echo "✓ '$crate' is published — will run semver-checks" + published_pkgs+=("--package" "$crate") + else + echo "✗ '$crate' is not yet published (HTTP $status) — skipping" + fi + done + if [ "${#published_pkgs[@]}" -gt 0 ]; then + cargo semver-checks "${published_pkgs[@]}" + else + echo "No crates are published yet — skipping semver checks entirely." + fi + + lint: + name: Lint + if: ${{ always() && !github.event.pull_request.draft }} + needs: [pre-commit, validate-pr-title, cargo-deny, semver-checks] + runs-on: ubuntu-latest + steps: + - run: | + result="${{ (contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled')) && 'failure' || 'success' }}" + echo "result: $result" + [[ "$result" == "success" ]] || exit 1
.github/workflows/Version.yml @@ -1,0 +1,31 @@ +on: + push: + branches: + - main + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +name: Version + +jobs: + release-please: + name: Trigger release pull-request + runs-on: ubuntu-latest + if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' + outputs: + pr: ${{ steps.release.outputs.pr }} + steps: + - uses: actions/create-github-app-token@v1 + id: app-token + with: + app-id: ${{ secrets.DEV_BOT_APP_ID }} + private-key: ${{ secrets.DEV_BOT_KEY }} + - uses: googleapis/release-please-action@v4 + id: release + with: + token: ${{ steps.app-token.outputs.token }} + config-file: .config/release-please-config.json + manifest-file: .config/release-please-manifest.json
COPYRIGHT @@ -1,0 +1,1 @@ +Copyright (c) 2026 Joseph D. Carpinelli
Cargo.toml @@ -1,0 +1,83 @@ +[workspace] +resolver = "3" +members = ["crates/git-ents-server"] + +[workspace.package] +edition = "2024" +publish = true +license = "MIT OR Apache-2.0" + +[workspace.lints.rust] +unsafe_code = "forbid" +missing_docs = "warn" + +[workspace.dependencies] +clap = { version = "4.5.60", features = ["derive"] } +clap_mangen = "0.2.31" +gix = { version = "0.83", features = ["no-default-features"] } +tempfile = "3" +thiserror = "2" + +# These lint configurations were originally pulled from [Evan Schwartz][1]. +# [1]: https://emschwartz.me/your-clippy-config-should-be-stricter/ +[workspace.lints.clippy] + +# Don't Panic - prevent panics from unwraps and unsafe slicing or indexing +string_slice = "warn" +indexing_slicing = "warn" +unwrap_used = "warn" +panic = "warn" +todo = "warn" +unimplemented = "warn" +unreachable = "warn" +get_unwrap = "warn" +unwrap_in_result = "warn" +unchecked_time_subtraction = "warn" +panic_in_result_fn = "warn" + +# Optional - see post for caveats +expect_used = "warn" +arithmetic_side_effects = "warn" + +# Don't Fail Silently - prevent dropped futures and swallowed errors +let_underscore_future = "warn" +let_underscore_must_use = "warn" +unused_result_ok = "warn" +map_err_ignore = "warn" +assertions_on_result_states = "warn" + +# Don't Do Bad Async Stuff - prevent deadlocks and concurrency bugs +await_holding_lock = "warn" +await_holding_refcell_ref = "warn" +if_let_mutex = "warn" # only relevant on editions before 2024 +large_futures = "warn" + +# Don't Do Unsafe Things with Memory +mem_forget = "warn" +undocumented_unsafe_blocks = "warn" +multiple_unsafe_ops_per_block = "warn" +unnecessary_safety_doc = "warn" +unnecessary_safety_comment = "warn" + +# Don't Do Potentially Incorrect Things with Numbers +float_cmp = "warn" +float_cmp_const = "warn" +lossy_float_literal = "warn" +cast_sign_loss = "warn" +invalid_upcast_comparisons = "warn" +cast_possible_wrap = "warn" +cast_precision_loss = "warn" +cast_possible_truncation = "warn" + +# Don't Do Bad Things That are Easy to Avoid +rc_mutex = "warn" +debug_assert_with_mut_call = "warn" +iter_not_returning_iterator = "warn" +expl_impl_clone_on_copy = "warn" +infallible_try_from = "warn" +dbg_macro = "warn" + +# Don't `allow` Your Way Around These Lints - every suppression must be +# a deliberate #[expect(..., reason = "…")] rather than a silent #[allow] +allow_attributes = "warn" +allow_attributes_without_reason = "warn"
LICENSE-APACHE @@ -1,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.
LICENSE-MIT @@ -1,0 +1,17 @@ +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.
README.md @@ -1,0 +1,43 @@ +# 🎁 `git-vendor` + +*An in-source vendoring alternative to submodules and subtrees.* + +<!-- rumdl-disable MD013 --> +[![CI](https://github.com/git-ents/git-vendor/actions/workflows/CI.yml/badge.svg)](https://github.com/git-ents/git-vendor/actions/workflows/CI.yml) +[![CD](https://github.com/git-ents/git-vendor/actions/workflows/CD.yml/badge.svg)](https://github.com/git-ents/git-vendor/actions/workflows/CD.yml) +<!-- rumdl-enable MD013 --> + +> [!CAUTION] +> This project is being refactored to improve the API, and use [Gitoxide][gitoxide] for all repository operations. +> The last [release] is fully featured: please try that (alpha) release if you want to try the project out. +> When the refactor is finished, this warning will be removed. + +[gitoxide]: https://github.com/GitoxideLabs/gitoxide +[release]: https://github.com/git-ents/git-vendor/releases/tag/git-vendor-v1.0.0-alpha.1 + +## About + +To support a more expansive usage of the Git object database — as is the goal for other projects within the [`git-ents`](https://github.com/git-ents) organization — new tooling is needed. +This project provides a command that allows users to fetch and merge remote content. + +You may see the terms *porcelain* and *plumbing* used across this project. +These are [borrowed from Git itself](https://git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Porcelain): porcelain refers to user-facing commands, and plumbing refers to the lower-level libraries and commands they are built on. + +## Crates + +| Crate | Description | API | +|---|---|----| +| [`git-vendor`](crates/git-vendor/) | An in-source vendoring alternative to submodules and subtrees. | Porcelain | +| [`git-set-attr`](crates/git-set-attr/) | Set Git attributes programmatically. | Plumbing | + +## Alternatives + +This is not the first `git-vendor` project. +In fact, despite being developed independently, this project was published *after* multiple other `git-vendor` projects. + +The [`thejoshwolfe/git-vendor`][thejoshwolfe] project appears to be near identical. +Another project, [`brettlangdon/git-vendor`][brettlangdon], carries the same name but has slightly different goals; it additionally supports contributing changes upstream. +Please check out each of those projects! + +[brettlangdon]: https://github.com/brettlangdon/git-vendor +[thejoshwolfe]: https://github.com/thejoshwolfe/git-vendor
crates/git-ents-server/Cargo.toml @@ -1,0 +1,11 @@ +[package] +name = "git-ents-server" +version = "0.0.0" +edition.workspace = true +publish.workspace = true +license.workspace = true + +[dependencies] + +[lints] +workspace = true
crates/git-ents-server/src/main.rs @@ -1,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +}