mirror of
https://github.com/git/git.git
synced 2026-03-14 18:59:04 +01:00
Merge branch 'jc/repack' into next
* jc/repack: repack: use only pack-objects, not rev-list. gitweb: Fix thinko in git_tags and git_heads gitweb: Make git_get_refs_list do work of git_get_references gitweb: Always use git-peek-remote in git_get_references gitweb: Require project for almost all actions gitweb: Even more support for PATH_INFO based URLs gitk(1): mention --all Fix trivial typos and inconsistencies in hooks documentation gitweb: Fix mimetype_guess_file for files with multiple extensions Patch for http-fetch.c and older curl releases
This commit is contained in:
@@ -37,6 +37,10 @@ frequently used options.
|
||||
|
||||
Show commits older than a specific date.
|
||||
|
||||
--all::
|
||||
|
||||
Show all branches.
|
||||
|
||||
<revs>::
|
||||
|
||||
Limit the revisions to show. This can be either a single revision
|
||||
@@ -63,6 +67,11 @@ gitk --since="2 weeks ago" \-- gitk::
|
||||
The "--" is necessary to avoid confusion with the *branch* named
|
||||
'gitk'
|
||||
|
||||
gitk --max-count=100 --all -- Makefile::
|
||||
|
||||
Show at most 100 changes made to the file 'Makefile'. Instead of only
|
||||
looking for changes in the current branch look in all branches.
|
||||
|
||||
See Also
|
||||
--------
|
||||
'qgit(1)'::
|
||||
|
||||
@@ -5,8 +5,7 @@ Hooks are little scripts you can place in `$GIT_DIR/hooks`
|
||||
directory to trigger action at certain points. When
|
||||
`git-init-db` is run, a handful example hooks are copied in the
|
||||
`hooks` directory of the new repository, but by default they are
|
||||
all disabled. To enable a hook, make it executable with `chmod
|
||||
+x`.
|
||||
all disabled. To enable a hook, make it executable with `chmod +x`.
|
||||
|
||||
This document describes the currently defined hooks.
|
||||
|
||||
@@ -16,16 +15,16 @@ applypatch-msg
|
||||
This hook is invoked by `git-applypatch` script, which is
|
||||
typically invoked by `git-applymbox`. It takes a single
|
||||
parameter, the name of the file that holds the proposed commit
|
||||
log message. Exiting with non-zero status causes the
|
||||
'git-applypatch' to abort before applying the patch.
|
||||
log message. Exiting with non-zero status causes
|
||||
`git-applypatch` to abort before applying the patch.
|
||||
|
||||
The hook is allowed to edit the message file in place, and can
|
||||
be used to normalize the message into some project standard
|
||||
format (if the project has one). It can also be used to refuse
|
||||
the commit after inspecting the message file.
|
||||
|
||||
The default applypatch-msg hook, when enabled, runs the
|
||||
commit-msg hook, if the latter is enabled.
|
||||
The default 'applypatch-msg' hook, when enabled, runs the
|
||||
'commit-msg' hook, if the latter is enabled.
|
||||
|
||||
pre-applypatch
|
||||
--------------
|
||||
@@ -39,8 +38,8 @@ after application of the patch not committed.
|
||||
It can be used to inspect the current working tree and refuse to
|
||||
make a commit if it does not pass certain test.
|
||||
|
||||
The default pre-applypatch hook, when enabled, runs the
|
||||
pre-commit hook, if the latter is enabled.
|
||||
The default 'pre-applypatch' hook, when enabled, runs the
|
||||
'pre-commit' hook, if the latter is enabled.
|
||||
|
||||
post-applypatch
|
||||
---------------
|
||||
@@ -61,9 +60,9 @@ invoked before obtaining the proposed commit log message and
|
||||
making a commit. Exiting with non-zero status from this script
|
||||
causes the `git-commit` to abort.
|
||||
|
||||
The default pre-commit hook, when enabled, catches introduction
|
||||
The default 'pre-commit' hook, when enabled, catches introduction
|
||||
of lines with trailing whitespaces and aborts the commit when
|
||||
a such line is found.
|
||||
such a line is found.
|
||||
|
||||
commit-msg
|
||||
----------
|
||||
@@ -79,8 +78,8 @@ be used to normalize the message into some project standard
|
||||
format (if the project has one). It can also be used to refuse
|
||||
the commit after inspecting the message file.
|
||||
|
||||
The default commit-msg hook, when enabled, detects duplicate
|
||||
Signed-off-by: lines, and aborts the commit when one is found.
|
||||
The default 'commit-msg' hook, when enabled, detects duplicate
|
||||
"Signed-off-by" lines, and aborts the commit if one is found.
|
||||
|
||||
post-commit
|
||||
-----------
|
||||
@@ -91,23 +90,24 @@ parameter, and is invoked after a commit is made.
|
||||
This hook is meant primarily for notification, and cannot affect
|
||||
the outcome of `git-commit`.
|
||||
|
||||
The default post-commit hook, when enabled, demonstrates how to
|
||||
The default 'post-commit' hook, when enabled, demonstrates how to
|
||||
send out a commit notification e-mail.
|
||||
|
||||
update
|
||||
------
|
||||
|
||||
This hook is invoked by `git-receive-pack` on the remote repository,
|
||||
which is happens when a `git push` is done on a local repository.
|
||||
which happens when a `git push` is done on a local repository.
|
||||
Just before updating the ref on the remote repository, the update hook
|
||||
is invoked. Its exit status determines the success or failure of
|
||||
the ref update.
|
||||
|
||||
The hook executes once for each ref to be updated, and takes
|
||||
three parameters:
|
||||
- the name of the ref being updated,
|
||||
- the old object name stored in the ref,
|
||||
- and the new objectname to be stored in the ref.
|
||||
|
||||
- the name of the ref being updated,
|
||||
- the old object name stored in the ref,
|
||||
- and the new objectname to be stored in the ref.
|
||||
|
||||
A zero exit from the update hook allows the ref to be updated.
|
||||
Exiting with a non-zero status prevents `git-receive-pack`
|
||||
@@ -126,16 +126,16 @@ Another use suggested on the mailing list is to use this hook to
|
||||
implement access control which is finer grained than the one
|
||||
based on filesystem group.
|
||||
|
||||
The standard output of this hook is sent to /dev/null; if you
|
||||
want to report something to the git-send-pack on the other end,
|
||||
you can redirect your output to your stderr.
|
||||
The standard output of this hook is sent to `/dev/null`; if you
|
||||
want to report something to the `git-send-pack` on the other end,
|
||||
you can redirect your output to your `stderr`.
|
||||
|
||||
|
||||
post-update
|
||||
-----------
|
||||
|
||||
This hook is invoked by `git-receive-pack` on the remote repository,
|
||||
which is happens when a `git push` is done on a local repository.
|
||||
which happens when a `git push` is done on a local repository.
|
||||
It executes on the remote repository once after all the refs have
|
||||
been updated.
|
||||
|
||||
@@ -145,16 +145,16 @@ name of ref that was actually updated.
|
||||
This hook is meant primarily for notification, and cannot affect
|
||||
the outcome of `git-receive-pack`.
|
||||
|
||||
The post-update hook can tell what are the heads that were pushed,
|
||||
The 'post-update' hook can tell what are the heads that were pushed,
|
||||
but it does not know what their original and updated values are,
|
||||
so it is a poor place to do log old..new.
|
||||
|
||||
The default post-update hook, when enabled, runs
|
||||
When enabled, the default 'post-update' hook runs
|
||||
`git-update-server-info` to keep the information used by dumb
|
||||
transports (e.g., http) up-to-date. If you are publishing
|
||||
a git repository that is accessible via http, you should
|
||||
transports (e.g., HTTP) up-to-date. If you are publishing
|
||||
a git repository that is accessible via HTTP, you should
|
||||
probably enable this hook.
|
||||
|
||||
The standard output of this hook is sent to /dev/null; if you
|
||||
want to report something to the git-send-pack on the other end,
|
||||
you can redirect your output to your stderr.
|
||||
The standard output of this hook is sent to `/dev/null`; if you
|
||||
want to report something to the `git-send-pack` on the other end,
|
||||
you can redirect your output to your `stderr`.
|
||||
|
||||
@@ -32,12 +32,10 @@ trap 'rm -f "$PACKTMP"-*' 0 1 2 3 15
|
||||
# There will be more repacking strategies to come...
|
||||
case ",$all_into_one," in
|
||||
,,)
|
||||
rev_list='--unpacked'
|
||||
pack_objects='--incremental'
|
||||
args='--unpacked --incremental'
|
||||
;;
|
||||
,t,)
|
||||
rev_list=
|
||||
pack_objects=
|
||||
args=
|
||||
|
||||
# Redundancy check in all-into-one case is trivial.
|
||||
existing=`test -d "$PACKDIR" && cd "$PACKDIR" && \
|
||||
@@ -45,11 +43,8 @@ case ",$all_into_one," in
|
||||
;;
|
||||
esac
|
||||
|
||||
pack_objects="$pack_objects $local $quiet $no_reuse_delta$extra"
|
||||
name=$( { git-rev-list --objects --all $rev_list ||
|
||||
echo "git-rev-list died with exit code $?"
|
||||
} |
|
||||
git-pack-objects --non-empty $pack_objects "$PACKTMP") ||
|
||||
args="$args $local $quiet $no_reuse_delta$extra"
|
||||
name=$(git-pack-objects --non-empty --all $args </dev/null "$PACKTMP") ||
|
||||
exit 1
|
||||
if [ -z "$name" ]; then
|
||||
echo Nothing new to pack.
|
||||
|
||||
@@ -274,13 +274,16 @@ sub evaluate_path_info {
|
||||
return if defined $project;
|
||||
my $path_info = $ENV{"PATH_INFO"};
|
||||
return if !$path_info;
|
||||
$path_info =~ s,(^/|/$),,gs;
|
||||
$path_info = validate_input($path_info);
|
||||
$path_info =~ s,^/+,,;
|
||||
return if !$path_info;
|
||||
# find which part of PATH_INFO is project
|
||||
$project = $path_info;
|
||||
$project =~ s,/+$,,;
|
||||
while ($project && !-e "$projectroot/$project/HEAD") {
|
||||
$project =~ s,/*[^/]*$,,;
|
||||
}
|
||||
# validate project
|
||||
$project = validate_input($project);
|
||||
if (!$project ||
|
||||
($export_ok && !-e "$projectroot/$project/$export_ok") ||
|
||||
($strict_export && !project_in_list($project))) {
|
||||
@@ -289,15 +292,23 @@ sub evaluate_path_info {
|
||||
}
|
||||
# do not change any parameters if an action is given using the query string
|
||||
return if $action;
|
||||
if ($path_info =~ m,^$project/([^/]+)/(.+)$,) {
|
||||
# we got "project.git/branch/filename"
|
||||
$action ||= "blob_plain";
|
||||
$hash_base ||= validate_input($1);
|
||||
$file_name ||= validate_input($2);
|
||||
} elsif ($path_info =~ m,^$project/([^/]+)$,) {
|
||||
$path_info =~ s,^$project/*,,;
|
||||
my ($refname, $pathname) = split(/:/, $path_info, 2);
|
||||
if (defined $pathname) {
|
||||
# we got "project.git/branch:filename" or "project.git/branch:dir/"
|
||||
# we could use git_get_type(branch:pathname), but it needs $git_dir
|
||||
$pathname =~ s,^/+,,;
|
||||
if (!$pathname || substr($pathname, -1) eq "/") {
|
||||
$action ||= "tree";
|
||||
} else {
|
||||
$action ||= "blob_plain";
|
||||
}
|
||||
$hash_base ||= validate_input($refname);
|
||||
$file_name ||= validate_input($pathname);
|
||||
} elsif (defined $refname) {
|
||||
# we got "project.git/branch"
|
||||
$action ||= "shortlog";
|
||||
$hash ||= validate_input($1);
|
||||
$hash ||= validate_input($refname);
|
||||
}
|
||||
}
|
||||
evaluate_path_info();
|
||||
@@ -341,6 +352,10 @@ if (defined $project) {
|
||||
if (!defined($actions{$action})) {
|
||||
die_error(undef, "Unknown action");
|
||||
}
|
||||
if ($action !~ m/^(opml|project_list|project_index)$/ &&
|
||||
!$project) {
|
||||
die_error(undef, "Project needed");
|
||||
}
|
||||
$actions{$action}->();
|
||||
exit;
|
||||
|
||||
@@ -828,16 +843,10 @@ sub git_get_project_owner {
|
||||
sub git_get_references {
|
||||
my $type = shift || "";
|
||||
my %refs;
|
||||
my $fd;
|
||||
# 5dc01c595e6c6ec9ccda4f6f69c131c0dd945f8c refs/tags/v2.6.11
|
||||
# c39ae07f393806ccf406ef966e9a15afc43cc36a refs/tags/v2.6.11^{}
|
||||
if (-f "$projectroot/$project/info/refs") {
|
||||
open $fd, "$projectroot/$project/info/refs"
|
||||
or return;
|
||||
} else {
|
||||
open $fd, "-|", git_cmd(), "ls-remote", "."
|
||||
or return;
|
||||
}
|
||||
open my $fd, "-|", $GIT, "peek-remote", "$projectroot/$project/"
|
||||
or return;
|
||||
|
||||
while (my $line = <$fd>) {
|
||||
chomp $line;
|
||||
@@ -1125,7 +1134,8 @@ sub parse_ls_tree_line ($;%) {
|
||||
## parse to array of hashes functions
|
||||
|
||||
sub git_get_refs_list {
|
||||
my $ref_dir = shift;
|
||||
my $type = shift || "";
|
||||
my %refs;
|
||||
my @reflist;
|
||||
|
||||
my @refs;
|
||||
@@ -1133,14 +1143,21 @@ sub git_get_refs_list {
|
||||
or return;
|
||||
while (my $line = <$fd>) {
|
||||
chomp $line;
|
||||
if ($line =~ m/^([0-9a-fA-F]{40})\t$ref_dir\/?([^\^]+)$/) {
|
||||
push @refs, { hash => $1, name => $2 };
|
||||
} elsif ($line =~ m/^[0-9a-fA-F]{40}\t$ref_dir\/?(.*)\^\{\}$/ &&
|
||||
$1 eq $refs[-1]{'name'}) {
|
||||
# most likely a tag is followed by its peeled
|
||||
# (deref) one, and when that happens we know the
|
||||
# previous one was of type 'tag'.
|
||||
$refs[-1]{'type'} = "tag";
|
||||
if ($line =~ m/^([0-9a-fA-F]{40})\trefs\/($type\/?([^\^]+))(\^\{\})?$/) {
|
||||
if (defined $refs{$1}) {
|
||||
push @{$refs{$1}}, $2;
|
||||
} else {
|
||||
$refs{$1} = [ $2 ];
|
||||
}
|
||||
|
||||
if (! $4) { # unpeeled, direct reference
|
||||
push @refs, { hash => $1, name => $3 }; # without type
|
||||
} elsif ($3 eq $refs[-1]{'name'}) {
|
||||
# most likely a tag is followed by its peeled
|
||||
# (deref) one, and when that happens we know the
|
||||
# previous one was of type 'tag'.
|
||||
$refs[-1]{'type'} = "tag";
|
||||
}
|
||||
}
|
||||
}
|
||||
close $fd;
|
||||
@@ -1156,7 +1173,7 @@ sub git_get_refs_list {
|
||||
}
|
||||
# sort refs by age
|
||||
@reflist = sort {$b->{'epoch'} <=> $a->{'epoch'}} @reflist;
|
||||
return \@reflist;
|
||||
return (\@reflist, \%refs);
|
||||
}
|
||||
|
||||
## ----------------------------------------------------------------------
|
||||
@@ -1197,7 +1214,7 @@ sub mimetype_guess_file {
|
||||
}
|
||||
close(MIME);
|
||||
|
||||
$filename =~ /\.(.*?)$/;
|
||||
$filename =~ /\.([^.]*)$/;
|
||||
return $mimemap{$1};
|
||||
}
|
||||
|
||||
@@ -2120,14 +2137,14 @@ sub git_tags_body {
|
||||
|
||||
sub git_heads_body {
|
||||
# uses global variable $project
|
||||
my ($taglist, $head, $from, $to, $extra) = @_;
|
||||
my ($headlist, $head, $from, $to, $extra) = @_;
|
||||
$from = 0 unless defined $from;
|
||||
$to = $#{$taglist} if (!defined $to || $#{$taglist} < $to);
|
||||
$to = $#{$headlist} if (!defined $to || $#{$headlist} < $to);
|
||||
|
||||
print "<table class=\"heads\" cellspacing=\"0\">\n";
|
||||
my $alternate = 0;
|
||||
for (my $i = $from; $i <= $to; $i++) {
|
||||
my $entry = $taglist->[$i];
|
||||
my $entry = $headlist->[$i];
|
||||
my %tag = %$entry;
|
||||
my $curr = $tag{'id'} eq $head;
|
||||
if ($alternate) {
|
||||
@@ -2297,7 +2314,19 @@ sub git_summary {
|
||||
|
||||
my $owner = git_get_project_owner($project);
|
||||
|
||||
my $refs = git_get_references();
|
||||
my ($reflist, $refs) = git_get_refs_list();
|
||||
|
||||
my @taglist;
|
||||
my @headlist;
|
||||
foreach my $ref (@$reflist) {
|
||||
if ($ref->{'name'} =~ s!^heads/!!) {
|
||||
push @headlist, $ref;
|
||||
} else {
|
||||
$ref->{'name'} =~ s!^tags/!!;
|
||||
push @taglist, $ref;
|
||||
}
|
||||
}
|
||||
|
||||
git_header_html();
|
||||
git_print_page_nav('summary','', $head);
|
||||
|
||||
@@ -2327,17 +2356,15 @@ sub git_summary {
|
||||
git_shortlog_body(\@revlist, 0, 15, $refs,
|
||||
$cgi->a({-href => href(action=>"shortlog")}, "..."));
|
||||
|
||||
my $taglist = git_get_refs_list("refs/tags");
|
||||
if (defined @$taglist) {
|
||||
if (@taglist) {
|
||||
git_print_header_div('tags');
|
||||
git_tags_body($taglist, 0, 15,
|
||||
git_tags_body(\@taglist, 0, 15,
|
||||
$cgi->a({-href => href(action=>"tags")}, "..."));
|
||||
}
|
||||
|
||||
my $headlist = git_get_refs_list("refs/heads");
|
||||
if (defined @$headlist) {
|
||||
if (@headlist) {
|
||||
git_print_header_div('heads');
|
||||
git_heads_body($headlist, $head, 0, 15,
|
||||
git_heads_body(\@headlist, $head, 0, 15,
|
||||
$cgi->a({-href => href(action=>"heads")}, "..."));
|
||||
}
|
||||
|
||||
@@ -2548,8 +2575,8 @@ sub git_tags {
|
||||
git_print_page_nav('','', $head,undef,$head);
|
||||
git_print_header_div('summary', $project);
|
||||
|
||||
my $taglist = git_get_refs_list("refs/tags");
|
||||
if (defined @$taglist) {
|
||||
my ($taglist) = git_get_refs_list("tags");
|
||||
if (@$taglist) {
|
||||
git_tags_body($taglist);
|
||||
}
|
||||
git_footer_html();
|
||||
@@ -2561,9 +2588,9 @@ sub git_heads {
|
||||
git_print_page_nav('','', $head,undef,$head);
|
||||
git_print_header_div('summary', $project);
|
||||
|
||||
my $taglist = git_get_refs_list("refs/heads");
|
||||
if (defined @$taglist) {
|
||||
git_heads_body($taglist, $head);
|
||||
my ($headlist) = git_get_refs_list("heads");
|
||||
if (@$headlist) {
|
||||
git_heads_body($headlist, $head);
|
||||
}
|
||||
git_footer_html();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user