Re: [PATCH 3/3] git-svn log: handle unreachable revisions like "svn log"

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



"David D. Kilzer" <ddkilzer@xxxxxxxxxx> wrote:

Hi Dave, thanks for the patches, and thanks to Benoit for the review.

> Benoit Sigoure <tsuna@xxxxxxxxxxxxx> wrote:
> 
> > thanks for the patches, the series looks good to me, I added some  
> > comments below, for this patch.
> 
> Thanks for the review, Benoit!  Comments below.
> 
> > On Nov 11, 2007, at 7:10 AM, David D Kilzer wrote:
> > 
> > >  sub find_rev_before {
> > > -	my ($self, $rev, $eq_ok) = @_;
> > > +	my ($self, $rev, $eq_ok, $min_rev) = @_;
> > 
> > Could you please document this function?  I guess that you had to  
> > figure out what each argument was for, so please save the time of the  
> > contributors that will read this code after you :)
> 
> What is the format for documenting functions in git Perl scripts?  I
> haven't see any "perlpod" use anywhere.  Do you just want comments
> before the function?

Just a regular comment is enough, perlpod uses too much space.

> This method returns the git commit hash and svn revision of the first svn
> revision that exists on the current branch that is less than $rev (or
> less-than-or-equal-to $rev if $eq_ok is true).
> 
> Please note that I don't have a full understanding of how find_rev_before()
> works (other than it's computing an offset into a sparse? data file based on
> the revision number) since I'm still new to git.

Pretty much.  The .rev_db format is documented above the _rev_db_set
sub.  I'm considering replacing the current rev_db format with something
more compact for larger repos, though.

> > > +sub find_rev_after {
> > > +	my ($self, $rev, $eq_ok, $max_rev) = @_;
> > > +	++$rev unless $eq_ok;
> > > +	$max_rev ||= $self->rev_db_max();
> > > +	while ($rev <= $max_rev) {
> > > +		if (my $c = $self->rev_db_get($rev)) {
> > > +			return ($rev, $c);
> > > +		}
> > > +		++$rev;
> > > +	}
> > > +	return (undef, undef);
> > > +}
> > 
> > Too much code duplication.  It should be possible to write a sub  
> > find_rev_ (or _find_rev, don't know what's the naming convention for  
> > internal details) that takes a 5th argument, an anonymous sub that  
> > does the comparison.  So that basically, find_rev_before will be  
> > something along these (untested) lines:
> > 
> > sub find_rev_before {
> > 	my ($self, $rev, $eq_ok, $min_rev) = @_;
> > 	return find_rev_($self, $rev, $eq_ok, $min_rev, sub { my ($a, $b) =  
> > @_; return $a >= $b; });
> > }
> 
> I think that combining find_rev_before() and find_rev_after() would greatly
> sacrifice readability of the code in exchange for removing ~10 lines of code. 
> Also, you must do more than just replace the comparison in the while() loop:
> 
> - before() decrements $rev while after() increments it
> - stop limits are different ($max_rev versus $min_rev)
> 
> This is what such a method might look like (untested).  Since you already
> requested find_rev_before() be documented, is this really going to help?
> 
> sub find_rev_ {
> 	my ($self, $rev, $eq_ok, $is_before, $limit_rev) = @_;
> 	($is_before ? --$rev : ++$rev) unless $eq_ok;
> 	$limit_rev ||= ($is_before ? 1 : $self->rev_db_max());
> 	while ($is_before ? $rev >= $limit_rev : $rev <= $limit_rev) {
> 		if (my $c = $self->rev_db_get($rev)) {
> 			return ($rev, $c);
> 		}
> 			$is_before ? --$rev : ++$rev;
> 	}
> 	return (undef, undef);
> }

find_rev_ is too complicated, please keep them as separate functions.

> Defining wrapper functions would help, but I still think it's just as clear to
> keep the two methods separate.
> 
> sub find_rev_before() {
> 	my ($self, $rev, $eq_ok, $min_rev) = @_;
> 	return $self->find_rev_($rev, $eq_ok, 1, $min_rev);
> }
> 
> sub find_rev_after() {
> 	my ($self, $rev, $eq_ok, $max_rev) = @_;
> 	return $self->find_rev_($rev, $eq_ok, 0, $max_rev);
> }
> 
> Do you agree, or do you think the methods should still be combined?
> 
> > > +		if ($r_max < $r_min) {
> > > +			($r_min, $r_max) = ($r_max, $r_min);
> > > +		}
> > > +		my (undef, $c_max) = $gs->find_rev_before($r_max, 1, $r_min);
> > > +		my (undef, $c_min) = $gs->find_rev_after($r_min, 1, $r_max);
> > > +		# If there are no commits in the range, both $c_max and $c_min
> > > +		# will be undefined.  If there is at least 1 commit in the
> > > +		# range, both will be defined.
> > > +		return () if !defined $c_min;
> > 
> > Fair enough but I'd strengthen the test by writing something like:
> > 		return () if not defined $c_min || not defined $c_max;
> > unless you can prove that `rev_db_get' can never return `undef' or  
> > something like that.

I prefer '!' instead of 'not' unless operator precedence matters.

> Will make this change.
> 
> > > +sub commit_log_separator {
> > > +    return ('-' x 72) . "\n";
> > > +}
> > > +
> > 
> > This is basically a constant, I think that declaring it with a  
> > prototype helps Perl to optimize it:
> > sub commit_log_separator() {

use constant commit_log_separator => ('-' x 72) . "\n";

is probably most readable...

-- 
Eric Wong
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux