[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH for-4.11 v3 1/1] Add new add_maintainers.pl script to optimise the workflow when using git format-patch with get_maintainer.pl
On 04/05/2018, 18:43, "Ian Jackson" <ian.jackson@xxxxxxxxxx> wrote: Thanks. This is much better :-). I have reviewed this for style, obvious bugs, and the semantics in the doc comment. I haven't tried to follow the algorithm in detail, but I reckon it's probably OK. I have reordered the patch (and hence the file) to make the grouping of my comments make more sense. Lars Kurth writes ("[PATCH for-4.11 v3 1/1] Add new add_maintainers.pl script to optimise the workflow when using git format-patch with get_maintainer.pl"): > + --inspatch (top|ccbody|cc---|none) | -p (top|ccbody|cc---|none) > + Insert email addresses into *.patch files according to the POLICY > + See section POLICY: > + --inscover (top|ccend|none) | -c (top|ccend|none) > + Insert email addresses into cover letteraccording to the POLICY > + See section PROCESSING POLICY: I'm afraid that I don't understand which addresses are added where, from the documentation. In particular, what happens without --tags or --tagscc ? Also you should define `tag'; it has a lot of different meanings, some subtly different, and it is not completely clear which one you mean. Is that because of the way I structured it? The actual behaviour Is stated under PROCESSING POLICY. Sure: I can explain what is read and what is done with the data. I think you should formally state the default behaviour. Something like: By default: * get_maintainer is called on each patch to find email addresses of maintainers/reviewers for that patch; these are added to the patch body near the CC section. * further email addresses are found in each patch's commit message tags (CC, signed-off-by, reviewed-by, etc.) * All of the above addresses are added to the CC mail headers of each patch * All of the above addresses are added to the CC mail headers of the cover letter I suspect that what I have above is not the real behaviour. You should write what is true in that kind of style :-). Sure. That makes things a lot clearer. > +my $patch_prefix = "0"; # Use a 0, such that v* does not get picked up > + # Obviously this will only work for series with > + # < 999 patches, which should be fine I don't understand the purpose of this: This is a bit of a hack! There are several different usage patterns for g-f-p when working on a series, which result in $patch_dir being used differently. In one case a) the user stores patches for multiple series in $patch_dir Thus, $patchdir may contain files starting with 0000*, 0001*, ... v1-000*, v2-000* I have directories that contain entries generated by Case a1) g-f-p ... g-f-p --reroll-count=2 ... Etc. and Case a2) g-f-p --reroll-count=1 ... Etc. b) the user stores patches in separate directories, aka one directory per g-f-p What I was trying to do here is to use $patch_prefix to select what to process in $patchdir. The problem is that in case a1, when g-f-p was called with no --reroll-count, I need to select entries 0000*, 0001*, ... as otherwise the entire directory is processed. The only way to identify these is via 0*.patch. But I may have missed something. > +if ($rerollcount > 0) { > + $patch_prefix = "v".$rerollcount; > +} ... > +my $pattern = $patch_dir.'/'.$patch_prefix.'*'.$patch_ext; > +print "Then perform:\n". > + "git send-email -to xen-devel\@lists.xenproject.org ". > + $patch_dir.'/'.$patch_prefix."*.patch"."\n"; What files matching *.patch exist here that should not be processed ? If the answer is none then $patch_prefix is redundant, I think ? Well, it depends. G-s-m will send everything in $patch_dir. I have not checked whether it ignores backups (~ .bak), but I assume it does. In any case, for scenario a1) and a2) I do need to select which files to select in g-s-e. > +foreach my $file (@patches) { > + if ($file =~ /\Q$cover_letter\E/) { I know you had me look at this over your shoulder and I said it was right, but I think in fact this would match hypothetical files $patch_dir/0020-do-something-about-0000-cover-letter.patch I think you need to expect a /. So one of + if ($file =~ /\/\Q$cover_letter\E/) { + if ($file =~ m{/\Q$cover_letter\E}) { Sure > +print "Then perform:\n". > + "git send-email -to xen-devel\@lists.xenproject.org ". > + $patch_dir.'/'.$patch_prefix."*.patch"."\n"; > + > +exit 0; > + > +my $readmailinglists = 0; > +my @mailinglists = (); This is a very curious structure. These assignments are never executed (but I guess the program works anyway). I would recommend moving the main program to the bottom of the file. > +sub getmailinglists () { > + # Read mailing list from MAINTAINERS file and copy > + # a list of e-mail addresses to @mailinglists > + if (!$readmailinglists) { I suggest you rename this variable $getmailinglists_done or something. As it is it is confusing because `read' might be the present tense, but then the sense is wrong. Sure Also, you might find it better to use a structure like one of if ($getmailingslists_done) { return; } return if $getmailingslists_done; > + if (-e $maintainers) { ... > + print "Warning: Mailing lists will be treated as CC's\n"; > + } > + # Don't try again, even if the MAINTAINERS file does not exist > + $readmailinglists = 1; > + # Remove any duplicates > + @mailinglists = uniq @mailinglists; > + } Indentation here is misleading. (But this will go away if you adopt my suggestion above). > +sub ismailinglist ($) { > + my ($check) = @_; > + # Get the mailing list information > + getmailinglists(); > + # Do the check > + if ( grep { $_ eq $check} @mailinglists) { Rather than uniq above, and then grep here, you could use a hash %mailinglists. That would be more idiomatic and also less code and faster. But as it is is tolerable. > +sub getmaintainers ($$$) { > + my ($file, $rto, $rcc) = @_; > + my $get_maintainer_args = join " ", @get_maintainer_args; > + my $cmd = "$get_maintainer $get_maintainer_args <$file"; ... > + open($fh, "-|", $cmd) > + or die "Failed to open '$cmd'\n"; You should use the array form of piped open, rather than this string joining. That way arguments containing spaces make their way through correct. Will look into this. > + if (! -e $get_maintainer) { > + die "$tool: The tool requires $get_maintainer\n"; I still don't like this check. What if the user specifies an implementation of $get_maintainer which is on the PATH ? The way get_maintainer.pl works is that it has to be called in the root directory of the Xen and Linux trees. There are some checks in the tool that throw an error when you call it from another location. The relevant code in get_maintainer.pl is 268 if (!top_of_tree($xen_path)) { 269 die "$P: The current directory does not appear to be " 270 . "a Xen source tree.\n"; 271 } Right now, $get_maintainer is not really configurable. So this is not an issue now, but could become one in future. I think for now, I will leave this as-is, but add a comment. > + while(my $line = <$fh>) { ... > + } > + close $fh; You need to check the errors here. See the `perldoc -f close'. OK > + if ($tags & !$tagscc) { You mean &&, not &. Indeed Thanks for the review Lars _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |