From 556b0f58bbcdc96ba8ed67001b4e57c50198da89 Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Sat, 10 Jan 2009 14:53:15 +0000 Subject: Revert "fix modules_install via NFS" This reverts commit 8b249b6856f16f09b0e5b79ce5f4d435e439b9d6. This 'fix' is not necessary; we just need to undo the damage caused accidentally by Igor/Mauro in 4b29631db33292d416dc395c56122ea865e7635c ("V4L/DVB (9533): cx88: Add support for TurboSight TBS8910 DVB-S PCI card") Signed-off-by: David Woodhouse --- scripts/.gitignore | 1 - scripts/Makefile | 3 +- scripts/ihex2fw.c | 268 ----------------------------------------------------- 3 files changed, 1 insertion(+), 271 deletions(-) delete mode 100644 scripts/ihex2fw.c (limited to 'scripts') diff --git a/scripts/.gitignore b/scripts/.gitignore index 09e2406f3b78..b939fbd01195 100644 --- a/scripts/.gitignore +++ b/scripts/.gitignore @@ -1,7 +1,6 @@ # # Generated files # -ihex2fw conmakehash kallsyms pnmtologo diff --git a/scripts/Makefile b/scripts/Makefile index 035182e16afb..aafdf064feef 100644 --- a/scripts/Makefile +++ b/scripts/Makefile @@ -2,12 +2,11 @@ # scripts contains sources for various helper programs used throughout # the kernel for the build process. # --------------------------------------------------------------------------- -# ihex2fw: Parser/loader for IHEX formatted data # kallsyms: Find all symbols in vmlinux # pnmttologo: Convert pnm files to logo files +# conmakehash: Create chartable # conmakehash: Create arrays for initializing the kernel console tables -hostprogs-y := ihex2fw hostprogs-$(CONFIG_KALLSYMS) += kallsyms hostprogs-$(CONFIG_LOGO) += pnmtologo hostprogs-$(CONFIG_VT) += conmakehash diff --git a/scripts/ihex2fw.c b/scripts/ihex2fw.c deleted file mode 100644 index 8f7fdaa9e010..000000000000 --- a/scripts/ihex2fw.c +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Parser/loader for IHEX formatted data. - * - * Copyright © 2008 David Woodhouse - * Copyright © 2005 Jan Harkes - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#define _GNU_SOURCE -#include - - -struct ihex_binrec { - struct ihex_binrec *next; /* not part of the real data structure */ - uint32_t addr; - uint16_t len; - uint8_t data[]; -}; - -/** - * nybble/hex are little helpers to parse hexadecimal numbers to a byte value - **/ -static uint8_t nybble(const uint8_t n) -{ - if (n >= '0' && n <= '9') return n - '0'; - else if (n >= 'A' && n <= 'F') return n - ('A' - 10); - else if (n >= 'a' && n <= 'f') return n - ('a' - 10); - return 0; -} - -static uint8_t hex(const uint8_t *data, uint8_t *crc) -{ - uint8_t val = (nybble(data[0]) << 4) | nybble(data[1]); - *crc += val; - return val; -} - -static int process_ihex(uint8_t *data, ssize_t size); -static void file_record(struct ihex_binrec *record); -static int output_records(int outfd); - -static int sort_records = 0; -static int wide_records = 0; - -int usage(void) -{ - fprintf(stderr, "ihex2fw: Convert ihex files into binary " - "representation for use by Linux kernel\n"); - fprintf(stderr, "usage: ihex2fw [] \n"); - fprintf(stderr, " -w: wide records (16-bit length)\n"); - fprintf(stderr, " -s: sort records by address\n"); - return 1; -} - -int main(int argc, char **argv) -{ - int infd, outfd; - struct stat st; - uint8_t *data; - int opt; - - while ((opt = getopt(argc, argv, "ws")) != -1) { - switch (opt) { - case 'w': - wide_records = 1; - break; - case 's': - sort_records = 1; - break; - default: - return usage(); - } - } - - if (optind + 2 != argc) - return usage(); - - if (!strcmp(argv[optind], "-")) - infd = 0; - else - infd = open(argv[optind], O_RDONLY); - if (infd == -1) { - fprintf(stderr, "Failed to open source file: %s", - strerror(errno)); - return usage(); - } - if (fstat(infd, &st)) { - perror("stat"); - return 1; - } - data = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, infd, 0); - if (data == MAP_FAILED) { - perror("mmap"); - return 1; - } - - if (!strcmp(argv[optind+1], "-")) - outfd = 1; - else - outfd = open(argv[optind+1], O_TRUNC|O_CREAT|O_WRONLY, 0644); - if (outfd == -1) { - fprintf(stderr, "Failed to open destination file: %s", - strerror(errno)); - return usage(); - } - if (process_ihex(data, st.st_size)) - return 1; - - output_records(outfd); - return 0; -} - -static int process_ihex(uint8_t *data, ssize_t size) -{ - struct ihex_binrec *record; - uint32_t offset = 0; - uint8_t type, crc = 0, crcbyte = 0; - int i, j; - int line = 1; - int len; - - i = 0; -next_record: - /* search for the start of record character */ - while (i < size) { - if (data[i] == '\n') line++; - if (data[i++] == ':') break; - } - - /* Minimum record length would be about 10 characters */ - if (i + 10 > size) { - fprintf(stderr, "Can't find valid record at line %d\n", line); - return -EINVAL; - } - - len = hex(data + i, &crc); i += 2; - if (wide_records) { - len <<= 8; - len += hex(data + i, &crc); i += 2; - } - record = malloc((sizeof (*record) + len + 3) & ~3); - if (!record) { - fprintf(stderr, "out of memory for records\n"); - return -ENOMEM; - } - memset(record, 0, (sizeof(*record) + len + 3) & ~3); - record->len = len; - - /* now check if we have enough data to read everything */ - if (i + 8 + (record->len * 2) > size) { - fprintf(stderr, "Not enough data to read complete record at line %d\n", - line); - return -EINVAL; - } - - record->addr = hex(data + i, &crc) << 8; i += 2; - record->addr |= hex(data + i, &crc); i += 2; - type = hex(data + i, &crc); i += 2; - - for (j = 0; j < record->len; j++, i += 2) - record->data[j] = hex(data + i, &crc); - - /* check CRC */ - crcbyte = hex(data + i, &crc); i += 2; - if (crc != 0) { - fprintf(stderr, "CRC failure at line %d: got 0x%X, expected 0x%X\n", - line, crcbyte, (unsigned char)(crcbyte-crc)); - return -EINVAL; - } - - /* Done reading the record */ - switch (type) { - case 0: - /* old style EOF record? */ - if (!record->len) - break; - - record->addr += offset; - file_record(record); - goto next_record; - - case 1: /* End-Of-File Record */ - if (record->addr || record->len) { - fprintf(stderr, "Bad EOF record (type 01) format at line %d", - line); - return -EINVAL; - } - break; - - case 2: /* Extended Segment Address Record (HEX86) */ - case 4: /* Extended Linear Address Record (HEX386) */ - if (record->addr || record->len != 2) { - fprintf(stderr, "Bad HEX86/HEX386 record (type %02X) at line %d\n", - type, line); - return -EINVAL; - } - - /* We shouldn't really be using the offset for HEX86 because - * the wraparound case is specified quite differently. */ - offset = record->data[0] << 8 | record->data[1]; - offset <<= (type == 2 ? 4 : 16); - goto next_record; - - case 3: /* Start Segment Address Record */ - case 5: /* Start Linear Address Record */ - if (record->addr || record->len != 4) { - fprintf(stderr, "Bad Start Address record (type %02X) at line %d\n", - type, line); - return -EINVAL; - } - - /* These records contain the CS/IP or EIP where execution - * starts. Don't really know what to do with them. */ - goto next_record; - - default: - fprintf(stderr, "Unknown record (type %02X)\n", type); - return -EINVAL; - } - - return 0; -} - -static struct ihex_binrec *records; - -static void file_record(struct ihex_binrec *record) -{ - struct ihex_binrec **p = &records; - - while ((*p) && (!sort_records || (*p)->addr < record->addr)) - p = &((*p)->next); - - record->next = *p; - *p = record; -} - -static int output_records(int outfd) -{ - unsigned char zeroes[6] = {0, 0, 0, 0, 0, 0}; - struct ihex_binrec *p = records; - - while (p) { - uint16_t writelen = (p->len + 9) & ~3; - - p->addr = htonl(p->addr); - p->len = htons(p->len); - write(outfd, &p->addr, writelen); - p = p->next; - } - /* EOF record is zero length, since we don't bother to represent - the type field in the binary version */ - write(outfd, zeroes, 6); - return 0; -} -- cgit From cb7301c7a3b2216c93b148fec0718d24f4ee2a99 Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Tue, 7 Apr 2009 20:40:12 -0700 Subject: Add scripts/get_maintainer.pl A script to parse file pattern information in MAINTAINERS and return selected information about a file or patch usage: scripts/get_maintainer.pl [options] patchfile scripts/get_maintainer.pl [options] -f file version: 0.14 MAINTAINERS field selection options: --email => print email address(es) if any --git => include git "*-by:" signers in commit count order --git-chief-penguins => include (Linus Torvalds) --git-min-signatures => number of signatures required (default: 1) --git-max-maintainers => maximum maintainers to add (default: 5) --git-since => git history to use (default: 1-year-ago) --m => include maintainer(s) if any --n => include name 'Full Name ' --l => include list(s) if any --s => include subscriber only list(s) if any --scm => print SCM tree(s) if any --status => print status if any --subsystem => print subsystem name if any --web => print website(s) if any Output type options: --separator [, ] => separator for multiple entries on 1 line --multiline => print 1 entry per line Default options: [--email --git --m --n --l --multiline] Other options: --version => show version --help => show this help information Signed-off-by: Joe Perches Acked-by: Pavel Machek --- scripts/get_maintainer.pl | 518 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 518 insertions(+) create mode 100755 scripts/get_maintainer.pl (limited to 'scripts') diff --git a/scripts/get_maintainer.pl b/scripts/get_maintainer.pl new file mode 100755 index 000000000000..0f3c0a5b5a5b --- /dev/null +++ b/scripts/get_maintainer.pl @@ -0,0 +1,518 @@ +#!/usr/bin/perl -w +# (c) 2007, Joe Perches +# created from checkpatch.pl +# +# Print selected MAINTAINERS information for +# the files modified in a patch or for a file +# +# usage: perl scripts/get_maintainers.pl [OPTIONS] +# perl scripts/get_maintainers.pl [OPTIONS] -f +# +# Licensed under the terms of the GNU GPL License version 2 + +use strict; + +my $P = $0; +my $V = '0.14'; + +use Getopt::Long qw(:config no_auto_abbrev); + +my $lk_path = "./"; +my $email = 1; +my $email_usename = 1; +my $email_maintainer = 1; +my $email_list = 1; +my $email_subscriber_list = 0; +my $email_git = 1; +my $email_git_penguin_chiefs = 0; +my $email_git_min_signatures = 1; +my $email_git_max_maintainers = 5; +my $email_git_since = "1-year-ago"; +my $output_multiline = 1; +my $output_separator = ", "; +my $scm = 0; +my $web = 0; +my $subsystem = 0; +my $status = 0; +my $onefile = 0; +my $version = 0; +my $help = 0; + +my $exit = 0; + +my @penguin_chief = (); +push(@penguin_chief,"Linus Torvalds:torvalds\@linux-foundation.org"); +#Andrew wants in on most everything - 2009/01/14 +#push(@penguin_chief,"Andrew Morton:akpm\@linux-foundation.org"); + +my @penguin_chief_names = (); +foreach my $chief (@penguin_chief) { + if ($chief =~ m/^(.*):(.*)/) { + my $chief_name = $1; + my $chief_addr = $2; + push(@penguin_chief_names, $chief_name); + } +} +my $penguin_chiefs = "\(" . join("|",@penguin_chief_names) . "\)"; + +if (!GetOptions( + 'email!' => \$email, + 'git!' => \$email_git, + 'git-chief-penguins!' => \$email_git_penguin_chiefs, + 'git-min-signatures=i' => \$email_git_min_signatures, + 'git-max-maintainers=i' => \$email_git_max_maintainers, + 'git-since=s' => \$email_git_since, + 'm!' => \$email_maintainer, + 'n!' => \$email_usename, + 'l!' => \$email_list, + 's!' => \$email_subscriber_list, + 'multiline!' => \$output_multiline, + 'separator=s' => \$output_separator, + 'subsystem!' => \$subsystem, + 'status!' => \$status, + 'scm!' => \$scm, + 'web!' => \$web, + 'f|file' => \$onefile, + 'v|version' => \$version, + 'h|help' => \$help, + )) { + usage(); + die "$P: invalid argument\n"; +} + +if ($help != 0) { + usage(); + exit 0; +} + +if ($version != 0) { + print("${P} ${V}\n"); + exit 0; +} + +my $infile = $ARGV[0]; + +if ($#ARGV < 0) { + usage(); + die "$P: argument missing: patchfile or -f file please\n"; +} + +my $selections = $email + $scm + $status + $subsystem + $web; +if ($selections == 0) { + usage(); + die "$P: Missing required option: email, scm, status, subsystem or web\n"; +} + +if ($email && ($email_maintainer + $email_list + $email_subscriber_list + + $email_git + $email_git_penguin_chiefs) == 0) { + usage(); + die "$P: Please select at least 1 email option\n"; +} + +if (!top_of_kernel_tree($lk_path)) { + die "$P: The current directory does not appear to be " + . "a linux kernel source tree.\n"; +} + +## Read MAINTAINERS for type/value pairs + +my @typevalue = (); +open(MAINT, "<${lk_path}MAINTAINERS") || die "$P: Can't open MAINTAINERS\n"; +while () { + my $line = $_; + + if ($line =~ m/^(\C):\s*(.*)/) { + my $type = $1; + my $value = $2; + + ##Filename pattern matching + if ($type eq "F" || $type eq "X") { + $value =~ s@\.@\\\.@g; ##Convert . to \. + $value =~ s/\*/\.\*/g; ##Convert * to .* + $value =~ s/\?/\./g; ##Convert ? to . + } + push(@typevalue, "$type:$value"); + } elsif (!/^(\s)*$/) { + $line =~ s/\n$//g; + push(@typevalue, $line); + } +} +close(MAINT); + +## use the filename on the command line or find the filenames in the patchfile + +my @files = (); + +if ($onefile) { + if (!(-f $infile)) { + die "$P: file '${infile}' not found\n"; + } + push(@files, $infile); +} else { + open(PATCH, "<$infile") or die "$P: Can't open ${infile}\n"; + while () { + if (m/^\+\+\+\s+(\S+)/) { + my $file = $1; + $file =~ s@^[^/]*/@@; + $file =~ s@\n@@; + push(@files, $file); + } + } + close(PATCH); + my $file_cnt = @files; + if ($file_cnt == 0) { + print STDERR "$P: file '${infile}' doesn't appear to be a patch. " + . "Add -f to options?\n"; + } + @files = sort_and_uniq(@files); +} + +my @email_to = (); +my @scm = (); +my @web = (); +my @subsystem = (); +my @status = (); + +# Find responsible parties + +foreach my $file (@files) { + +#Do not match excluded file patterns + + my $exclude = 0; + foreach my $line (@typevalue) { + if ($line =~ m/^(\C):(.*)/) { + my $type = $1; + my $value = $2; + if ($type eq 'X') { + if (file_match_pattern($file, $value)) { + $exclude = 1; + } + } + } + } + + if (!$exclude) { + my $tvi = 0; + foreach my $line (@typevalue) { + if ($line =~ m/^(\C):(.*)/) { + my $type = $1; + my $value = $2; + if ($type eq 'F') { + if (file_match_pattern($file, $value)) { + add_categories($tvi); + } + } + } + $tvi++; + } + } + + if ($email_git) { + recent_git_signoffs($file); + } + +} + +if ($email_git_penguin_chiefs) { + foreach my $chief (@penguin_chief) { + if ($chief =~ m/^(.*):(.*)/) { + my $chief_name = $1; + my $chief_addr = $2; + if ($email_usename) { + push(@email_to, format_email($chief_name, $chief_addr)); + } else { + push(@email_to, $chief_addr); + } + } + } +} + +if ($email) { + my $address_cnt = @email_to; + if ($address_cnt == 0 && $email_list) { + push(@email_to, "linux-kernel\@vger.kernel.org"); + } + +#Don't sort email address list, but do remove duplicates + @email_to = uniq(@email_to); + output(@email_to); +} + +if ($scm) { + if (!$onefile) { + @scm = sort_and_uniq(@scm); + } + output(@scm); +} + +if ($status) { + if (!$onefile) { + @status = sort_and_uniq(@status); + } + output(@status); +} + +if ($subsystem) { + if (!$onefile) { + @subsystem = sort_and_uniq(@subsystem); + } + output(@subsystem); +} + +if ($web) { + if (!$onefile) { + @web = sort_and_uniq(@web); + } + output(@web); +} + +exit($exit); + +sub file_match_pattern { + my ($file, $pattern) = @_; + if (substr($pattern, -1) eq "/") { + if ($file =~ m@^$pattern@) { + return 1; + } + } else { + if ($file =~ m@^$pattern@) { + my $s1 = ($file =~ tr@/@@); + my $s2 = ($pattern =~ tr@/@@); + if ($s1 == $s2) { + return 1; + } + } + } + return 0; +} + +sub usage { + print < print email address(es) if any + --git => include recent git \*-by: signers + --git-chief-penguins => include ${penguin_chiefs} + --git-min-signatures => number of signatures required (default: 1) + --git-max-maintainers => maximum maintainers to add (default: 5) + --git-since => git history to use (default: 1-year-ago) + --m => include maintainer(s) if any + --n => include name 'Full Name ' + --l => include list(s) if any + --s => include subscriber only list(s) if any + --scm => print SCM tree(s) if any + --status => print status if any + --subsystem => print subsystem name if any + --web => print website(s) if any + +Output type options: + --separator [, ] => separator for multiple entries on 1 line + --multiline => print 1 entry per line + +Default options: + [--email --git --m --l --multiline] + +Other options: + --version -> show version + --help => show this help information + +EOT +} + +sub top_of_kernel_tree { + my ($lk_path) = @_; + + if ($lk_path ne "" && substr($lk_path,length($lk_path)-1,1) ne "/") { + $lk_path .= "/"; + } + if ( (-f "${lk_path}COPYING") + && (-f "${lk_path}CREDITS") + && (-f "${lk_path}Kbuild") + && (-f "${lk_path}MAINTAINERS") + && (-f "${lk_path}Makefile") + && (-f "${lk_path}README") + && (-d "${lk_path}Documentation") + && (-d "${lk_path}arch") + && (-d "${lk_path}include") + && (-d "${lk_path}drivers") + && (-d "${lk_path}fs") + && (-d "${lk_path}init") + && (-d "${lk_path}ipc") + && (-d "${lk_path}kernel") + && (-d "${lk_path}lib") + && (-d "${lk_path}scripts")) { + return 1; + } + return 0; +} + +sub format_email { + my ($name, $email) = @_; + + $name =~ s/^\s+|\s+$//g; + $email =~ s/^\s+|\s+$//g; + + my $formatted_email = ""; + + if ($name =~ /[^a-z0-9 \.\-]/i) { ##has "must quote" chars + $name =~ s/(?"; + } else { + $formatted_email = "${name} \<${email}\>"; + } + return $formatted_email; +} + +sub add_categories { + my ($index) = @_; + + $index = $index - 1; + while ($index >= 0) { + my $tv = $typevalue[$index]; + if ($tv =~ m/^(\C):(.*)/) { + my $ptype = $1; + my $pvalue = $2; + if ($ptype eq "L") { + my $subscr = $pvalue; + if ($subscr =~ m/\s*\(subscribers-only\)/) { + if ($email_subscriber_list) { + $subscr =~ s/\s*\(subscribers-only\)//g; + push(@email_to, $subscr); + } + } else { + if ($email_list) { + push(@email_to, $pvalue); + } + } + } elsif ($ptype eq "M") { + if ($email_maintainer) { + if ($index >= 0) { + my $tv = $typevalue[$index - 1]; + if ($tv =~ m/^(\C):(.*)/) { + if ($1 eq "P" && $email_usename) { + push(@email_to, format_email($2, $pvalue)); + } else { + push(@email_to, $pvalue); + } + } + } else { + push(@email_to, $pvalue); + } + } + } elsif ($ptype eq "T") { + push(@scm, $pvalue); + } elsif ($ptype eq "W") { + push(@web, $pvalue); + } elsif ($ptype eq "S") { + push(@status, $pvalue); + } + + $index--; + } else { + push(@subsystem,$tv); + $index = -1; + } + } +} + +sub which { + my ($bin) = @_; + + foreach my $path (split /:/, $ENV{PATH}) { + if (-e "$path/$bin") { + return "$path/$bin"; + } + } + + return ""; +} + +sub recent_git_signoffs { + my ($file) = @_; + + my $sign_offs = ""; + my $cmd = ""; + my $output = ""; + my $count = 0; + my @lines = (); + + if (which("git") eq "") { + die("$P: git not found. Add --nogit to options?\n"); + } + + $cmd = "git log --since=${email_git_since} -- ${file}"; + $cmd .= " | grep -P '^ [-A-Za-z]+by:.*\\\@'"; + if (!$email_git_penguin_chiefs) { + $cmd .= " | grep -E -v \"${penguin_chiefs}\""; + } + $cmd .= " | sort | uniq -c | sort -rn"; + + $output = `${cmd}`; + $output =~ s/^\s*//gm; + + @lines = split("\n", $output); + foreach my $line (@lines) { + if ($line =~ m/([0-9]+)\s+([-A-Za-z]+by:)\s+(.*)/) { + my $sign_offs = $1; + $line = $3; + $count++; + if ($sign_offs < $email_git_min_signatures || + $count > $email_git_max_maintainers) { + last; + } + } else { + die("$P: Unexpected git output: ${line}\n"); + } + if ($line =~ m/(.*) <(.*)>/) { + my $git_name = $1; + my $git_addr = $2; + $git_name =~ tr/^\"//; + $git_name =~ tr/\"$//; + if ($email_usename) { + push(@email_to, format_email($git_name, $git_addr)); + } else { + push(@email_to, $git_addr); + } + } elsif ($line =~ m/<(.*)>/) { + my $git_addr = $1; + push(@email_to, $git_addr); + } else { + push(@email_to, $line); + } + } + return $output; +} + +sub uniq { + my @parms = @_; + + my %saw; + @parms = grep(!$saw{$_}++, @parms); + return @parms; +} + +sub sort_and_uniq { + my @parms = @_; + + my %saw; + @parms = sort @parms; + @parms = grep(!$saw{$_}++, @parms); + return @parms; +} + +sub output { + my @parms = @_; + + if ($output_multiline) { + foreach my $line (@parms) { + print("${line}\n"); + } + } else { + print(join($output_separator, @parms)); + print("\n"); + } +} -- cgit From 4a7fdb5f51a4d9228b0ff93494b95f72be5e904a Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Fri, 10 Apr 2009 12:28:57 -0700 Subject: scripts/get_maintainer.pl - Allow multiple files on command line Improve handling of "by:" signoffs Sorting and frequency checks are done by name/email, not by "by:" tag. Signed-off-by: Joe Perches --- scripts/get_maintainer.pl | 85 +++++++++++++++++++++++------------------------ 1 file changed, 41 insertions(+), 44 deletions(-) (limited to 'scripts') diff --git a/scripts/get_maintainer.pl b/scripts/get_maintainer.pl index 0f3c0a5b5a5b..60dc0c48c929 100755 --- a/scripts/get_maintainer.pl +++ b/scripts/get_maintainer.pl @@ -13,7 +13,7 @@ use strict; my $P = $0; -my $V = '0.14'; +my $V = '0.15'; use Getopt::Long qw(:config no_auto_abbrev); @@ -34,7 +34,7 @@ my $scm = 0; my $web = 0; my $subsystem = 0; my $status = 0; -my $onefile = 0; +my $from_filename = 0; my $version = 0; my $help = 0; @@ -72,7 +72,7 @@ if (!GetOptions( 'status!' => \$status, 'scm!' => \$scm, 'web!' => \$web, - 'f|file' => \$onefile, + 'f|file' => \$from_filename, 'v|version' => \$version, 'h|help' => \$help, )) { @@ -90,8 +90,6 @@ if ($version != 0) { exit 0; } -my $infile = $ARGV[0]; - if ($#ARGV < 0) { usage(); die "$P: argument missing: patchfile or -f file please\n"; @@ -139,32 +137,35 @@ while () { } close(MAINT); -## use the filename on the command line or find the filenames in the patchfile +## use the filenames on the command line or find the filenames in the patchfiles my @files = (); -if ($onefile) { - if (!(-f $infile)) { - die "$P: file '${infile}' not found\n"; +foreach my $file (@ARGV) { + next if ((-d $file)); + if (!(-f $file)) { + die "$P: file '${file}' not found\n"; } - push(@files, $infile); -} else { - open(PATCH, "<$infile") or die "$P: Can't open ${infile}\n"; - while () { - if (m/^\+\+\+\s+(\S+)/) { - my $file = $1; - $file =~ s@^[^/]*/@@; - $file =~ s@\n@@; - push(@files, $file); + if ($from_filename) { + push(@files, $file); + } else { + my $file_cnt = @files; + open(PATCH, "<$file") or die "$P: Can't open ${file}\n"; + while () { + if (m/^\+\+\+\s+(\S+)/) { + my $filename = $1; + $filename =~ s@^[^/]*/@@; + $filename =~ s@\n@@; + push(@files, $filename); + } } + close(PATCH); + if ($file_cnt == @files) { + die "$P: file '${file}' doesn't appear to be a patch. " + . "Add -f to options?\n"; + } + @files = sort_and_uniq(@files); } - close(PATCH); - my $file_cnt = @files; - if ($file_cnt == 0) { - print STDERR "$P: file '${infile}' doesn't appear to be a patch. " - . "Add -f to options?\n"; - } - @files = sort_and_uniq(@files); } my @email_to = (); @@ -208,7 +209,7 @@ foreach my $file (@files) { } } - if ($email_git) { + if ($email && $email_git) { recent_git_signoffs($file); } @@ -240,30 +241,22 @@ if ($email) { } if ($scm) { - if (!$onefile) { - @scm = sort_and_uniq(@scm); - } + @scm = sort_and_uniq(@scm); output(@scm); } if ($status) { - if (!$onefile) { - @status = sort_and_uniq(@status); - } + @status = sort_and_uniq(@status); output(@status); } if ($subsystem) { - if (!$onefile) { - @subsystem = sort_and_uniq(@subsystem); - } + @subsystem = sort_and_uniq(@subsystem); output(@subsystem); } if ($web) { - if (!$onefile) { - @web = sort_and_uniq(@web); - } + @web = sort_and_uniq(@web); output(@web); } @@ -445,10 +438,12 @@ sub recent_git_signoffs { } $cmd = "git log --since=${email_git_since} -- ${file}"; - $cmd .= " | grep -P '^ [-A-Za-z]+by:.*\\\@'"; + $cmd .= " | grep -Pi \"^[-_ a-z]+by:.*\\\@\""; if (!$email_git_penguin_chiefs) { - $cmd .= " | grep -E -v \"${penguin_chiefs}\""; + $cmd .= " | grep -Pv \"${penguin_chiefs}\""; } + $cmd .= " | cut -f2- -d\":\""; + $cmd .= " | sed -e \"s/^\\s+//g\""; $cmd .= " | sort | uniq -c | sort -rn"; $output = `${cmd}`; @@ -456,9 +451,9 @@ sub recent_git_signoffs { @lines = split("\n", $output); foreach my $line (@lines) { - if ($line =~ m/([0-9]+)\s+([-A-Za-z]+by:)\s+(.*)/) { + if ($line =~ m/([0-9]+)\s+(.*)/) { my $sign_offs = $1; - $line = $3; + $line = $2; $count++; if ($sign_offs < $email_git_min_signatures || $count > $email_git_max_maintainers) { @@ -467,17 +462,19 @@ sub recent_git_signoffs { } else { die("$P: Unexpected git output: ${line}\n"); } - if ($line =~ m/(.*) <(.*)>/) { + if ($line =~ m/(.+)<(.+)>/) { my $git_name = $1; my $git_addr = $2; $git_name =~ tr/^\"//; + $git_name =~ tr/^\\s*//; $git_name =~ tr/\"$//; + $git_name =~ tr/\\s*$//; if ($email_usename) { push(@email_to, format_email($git_name, $git_addr)); } else { push(@email_to, $git_addr); } - } elsif ($line =~ m/<(.*)>/) { + } elsif ($line =~ m/<(.+)>/) { my $git_addr = $1; push(@email_to, $git_addr); } else { -- cgit From 79ff807cf23ffb527f3f35bdececf56cabcdee07 Mon Sep 17 00:00:00 2001 From: Uwe Kleine-König Date: Sun, 29 Mar 2009 15:01:47 +0200 Subject: kbuild: fix option processing for -I in headerdep MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -I takes an argument. Without this change only a 1 is added to @opt_include which is not helpful. Signed-off-by: Uwe Kleine-König Acked-by: Vegard Nossum Signed-off-by: Sam Ravnborg --- scripts/headerdep.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'scripts') diff --git a/scripts/headerdep.pl b/scripts/headerdep.pl index 97399da89ef2..b7f6c560e24d 100755 --- a/scripts/headerdep.pl +++ b/scripts/headerdep.pl @@ -19,7 +19,7 @@ my $opt_graph; version => \&version, all => \$opt_all, - I => \@opt_include, + "I=s" => \@opt_include, graph => \$opt_graph, ); -- cgit From 612c280ef2400c70ea2fd8f2e17549c95002368c Mon Sep 17 00:00:00 2001 From: Sam Ravnborg Date: Wed, 8 Apr 2009 08:42:48 +0200 Subject: kconfig: fix update-po-config to accect backslash in input Massimo Maiurana reported (slightly edited): ===== In latest 2.6.29 "make update-po-config" fails at msguniq invocation with an "invalid control sequence" error. The offending string is the following, and it's located in drivers/staging/panel/Kconfig:72: "'\e[L' which are specific to the LCD, and a few ANSI codes. The" looks to me like gettext expects strings in printf format, so in this case it thinks "\e" is a control sequence but doesn't recognise it as a valid one. A valid solution would be to tell kxgettext to automatically escape this kind of strings in the */config.pot he produces, so that msguniq would not complain. ===== This patch implements the suggested escaping. Reported-by: Massimo Maiurana Tested-by: Massimo Maiurana Signed-off-by: Sam Ravnborg --- scripts/kconfig/kxgettext.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'scripts') diff --git a/scripts/kconfig/kxgettext.c b/scripts/kconfig/kxgettext.c index 6eb72a7f2562..8d9ce22b0fc5 100644 --- a/scripts/kconfig/kxgettext.c +++ b/scripts/kconfig/kxgettext.c @@ -43,6 +43,10 @@ static char *escape(const char* text, char *bf, int len) ++text; goto next; } + else if (*text == '\\') { + *bfp++ = '\\'; + len--; + } *bfp++ = *text++; next: --len; -- cgit From 4774bb1ced60a94d83b28e5a42d4cf01b83d9b60 Mon Sep 17 00:00:00 2001 From: Peter Korsgaard Date: Thu, 26 Mar 2009 21:58:04 +0100 Subject: kbuild: use git svn instead of git-svn in setlocalversion Use the correct git syntax instead of the deprecated git-. Signed-off-by: Peter Korsgaard Signed-off-by: Sam Ravnborg --- scripts/setlocalversion | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'scripts') diff --git a/scripts/setlocalversion b/scripts/setlocalversion index f1c4b35bc324..47e75b69a2e9 100755 --- a/scripts/setlocalversion +++ b/scripts/setlocalversion @@ -21,7 +21,7 @@ if head=`git rev-parse --verify --short HEAD 2>/dev/null`; then # Is this git on svn? if git config --get svn-remote.svn.url >/dev/null; then - printf -- '-svn%s' "`git-svn find-rev $head`" + printf -- '-svn%s' "`git svn find-rev $head`" fi # Are there uncommitted changes? -- cgit From c7bb349e7c25df1ae1bbb72675b9bb02e1d9c464 Mon Sep 17 00:00:00 2001 From: Sam Ravnborg Date: Fri, 10 Apr 2009 08:52:43 +0200 Subject: kbuild: introduce destination-y for exported headers xtensa and arm have asked for a possibility to export headers and locate them in a specific directory when exported. Introduce destiantion-y to support this. This patch in additiona adds some limited documentation for the variables used for exported headers. Signed-off-by: Sam Ravnborg Cc: Oskar Schirmer Cc: Mikael Starvik --- scripts/Makefile.headersinst | 2 ++ 1 file changed, 2 insertions(+) (limited to 'scripts') diff --git a/scripts/Makefile.headersinst b/scripts/Makefile.headersinst index 612dc13ddd85..095cfc8b9dbf 100644 --- a/scripts/Makefile.headersinst +++ b/scripts/Makefile.headersinst @@ -14,6 +14,8 @@ _dst := $(if $(dst),$(dst),$(obj)) kbuild-file := $(srctree)/$(obj)/Kbuild include $(kbuild-file) +_dst := $(if $(destination-y),$(destination-y),$(_dst)) + include scripts/Kbuild.include install := $(INSTALL_HDR_PATH)/$(_dst) -- cgit From 0fa3a88cfdfc910d7f335aef588edf9819c05d54 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Thu, 12 Mar 2009 12:28:30 +0000 Subject: kbuild: remove pointless strdup() on arguments passed to new_module() in modpost new_module() itself already calls strdup() on its modname parameter. Signed-off-by: Jan Beulich Signed-off-by: Sam Ravnborg --- scripts/mod/modpost.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'scripts') diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 8cc70612984c..df6e6286a065 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -1913,7 +1913,7 @@ static void read_dump(const char *fname, unsigned int kernel) if (!mod) { if (is_vmlinux(modname)) have_vmlinux = 1; - mod = new_module(NOFAIL(strdup(modname))); + mod = new_module(modname); mod->skip = 1; } s = sym_add_exported(symname, mod, export_no(export)); @@ -1997,7 +1997,7 @@ static void read_markers(const char *fname) mod = find_module(modname); if (!mod) { - mod = new_module(NOFAIL(strdup(modname))); + mod = new_module(modname); mod->skip = 1; } if (is_vmlinux(modname)) { -- cgit From 9e5ec8615209f6a5bf2a612120d972b6021790da Mon Sep 17 00:00:00 2001 From: Maxime Bizon Date: Mon, 9 Feb 2009 18:49:52 +0100 Subject: kbuild: fix spurious initramfs rebuild When gen_initramfs_list is used to generate make dependencies, it includes symbolic links, for which make tracks the link target. Any change to that target will cause an initramfs rebuild, even if the symlink points to something outside of the initramfs directory. If the target happens to be /tmp, the rebuild occurs for each kernel build, since gen_initramfs_list uses mktemp... Proposed way to fix it is to omit symbolic links from generated dependencies, but this has a small drawback: changing perm/owner on a symlink will go unnoticed. Signed-off-by: Maxime Bizon Signed-off-by: Sam Ravnborg --- scripts/gen_initramfs_list.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'scripts') diff --git a/scripts/gen_initramfs_list.sh b/scripts/gen_initramfs_list.sh index 3eea8f15131b..76af5f9623e3 100644 --- a/scripts/gen_initramfs_list.sh +++ b/scripts/gen_initramfs_list.sh @@ -97,7 +97,7 @@ print_mtime() { } list_parse() { - echo "$1 \\" + [ ! -L "$1" ] && echo "$1 \\" || : } # for each file print a line in following format -- cgit