mirror of
https://github.com/git/git.git
synced 2026-03-14 10:53:25 +01:00
Merge branch 'np/verbose-push' into next
* np/verbose-push: make git-push a bit more verbose pack-objects doesn't create random pack names branch: work in subdirectories. gitweb: Use 's' regexp modifier to secure against filenames with LF gitweb: Secure against commit-ish/tree-ish with the same name as path gitweb: esc_html() author in blame git-svnimport: support for partial imports link_temp_to_file: don't leave the path truncated on adjust_shared_perm failure
This commit is contained in:
@@ -10,7 +10,7 @@ SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'git-pack-objects' [-q] [--no-reuse-delta] [--delta-base-offset] [--non-empty]
|
||||
[--local] [--incremental] [--window=N] [--depth=N]
|
||||
[--local] [--incremental] [--window=N] [--depth=N] [--all-progress]
|
||||
[--revs [--unpacked | --all]*] [--stdout | base-name] < object-list
|
||||
|
||||
|
||||
@@ -47,9 +47,8 @@ base-name::
|
||||
<base-name> to determine the name of the created file.
|
||||
When this option is used, the two files are written in
|
||||
<base-name>-<SHA1>.{pack,idx} files. <SHA1> is a hash
|
||||
of object names (currently in random order so it does
|
||||
not have any useful meaning) to make the resulting
|
||||
filename reasonably unique, and written to the standard
|
||||
of the sorted object names to make the resulting filename
|
||||
based on the pack content, and written to the standard
|
||||
output of the command.
|
||||
|
||||
--stdout::
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
#include <sys/time.h>
|
||||
#include <signal.h>
|
||||
|
||||
static const char pack_usage[] = "git-pack-objects [-q] [--no-reuse-delta] [--delta-base-offset] [--non-empty] [--local] [--incremental] [--window=N] [--depth=N] [--revs [--unpacked | --all]*] [--stdout | base-name] <ref-list | <object-list]";
|
||||
static const char pack_usage[] = "git-pack-objects [-q] [--no-reuse-delta] [--delta-base-offset] [--non-empty] [--local] [--incremental] [--window=N] [--depth=N] [--all-progress] [--revs [--unpacked | --all]*] [--stdout | base-name] <ref-list | <object-list]";
|
||||
|
||||
struct object_entry {
|
||||
unsigned char sha1[20];
|
||||
@@ -475,15 +475,15 @@ static void write_pack_file(void)
|
||||
unsigned long offset;
|
||||
struct pack_header hdr;
|
||||
unsigned last_percent = 999;
|
||||
int do_progress = 0;
|
||||
int do_progress = progress;
|
||||
|
||||
if (!base_name)
|
||||
if (!base_name) {
|
||||
f = sha1fd(1, "<stdout>");
|
||||
else {
|
||||
do_progress >>= 1;
|
||||
}
|
||||
else
|
||||
f = sha1create("%s-%s.%s", base_name,
|
||||
sha1_to_hex(object_list_sha1), "pack");
|
||||
do_progress = progress;
|
||||
}
|
||||
if (do_progress)
|
||||
fprintf(stderr, "Writing %d objects.\n", nr_result);
|
||||
|
||||
@@ -1524,6 +1524,10 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
|
||||
progress = 1;
|
||||
continue;
|
||||
}
|
||||
if (!strcmp("--all-progress", arg)) {
|
||||
progress = 2;
|
||||
continue;
|
||||
}
|
||||
if (!strcmp("--incremental", arg)) {
|
||||
incremental = 1;
|
||||
continue;
|
||||
@@ -1641,7 +1645,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
|
||||
else {
|
||||
if (nr_result)
|
||||
prepare_pack(window, depth);
|
||||
if (progress && pack_to_stdout) {
|
||||
if (progress == 1 && pack_to_stdout) {
|
||||
/* the other end usually displays progress itself */
|
||||
struct itimerval v = {{0,},};
|
||||
setitimer(ITIMER_REAL, &v, NULL);
|
||||
|
||||
@@ -31,7 +31,7 @@ $SIG{'PIPE'}="IGNORE";
|
||||
$ENV{'TZ'}="UTC";
|
||||
|
||||
our($opt_h,$opt_o,$opt_v,$opt_u,$opt_C,$opt_i,$opt_m,$opt_M,$opt_t,$opt_T,
|
||||
$opt_b,$opt_r,$opt_I,$opt_A,$opt_s,$opt_l,$opt_d,$opt_D,$opt_S,$opt_F);
|
||||
$opt_b,$opt_r,$opt_I,$opt_A,$opt_s,$opt_l,$opt_d,$opt_D,$opt_S,$opt_F,$opt_P);
|
||||
|
||||
sub usage() {
|
||||
print STDERR <<END;
|
||||
@@ -39,17 +39,19 @@ Usage: ${\basename $0} # fetch/update GIT from SVN
|
||||
[-o branch-for-HEAD] [-h] [-v] [-l max_rev]
|
||||
[-C GIT_repository] [-t tagname] [-T trunkname] [-b branchname]
|
||||
[-d|-D] [-i] [-u] [-r] [-I ignorefilename] [-s start_chg]
|
||||
[-m] [-M regex] [-A author_file] [-S] [-F] [SVN_URL]
|
||||
[-m] [-M regex] [-A author_file] [-S] [-F] [-P project_name] [SVN_URL]
|
||||
END
|
||||
exit(1);
|
||||
}
|
||||
|
||||
getopts("A:b:C:dDFhiI:l:mM:o:rs:t:T:Suv") or usage();
|
||||
getopts("A:b:C:dDFhiI:l:mM:o:rs:t:T:SP:uv") or usage();
|
||||
usage if $opt_h;
|
||||
|
||||
my $tag_name = $opt_t || "tags";
|
||||
my $trunk_name = $opt_T || "trunk";
|
||||
my $branch_name = $opt_b || "branches";
|
||||
my $project_name = $opt_P || "";
|
||||
$project_name = "/" . $project_name if ($project_name);
|
||||
|
||||
@ARGV == 1 or @ARGV == 2 or usage();
|
||||
|
||||
@@ -427,6 +429,20 @@ sub get_ignore($$$$$) {
|
||||
}
|
||||
}
|
||||
|
||||
sub project_path($$)
|
||||
{
|
||||
my ($path, $project) = @_;
|
||||
|
||||
$path = "/".$path unless ($path =~ m#^\/#) ;
|
||||
return $1 if ($path =~ m#^$project\/(.*)$#);
|
||||
|
||||
$path =~ s#\.#\\\.#g;
|
||||
$path =~ s#\+#\\\+#g;
|
||||
return "/" if ($project =~ m#^$path.*$#);
|
||||
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub split_path($$) {
|
||||
my($rev,$path) = @_;
|
||||
my $branch;
|
||||
@@ -446,7 +462,11 @@ sub split_path($$) {
|
||||
print STDERR "$rev: Unrecognized path: $path\n" unless (defined $no_error{$path});
|
||||
return ()
|
||||
}
|
||||
$path = "/" if $path eq "";
|
||||
if ($path eq "") {
|
||||
$path = "/";
|
||||
} elsif ($project_name) {
|
||||
$path = project_path($path, $project_name);
|
||||
}
|
||||
return ($branch,$path);
|
||||
}
|
||||
|
||||
@@ -898,6 +918,7 @@ sub commit_all {
|
||||
while(my($path,$action) = each %$changed_paths) {
|
||||
($branch,$path) = split_path($revision,$path);
|
||||
next if not defined $branch;
|
||||
next if not defined $path;
|
||||
$done{$branch}{$path} = $action;
|
||||
}
|
||||
while(($branch,$changed_paths) = each %done) {
|
||||
|
||||
2
git.c
2
git.c
@@ -222,7 +222,7 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
|
||||
{ "annotate", cmd_annotate, },
|
||||
{ "apply", cmd_apply },
|
||||
{ "archive", cmd_archive },
|
||||
{ "branch", cmd_branch },
|
||||
{ "branch", cmd_branch, RUN_SETUP },
|
||||
{ "cat-file", cmd_cat_file, RUN_SETUP },
|
||||
{ "checkout-index", cmd_checkout_index, RUN_SETUP },
|
||||
{ "check-ref-format", cmd_check_ref_format },
|
||||
|
||||
@@ -876,7 +876,7 @@ sub git_get_hash_by_path {
|
||||
close $fd or return undef;
|
||||
|
||||
#'100644 blob 0fa3f3a66fb6a137f6ec2c19351ed4d807070ffa panic.c'
|
||||
$line =~ m/^([0-9]+) (.+) ([0-9a-fA-F]{40})\t(.+)$/;
|
||||
$line =~ m/^([0-9]+) (.+) ([0-9a-fA-F]{40})\t/;
|
||||
if (defined $type && $type ne $2) {
|
||||
# type doesn't match
|
||||
return undef;
|
||||
@@ -1135,7 +1135,9 @@ sub parse_commit {
|
||||
@commit_lines = @$commit_text;
|
||||
} else {
|
||||
local $/ = "\0";
|
||||
open my $fd, "-|", git_cmd(), "rev-list", "--header", "--parents", "--max-count=1", $commit_id
|
||||
open my $fd, "-|", git_cmd(), "rev-list",
|
||||
"--header", "--parents", "--max-count=1",
|
||||
$commit_id, "--"
|
||||
or return;
|
||||
@commit_lines = split '\n', <$fd>;
|
||||
close $fd or return;
|
||||
@@ -1299,7 +1301,7 @@ sub parse_ls_tree_line ($;%) {
|
||||
my %res;
|
||||
|
||||
#'100644 blob 0fa3f3a66fb6a137f6ec2c19351ed4d807070ffa panic.c'
|
||||
$line =~ m/^([0-9]+) (.+) ([0-9a-fA-F]{40})\t(.+)$/;
|
||||
$line =~ m/^([0-9]+) (.+) ([0-9a-fA-F]{40})\t(.+)$/s;
|
||||
|
||||
$res{'mode'} = $1;
|
||||
$res{'type'} = $2;
|
||||
@@ -2614,7 +2616,7 @@ sub git_summary {
|
||||
}
|
||||
|
||||
open my $fd, "-|", git_cmd(), "rev-list", "--max-count=17",
|
||||
git_get_head_hash($project)
|
||||
git_get_head_hash($project), "--"
|
||||
or die_error(undef, "Open git-rev-list failed");
|
||||
my @revlist = map { chomp; $_ } <$fd>;
|
||||
close $fd;
|
||||
@@ -2751,7 +2753,7 @@ HTML
|
||||
print "<tr class=\"$rev_color[$current_color]\">\n";
|
||||
if ($group_size) {
|
||||
print "<td class=\"sha1\"";
|
||||
print " title=\"$author, $date\"";
|
||||
print " title=\"". esc_html($author) . ", $date\"";
|
||||
print " rowspan=\"$group_size\"" if ($group_size > 1);
|
||||
print ">";
|
||||
print $cgi->a({-href => href(action=>"commit",
|
||||
@@ -3164,7 +3166,7 @@ sub git_log {
|
||||
my $refs = git_get_references();
|
||||
|
||||
my $limit = sprintf("--max-count=%i", (100 * ($page+1)));
|
||||
open my $fd, "-|", git_cmd(), "rev-list", $limit, $hash
|
||||
open my $fd, "-|", git_cmd(), "rev-list", $limit, $hash, "--"
|
||||
or die_error(undef, "Open git-rev-list failed");
|
||||
my @revlist = map { chomp; $_ } <$fd>;
|
||||
close $fd;
|
||||
@@ -3222,7 +3224,7 @@ sub git_commit {
|
||||
$parent = "--root";
|
||||
}
|
||||
open my $fd, "-|", git_cmd(), "diff-tree", '-r', "--no-commit-id",
|
||||
@diff_opts, $parent, $hash
|
||||
@diff_opts, $parent, $hash, "--"
|
||||
or die_error(undef, "Open git-diff-tree failed");
|
||||
my @difftree = map { chomp; $_ } <$fd>;
|
||||
close $fd or die_error(undef, "Reading git-diff-tree failed");
|
||||
@@ -3327,7 +3329,8 @@ sub git_blobdiff {
|
||||
if (defined $hash_base && defined $hash_parent_base) {
|
||||
if (defined $file_name) {
|
||||
# read raw output
|
||||
open $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts, $hash_parent_base, $hash_base,
|
||||
open $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts,
|
||||
$hash_parent_base, $hash_base,
|
||||
"--", $file_name
|
||||
or die_error(undef, "Open git-diff-tree failed");
|
||||
@difftree = map { chomp; $_ } <$fd>;
|
||||
@@ -3341,7 +3344,8 @@ sub git_blobdiff {
|
||||
# try to find filename from $hash
|
||||
|
||||
# read filtered raw output
|
||||
open $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts, $hash_parent_base, $hash_base
|
||||
open $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts,
|
||||
$hash_parent_base, $hash_base, "--"
|
||||
or die_error(undef, "Open git-diff-tree failed");
|
||||
@difftree =
|
||||
# ':100644 100644 03b21826... 3b93d5e7... M ls-files.c'
|
||||
@@ -3411,7 +3415,8 @@ sub git_blobdiff {
|
||||
}
|
||||
|
||||
# open patch output
|
||||
open $fd, "-|", git_cmd(), "diff", '-p', @diff_opts, $hash_parent, $hash
|
||||
open $fd, "-|", git_cmd(), "diff", '-p', @diff_opts,
|
||||
$hash_parent, $hash, "--"
|
||||
or die_error(undef, "Open git-diff failed");
|
||||
} else {
|
||||
die_error('404 Not Found', "Missing one of the blob diff parameters")
|
||||
@@ -3542,8 +3547,8 @@ sub git_commitdiff {
|
||||
my @difftree;
|
||||
if ($format eq 'html') {
|
||||
open $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts,
|
||||
"--no-commit-id",
|
||||
"--patch-with-raw", "--full-index", $hash_parent, $hash
|
||||
"--no-commit-id", "--patch-with-raw", "--full-index",
|
||||
$hash_parent, $hash, "--"
|
||||
or die_error(undef, "Open git-diff-tree failed");
|
||||
|
||||
while (chomp(my $line = <$fd>)) {
|
||||
@@ -3554,7 +3559,7 @@ sub git_commitdiff {
|
||||
|
||||
} elsif ($format eq 'plain') {
|
||||
open $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts,
|
||||
'-p', $hash_parent, $hash
|
||||
'-p', $hash_parent, $hash, "--"
|
||||
or die_error(undef, "Open git-diff-tree failed");
|
||||
|
||||
} else {
|
||||
@@ -3731,7 +3736,9 @@ sub git_search {
|
||||
my $alternate = 1;
|
||||
if ($searchtype eq 'commit' or $searchtype eq 'author' or $searchtype eq 'committer') {
|
||||
$/ = "\0";
|
||||
open my $fd, "-|", git_cmd(), "rev-list", "--header", "--parents", $hash or next;
|
||||
open my $fd, "-|", git_cmd(), "rev-list",
|
||||
"--header", "--parents", $hash, "--"
|
||||
or next;
|
||||
while (my $commit_text = <$fd>) {
|
||||
if (!grep m/$searchtext/i, $commit_text) {
|
||||
next;
|
||||
@@ -3877,7 +3884,7 @@ sub git_shortlog {
|
||||
my $refs = git_get_references();
|
||||
|
||||
my $limit = sprintf("--max-count=%i", (100 * ($page+1)));
|
||||
open my $fd, "-|", git_cmd(), "rev-list", $limit, $hash
|
||||
open my $fd, "-|", git_cmd(), "rev-list", $limit, $hash, "--"
|
||||
or die_error(undef, "Open git-rev-list failed");
|
||||
my @revlist = map { chomp; $_ } <$fd>;
|
||||
close $fd;
|
||||
@@ -3905,7 +3912,8 @@ sub git_shortlog {
|
||||
|
||||
sub git_rss {
|
||||
# http://www.notestips.com/80256B3A007F2692/1/NAMO5P9UPQ
|
||||
open my $fd, "-|", git_cmd(), "rev-list", "--max-count=150", git_get_head_hash($project)
|
||||
open my $fd, "-|", git_cmd(), "rev-list", "--max-count=150",
|
||||
git_get_head_hash($project), "--"
|
||||
or die_error(undef, "Open git-rev-list failed");
|
||||
my @revlist = map { chomp; $_ } <$fd>;
|
||||
close $fd or die_error(undef, "Reading git-rev-list failed");
|
||||
@@ -3929,7 +3937,7 @@ XML
|
||||
}
|
||||
my %cd = parse_date($co{'committer_epoch'});
|
||||
open $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts,
|
||||
$co{'parent'}, $co{'id'}
|
||||
$co{'parent'}, $co{'id'}, "--"
|
||||
or next;
|
||||
my @difftree = map { chomp; $_ } <$fd>;
|
||||
close $fd
|
||||
|
||||
@@ -29,6 +29,7 @@ static void exec_pack_objects(void)
|
||||
{
|
||||
static const char *args[] = {
|
||||
"pack-objects",
|
||||
"--all-progress",
|
||||
"--stdout",
|
||||
NULL
|
||||
};
|
||||
|
||||
@@ -1418,8 +1418,10 @@ static int link_temp_to_file(const char *tmpfile, const char *filename)
|
||||
if (dir) {
|
||||
*dir = 0;
|
||||
mkdir(filename, 0777);
|
||||
if (adjust_shared_perm(filename))
|
||||
if (adjust_shared_perm(filename)) {
|
||||
*dir = '/';
|
||||
return -2;
|
||||
}
|
||||
*dir = '/';
|
||||
if (!link(tmpfile, filename))
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user