Peter Krefting wrote: > Instead of having each imported tar ball's commit message be "Imported > from filename.tar", optionally take a commit message from a file > called "filename.tar.msg". > > Instead of having each commit have the same author and committer > information, optionally read the committer information from a file > called "filename.tar.committer" and author from a file called > "filename.tar.author". > > Signed-off-by: Peter Krefting <peter@xxxxxxxxxxxxxxxx> > --- > I used this (albeit based on a slightly earlier verison of the script) > to generate a better-looking history when importing > http://git.debian.org/?p=crashmail/jamnntpd.git and > http://git.debian.org/?p=crashmail/crashmail.git into Git, using > excerpts from the embedded change history as commit messages. > > contrib/fast-import/import-tars.perl | 42 +++++++++++++++++++++++++++++++-- > 1 files changed, 39 insertions(+), 3 deletions(-) > > diff --git a/contrib/fast-import/import-tars.perl b/contrib/fast-import/import-tars.perl > index 78e40d2..7aad16f 100755 > --- a/contrib/fast-import/import-tars.perl > +++ b/contrib/fast-import/import-tars.perl > @@ -109,12 +109,48 @@ foreach my $tar_file (@ARGV) > $have_top_dir = 0 if $top_dir ne $1; > } > > + # Optionally read a commit message from <filename.tar>.msg > + my $commit_msg = "Imported from $tar_file."; > + if (open MSG, '<', "${tar_file}.msg") > + { > + $commit_msg = ''; > + while (<MSG>) > + { > + $commit_msg .= $_; > + } > + close MSG; > + } > + > + # Optionally read a committer from <filename.tar>.committer > + # (first line is name, second line is e-mail address). > + my $this_committer_name = $committer_name; > + my $this_committer_email = $committer_email; > + if (open COMMITTER, '<', "${tar_file}.committer") > + { > + ($this_committer_name, $this_committer_email) = <COMMITTER>; > + chomp $this_committer_name; > + chomp $this_committer_email; > + close COMMITTER; > + } > + > + # Optionally read an author from <filename.tar>.author > + # (first line is name, second line is e-mail address). > + my $this_author_name = $author_name; > + my $this_author_email = $author_email; > + if (open AUTHOR, '<', "${tar_file}.author") > + { > + ($this_author_name, $this_author_email) = <AUTHOR>; > + chomp $this_author_name; > + chomp $this_author_email; > + close AUTHOR; > + } > + > It's not necessary to duplicate code like that. Also I wonder if there isn't a nicer interface for users. Why not allow the file to specify From:, Committer: etc as header lines # Optionally read a commit message from <filename.tar>.msg my $commit_msg = "Imported from $tar_file."; my ($committer, $commit_date, $author, $author_date); if (open MSG, '<', "${tar_file}.desc") { my $state = "header"; $commit_msg = ''; my $last_val; while (<MSG>) { if ($state eq "header") { if (m{^([A-Z][\w\-]+): (.*)}) { my ($header, $value) = $1; $last_val = ($header eq "Date" ? \$author_date : $header eq "From" ? \$author : $header eq "Subject" ? \$commit_msg : $header eq "Commit-Date" ? \$commit_date : $header eq "Committer" ? \$committer : undef ); if ($last_val) { $$last_val = $value; } else { warn "ignoring header '$header' in ${tar_file}.desc line $.\n"; } } elsif (m{^\s+(.+)}) { if ($last_val) { $$last_val .= " $1"; } } elsif (m{^\s*$}) { $commit_msg .= ($commit_msg ? "\n" : "") . "\n"; $state = "body"; next; } } if ($state eq "body") { $commit_msg .= $_; } } close MSG; } ($this_committer_name, $this_committer_email) = choose_email($committer, $committer_name, $committer_email); ($this_author_name, $this_author_email) = choose_email($author, $author_name, $author_email); sub choose_email { my ($spec_combined, $def_name, $def_email) = @_; return ($def_name, $def_email) unless $spec_combined; if ($spec_combined =~ m{^([^<]+) <([^@]+@[^@]+)>$})) { ($1, $2); } elsif ($spec_combined =~ m{^([^@]+@[^@]+) \((.*)\)$}) { ($2, $1); } else { warn "Couldn't parse e-mail address '$spec_combined'"; ($def_name, $def_email); } } Something like that, anyway... Sam > print FI <<EOF; > commit $branch_ref > -author $author_name <$author_email> $author_time +0000 > -committer $committer_name <$committer_email> $commit_time +0000 > +author $this_author_name <$this_author_email> $author_time +0000 > +committer $this_committer_name <$this_committer_email> $commit_time +0000 > data <<END_OF_COMMIT_MESSAGE > -Imported from $tar_file. > +$commit_msg > END_OF_COMMIT_MESSAGE > > deleteall > -- 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