git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Thomas Rast <trast@student.ethz.ch>
To: Bo Yang <struggleyb.nku@gmail.com>
Cc: <git@vger.kernel.org>, <Jens.Lehmann@web.de>
Subject: Re: [PATCH v4 08/18] map/take range to the parent of commits
Date: Thu, 5 Aug 2010 23:32:37 +0200	[thread overview]
Message-ID: <201008052332.37435.trast@student.ethz.ch> (raw)
In-Reply-To: <1281024717-7855-9-git-send-email-struggleyb.nku@gmail.com>

Bo Yang wrote:
> The algorithm that maps lines from post-image to pre-image is in
> the function map_lines. Generally, we use simple line number
> calculation method to do the map.

> +#define SCALE_FACTOR 4
> +/*
> + * [p_start, p_end] represents the pre-image of current diff hunk,
> + * [t_start, t_end] represnets the post-image of the current diff hunk,
                            ^^
Typo here ------------------/

> + * [start, end] represents the currently interesting line range in
> + * post-image,
> + * [o_start, o_end] represents the original line range that coresponds
> + * to current line range.
> + */
> +void map_lines(long p_start, long p_end, long t_start, long t_end,
> +		long start, long end, long *o_start, long *o_end)
> +{
[...]
> +	/*
> +	 * A heuristic for lines mapping:
> +	 *
> +	 * When the pre-image is no more than 1/4 of the post-image,
> +	 * there is no effective way to find out which part of pre-image
> +	 * corresponds to the currently interesting range of post-image.
> +	 * And we are in the danger of tracking totally useless lines.
> +	 * So, we just treat all the post-image lines as added from scratch.
> +	 */
> +	if (SCALE_FACTOR * (p_end - p_start + 1) < (t_end - t_start + 1)) {

So that's what SCALE_FACTOR is good for (and the comment should
probably say 1/SCALE_FACTOR instead).

Out of curiosity, did you come up with 4 randomly or by experimentation?

> +/*
> + * When same == 1:
> + * [p_start, p_end] represents the diff hunk line range of pre-image,
> + * [t_start, t_end] represents the diff hunk line range of post-image.
> + * When same == 0, they represents a range of idnetical lines between

+ * When same == 0, they represent a range of identical lines between

> + * two images.
> + *
> + * This function find out the corresponding line ranges of currently
> + * interesting ranges which this diff hunk touches.
> + */
> +static void map_range(struct take_range_cb_data *data, int same,
> +		long p_start, long p_end, long t_start, long t_end)

You took some time to comment map_lines, but not this one, sadly.

I gather it works as

  assign_parents_range
  -> assign_range_to_parent once with map=1, once with map=0
  -> either map_range_cb or take_range_cb
  -> either map_range or take_range

but there are few comments on where the decisions should be obvious
and where they are just heuristics.  Can you add some more comments to
enlighten us?

> +		if (map)
> +			map_range(&cb, 1, cb.plno + 1, 0x7FFFFFFF, cb.tlno + 1, 0x7FFFFFFF);
> +		else
> +			take_range(&cb, cb.plno + 1, 0x7FFFFFFF, cb.tlno + 1, 0x7FFFFFFF);

Use INT_MAX from limits.h (and besides, you're not guaranteed to have
32 bits).

> +	/*
> +	 * Loop on the parents and assign the ranges to different
> +	 * parents, if there is any range left, this commit must
> +	 * be an evil merge.
> +	 */
> +	copy = diff_line_range_clone_deeply(r);
> +	parents = commit->parents;
> +	while (parents) {
> +		struct commit *p = parents->item;

> +		assign_range_to_parent(rev, commit, p, r, &rev->diffopt, 1);

IIUC, the latter line is

  /* assign to the parent what we can */

and the next one

> +		assign_range_to_parent(rev, commit, p, copy, &rev->diffopt, 0);

  /* and remove it from our to-be-printed range */

right?

If so, please rename the 'copy' variable since its purpose is not to
be a copy, but to hold entirely different data.

-- 
Thomas Rast
trast@{inf,student}.ethz.ch

  reply	other threads:[~2010-08-05 21:34 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-08-05 16:11 [PATCH v4 00/18] Reroll the line log series Bo Yang
2010-08-05 16:11 ` [PATCH v4 01/18] parse-options: enhance STOP_AT_NON_OPTION Bo Yang
2010-08-05 16:11 ` [PATCH v4 02/18] parse-options: add two helper functions Bo Yang
2010-08-05 20:43   ` Thomas Rast
2010-08-05 16:11 ` [PATCH v4 03/18] Add the basic data structure for line level history Bo Yang
2010-08-05 21:09   ` Thomas Rast
2010-08-06 19:42   ` Junio C Hamano
2010-08-05 16:11 ` [PATCH v4 04/18] Refactor parse_loc Bo Yang
2010-08-05 16:11 ` [PATCH v4 05/18] Parse the -L options Bo Yang
2010-08-06 19:42   ` Junio C Hamano
2010-08-10 15:40     ` Bo Yang
2010-08-05 16:11 ` [PATCH v4 06/18] Export three functions from diff.c Bo Yang
2010-08-05 16:11 ` [PATCH v4 07/18] Add range clone functions Bo Yang
2010-08-05 16:11 ` [PATCH v4 08/18] map/take range to the parent of commits Bo Yang
2010-08-05 21:32   ` Thomas Rast [this message]
2010-08-05 16:11 ` [PATCH v4 09/18] Print the line log Bo Yang
2010-08-05 16:11 ` [PATCH v4 10/18] Hook line history into cmd_log, ensuring a topo-ordered walk Bo Yang
2010-08-05 16:11 ` [PATCH v4 11/18] Add tests for line history browser Bo Yang
2010-08-05 20:38   ` Thomas Rast
2010-08-06  5:28     ` Bo Yang
2010-08-06  9:04       ` Thomas Rast
2010-08-05 16:11 ` [PATCH v4 12/18] Make rewrite_parents public to other part of git Bo Yang
2010-08-05 16:11 ` [PATCH v4 13/18] Make graph_next_line external " Bo Yang
2010-08-05 16:11 ` [PATCH v4 14/18] Add parent rewriting to line history browser Bo Yang
2010-08-05 16:11 ` [PATCH v4 15/18] Add --graph prefix before line history output Bo Yang
2010-08-05 16:11 ` [PATCH v4 16/18] Add --full-line-diff option Bo Yang
2010-08-05 16:11 ` [PATCH v4 17/18] Add test cases for '--graph' of line level log Bo Yang
2010-08-05 16:11 ` [PATCH v4 18/18] Document line history browser Bo Yang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201008052332.37435.trast@student.ethz.ch \
    --to=trast@student.ethz.ch \
    --cc=Jens.Lehmann@web.de \
    --cc=git@vger.kernel.org \
    --cc=struggleyb.nku@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).