diff options
author | Junio C Hamano <gitster@pobox.com> | 2007-09-17 21:18:20 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2007-09-17 22:02:19 -0700 |
commit | be510cfef3d8344007bd34128ca6eb799b714c8c (patch) | |
tree | 4c1136f834d85ca27f5f1870e46352d56927c249 /git-send-email.perl | |
parent | d7416ecac8508367a8ac35ab74ef09b7707d0c4b (diff) | |
download | git-be510cfef3d8344007bd34128ca6eb799b714c8c.tar.gz git-be510cfef3d8344007bd34128ca6eb799b714c8c.tar.xz |
send-email: make message-id generation a bit more robust
Earlier code took Unix time and appended a few random digits.
If you are firing off many messages within a second, you could
issue the same id to different messages, which is a no-no. If
you send out 31 messages within a single second, with random
integer taken out of rand(4200), you have about 10% chance of
producing the same message ID.
This fixes the problem by uses a prefix string which is
constant-per-invocation (time and pid), with a serial number for
each message generated by the process appended at the end.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'git-send-email.perl')
-rwxr-xr-x | git-send-email.perl | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/git-send-email.perl b/git-send-email.perl index 195fe6f70..9547cc37a 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -437,10 +437,17 @@ sub extract_valid_address { # We'll setup a template for the message id, using the "from" address: +my ($message_id_stamp, $message_id_serial); sub make_message_id { - my $date = time; - my $pseudo_rand = int (rand(4200)); + my $uniq; + if (!defined $message_id_stamp) { + $message_id_stamp = sprintf("%s-%s", time, $$); + $message_id_serial = 0; + } + $message_id_serial++; + $uniq = "$message_id_stamp-$message_id_serial"; + my $du_part; for ($sender, $repocommitter, $repoauthor) { $du_part = extract_valid_address(sanitize_address($_)); @@ -450,8 +457,8 @@ sub make_message_id use Sys::Hostname qw(); $du_part = 'user@' . Sys::Hostname::hostname(); } - my $message_id_template = "<%s-git-send-email-$du_part>"; - $message_id = sprintf $message_id_template, "$date$pseudo_rand"; + my $message_id_template = "<%s-git-send-email-%s>"; + $message_id = sprintf($message_id_template, $uniq, $du_part); #print "new message id = $message_id\n"; # Was useful for debugging } |