X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FGitalist%2FGit%2FProject.pm;h=1548e003bea2903b0d9a471a9d9f63b8bbf931d1;hb=352713a1cf819c27c0c7528ef4f6065057a28491;hp=9d90ea49f3ef6209cb0da15128df6b5de3ec56fc;hpb=b9ef23a551dbf2ea9fac2465ebd02a12ee77b84e;p=catagits%2FGitalist.git diff --git a/lib/Gitalist/Git/Project.pm b/lib/Gitalist/Git/Project.pm index 9d90ea4..1548e00 100644 --- a/lib/Gitalist/Git/Project.pm +++ b/lib/Gitalist/Git/Project.pm @@ -211,13 +211,12 @@ Returns a list of revs for the given head ($sha1). Int :$count?, Int :$skip?, HashRef :$search?, - NonEmptySimpleStr :$file? - ) { + NonEmptySimpleStr :$file? ) { $sha1 = $self->head_hash($sha1) if !$sha1 || $sha1 !~ $SHA1RE; my @search_opts; - if($search) { + if ($search) { $search->{type} = 'grep' if $search->{type} eq 'commit'; @search_opts = ( @@ -247,45 +246,18 @@ Returns a list of revs for the given head ($sha1). =head2 diff($commit, $patch?, $parent?, $file?) -Generate a diff. - -FIXME this should be a method on the commit object. +Generate a diff from a given L. =cut - # XXX Ideally this would return a wee object instead of ad hoc structures. method diff ( Gitalist::Git::Object :$commit!, Bool :$patch?, Maybe[NonEmptySimpleStr] :$parent?, - NonEmptySimpleStr :$file? ) { - # Use parent if specifed, else take the parent from the commit - # if there is only one, otherwise it was a merge commit. - $parent = $parent - ? $parent - : $commit->parents <= 1 - ? $commit->parent_sha1 - : '-c'; - my @etc = ( - ( $file ? ('--', $file) : () ), - ); - - my @out = $self->_raw_diff( - ( $patch ? '--patch-with-raw' : () ), - ( $parent ? $parent : () ), - $commit->sha1, @etc, - ); - - # XXX Yes, there is much wrongness having _parse_diff_tree be destructive. - my @difftree = $self->_parse_diff_tree(\@out); - - return \@difftree - unless $patch; - - # The blank line between the tree and the patch. - shift @out; - - # XXX And no I'm not happy about having diff return tree + patch. - return \@difftree, [$self->_parse_diff(@out)]; + NonEmptySimpleStr :$file? + ) { + return $commit->diff( patch => $patch, + parent => $parent, + file => $file); } =head2 reflog(@lorgargs) @@ -300,13 +272,13 @@ FIXME Should this return objects? = $self->run_cmd(qw(log -g), @logargs) =~ /(^commit.+?(?:(?=^commit)|(?=\z)))/msg; -# commit 02526fc15beddf2c64798a947fecdd8d11bf993d -# Reflog: HEAD@{14} (The Git Server ) -# Reflog message: push -# Author: Foo Barsby -# Date: Thu Sep 17 12:26:05 2009 +0100 -# -# Merge branch 'abc123' + # commit 02526fc15beddf2c64798a947fecdd8d11bf993d + # Reflog: HEAD@{14} (The Git Server ) + # Reflog message: push + # Author: Foo Barsby + # Date: Thu Sep 17 12:26:05 2009 +0100 + # + # Merge branch 'abc123' return map { # XXX Stuff like this makes me want to switch to Git::PurePerl @@ -344,7 +316,13 @@ FIXME Should this return objects? } method _build_description { - return $self->gpp->description; + eval { + return $self->gpp->description; + }; + if ($@) { + return "Unnamed repository."; + } + } method _build_owner { @@ -391,14 +369,14 @@ FIXME Should this return objects? # 5dc01c595e6c6ec9ccda4f6f69c131c0dd945f8c refs/tags/v2.6.11 # c39ae07f393806ccf406ef966e9a15afc43cc36a refs/tags/v2.6.11^{} my @reflist = $self->run_cmd_list(qw(show-ref --dereference)) - or return; + or return; my %refs; - for(@reflist) { - push @{$refs{$1}}, $2 - if m!^($SHA1RE)\srefs/(.*)$!; - } + for (@reflist) { + push @{$refs{$1}}, $2 + if m!^($SHA1RE)\srefs/(.*)$!; + } - return \%refs; + return \%refs; } ## Private methods @@ -413,65 +391,6 @@ FIXME Should this return objects? map split(/\n/, $_, 6), split /\0/, $output; } - method _parse_diff_tree ($diff) { - my @keys = qw(modesrc modedst sha1src sha1dst status src dst); - my @ret; - while (@$diff and $diff->[0] =~ /^:\d+/) { - my $line = shift @$diff; - # see. man git-diff-tree for more info - # mode src, mode dst, sha1 src, sha1 dst, status, src[, dst] - my @vals = $line =~ /^:(\d+) (\d+) ($SHA1RE) ($SHA1RE) ([ACDMRTUX]\d*)\t([^\t]+)(?:\t([^\n]+))?$/; - my %line = zip @keys, @vals; - # Some convenience keys - $line{file} = $line{src}; - $line{sha1} = $line{sha1dst}; - $line{is_new} = $line{sha1src} =~ /^0+$/ - if $line{sha1src}; - @line{qw/status sim/} = $line{status} =~ /(R)(\d+)/ - if $line{status} =~ /^R/; - push @ret, \%line; - } - - return @ret; - } - method _parse_diff (@diff) { - my @ret; - for (@diff) { - # This regex is a little pathological. - if(m{^diff --git (a/(.*?)) (b/\2)}) { - push @ret, { - head => $_, - a => $1, - b => $3, - file => $2, - diff => '', - }; - next; - } - - if(/^index (\w+)\.\.(\w+) (\d+)$/) { - @{$ret[-1]}{qw(index src dst mode)} = ($_, $1, $2, $3); - next - } - - # XXX Somewhat hacky. Ahem. - $ret[@ret ? -1 : 0]{diff} .= "$_\n"; - } - - return @ret; - } - - # gitweb uses the following sort of command for diffing merges: -# /home/dbrook/apps/bin/git --git-dir=/home/dbrook/dev/app/.git diff-tree -r -M --no-commit-id --patch-with-raw --full-index --cc 316cf158df3f6207afbae7270bcc5ba0 -- -# and for regular diffs -# /home/dbrook/apps/bin/git --git-dir=/home/dbrook/dev/app/.git diff-tree -r -M --no-commit-id --patch-with-raw --full-index 2e3454ca0749641b42f063730b0090e1 316cf158df3f6207afbae7270bcc5ba0 -- - method _raw_diff (@args) { - return $self->run_cmd_list( - qw(diff-tree -r -M --no-commit-id --full-index), - @args - ); - } - =head1 SEE ALSO L L