1
0
mirror of https://github.com/j178/prek.git synced 2026-04-25 02:11:36 +02:00

Fix large file check to use staged_get instead of intent_add (#332)

This commit is contained in:
Miao
2025-08-04 15:55:07 +02:00
committed by GitHub
parent 40bdff4d7f
commit 48a9252163
3 changed files with 142 additions and 2 deletions
@@ -3,7 +3,7 @@ use std::collections::{HashMap, HashSet};
use clap::Parser;
use futures::StreamExt;
use crate::git::{intent_to_add_files, lfs_files};
use crate::git::{get_staged_files, lfs_files};
use crate::hook::Hook;
use crate::run::CONCURRENCY;
@@ -39,7 +39,7 @@ pub(crate) async fn check_added_large_files(
let filter = if args.enforce_all {
FileFilter::NoFilter
} else {
let add_files: HashSet<_> = intent_to_add_files().await?.into_iter().collect();
let add_files: HashSet<_> = get_staged_files().await?.into_iter().collect();
FileFilter::Files(add_files)
};
+105
View File
@@ -98,3 +98,108 @@ fn end_of_file_fixer_hook() -> Result<()> {
Ok(())
}
#[test]
fn check_added_large_files_hook() -> Result<()> {
let context = TestContext::new();
context.init_project();
context.configure_git_author();
// Create an initial commit
let cwd = context.work_dir();
cwd.child("README.md").write_str("Initial commit")?;
context.git_add(".");
context.git_commit("Initial commit");
context.write_pre_commit_config(indoc::indoc! {r"
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0
hooks:
- id: check-added-large-files
args: ['1']
"});
// Create test files
cwd.child("small_file.txt").write_str("Hello World\n")?;
let large_file = cwd.child("large_file.txt");
large_file.write_binary(&[0; 2048])?; // 2KB file
context.git_add(".");
// First run: hook should fail because of the large file
cmd_snapshot!(context.filters(), context.run(), @r#"
success: false
exit_code: 1
----- stdout -----
check for added large files..............................................Failed
- hook id: check-added-large-files
- exit code: 1
large_file.txt (2 KB) exceeds 1 KB
----- stderr -----
"#);
// Commit the files
context.git_add(".");
context.git_commit("Add large file");
// Create a new unstaged large file
let unstaged_large_file = cwd.child("unstaged_large_file.txt");
unstaged_large_file.write_binary(&[0; 2048])?; // 2KB file
context.git_add("unstaged_large_file.txt");
context.write_pre_commit_config(indoc::indoc! {r"
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0
hooks:
- id: check-added-large-files
args: ['1', '--enforce-all']
"});
// Second run: the hook should check all files even if not staged
cmd_snapshot!(context.filters(), context.run().arg("--all-files"), @r#"
success: false
exit_code: 1
----- stdout -----
check for added large files..............................................Failed
- hook id: check-added-large-files
- exit code: 1
unstaged_large_file.txt (2 KB) exceeds 1 KB
large_file.txt (2 KB) exceeds 1 KB
----- stderr -----
"#);
context.git_rm("unstaged_large_file.txt");
context.git_clean();
// Test git-lfs integration
context.write_pre_commit_config(indoc::indoc! {r"
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0
hooks:
- id: check-added-large-files
args: ['1']
"});
cwd.child(".gitattributes")
.write_str("*.dat filter=lfs diff=lfs merge=lfs -text")?;
context.git_add(".gitattributes");
let lfs_file = cwd.child("lfs_file.dat");
lfs_file.write_binary(&[0; 2048])?; // 2KB file
context.git_add("lfs_file.dat");
// Third run: hook should pass because the large file is tracked by git-lfs
cmd_snapshot!(context.filters(), context.run(), @r#"
success: true
exit_code: 0
----- stdout -----
check for added large files..............................................Passed
----- stderr -----
"#);
Ok(())
}
+35
View File
@@ -239,6 +239,41 @@ impl TestContext {
.success();
}
/// Run `git reset`.
pub fn git_reset(&self, target: &str) {
Command::new("git")
.arg("reset")
.arg(target)
.current_dir(&self.temp_dir)
.assert()
.success();
}
/// Run `git rm`.
pub fn git_rm(&self, path: &str) {
Command::new("git")
.arg("rm")
.arg("--cached")
.arg(path)
.current_dir(&self.temp_dir)
.assert()
.success();
let file_path = self.temp_dir.child(path);
if file_path.exists() {
fs_err::remove_file(file_path).unwrap();
}
}
/// Run `git clean`.
pub fn git_clean(&self) {
Command::new("git")
.arg("clean")
.arg("-fdx")
.current_dir(&self.temp_dir)
.assert()
.success();
}
/// Write a `.pre-commit-config.yaml` file in the temporary directory.
pub fn write_pre_commit_config(&self, content: &str) {
self.temp_dir