From fa7041187f46ae5086148347ea00e0c7022a72a0 Mon Sep 17 00:00:00 2001 From: kjuulh Date: Sun, 22 Dec 2024 11:51:36 +0100 Subject: [PATCH] feat: redo project structure Signed-off-by: kjuulh --- .github/workflows/release.yml | 178 ---------------- Cargo.lock | 16 +- Cargo.toml | 22 +- HomebrewFormula | 1 - ci/build-dep | 33 --- ci/cargo-out-dir | 14 -- ci/ubuntu-install-packages | 10 - crates/gitignore_inner/src/.main.rs.rustfmt | 191 ------------------ .../{gitignore_inner => kignore}/Cargo.toml | 8 +- .../{gitignore_inner => kignore}/src/lib.rs | 0 git-alias/git-ignore | 5 - pkg/brew/kignore-bin.rb | 17 -- scripts/install-git-alias.sh | 8 - src/main.rs | 3 - 14 files changed, 10 insertions(+), 496 deletions(-) delete mode 100644 .github/workflows/release.yml delete mode 120000 HomebrewFormula delete mode 100755 ci/build-dep delete mode 100755 ci/cargo-out-dir delete mode 100755 ci/ubuntu-install-packages delete mode 100644 crates/gitignore_inner/src/.main.rs.rustfmt rename crates/{gitignore_inner => kignore}/Cargo.toml (84%) rename crates/{gitignore_inner => kignore}/src/lib.rs (100%) delete mode 100755 git-alias/git-ignore delete mode 100644 pkg/brew/kignore-bin.rb delete mode 100755 scripts/install-git-alias.sh delete mode 100644 src/main.rs diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 5726149..0000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,178 +0,0 @@ -# The way this works is the following: -# -# The create-release job runs purely to initialize the GitHub release itself -# and to output upload_url for the following job. -# -# The build-release job runs only once create-release is finished. It gets the -# release upload URL from create-release job outputs, then builds the release -# executables for each supported platform and attaches them as release assets -# to the previously created release. -# -# The key here is that we create the release only once. -# -# Reference: -# https://eugene-babichenko.github.io/blog/2020/05/09/github-actions-cross-platform-auto-releases/ - -name: release -on: - push: - # Enable when testing release infrastructure on a branch. - branches: - - kjuulh/test - tags: - - "[0-9]+.[0-9]+.[0-9]+" -jobs: - create-release: - name: create-release - runs-on: ubuntu-22.04 - # env: - # Set to force version number, e.g., when no tag exists. - # KIGNORE_VERSION: TEST-0.0.0 - outputs: - upload_url: ${{ steps.release.outputs.upload_url }} - kignore_version: ${{ env.KIGNORE_VERSION }} - steps: - - name: Get the release version from the tag - shell: bash - if: env.KIGNORE_VERSION == '' - run: | - # Apparently, this is the right way to get a tag name. Really? - # - # See: https://github.community/t5/GitHub-Actions/How-to-get-just-the-tag-name/m-p/32167/highlight/true#M1027 - echo "KIGNORE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV - echo "version is: ${{ env.KIGNORE_VERSION }}" - - name: Create GitHub release - id: release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: ${{ env.KIGNORE_VERSION }} - release_name: ${{ env.KIGNORE_VERSION }} - - build-release: - name: build-release - needs: ["create-release"] - runs-on: ${{ matrix.os }} - env: - # For some builds, we use cross to test on 32-bit and big-endian - # systems. - CARGO: cargo - # When CARGO is set to CROSS, this is set to `--target matrix.target`. - TARGET_FLAGS: "" - # When CARGO is set to CROSS, TARGET_DIR includes matrix.target. - TARGET_DIR: ./target - # Emit backtraces on panics. - RUST_BACKTRACE: 1 - # Build static releases with PCRE2. - PCRE2_SYS_STATIC: 1 - strategy: - matrix: - build: [linux, linux-arm, macos] #, win-msvc, win-gnu, win32-msvc] - include: - - build: linux - os: ubuntu-22.04 - rust: nightly - target: x86_64-unknown-linux-musl - - build: linux-arm - os: ubuntu-22.04 - rust: nightly - target: arm-unknown-linux-gnueabihf - - build: macos - os: macos-12 - rust: nightly - target: - x86_64-apple-darwin - # - build: win-msvc - # os: windows-2022 - # rust: nightly - # target: x86_64-pc-windows-msvc - # - build: win-gnu - # os: windows-2022 - # rust: nightly-x86_64-gnu - # target: x86_64-pc-windows-gnu - # - build: win32-msvc - # os: windows-2022 - # rust: nightly - # target: i686-pc-windows-msvc - - steps: - - name: Checkout repository - uses: - actions/checkout@v3 - - #- name: Install packages (Ubuntu) - # if: matrix.os == 'ubuntu-22.04' - # run: | - # ci/ubuntu-install-packages - - - name: Install Rust - uses: dtolnay/rust-toolchain@master - with: - toolchain: ${{ matrix.rust }} - target: ${{ matrix.target }} - - - name: Use Cross - shell: bash - run: | - cargo install cross - echo "CARGO=cross" >> $GITHUB_ENV - echo "TARGET_FLAGS=--target ${{ matrix.target }}" >> $GITHUB_ENV - echo "TARGET_DIR=./target/${{ matrix.target }}" >> $GITHUB_ENV - - - name: Show command used for Cargo - run: | - echo "cargo command is: ${{ env.CARGO }}" - echo "target flag is: ${{ env.TARGET_FLAGS }}" - echo "target dir is: ${{ env.TARGET_DIR }}" - - - name: Build release binary - run: ${{ env.CARGO }} build --verbose --release ${{ env.TARGET_FLAGS }} - - - name: Strip release binary (linux and macos) - if: matrix.build == 'linux' || matrix.build == 'macos' - run: strip "target/${{ matrix.target }}/release/kignore" - - - name: Strip release binary (arm) - if: matrix.build == 'linux-arm' - run: | - docker run --rm -v \ - "$PWD/target:/target:Z" \ - rustembedded/cross:arm-unknown-linux-gnueabihf \ - arm-linux-gnueabihf-strip \ - /target/arm-unknown-linux-gnueabihf/release/kignore - - - name: Build archive - shell: bash - run: | - outdir="$(ci/cargo-out-dir "${{ env.TARGET_DIR }}")" - staging="kignore-${{ needs.create-release.outputs.kignore_version }}-${{ matrix.target }}" - mkdir -p "$staging"/{complete,doc} - - cp {README.md,LICENSE-MIT} "$staging/" - #cp {CHANGELOG.md,FAQ.md,GUIDE.md} "$staging/doc/" - #cp "$outdir"/{rg.bash,rg.fish,_rg.ps1} "$staging/complete/" - #cp complete/_rg "$staging/complete/" - - if [ "${{ matrix.os }}" = "windows-2022" ]; then - cp "target/${{ matrix.target }}/release/kignore.exe" "$staging/" - 7z a "$staging.zip" "$staging" - echo "ASSET=$staging.zip" >> $GITHUB_ENV - else - cp "git-alias/git-ignore" "$staging/" - # The man page is only generated on Unix systems. - #cp "$outdir"/kignore.1 "$staging/doc/" - cp "target/${{ matrix.target }}/release/kignore" "$staging/" - tar czf "$staging.tar.gz" "$staging" - echo "ASSET=$staging.tar.gz" >> $GITHUB_ENV - fi - - - name: Upload release archive - uses: actions/upload-release-asset@v1.0.2 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ needs.create-release.outputs.upload_url }} - asset_path: ${{ env.ASSET }} - asset_name: ${{ env.ASSET }} - asset_content_type: application/octet-stream diff --git a/Cargo.lock b/Cargo.lock index 68b7ee3..201fd9e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -139,17 +139,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "gitignore_inner" -version = "0.1.3" -dependencies = [ - "clap", - "console", - "eyre", - "tracing", - "tracing-subscriber", -] - [[package]] name = "indenter" version = "0.3.3" @@ -172,8 +161,11 @@ checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" name = "kignore" version = "0.1.3" dependencies = [ + "clap", + "console", "eyre", - "gitignore_inner", + "tracing", + "tracing-subscriber", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 02e73c8..c3821e8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,24 +1,6 @@ [workspace] -members = ["crates/gitignore_inner", "."] +members = ["crates/*"] +resolver = "2" [workspace.package] version = "0.1.3" - -[package] -name = "kignore" -version.workspace = true -authors = ["Kasper J. Hermansen "] -license = "MIT" -readme = "README.md" -keywords = ["git", "ignore", "clap", "interactive"] -repository = "https://github.com/kjuulh/gitignore" -documentation = "https://docs.rs/gitignore" -description = """ -kignore is a tool for easily adding patterns to .gitignore and cleaning up afterwards -""" -categories = ["command-line-interface"] -edition = "2021" - -[dependencies] -eyre = "0.6.12" -gitignore_inner = { path = "crates/gitignore_inner", version = "0.1.0" } diff --git a/HomebrewFormula b/HomebrewFormula deleted file mode 120000 index 993869f..0000000 --- a/HomebrewFormula +++ /dev/null @@ -1 +0,0 @@ -pkg/brew/ \ No newline at end of file diff --git a/ci/build-dep b/ci/build-dep deleted file mode 100755 index 1f8cce1..0000000 --- a/ci/build-dep +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -set -e -D="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" - -# This script builds a binary dpkg for Debian based distros. It does not -# currently run in CI, and is instead run manually and the resulting dpkg is -# uploaded to GitHub via the web UI. -# -# Note that this requires 'cargo deb', which can be installed with -# 'cargo install cargo-deb'. -# -# This should be run from the root of the ripgrep repo. - -if ! command -V cargo-deb > /dev/null 2>&1; then - echo "cargo-deb command missing" >&2 - exit 1 -fi - -# 'cargo deb' does not seem to provide a way to specify an asset that is -# created at build time, such as ripgrep's man page. To work around this, -# we force a debug build, copy out the man page (and shell completions) -# produced from that build, put it into a predictable location and then build -# the deb, which knows where to look. -cargo build - -DEPLOY_DIR=deployment/deb -OUT_DIR="$("$D"/cargo-out-dir target/debug/)" -mkdir -p "$DEPLOY_DIR" - -# Since we're distributing the dpkg, we don't know whether the user will have -# PCRE2 installed, so just do a static build. -PCRE2_SYS_STATIC=1 cargo deb --target x86_64-unknown-linux-musl diff --git a/ci/cargo-out-dir b/ci/cargo-out-dir deleted file mode 100755 index 9c0712b..0000000 --- a/ci/cargo-out-dir +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -if [ $# != 1 ]; then - echo "Usage: $(basename "$0") " >&2 - exit 2 -fi - -# This works by finding the most recent stamp file, which is produced by -# every ripgrep build. -target_dir="$1" -find "$target_dir" -name kignore-stamp -print0 \ - | xargs -0 ls -t \ - | head -n1 \ - | xargs dirname diff --git a/ci/ubuntu-install-packages b/ci/ubuntu-install-packages deleted file mode 100755 index 6ff8ecc..0000000 --- a/ci/ubuntu-install-packages +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -if ! command -V sudo; then - apt-get update - apt-get install -y --no-install-recommends sudo -fi -sudo apt-get update -sudo apt-get install -y --no-install-recommends \ - zsh xz-utils liblz4-tool musl-tools \ - brotli zstd diff --git a/crates/gitignore_inner/src/.main.rs.rustfmt b/crates/gitignore_inner/src/.main.rs.rustfmt deleted file mode 100644 index 2778e75..0000000 --- a/crates/gitignore_inner/src/.main.rs.rustfmt +++ /dev/null @@ -1,191 +0,0 @@ -use clap::{Arg, Command}; -use eyre::{Context, ContextCompat}; -use std::io::prelude::*; -use std::{env::current_dir, io::Read, path::PathBuf}; - -fn main() -> eyre::Result<()> { - let matches = Command::new("gitignore") - .version("0.1") - .author("Kasper J. Hermansen ") - .about("Easily ignore items and remove from git state") - .long_about("git ignore is a utility tool for easily adding patterns to your .gitignore file. -Easily add patterns using `git ignore ` this will by default also help you remove committed code violating these patterns - ") - .propagate_version(true) - .arg( - Arg::new("pattern") - .help("the pattern you want to ignore") - .long_help("the pattern you want to ignore in the nearest .gitignore file") - .required(true), - ).arg( - Arg::new("log-level").long("log-level").help("choose a log level and get more messages").long_help("Choose a log level and get more message, defaults to [INFO]")) - .get_matches(); - - let pattern = matches - .get_one::("pattern") - .context("missing [pattern]")?; - - add_gitignore_pattern(pattern) -} - -enum GitActions { - AddPattern { - git_path: PathBuf, - gitignore_path: PathBuf, - }, - CreateIgnoreAndAddPattern { - git_path: PathBuf, - }, -} - -fn add_gitignore_pattern(pattern: &String) -> eyre::Result<()> { - let curdir = current_dir().context( - "could not find current_dir, you may not have permission to access that directory", - )?; - let actions = match search_for_dotgitignore(&curdir)? { - // If we have an ignore path, make sure it is in a git repo as well - GitSearchResult::GitIgnore(ignorepath) => match search_for_git_root(&curdir)? { - GitSearchResult::Git(gitpath) => GitActions::AddPattern { - git_path: gitpath, - gitignore_path: ignorepath, - }, - _ => return Err(eyre::anyhow!("could not find parent git directory")), - }, - // Find the nearest git repo - GitSearchResult::Git(gitpath) => { - GitActions::CreateIgnoreAndAddPattern { git_path: gitpath } - } // We will always have either above, or an error so we have no default arm - }; - - match actions { - GitActions::AddPattern { - git_path, - gitignore_path, - } => { - let mut gitignore_file = open_gitignore_file(&gitignore_path)?; - // TODO: search for pattern in file - let mut gitignore_content = String::new(); - gitignore_file - .read_to_string(&mut gitignore_content) - .context(format!( - "could not read file: {}", - gitignore_path.to_string_lossy() - ))?; - if gitignore_content.contains(pattern) { - return Ok(()); - } - - writeln!(gitignore_file, "{}", pattern).context("could not write contents to file")?; - gitignore_file - .sync_all() - .context("failed to write data to disk")?; - } - GitActions::CreateIgnoreAndAddPattern { git_path } => { - // TODO: Create gitignore file in root - let mut gitignore_file = create_gitignore_file(&git_path)?; - // TODO: do same as above - writeln!(gitignore_file, "{}", pattern).context("could not write contents to file")?; - gitignore_file - .sync_all() - .context("failed to write data to disk")?; - } - } - - // TODO: Run git rm -r --cached on the .git root - - Ok(()) -} - -fn create_gitignore_file(gitroot: &PathBuf) -> eyre::Result { - let mut ignore_path = gitroot.clone(); - if !ignore_path.pop() { - return Err(eyre::anyhow!("could not open parent dir")); - } - ignore_path.push(".gitignore"); - let file = std::fs::File::create(ignore_path.clone()).context(format!( - "could not create file at path: {}", - ignore_path.to_string_lossy() - ))?; - - Ok(file) -} - -fn open_gitignore_file(gitignore: &PathBuf) -> eyre::Result { - let file = std::fs::OpenOptions::new() - .read(true) - .write(true) - .open(gitignore) - .context(format!( - "could not create file at path: {}", - gitignore.to_string_lossy() - ))?; - - return Ok(file); -} - -enum GitSearchResult { - GitIgnore(PathBuf), - Git(PathBuf), -} - -fn search_for_git_root(path: &PathBuf) -> eyre::Result { - if !path.is_dir() { - return Err(eyre::anyhow!( - "path is not a dir: {}", - path.to_string_lossy() - )); - } - - let direntries = std::fs::read_dir(path) - .context(format!("could not open dir: {}", path.to_string_lossy()))?; - for direntry in direntries { - let entry = direntry.context("could not access file")?; - - let file_name = entry.file_name().to_os_string(); - match file_name.to_str().context("could not convert to str")? { - ".git" => return Ok(GitSearchResult::Git(entry.path())), - _ => {} - } - } - - let mut upwards_par = path.clone(); - if !upwards_par.pop() { - return Err(eyre::anyhow!( - "no parent exists, cannot check further, you may not be in a git repository" - )); - } - - search_for_git_root(&upwards_par) -} - -fn search_for_dotgitignore(path: &PathBuf) -> eyre::Result { - if !path.is_dir() { - return Err(eyre::anyhow!( - "path is not a dir: {}", - path.to_string_lossy() - )); - } - - let direntries = std::fs::read_dir(path) - .context(format!("could not open dir: {}", path.to_string_lossy()))?; - for direntry in direntries { - let entry = direntry.context("could not access file")?; - - let file_name = entry.file_name().to_os_string(); - - match file_name.to_str().context("could not convert to str")? { - ".gitignore" => return Ok(GitSearchResult::GitIgnore(entry.path())), - ".git" => return Ok(GitSearchResult::Git(entry.path())), - _ => {} - } - } - - let mut upwards_par = path.clone(); - if !upwards_par.pop() { - return Err(eyre::anyhow!( - "no parent exists, cannot check further, you may not be in a git repository" - )); - } - - search_for_dotgitignore(&upwards_par) -} diff --git a/crates/gitignore_inner/Cargo.toml b/crates/kignore/Cargo.toml similarity index 84% rename from crates/gitignore_inner/Cargo.toml rename to crates/kignore/Cargo.toml index e594867..a65a3de 100644 --- a/crates/gitignore_inner/Cargo.toml +++ b/crates/kignore/Cargo.toml @@ -1,17 +1,17 @@ [package] -name = "gitignore_inner" +name = "kignore" version.workspace = true -edition = "2021" authors = ["Kasper J. Hermansen "] license = "MIT" -readme = "../../README.md" +readme = "README.md" keywords = ["git", "ignore", "clap", "interactive"] repository = "https://github.com/kjuulh/gitignore" documentation = "https://docs.rs/gitignore" description = """ -gitignore_inner is the internal module for cargo +kignore is a tool for easily adding patterns to .gitignore and cleaning up afterwards """ categories = ["command-line-interface"] +edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/crates/gitignore_inner/src/lib.rs b/crates/kignore/src/lib.rs similarity index 100% rename from crates/gitignore_inner/src/lib.rs rename to crates/kignore/src/lib.rs diff --git a/git-alias/git-ignore b/git-alias/git-ignore deleted file mode 100755 index 13b646c..0000000 --- a/git-alias/git-ignore +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env sh - -set -e - -kignore $@ diff --git a/pkg/brew/kignore-bin.rb b/pkg/brew/kignore-bin.rb deleted file mode 100644 index 770c871..0000000 --- a/pkg/brew/kignore-bin.rb +++ /dev/null @@ -1,17 +0,0 @@ -class KignoreBin < Formula - desc "Easily add items to .gitignore and cleanup afterwards" - homepage "https://github.com/kjuulh/gitignore" - version "0.1.3" - license "MIT" - - if OS.mac? - url "https://github.com/kjuulh/gitignore/releases/download/#{version}/kignore-#{version}-x86_64-apple-darwin.tar.gz" - sha256 "fa4e520854f0cc8222625b0398c778d4f474dd7a9ad1da1dd9a326ff7893bd44" - end - - def install - bin.install "kignore" - bin.install "git-ignore" - end -end - diff --git a/scripts/install-git-alias.sh b/scripts/install-git-alias.sh deleted file mode 100755 index 7e4a897..0000000 --- a/scripts/install-git-alias.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -set -e - -mkdir ~/.git-bins -cp git-alias/git-ignore ~/.git-bins/git-ignore - -echo "Make sure to add ~/.git-bins to your PATH" diff --git a/src/main.rs b/src/main.rs deleted file mode 100644 index 3413cf3..0000000 --- a/src/main.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() -> eyre::Result<()> { - gitignore_inner::main() -}