Re: git-send-email creates duplicate Message-Id's
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Sep 17, 2007, 20:22 UTC
- Message-ID
- <7vejgxyrde.fsf@gitster.siamese.dyndns.org>
- In-Reply-To
- <20070917155901.GP18232@stusta.de>
Adrian Bunk <bunk@kernel.org> writes:
Show 11 quoted lines
> The following might be a bug in git-send-email (git maintainers Cc'ed > and KVM list removed from Cc): > > Patch 54 got the same Message-Id as patch 61 and patch 89 got the same > Message-Id as patch 104. > ... > The emails are: > http://marc.info/?l=linux-kernel&m=119002061330270&w=2 > http://marc.info/?l=linux-kernel&m=119002059626434&w=2 > http://marc.info/?l=linux-kernel&m=119002060011801&w=2 > http://marc.info/?l=linux-kernel&m=119002060318915&w=2
The old code generated rand(4200) for each message and appended it to the timestamp. I do not know where the original author got 4200 from, but I think if you send many messages within a single second it is possible to get collisions.
I guess something like this patch is an improvement? It generates a single prefix from timestamp and random, and appends a number that is incremented for each message.
---
diff --git a/git-send-email.perl b/git-send-email.perl index dd7560b..e250732 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -477,10 +477,18 @@ 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, int(rand(4200))); + $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($_)); @@ -490,8 +498,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 }