* [PATCH] view: support SHA-1 of Message-IDs for message links
@ 2014-09-15 2:46 Eric Wong
0 siblings, 0 replies; only message in thread
From: Eric Wong @ 2014-09-15 2:46 UTC (permalink / raw)
To: meta; +Cc: Eric Wong
Some Message-IDs are crazy long, so support SHA-1s for them
instead. This allows shorter URLs to be generated and are
less likely
However, we'll still favor short Message-IDs whenever possible.
---
lib/PublicInbox/Hval.pm | 22 +++++++++++++++-------
lib/PublicInbox/WWW.pm | 16 +++++++++++-----
2 files changed, 26 insertions(+), 12 deletions(-)
diff --git a/lib/PublicInbox/Hval.pm b/lib/PublicInbox/Hval.pm
index a93e8c2..9be163a 100644
--- a/lib/PublicInbox/Hval.pm
+++ b/lib/PublicInbox/Hval.pm
@@ -5,28 +5,36 @@
package PublicInbox::Hval;
use strict;
use warnings;
-use fields qw(raw);
+use fields qw(raw href);
use Encode qw(find_encoding);
use URI::Escape qw(uri_escape_utf8);
my $enc_ascii = find_encoding('us-ascii');
sub new {
- my ($class, $raw) = @_;
+ my ($class, $raw, $href) = @_;
my $self = fields::new($class);
# we never care about leading/trailing whitespace
$raw =~ s/\A\s*//;
$raw =~ s/\s*\z//;
$self->{raw} = $raw;
+ $self->{href} = defined $href ? $href : $raw;
$self;
}
sub new_msgid {
- my ($class, $raw) = @_;
- $raw =~ s/\A<//;
- $raw =~ s/>\z//;
- $class->new($raw);
+ my ($class, $msgid) = @_;
+ $msgid =~ s/\A\s*<?//;
+ $msgid =~ s/>?\s*\z//;
+
+ if (length($msgid) <= 40) {
+ $class->new($msgid);
+ } else {
+ require Digest::SHA;
+ my $hex = Digest::SHA::sha1_hex($msgid);
+ $class->new($msgid, $hex);
+ }
}
sub new_oneline {
@@ -52,7 +60,7 @@ sub ascii_html {
}
sub as_html { ascii_html($_[0]->{raw}) }
-sub as_href { ascii_html(uri_escape_utf8($_[0]->{raw})) }
+sub as_href { ascii_html(uri_escape_utf8($_[0]->{href})) }
sub raw {
if (defined $_[1]) {
diff --git a/lib/PublicInbox/WWW.pm b/lib/PublicInbox/WWW.pm
index f67e72c..1814286 100644
--- a/lib/PublicInbox/WWW.pm
+++ b/lib/PublicInbox/WWW.pm
@@ -130,13 +130,19 @@ sub get_index {
# just returns a string ref for the blob in the current ctx
sub mid2blob {
my ($ctx) = @_;
- require Digest::SHA;
- my $hex = Digest::SHA::sha1_hex($ctx->{mid});
- $hex =~ /\A([a-f0-9]{2})([a-f0-9]{38})\z/i or
- die "BUG: not a SHA-1 hex: $hex";
+ my $hex = $ctx->{mid};
+ my ($x2, $x38) = ($hex =~ /\A([a-f0-9]{2})([a-f0-9]{38})\z/);
+
+ unless (defined $x38) {
+ # compatibility with old links
+ require Digest::SHA;
+ $hex = Digest::SHA::sha1_hex($hex);
+ ($x2, $x38) = ($hex =~ /\A([a-f0-9]{2})([a-f0-9]{38})\z/);
+ defined $x38 or die "BUG: not a SHA-1 hex: $hex";
+ }
my @cmd = ('git', "--git-dir=$ctx->{git_dir}",
- qw(cat-file blob), "HEAD:$1/$2");
+ qw(cat-file blob), "HEAD:$x2/$x38");
my $cmd = join(' ', @cmd);
my $pid = open my $fh, '-|';
defined $pid or die "fork failed: $!\n";
--
EW
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2014-09-15 2:46 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-09-15 2:46 [PATCH] view: support SHA-1 of Message-IDs for message links Eric Wong
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).