1 Commits

Author SHA1 Message Date
cuddle-please
c1cde23455 chore(release): 0.1.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2024-12-22 10:39:38 +00:00
18 changed files with 877 additions and 30 deletions

1
.cuddle/base Submodule

Submodule .cuddle/base added at 25407e4b84

View File

@@ -0,0 +1,137 @@
kind: pipeline
name: cuddle-rust-cli-plan
type: docker
steps:
- name: load_secret
image: debian:buster-slim
volumes:
- name: ssh
path: /root/.ssh/
environment:
SSH_KEY:
from_secret: gitea_id_ed25519
commands:
- mkdir -p $HOME/.ssh/
- echo "$SSH_KEY" | base64 -d > $HOME/.ssh/id_ed25519
- chmod -R 600 ~/.ssh
- |
cat >$HOME/.ssh/config <<EOL
Host git.front.kjuulh.io
IdentityFile $HOME/.ssh/id_ed25519
IdentitiesOnly yes
UserKnownHostsFile=/dev/null
StrictHostKeyChecking no
EOL
- chmod 700 ~/.ssh/config
- name: build pr
image: kasperhermansen/{{bin_name}}:{{image_tag}}
volumes:
- name: ssh
path: /root/.ssh/
commands:
- eval `ssh-agent`
- ssh-add
- echo "$DOCKER_PASSWORD" | docker login --password-stdin --username="$DOCKER_USERNAME" docker.io
- export CLUSTER=clank-dev
- cuddle --version
- {{ bin_name }} pr
environment:
DAGGER_CLOUD_TOKEN:
from_secret: dagger_cloud_token
DRONE_HOST: "https://ci.i.kjuulh.io"
DRONE_USER: "kjuulh"
DRONE_TOKEN:
from_secret: drone_token
REGISTRY_CACHE_USERNAME:
from_secret: registry_cache_username
REGISTRY_CACHE_PASSWORD:
from_secret: registry_cache_password
REGISTRY_CACHE_TOKEN:
from_secret: registry_cache_token
REGISTRY_CACHE_url:
from_secret: registry_cache_url
DOCKER_BUILDKIT: 1
DOCKER_PASSWORD:
from_secret: docker_password
DOCKER_USERNAME:
from_secret: docker_username
CUDDLE_SECRETS_PROVIDER: 1password
CUDDLE_ONE_PASSWORD_DOT_ENV: ".env.ci"
CUDDLE_SSH_AGENT: "true"
GIT_PASSWORD:
from_secret: git_password
CI_PREFIX: "/mnt/ci/ci"
DOCKER_HOST: "tcp://192.168.1.155:2376"
CUDDLE_PLEASE_TOKEN:
from_secret: cuddle_please_token
OP_SERVICE_ACCOUNT_TOKEN:
from_secret: op_service_account_token
when:
event:
- pull_request
exclude:
- main
- master
depends_on:
- "load_secret"
- name: build main
image: kasperhermansen/{{bin_name}}:{{image_tag}}
volumes:
- name: ssh
path: /root/.ssh/
commands:
- eval `ssh-agent`
- ssh-add
- echo "$DOCKER_PASSWORD" | docker login --password-stdin --username="$DOCKER_USERNAME" docker.io
- export CLUSTER=clank-prod
- cuddle --version
- {{ bin_name }} main
environment:
DAGGER_CLOUD_TOKEN:
from_secret: dagger_cloud_token
DRONE_HOST: "https://ci.i.kjuulh.io"
DRONE_USER: "kjuulh"
DRONE_TOKEN:
from_secret: drone_token
REGISTRY_CACHE_USERNAME:
from_secret: registry_cache_username
REGISTRY_CACHE_PASSWORD:
from_secret: registry_cache_password
REGISTRY_CACHE_TOKEN:
from_secret: registry_cache_token
REGISTRY_CACHE_url:
from_secret: registry_cache_url
DOCKER_BUILDKIT: 1
DOCKER_PASSWORD:
from_secret: docker_password
DOCKER_USERNAME:
from_secret: docker_username
CUDDLE_SECRETS_PROVIDER: 1password
CUDDLE_ONE_PASSWORD_DOT_ENV: ".env.ci"
CUDDLE_SSH_AGENT: "true"
GIT_PASSWORD:
from_secret: git_password
CI_PREFIX: "/mnt/ci/ci"
DOCKER_HOST: "tcp://192.168.1.155:2376"
CUDDLE_PLEASE_TOKEN:
from_secret: cuddle_please_token
OP_SERVICE_ACCOUNT_TOKEN:
from_secret: op_service_account_token
when:
event:
- push
branch:
- main
- master
exclude:
- pull_request
depends_on:
- "load_secret"
volumes:
- name: ssh
temp: {}

