Per-file, possibly even per-hunk cherry picking
Hi all,
I'm interested in extending the cherry analysis to allow specification of the diff options used when calculating diff IDs, presenting the calculated diff IDs for analysis by external tools, and even calculating and dealing with per-hunk diff IDs.
Has anyone done anything with this before, or got any good pointers or advice?
Sam.
Quoted 5 lines · Sam Vilain
I'm interested in extending the cherry analysis to allow specification of the diff options used when calculating diff IDs, presenting the calculated diff IDs for analysis by external tools, and even calculating and dealing with per-hunk diff IDs.
On reflection I think so long as --cherry-pick works together with a file selection, it would probably be enough.
ie, if I have these commits:
A---B
\
\
C
B changes a file foo.c, adding a line of text. C changes foo.c as well as bar.c, but the change in foo.c was identical to change B.
I want this to show me nothing:
git-rev-list --left-right --cherry-pick B...C -- foo.c
Would it be the right approach to put this information in ids->diffopts, or somewhere else?
Sam.
PATCH 1/1 Fix --cherry-pick with given paths
If you say --cherry-pick, you do not want to see patches which are in the upstream. If you specify paths with that, what you usually expect is that only those parts of the patches are looked at which actually touch the given paths.
With this patch, that expectation is met.
Noticed by Sam Vilain.
---
On Wed, 11 Jul 2007, Sam Vilain wrote:
> Sam Vilain wrote:
> > I'm interested in extending the cherry analysis to allow > > specification of the diff options used when calculating diff > > IDs, presenting the calculated diff IDs for analysis by > > external tools, and even calculating and dealing with per-hunk > > diff IDs.
>
> On reflection I think so long as --cherry-pick works together > with a file selection, it would probably be enough. >
> ie, if I have these commits:
>
> A---B
> \
> \
> C
>
> B changes a file foo.c, adding a line of text. C changes foo.c > as well as bar.c, but the change in foo.c was identical to > change B.
>
> I want this to show me nothing:
>
> git-rev-list --left-right --cherry-pick B...C -- foo.c
>
> Would it be the right approach to put this information in > ids->diffopts, or somewhere else?
That was interesting. And it is indeed the right place to put it.
revision.c | 9 +++++- t/t6007-rev-list-cherry-pick-file.sh | 43 ++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) create mode 100755 t/t6007-rev-list-cherry-pick-file.sh
revision.c +7 -2
@@ -437,7 +437,7 @@ static int add_parents_to_list(struct rev_info *revs, struct commit *commit, strreturn 0 ; } -static void cherry_pick_list (struct commit_list *list) +static void cherry_pick_list (struct commit_list *list,struct rev_info *revs) {struct commit_list *p;int left_count =0 , right_count =0 ;
@@ -458,6 +458,11 @@ static void cherry_pick_list(struct commit_list *list) left_first = left_count < right_count;init_patch_ids (&ids); +if (revs->diffopt.nr_paths) { + ids.diffopts.nr_paths = revs->diffopt.nr_paths; + ids.diffopts.paths = revs->diffopt.paths; + ids.diffopts.pathlens = revs->diffopt.pathlens; + }/* Compute patch-ids for one side */ for (p = list; p; p = p->next) {
@@ -546,7 +551,7 @@ static int limit_list(struct rev_info *revs) p = &commit_list_insert (commit, p)->next; }if (revs->cherry_pick) -cherry_pick_list (newlist); +cherry_pick_list (newlist, revs); revs->commits = newlist;return 0 ;
t/t6007-rev-list-cherry-pick-file.sh new file +43 -0
43 lines not on this page · raw message
Signature · 1 line
1.5.3.rc0.2782.g192a9-dirty
Re: [PATCH] Fix --cherry-pick with given paths
Quoted 11 lines · Johannes Schindelin
If you say --cherry-pick, you do not want to see patches which are in the upstream. If you specify paths with that, what you usually expect is that only those parts of the patches are looked at which actually touch the given paths.
With this patch, that expectation is met.
Noticed by Sam Vilain.
Signed-off-by Johannes Schindelin <[email protected]>
I just tested this, and it seems to work just like I hoped, so:
Sam.
Re: [PATCH] Fix --cherry-pick with given paths
In reply to Johannes SchindelinQuoted 16 lines · Johannes Schindelin
> Sam Vilain wrote:
> > I'm interested in extending the cherry analysis to allow > > specification of the diff options used when calculating diff > > IDs, presenting the calculated diff IDs for analysis by > > external tools, and even calculating and dealing with per-hunk > > diff IDs.
>
> On reflection I think so long as --cherry-pick works together > with a file selection, it would probably be enough. >
> ie, if I have these commits:
>
> A---B
> \
> \
> C
Quoted 8 lines
>
> B changes a filefoo.c, adding a line of text. C changesfoo.c> as well asbar.c, but the change infoo.cwas identical to > change B.
>
> I want this to show me nothing:
>
> git-rev-list --left-right --cherry-pick B...C --foo.c
Thanks, both.