From 3730d9932c2cfcca5aaab38cef547733d49eca01 Mon Sep 17 00:00:00 2001 From: Christian Schilling Date: Wed, 1 Jun 2022 18:14:32 +0200 Subject: [PATCH] Make :linear filter non-recursive The :linear filter was implemented recursively by accident, making it very slow on non trivial repos. Change-Id: non-recursive-linear --- src/filter/mod.rs | 15 ++++++++------- tests/filter/linear.t | 2 ++ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/filter/mod.rs b/src/filter/mod.rs index 6c6372613..96073be2d 100644 --- a/src/filter/mod.rs +++ b/src/filter/mod.rs @@ -297,20 +297,21 @@ fn apply_to_commit2( let filtered_tree = match &to_op(filter) { Op::Linear => { - let p: Vec<_> = commit.parents().collect(); + let p: Vec<_> = commit.parent_ids().collect(); if p.len() == 0 { + transaction.insert(filter, commit.id(), commit.id(), true); return Ok(Some(commit.id())); } - let parent = some_or!(apply_to_commit2(op, &p[0], transaction)?, { + let parent = some_or!(transaction.get(filter, p[0]), { return Ok(None); }); - let parent_commit = repo.find_commit(parent)?; - return Some(history::rewrite_commit( - repo, + return Some(history::create_filtered_commit( commit, - &[&parent_commit], - &commit.tree()?, + vec![parent], + commit.tree()?, + transaction, + filter, )) .transpose(); } diff --git a/tests/filter/linear.t b/tests/filter/linear.t index e8839a7c2..27f8538f9 100644 --- a/tests/filter/linear.t +++ b/tests/filter/linear.t @@ -32,6 +32,7 @@ * add file1 $ josh-filter -s :linear refs/heads/master --update refs/heads/filtered + [3] :linear $ git log --graph --pretty=%s refs/heads/filtered * Merge branch 'branch2' @@ -56,6 +57,7 @@ * add file1 $ josh-filter -s :linear refs/heads/master --update refs/heads/filtered --reverse + [3] :linear $ git log --graph --pretty=%s refs/heads/master * mod file2