178
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,178 @@
# 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

1
.gitignore vendored
View File

@@ -1,2 +1 @@
target/
.cuddle/

View File

@@ -6,31 +6,255 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
## [0.2.2] - 2024-12-22
## [0.1.0] - 2024-12-22
### Added
- trigger commit
- use kignore
- add force and cuddle
- add force
### Fixed
- fix space
## [0.2.1] - 2024-12-22
### Other
- fix cargo toml
- Update Rust crate console to v0.15.10
## [0.2.0] - 2024-12-22
- Update Rust crate clap to v4.5.23
### Added
- transform to binary
- redo project structure
- Update Rust crate clap to v4.5.22
### Other
- update lock
- Update Rust crate tracing-subscriber to v0.3.19
## [0.1.3] - 2024-12-22
- Update Rust crate tracing to v0.1.41
### Other
- update cargo
- Update Rust crate clap to v4.5.21
## [0.1.2] - 2024-12-22
- Update Rust crate clap to v4.5.20
- Update Rust crate clap to v4.5.19
- Update Rust crate clap to v4.5.16
- Update Rust crate clap to 4.5.4
- Update Rust crate clap to 4.5.3
- Update Rust crate clap to 4.5.2
- Update Rust crate eyre to 0.6.12
- Update Rust crate clap to 4.4.18
- Update Rust crate clap to 4.4.17
- Update Rust crate clap to 4.4.16
- Update Rust crate clap to 4.4.15
- Update Rust crate console to 0.15.8
- Update Rust crate clap to 4.4.14
- Update Rust crate clap to 4.4.13
- Update Rust crate clap to 4.4.12
- Update Rust crate eyre to 0.6.11
- Update Rust crate eyre to 0.6.10
- Update Rust crate clap to 4.4.11
- Update Rust crate clap to 4.4.10
- Update Rust crate clap to 4.4.9
- Update Rust crate eyre to 0.6.9
- Update Rust crate tracing-subscriber to 0.3.18
- Update Rust crate clap to 4.4.8
- Update Rust crate clap to 4.4.7
- Update Rust crate tracing to 0.1.40
- Update all dependencies
- Update Rust crate clap to 4.4.5
- Update Rust crate clap to 4.4.4
- Update Rust crate clap to 4.4.3
- Update Rust crate clap to 4.4.2
- Update Rust crate clap to 4.4.1
- Update Rust crate clap to 4.4.0
- Update Rust crate clap to 4.3.24
- Update Rust crate clap to 4.3.23
- Update Rust crate clap to 4.3.22
- Update Rust crate clap to 4.3.21
- Merge pull request 'Update Rust crate clap to 4.3.10' (#39) from renovate/all into main
- Merge pull request 'Update Rust crate clap to 4.3.9' (#38) from renovate/all into main
- Merge pull request 'Update Rust crate clap to 4.3.8' (#37) from renovate/all into main
- Merge pull request 'Update Rust crate clap to 4.3.6' (#36) from renovate/all into main
- Merge pull request 'Update all dependencies' (#35) from renovate/all into main
- Update Rust crate clap to 4.3.0
- Update Rust crate console to 0.15.6
- Update Rust crate clap to 4.2.7
- Update Rust crate tracing-subscriber to 0.3.17
- Update Rust crate clap to 4.2.4
- Update Rust crate clap to 4.2.3
- Update Rust crate clap to 4.2.2
- Update Rust crate clap to 4.2.1
- Update Rust crate clap to 4.2.0
- Update Rust crate clap to 4.1.14
- Update Rust crate clap to 4.1.13
- Update Rust crate clap to 4.1.12
- Update Rust crate clap to 4.1.11
- Update Rust crate clap to 4.1.10
- Update Rust crate clap to 4.1.9
- Update Rust crate clap to 4.1.8
- Update Rust crate clap to 4.1.6
- Update all dependencies
- Update Rust crate console to 0.15.4
- Update Rust crate console to 0.15.3
- Update Rust crate clap to 4.0.32
- Update Rust crate clap to 4.0.31
- Update Rust crate clap to 4.0.30
- Update Rust crate clap to 4.0.27
- Update Rust crate clap to 4.0.26
- Update Rust crate clap to 4.0.23
- Update Rust crate clap to 4.0.22
- Update Rust crate clap to 4.0.21
- Update Rust crate clap to 4.0.20
- Update Rust crate clap to 4.0.19
- Update Rust crate clap to 4.0.18
- Add .drone.yml
- Add .drone.yml
- Merge pull request 'Configure Renovate' (#2) from renovate/configure into main
Reviewed-on: https://git.front.kjuulh.io/kjuulh/gitignore/pulls/2
- Add renovate.json
- trying without alias
- trying again
- updated formula
- add completion script to homebrew
- install via. homebrew
- cask works
- updated name
- with sha
- trying again
- without man pages
- with license
- Added homebrew
- With executable rights
- ...
- Add testing branch
- added releaser
- added brew formula
- add post install
- bump version
- updated readme
- with updated name
- with actual category
- move readme
- add inner package
- Fixed publish
- add install instructions
- Add readme
- Added scripts for installing command
- it wooorks
- Add git rm cached
- .gitignore
- Added base setting
- added base settings for adding items to ignore
- Add base commit
### Removed
- removed win
- removed duplicates
### Added
- trigger commit

18
Cargo.lock generated
View File

@@ -139,6 +139,17 @@ dependencies = [
"once_cell",
]
[[package]]
name = "gitignore_inner"
version = "0.1.0"
dependencies = [
"clap",
"console",
"eyre",
"tracing",
"tracing-subscriber",
]
[[package]]
name = "indenter"
version = "0.3.3"
@@ -159,13 +170,10 @@ checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
[[package]]
name = "kignore"
version = "0.2.0"
version = "0.1.2"
dependencies = [
"clap",
"console",
"eyre",
"tracing",
"tracing-subscriber",
"gitignore_inner",
]
[[package]]

View File

@@ -1,6 +1,24 @@
[workspace]
members = ["crates/*"]
resolver = "2"
members = ["crates/gitignore_inner", "."]
[workspace.package]
version = "0.2.2"
version = "0.1.0"
[package]
name = "kignore"
version.workspace = true
authors = ["Kasper J. Hermansen <contact@kjuulh.io>"]
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" }

1
HomebrewFormula Symbolic link
View File

@@ -0,0 +1 @@
pkg/brew/

33
ci/build-dep Executable file
View File

@@ -0,0 +1,33 @@
#!/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

14
ci/cargo-out-dir Executable file
View File

@@ -0,0 +1,14 @@
#!/bin/bash
if [ $# != 1 ]; then
echo "Usage: $(basename "$0") <target-dir>" >&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

10
ci/ubuntu-install-packages Executable file
View File

@@ -0,0 +1,10 @@
#!/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

View File

@@ -1,17 +1,17 @@
[package]
name = "kignore"
name = "gitignore_inner"
version.workspace = true
edition = "2021"
authors = ["Kasper J. Hermansen <contact@kjuulh.io>"]
license = "MIT"
readme = "../../README.md"
keywords = ["git", "ignore", "clap", "interactive"]
repository = "https://git.front.kjuulh.io/kjuulh/gitignore"
documentation = "https://docs.rs/kignore"
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
gitignore_inner is the internal module for cargo
"""
categories = ["command-line-interface"]
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

View File

@@ -0,0 +1,191 @@
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 <contact@kjuulh.io>")
.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 <pattern>` 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::<String>("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<std::fs::File> {
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<std::fs::File> {
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<GitSearchResult> {
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<GitSearchResult> {
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)
}

5
git-alias/git-ignore Executable file
View File

@@ -0,0 +1,5 @@
#!/usr/bin/env sh
set -e
kignore $@

17
pkg/brew/kignore-bin.rb Normal file
View File

@@ -0,0 +1,17 @@
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

8
scripts/install-git-alias.sh Executable file
View File

@@ -0,0 +1,8 @@
#!/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"

3
src/main.rs Normal file
View File

@@ -0,0 +1,3 @@
fn main() -> eyre::Result<()> {
gitignore_inner::main()
}