Merge branch 'lt/setup' into __/setup-n-mv

This merges the new built-in calling convention code into Johannes's
builtin-mv topic in order to resolve their conflicts early on.

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Junio C Hamano 2006-07-29 01:54:54 -07:00
commit 7061cf0f20
60 changed files with 586 additions and 327 deletions

View File

@ -11,7 +11,7 @@ SYNOPSIS
'git-daemon' [--verbose] [--syslog] [--inetd | --port=n] [--export-all] 'git-daemon' [--verbose] [--syslog] [--inetd | --port=n] [--export-all]
[--timeout=n] [--init-timeout=n] [--strict-paths] [--timeout=n] [--init-timeout=n] [--strict-paths]
[--base-path=path] [--user-path | --user-path=path] [--base-path=path] [--user-path | --user-path=path]
[directory...] [--reuseaddr] [--detach] [--pid-file=file] [directory...]
DESCRIPTION DESCRIPTION
----------- -----------
@ -82,6 +82,17 @@ OPTIONS
--verbose:: --verbose::
Log details about the incoming connections and requested files. Log details about the incoming connections and requested files.
--reuseaddr::
Use SO_REUSEADDR when binding the listening socket.
This allows the server to restart without waiting for
old connections to time out.
--detach::
Detach from the shell. Implies --syslog.
--pid-file=file::
Save the process id in 'file'.
<directory>:: <directory>::
A directory to add to the whitelist of allowed directories. Unless A directory to add to the whitelist of allowed directories. Unless
--strict-paths is specified this will also include subdirectories --strict-paths is specified this will also include subdirectories

View File

@ -8,7 +8,7 @@ git-http-fetch - downloads a remote git repository via HTTP
SYNOPSIS SYNOPSIS
-------- --------
'git-http-fetch' [-c] [-t] [-a] [-d] [-v] [-w filename] [--recover] <commit> <url> 'git-http-fetch' [-c] [-t] [-a] [-d] [-v] [-w filename] [--recover] [--stdin] <commit> <url>
DESCRIPTION DESCRIPTION
----------- -----------
@ -33,6 +33,12 @@ commit-id::
Writes the commit-id into the filename under $GIT_DIR/refs/<filename> on Writes the commit-id into the filename under $GIT_DIR/refs/<filename> on
the local end after the transfer is complete. the local end after the transfer is complete.
--stdin::
Instead of a commit id on the commandline (which is not expected in this
case), 'git-http-fetch' expects lines on stdin in the format
<commit-id>['\t'<filename-as-in--w>]
Author Author
------ ------
Written by Linus Torvalds <torvalds@osdl.org> Written by Linus Torvalds <torvalds@osdl.org>

View File

@ -29,6 +29,12 @@ OPTIONS
Writes the commit-id into the filename under $GIT_DIR/refs/<filename> on Writes the commit-id into the filename under $GIT_DIR/refs/<filename> on
the local end after the transfer is complete. the local end after the transfer is complete.
--stdin::
Instead of a commit id on the commandline (which is not expected in this
case), 'git-local-fetch' expects lines on stdin in the format
<commit-id>['\t'<filename-as-in--w>]
Author Author
------ ------
Written by Junio C Hamano <junkio@cox.net> Written by Junio C Hamano <junkio@cox.net>

View File

@ -8,7 +8,8 @@ git - the stupid content tracker
SYNOPSIS SYNOPSIS
-------- --------
'git' [--version] [--exec-path[=GIT_EXEC_PATH]] [--help] COMMAND [ARGS] 'git' [--version] [--exec-path[=GIT_EXEC_PATH]] [-p|--paginate]
[--bare] [--git-dir=GIT_DIR] [--help] COMMAND [ARGS]
DESCRIPTION DESCRIPTION
----------- -----------
@ -41,6 +42,15 @@ OPTIONS
environment variable. If no path is given 'git' will print environment variable. If no path is given 'git' will print
the current setting and then exit. the current setting and then exit.
-p|--paginate::
Pipe all output into 'less' (or if set, $PAGER).
--git-dir=<path>::
Set the path to the repository. This can also be controlled by
setting the GIT_DIR environment variable.
--bare::
Same as --git-dir=`pwd`.
FURTHER DOCUMENTATION FURTHER DOCUMENTATION
--------------------- ---------------------

View File

@ -615,6 +615,8 @@ $(SIMPLE_PROGRAMS) : git-%$X : %.o
$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \ $(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
$(LIB_FILE) $(SIMPLE_LIB) $(LIB_FILE) $(SIMPLE_LIB)
ssh-pull.o: ssh-fetch.c
ssh-push.o: ssh-upload.c
git-local-fetch$X: fetch.o git-local-fetch$X: fetch.o
git-ssh-fetch$X: rsh.o fetch.o git-ssh-fetch$X: rsh.o fetch.o
git-ssh-upload$X: rsh.o git-ssh-upload$X: rsh.o

View File

@ -834,7 +834,7 @@ int main(int argc, const char **argv)
} }
init_revisions(&rev); init_revisions(&rev, setup_git_directory());
rev.remove_empty_trees = 1; rev.remove_empty_trees = 1;
rev.topo_order = 1; rev.topo_order = 1;
rev.prune_fn = simplify_commit; rev.prune_fn = simplify_commit;

View File

@ -84,11 +84,10 @@ static void fill_directory(struct dir_struct *dir, const char **pathspec)
static struct lock_file lock_file; static struct lock_file lock_file;
int cmd_add(int argc, const char **argv, char **envp) int cmd_add(int argc, const char **argv, const char *prefix)
{ {
int i, newfd; int i, newfd;
int verbose = 0, show_only = 0; int verbose = 0, show_only = 0;
const char *prefix = setup_git_directory();
const char **pathspec; const char **pathspec;
struct dir_struct dir; struct dir_struct dir;

View File

@ -120,7 +120,7 @@ struct fragment {
struct patch { struct patch {
char *new_name, *old_name, *def_name; char *new_name, *old_name, *def_name;
unsigned int old_mode, new_mode; unsigned int old_mode, new_mode;
int is_rename, is_copy, is_new, is_delete, is_binary; int is_rename, is_copy, is_new, is_delete, is_binary, is_reverse;
#define BINARY_DELTA_DEFLATED 1 #define BINARY_DELTA_DEFLATED 1
#define BINARY_LITERAL_DEFLATED 2 #define BINARY_LITERAL_DEFLATED 2
unsigned long deflate_origlen; unsigned long deflate_origlen;
@ -1119,6 +1119,34 @@ static int parse_chunk(char *buffer, unsigned long size, struct patch *patch)
return offset + hdrsize + patchsize; return offset + hdrsize + patchsize;
} }
#define swap(a,b) myswap((a),(b),sizeof(a))
#define myswap(a, b, size) do { \
unsigned char mytmp[size]; \
memcpy(mytmp, &a, size); \
memcpy(&a, &b, size); \
memcpy(&b, mytmp, size); \
} while (0)
static void reverse_patches(struct patch *p)
{
for (; p; p = p->next) {
struct fragment *frag = p->fragments;
swap(p->new_name, p->old_name);
swap(p->new_mode, p->old_mode);
swap(p->is_new, p->is_delete);
swap(p->lines_added, p->lines_deleted);
swap(p->old_sha1_prefix, p->new_sha1_prefix);
for (; frag; frag = frag->next) {
swap(frag->newpos, frag->oldpos);
swap(frag->newlines, frag->oldlines);
}
p->is_reverse = !p->is_reverse;
}
}
static const char pluses[] = "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"; static const char pluses[] = "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++";
static const char minuses[]= "----------------------------------------------------------------------"; static const char minuses[]= "----------------------------------------------------------------------";
@ -1336,7 +1364,7 @@ static int apply_line(char *output, const char *patch, int plen)
} }
static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag, static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag,
int inaccurate_eof) int reverse, int inaccurate_eof)
{ {
int match_beginning, match_end; int match_beginning, match_end;
char *buf = desc->buffer; char *buf = desc->buffer;
@ -1350,6 +1378,7 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag,
int pos, lines; int pos, lines;
while (size > 0) { while (size > 0) {
char first;
int len = linelen(patch, size); int len = linelen(patch, size);
int plen; int plen;
@ -1366,16 +1395,23 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag,
plen = len-1; plen = len-1;
if (len < size && patch[len] == '\\') if (len < size && patch[len] == '\\')
plen--; plen--;
switch (*patch) { first = *patch;
if (reverse) {
if (first == '-')
first = '+';
else if (first == '+')
first = '-';
}
switch (first) {
case ' ': case ' ':
case '-': case '-':
memcpy(old + oldsize, patch + 1, plen); memcpy(old + oldsize, patch + 1, plen);
oldsize += plen; oldsize += plen;
if (*patch == '-') if (first == '-')
break; break;
/* Fall-through for ' ' */ /* Fall-through for ' ' */
case '+': case '+':
if (*patch != '+' || !no_add) if (first != '+' || !no_add)
newsize += apply_line(new + newsize, patch, newsize += apply_line(new + newsize, patch,
plen); plen);
break; break;
@ -1499,6 +1535,12 @@ static int apply_binary_fragment(struct buffer_desc *desc, struct patch *patch)
void *data; void *data;
void *result; void *result;
/* Binary patch is irreversible */
if (patch->is_reverse)
return error("cannot reverse-apply a binary patch to '%s'",
patch->new_name
? patch->new_name : patch->old_name);
data = inflate_it(fragment->patch, fragment->size, data = inflate_it(fragment->patch, fragment->size,
patch->deflate_origlen); patch->deflate_origlen);
if (!data) if (!data)
@ -1615,7 +1657,8 @@ static int apply_fragments(struct buffer_desc *desc, struct patch *patch)
return apply_binary(desc, patch); return apply_binary(desc, patch);
while (frag) { while (frag) {
if (apply_one_fragment(desc, frag, patch->inaccurate_eof) < 0) if (apply_one_fragment(desc, frag, patch->is_reverse,
patch->inaccurate_eof) < 0)
return error("patch failed: %s:%ld", return error("patch failed: %s:%ld",
name, frag->oldpos); name, frag->oldpos);
frag = frag->next; frag = frag->next;
@ -2142,7 +2185,8 @@ static int use_patch(struct patch *p)
return 1; return 1;
} }
static int apply_patch(int fd, const char *filename, int inaccurate_eof) static int apply_patch(int fd, const char *filename,
int reverse, int inaccurate_eof)
{ {
unsigned long offset, size; unsigned long offset, size;
char *buffer = read_patch_file(fd, &size); char *buffer = read_patch_file(fd, &size);
@ -2162,6 +2206,8 @@ static int apply_patch(int fd, const char *filename, int inaccurate_eof)
nr = parse_chunk(buffer + offset, size, patch); nr = parse_chunk(buffer + offset, size, patch);
if (nr < 0) if (nr < 0)
break; break;
if (reverse)
reverse_patches(patch);
if (use_patch(patch)) { if (use_patch(patch)) {
patch_stats(patch); patch_stats(patch);
*listp = patch; *listp = patch;
@ -2222,10 +2268,11 @@ static int git_apply_config(const char *var, const char *value)
} }
int cmd_apply(int argc, const char **argv, char **envp) int cmd_apply(int argc, const char **argv, const char *prefix)
{ {
int i; int i;
int read_stdin = 1; int read_stdin = 1;
int reverse = 0;
int inaccurate_eof = 0; int inaccurate_eof = 0;
const char *whitespace_option = NULL; const char *whitespace_option = NULL;
@ -2236,7 +2283,7 @@ int cmd_apply(int argc, const char **argv, char **envp)
int fd; int fd;
if (!strcmp(arg, "-")) { if (!strcmp(arg, "-")) {
apply_patch(0, "<stdin>", inaccurate_eof); apply_patch(0, "<stdin>", reverse, inaccurate_eof);
read_stdin = 0; read_stdin = 0;
continue; continue;
} }
@ -2313,6 +2360,10 @@ int cmd_apply(int argc, const char **argv, char **envp)
parse_whitespace_option(arg + 13); parse_whitespace_option(arg + 13);
continue; continue;
} }
if (!strcmp(arg, "-R") || !strcmp(arg, "--reverse")) {
reverse = 1;
continue;
}
if (!strcmp(arg, "--inaccurate-eof")) { if (!strcmp(arg, "--inaccurate-eof")) {
inaccurate_eof = 1; inaccurate_eof = 1;
continue; continue;
@ -2333,12 +2384,12 @@ int cmd_apply(int argc, const char **argv, char **envp)
usage(apply_usage); usage(apply_usage);
read_stdin = 0; read_stdin = 0;
set_default_whitespace_mode(whitespace_option); set_default_whitespace_mode(whitespace_option);
apply_patch(fd, arg, inaccurate_eof); apply_patch(fd, arg, reverse, inaccurate_eof);
close(fd); close(fd);
} }
set_default_whitespace_mode(whitespace_option); set_default_whitespace_mode(whitespace_option);
if (read_stdin) if (read_stdin)
apply_patch(0, "<stdin>", inaccurate_eof); apply_patch(0, "<stdin>", reverse, inaccurate_eof);
if (whitespace_error) { if (whitespace_error) {
if (squelch_whitespace_errors && if (squelch_whitespace_errors &&
squelch_whitespace_errors < whitespace_error) { squelch_whitespace_errors < whitespace_error) {

View File

@ -94,7 +94,7 @@ static int pprint_tag(const unsigned char *sha1, const char *buf, unsigned long
return 0; return 0;
} }
int cmd_cat_file(int argc, const char **argv, char **envp) int cmd_cat_file(int argc, const char **argv, const char *prefix)
{ {
unsigned char sha1[20]; unsigned char sha1[20];
char type[20]; char type[20];
@ -102,7 +102,6 @@ int cmd_cat_file(int argc, const char **argv, char **envp)
unsigned long size; unsigned long size;
int opt; int opt;
setup_git_directory();
git_config(git_default_config); git_config(git_default_config);
if (argc != 3) if (argc != 3)
usage("git-cat-file [-t|-s|-e|-p|<type>] <sha1>"); usage("git-cat-file [-t|-s|-e|-p|<type>] <sha1>");

View File

@ -6,7 +6,7 @@
#include "refs.h" #include "refs.h"
#include "builtin.h" #include "builtin.h"
int cmd_check_ref_format(int argc, const char **argv, char **envp) int cmd_check_ref_format(int argc, const char **argv, const char *prefix)
{ {
if (argc != 2) if (argc != 2)
usage("git check-ref-format refname"); usage("git check-ref-format refname");

View File

@ -77,7 +77,7 @@ static int new_parent(int idx)
return 1; return 1;
} }
int cmd_commit_tree(int argc, const char **argv, char **envp) int cmd_commit_tree(int argc, const char **argv, const char *prefix)
{ {
int i; int i;
int parents = 0; int parents = 0;
@ -88,8 +88,6 @@ int cmd_commit_tree(int argc, const char **argv, char **envp)
unsigned int size; unsigned int size;
setup_ident(); setup_ident();
setup_git_directory();
git_config(git_default_config); git_config(git_default_config);
if (argc < 2) if (argc < 2)

View File

@ -67,7 +67,7 @@ static void count_objects(DIR *d, char *path, int len, int verbose,
} }
} }
int cmd_count_objects(int ac, const char **av, char **ep) int cmd_count_objects(int ac, const char **av, const char *prefix)
{ {
int i; int i;
int verbose = 0; int verbose = 0;

View File

@ -13,13 +13,13 @@ static const char diff_files_usage[] =
"git-diff-files [-q] [-0/-1/2/3 |-c|--cc] [<common diff options>] [<path>...]" "git-diff-files [-q] [-0/-1/2/3 |-c|--cc] [<common diff options>] [<path>...]"
COMMON_DIFF_OPTIONS_HELP; COMMON_DIFF_OPTIONS_HELP;
int cmd_diff_files(int argc, const char **argv, char **envp) int cmd_diff_files(int argc, const char **argv, const char *prefix)
{ {
struct rev_info rev; struct rev_info rev;
int silent = 0; int silent = 0;
init_revisions(&rev, prefix);
git_config(git_default_config); /* no "diff" UI options */ git_config(git_default_config); /* no "diff" UI options */
init_revisions(&rev);
rev.abbrev = 0; rev.abbrev = 0;
argc = setup_revisions(argc, argv, &rev, NULL); argc = setup_revisions(argc, argv, &rev, NULL);

View File

@ -9,14 +9,14 @@ static const char diff_cache_usage[] =
"[<common diff options>] <tree-ish> [<path>...]" "[<common diff options>] <tree-ish> [<path>...]"
COMMON_DIFF_OPTIONS_HELP; COMMON_DIFF_OPTIONS_HELP;
int cmd_diff_index(int argc, const char **argv, char **envp) int cmd_diff_index(int argc, const char **argv, const char *prefix)
{ {
struct rev_info rev; struct rev_info rev;
int cached = 0; int cached = 0;
int i; int i;
init_revisions(&rev, prefix);
git_config(git_default_config); /* no "diff" UI options */ git_config(git_default_config); /* no "diff" UI options */
init_revisions(&rev);
rev.abbrev = 0; rev.abbrev = 0;
argc = setup_revisions(argc, argv, &rev, NULL); argc = setup_revisions(argc, argv, &rev, NULL);

View File

@ -55,10 +55,9 @@ static void diff_stages(int stage1, int stage2, const char **pathspec)
} }
} }
int cmd_diff_stages(int ac, const char **av, char **envp) int cmd_diff_stages(int ac, const char **av, const char *prefix)
{ {
int stage1, stage2; int stage1, stage2;
const char *prefix = setup_git_directory();
const char **pathspec = NULL; const char **pathspec = NULL;
git_config(git_default_config); /* no "diff" UI options */ git_config(git_default_config); /* no "diff" UI options */

View File

@ -59,7 +59,7 @@ static const char diff_tree_usage[] =
" --root include the initial commit as diff against /dev/null\n" " --root include the initial commit as diff against /dev/null\n"
COMMON_DIFF_OPTIONS_HELP; COMMON_DIFF_OPTIONS_HELP;
int cmd_diff_tree(int argc, const char **argv, char **envp) int cmd_diff_tree(int argc, const char **argv, const char *prefix)
{ {
int nr_sha1; int nr_sha1;
char line[1000]; char line[1000];
@ -67,9 +67,9 @@ int cmd_diff_tree(int argc, const char **argv, char **envp)
static struct rev_info *opt = &log_tree_opt; static struct rev_info *opt = &log_tree_opt;
int read_stdin = 0; int read_stdin = 0;
init_revisions(opt, prefix);
git_config(git_default_config); /* no "diff" UI options */ git_config(git_default_config); /* no "diff" UI options */
nr_sha1 = 0; nr_sha1 = 0;
init_revisions(opt);
opt->abbrev = 0; opt->abbrev = 0;
opt->diff = 1; opt->diff = 1;
argc = setup_revisions(argc, argv, opt, NULL); argc = setup_revisions(argc, argv, opt, NULL);

View File

@ -221,7 +221,7 @@ void add_head(struct rev_info *revs)
add_pending_object(revs, obj, "HEAD"); add_pending_object(revs, obj, "HEAD");
} }
int cmd_diff(int argc, const char **argv, char **envp) int cmd_diff(int argc, const char **argv, const char *prefix)
{ {
int i; int i;
struct rev_info rev; struct rev_info rev;
@ -251,7 +251,7 @@ int cmd_diff(int argc, const char **argv, char **envp)
*/ */
git_config(git_diff_ui_config); git_config(git_diff_ui_config);
init_revisions(&rev); init_revisions(&rev, prefix);
argc = setup_revisions(argc, argv, &rev, NULL); argc = setup_revisions(argc, argv, &rev, NULL);
if (!rev.diffopt.output_format) { if (!rev.diffopt.output_format) {
@ -346,7 +346,15 @@ int cmd_diff(int argc, const char **argv, char **envp)
return builtin_diff_index(&rev, argc, argv); return builtin_diff_index(&rev, argc, argv);
else if (ents == 2) else if (ents == 2)
return builtin_diff_tree(&rev, argc, argv, ent); return builtin_diff_tree(&rev, argc, argv, ent);
else if ((ents == 3) && (ent[0].item->flags & UNINTERESTING)) {
/* diff A...B where there is one sane merge base between
* A and B. We have ent[0] == merge-base, ent[1] == A,
* and ent[2] == B. Show diff between the base and B.
*/
return builtin_diff_tree(&rev, argc, argv, ent);
}
else else
return builtin_diff_combined(&rev, argc, argv, ent, ents); return builtin_diff_combined(&rev, argc, argv,
ent, ents);
usage(builtin_diff_usage); usage(builtin_diff_usage);
} }

View File

@ -242,7 +242,7 @@ static void shortlog(const char *name, unsigned char *sha1,
free_list(&subjects); free_list(&subjects);
} }
int cmd_fmt_merge_msg(int argc, char **argv, char **envp) int cmd_fmt_merge_msg(int argc, char **argv, const char *prefix)
{ {
int limit = 20, i = 0; int limit = 20, i = 0;
char line[1024]; char line[1024];
@ -342,7 +342,7 @@ int cmd_fmt_merge_msg(int argc, char **argv, char **envp)
struct rev_info rev; struct rev_info rev;
head = lookup_commit(head_sha1); head = lookup_commit(head_sha1);
init_revisions(&rev); init_revisions(&rev, prefix);
rev.commit_format = CMIT_FMT_ONELINE; rev.commit_format = CMIT_FMT_ONELINE;
rev.ignore_merges = 1; rev.ignore_merges = 1;
rev.limited = 1; rev.limited = 1;

View File

@ -919,14 +919,13 @@ static const char emsg_missing_context_len[] =
static const char emsg_missing_argument[] = static const char emsg_missing_argument[] =
"option requires an argument -%s"; "option requires an argument -%s";
int cmd_grep(int argc, const char **argv, char **envp) int cmd_grep(int argc, const char **argv, const char *prefix)
{ {
int hit = 0; int hit = 0;
int cached = 0; int cached = 0;
int seen_dashdash = 0; int seen_dashdash = 0;
struct grep_opt opt; struct grep_opt opt;
struct object_array list = { 0, 0, NULL }; struct object_array list = { 0, 0, NULL };
const char *prefix = setup_git_directory();
const char **paths = NULL; const char **paths = NULL;
int i; int i;

View File

@ -221,15 +221,15 @@ static void show_man_page(const char *git_cmd)
execlp("man", "man", page, NULL); execlp("man", "man", page, NULL);
} }
int cmd_version(int argc, const char **argv, char **envp) int cmd_version(int argc, const char **argv, const char *prefix)
{ {
printf("git version %s\n", git_version_string); printf("git version %s\n", git_version_string);
return 0; return 0;
} }
int cmd_help(int argc, const char **argv, char **envp) int cmd_help(int argc, const char **argv, const char *prefix)
{ {
const char *help_cmd = argv[1]; const char *help_cmd = argc > 1 ? argv[1] : NULL;
if (!help_cmd) if (!help_cmd)
cmd_usage(0, git_exec_path(), NULL); cmd_usage(0, git_exec_path(), NULL);
else if (!strcmp(help_cmd, "--all") || !strcmp(help_cmd, "-a")) else if (!strcmp(help_cmd, "--all") || !strcmp(help_cmd, "-a"))

View File

@ -250,7 +250,7 @@ static const char init_db_usage[] =
* On the other hand, it might just make lookup slower and messier. You * On the other hand, it might just make lookup slower and messier. You
* be the judge. The default case is to have one DB per managed directory. * be the judge. The default case is to have one DB per managed directory.
*/ */
int cmd_init_db(int argc, const char **argv, char **envp) int cmd_init_db(int argc, const char **argv, const char *prefix)
{ {
const char *git_dir; const char *git_dir;
const char *sha1_dir; const char *sha1_dir;

View File

@ -16,7 +16,7 @@
/* this is in builtin-diff.c */ /* this is in builtin-diff.c */
void add_head(struct rev_info *revs); void add_head(struct rev_info *revs);
static void cmd_log_init(int argc, const char **argv, char **envp, static void cmd_log_init(int argc, const char **argv, const char *prefix,
struct rev_info *rev) struct rev_info *rev)
{ {
rev->abbrev = DEFAULT_ABBREV; rev->abbrev = DEFAULT_ABBREV;
@ -45,27 +45,27 @@ static int cmd_log_walk(struct rev_info *rev)
return 0; return 0;
} }
int cmd_whatchanged(int argc, const char **argv, char **envp) int cmd_whatchanged(int argc, const char **argv, const char *prefix)
{ {
struct rev_info rev; struct rev_info rev;
git_config(git_diff_ui_config); git_config(git_diff_ui_config);
init_revisions(&rev); init_revisions(&rev, prefix);
rev.diff = 1; rev.diff = 1;
rev.diffopt.recursive = 1; rev.diffopt.recursive = 1;
rev.simplify_history = 0; rev.simplify_history = 0;
cmd_log_init(argc, argv, envp, &rev); cmd_log_init(argc, argv, prefix, &rev);
if (!rev.diffopt.output_format) if (!rev.diffopt.output_format)
rev.diffopt.output_format = DIFF_FORMAT_RAW; rev.diffopt.output_format = DIFF_FORMAT_RAW;
return cmd_log_walk(&rev); return cmd_log_walk(&rev);
} }
int cmd_show(int argc, const char **argv, char **envp) int cmd_show(int argc, const char **argv, const char *prefix)
{ {
struct rev_info rev; struct rev_info rev;
git_config(git_diff_ui_config); git_config(git_diff_ui_config);
init_revisions(&rev); init_revisions(&rev, prefix);
rev.diff = 1; rev.diff = 1;
rev.diffopt.recursive = 1; rev.diffopt.recursive = 1;
rev.combine_merges = 1; rev.combine_merges = 1;
@ -73,18 +73,18 @@ int cmd_show(int argc, const char **argv, char **envp)
rev.always_show_header = 1; rev.always_show_header = 1;
rev.ignore_merges = 0; rev.ignore_merges = 0;
rev.no_walk = 1; rev.no_walk = 1;
cmd_log_init(argc, argv, envp, &rev); cmd_log_init(argc, argv, prefix, &rev);
return cmd_log_walk(&rev); return cmd_log_walk(&rev);
} }
int cmd_log(int argc, const char **argv, char **envp) int cmd_log(int argc, const char **argv, const char *prefix)
{ {
struct rev_info rev; struct rev_info rev;
git_config(git_diff_ui_config); git_config(git_diff_ui_config);
init_revisions(&rev); init_revisions(&rev, prefix);
rev.always_show_header = 1; rev.always_show_header = 1;
cmd_log_init(argc, argv, envp, &rev); cmd_log_init(argc, argv, prefix, &rev);
return cmd_log_walk(&rev); return cmd_log_walk(&rev);
} }
@ -178,7 +178,7 @@ static int get_patch_id(struct commit *commit, struct diff_options *options,
return diff_flush_patch_id(options, sha1); return diff_flush_patch_id(options, sha1);
} }
static void get_patch_ids(struct rev_info *rev, struct diff_options *options) static void get_patch_ids(struct rev_info *rev, struct diff_options *options, const char *prefix)
{ {
struct rev_info check_rev; struct rev_info check_rev;
struct commit *commit; struct commit *commit;
@ -203,7 +203,7 @@ static void get_patch_ids(struct rev_info *rev, struct diff_options *options)
die("diff_setup_done failed"); die("diff_setup_done failed");
/* given a range a..b get all patch ids for b..a */ /* given a range a..b get all patch ids for b..a */
init_revisions(&check_rev); init_revisions(&check_rev, prefix);
o1->flags ^= UNINTERESTING; o1->flags ^= UNINTERESTING;
o2->flags ^= UNINTERESTING; o2->flags ^= UNINTERESTING;
add_pending_object(&check_rev, o1, "o1"); add_pending_object(&check_rev, o1, "o1");
@ -240,7 +240,7 @@ static void gen_message_id(char *dest, unsigned int length, char *base)
(int)(email_end - email_start - 1), email_start + 1); (int)(email_end - email_start - 1), email_start + 1);
} }
int cmd_format_patch(int argc, const char **argv, char **envp) int cmd_format_patch(int argc, const char **argv, const char *prefix)
{ {
struct commit *commit; struct commit *commit;
struct commit **list = NULL; struct commit **list = NULL;
@ -259,7 +259,7 @@ int cmd_format_patch(int argc, const char **argv, char **envp)
char ref_message_id[1024]; char ref_message_id[1024];
git_config(git_format_config); git_config(git_format_config);
init_revisions(&rev); init_revisions(&rev, prefix);
rev.commit_format = CMIT_FMT_EMAIL; rev.commit_format = CMIT_FMT_EMAIL;
rev.verbose_header = 1; rev.verbose_header = 1;
rev.diff = 1; rev.diff = 1;
@ -363,7 +363,7 @@ int cmd_format_patch(int argc, const char **argv, char **envp)
} }
if (ignore_if_in_upstream) if (ignore_if_in_upstream)
get_patch_ids(&rev, &patch_id_opts); get_patch_ids(&rev, &patch_id_opts, prefix);
if (!use_stdout) if (!use_stdout)
realstdout = fdopen(dup(1), "w"); realstdout = fdopen(dup(1), "w");

View File

@ -322,14 +322,13 @@ static const char ls_files_usage[] =
"[ --exclude-per-directory=<filename> ] [--full-name] [--abbrev] " "[ --exclude-per-directory=<filename> ] [--full-name] [--abbrev] "
"[--] [<file>]*"; "[--] [<file>]*";
int cmd_ls_files(int argc, const char **argv, char** envp) int cmd_ls_files(int argc, const char **argv, const char *prefix)
{ {
int i; int i;
int exc_given = 0; int exc_given = 0;
struct dir_struct dir; struct dir_struct dir;
memset(&dir, 0, sizeof(dir)); memset(&dir, 0, sizeof(dir));
prefix = setup_git_directory();
if (prefix) if (prefix)
prefix_offset = strlen(prefix); prefix_offset = strlen(prefix);
git_config(git_default_config); git_config(git_default_config);

View File

@ -18,7 +18,7 @@ static int abbrev = 0;
static int ls_options = 0; static int ls_options = 0;
static const char **pathspec; static const char **pathspec;
static int chomp_prefix = 0; static int chomp_prefix = 0;
static const char *prefix; static const char *ls_tree_prefix;
static const char ls_tree_usage[] = static const char ls_tree_usage[] =
"git-ls-tree [-d] [-r] [-t] [-z] [--name-only] [--name-status] [--full-name] [--abbrev[=<n>]] <tree-ish> [path...]"; "git-ls-tree [-d] [-r] [-t] [-z] [--name-only] [--name-status] [--full-name] [--abbrev[=<n>]] <tree-ish> [path...]";
@ -71,7 +71,7 @@ static int show_tree(const unsigned char *sha1, const char *base, int baselen,
return 0; return 0;
if (chomp_prefix && if (chomp_prefix &&
(baselen < chomp_prefix || memcmp(prefix, base, chomp_prefix))) (baselen < chomp_prefix || memcmp(ls_tree_prefix, base, chomp_prefix)))
return 0; return 0;
if (!(ls_options & LS_NAME_ONLY)) if (!(ls_options & LS_NAME_ONLY))
@ -85,13 +85,13 @@ static int show_tree(const unsigned char *sha1, const char *base, int baselen,
return retval; return retval;
} }
int cmd_ls_tree(int argc, const char **argv, char **envp) int cmd_ls_tree(int argc, const char **argv, const char *prefix)
{ {
unsigned char sha1[20]; unsigned char sha1[20];
struct tree *tree; struct tree *tree;
prefix = setup_git_directory();
git_config(git_default_config); git_config(git_default_config);
ls_tree_prefix = prefix;
if (prefix && *prefix) if (prefix && *prefix)
chomp_prefix = strlen(prefix); chomp_prefix = strlen(prefix);
while (1 < argc && argv[1][0] == '-') { while (1 < argc && argv[1][0] == '-') {

View File

@ -446,7 +446,7 @@ static int read_one_header_line(char *line, int sz, FILE *in)
break; break;
} }
/* Count mbox From headers as headers */ /* Count mbox From headers as headers */
if (!ofs && !memcmp(line, "From ", 5)) if (!ofs && (!memcmp(line, "From ", 5) || !memcmp(line, ">From ", 6)))
ofs = 1; ofs = 1;
return ofs; return ofs;
} }
@ -836,7 +836,7 @@ int mailinfo(FILE *in, FILE *out, int ks, const char *encoding,
static const char mailinfo_usage[] = static const char mailinfo_usage[] =
"git-mailinfo [-k] [-u | --encoding=<encoding>] msg patch <mail >info"; "git-mailinfo [-k] [-u | --encoding=<encoding>] msg patch <mail >info";
int cmd_mailinfo(int argc, const char **argv, char **envp) int cmd_mailinfo(int argc, const char **argv, const char *prefix)
{ {
/* NEEDSWORK: might want to do the optional .git/ directory /* NEEDSWORK: might want to do the optional .git/ directory
* discovery * discovery

View File

@ -138,7 +138,7 @@ out:
free(name); free(name);
return ret; return ret;
} }
int cmd_mailsplit(int argc, const char **argv, char **envp) int cmd_mailsplit(int argc, const char **argv, const char *prefix)
{ {
int nr = 0, nr_prec = 4, ret; int nr = 0, nr_prec = 4, ret;
int allow_bare = 0; int allow_bare = 0;

View File

@ -56,11 +56,10 @@ static const char *add_slash(const char *path)
static struct lock_file lock_file; static struct lock_file lock_file;
int cmd_mv(int argc, const char **argv, char **envp) int cmd_mv(int argc, const char **argv, const char *prefix)
{ {
int i, newfd, count; int i, newfd, count;
int verbose = 0, show_only = 0, force = 0, ignore_errors = 0; int verbose = 0, show_only = 0, force = 0, ignore_errors = 0;
const char *prefix = setup_git_directory();
const char **source, **destination, **dest_path; const char **source, **destination, **dest_path;
enum update_mode { BOTH = 0, WORKING_DIRECTORY, INDEX } *modes; enum update_mode { BOTH = 0, WORKING_DIRECTORY, INDEX } *modes;
struct stat st; struct stat st;

View File

@ -217,7 +217,7 @@ static void add_cache_refs(void)
add_cache_tree(active_cache_tree); add_cache_tree(active_cache_tree);
} }
int cmd_prune(int argc, const char **argv, char **envp) int cmd_prune(int argc, const char **argv, const char *prefix)
{ {
int i; int i;
@ -234,7 +234,7 @@ int cmd_prune(int argc, const char **argv, char **envp)
* Set up revision parsing, and mark us as being interested * Set up revision parsing, and mark us as being interested
* in all object types, not just commits. * in all object types, not just commits.
*/ */
init_revisions(&revs); init_revisions(&revs, prefix);
revs.tag_objects = 1; revs.tag_objects = 1;
revs.blob_objects = 1; revs.blob_objects = 1;
revs.tree_objects = 1; revs.tree_objects = 1;

View File

@ -270,7 +270,7 @@ static int do_push(const char *repo)
return 0; return 0;
} }
int cmd_push(int argc, const char **argv, char **envp) int cmd_push(int argc, const char **argv, const char *prefix)
{ {
int i; int i;
const char *repo = "origin"; /* default repository */ const char *repo = "origin"; /* default repository */

View File

@ -870,7 +870,7 @@ static const char read_tree_usage[] = "git-read-tree (<sha> | [[-m [--aggressive
static struct lock_file lock_file; static struct lock_file lock_file;
int cmd_read_tree(int argc, const char **argv, char **envp) int cmd_read_tree(int argc, const char **argv, const char *prefix)
{ {
int i, newfd, stage = 0; int i, newfd, stage = 0;
unsigned char sha1[20]; unsigned char sha1[20];
@ -882,7 +882,6 @@ int cmd_read_tree(int argc, const char **argv, char **envp)
state.quiet = 1; state.quiet = 1;
state.refresh_cache = 1; state.refresh_cache = 1;
setup_git_directory();
git_config(git_default_config); git_config(git_default_config);
newfd = hold_lock_file_for_update(&lock_file, get_index_file()); newfd = hold_lock_file_for_update(&lock_file, get_index_file());

View File

@ -306,12 +306,12 @@ static void mark_edges_uninteresting(struct commit_list *list)
} }
} }
int cmd_rev_list(int argc, const char **argv, char **envp) int cmd_rev_list(int argc, const char **argv, const char *prefix)
{ {
struct commit_list *list; struct commit_list *list;
int i; int i;
init_revisions(&revs); init_revisions(&revs, prefix);
revs.abbrev = 0; revs.abbrev = 0;
revs.commit_format = CMIT_FMT_UNSPECIFIED; revs.commit_format = CMIT_FMT_UNSPECIFIED;
argc = setup_revisions(argc, argv, &revs, NULL); argc = setup_revisions(argc, argv, &revs, NULL);

View File

@ -209,11 +209,10 @@ static int try_difference(const char *arg)
return 0; return 0;
} }
int cmd_rev_parse(int argc, const char **argv, char **envp) int cmd_rev_parse(int argc, const char **argv, const char *prefix)
{ {
int i, as_is = 0, verify = 0; int i, as_is = 0, verify = 0;
unsigned char sha1[20]; unsigned char sha1[20];
const char *prefix = setup_git_directory();
git_config(git_default_config); git_config(git_default_config);

View File

@ -43,11 +43,10 @@ static int remove_file(const char *name)
static struct lock_file lock_file; static struct lock_file lock_file;
int cmd_rm(int argc, const char **argv, char **envp) int cmd_rm(int argc, const char **argv, const char *prefix)
{ {
int i, newfd; int i, newfd;
int verbose = 0, show_only = 0, force = 0; int verbose = 0, show_only = 0, force = 0;
const char *prefix = setup_git_directory();
const char **pathspec; const char **pathspec;
char *seen; char *seen;

View File

@ -550,7 +550,7 @@ static int omit_in_dense(struct commit *commit, struct commit **rev, int n)
return 0; return 0;
} }
int cmd_show_branch(int ac, const char **av, char **envp) int cmd_show_branch(int ac, const char **av, const char *prefix)
{ {
struct commit *rev[MAX_REVS], *commit; struct commit *rev[MAX_REVS], *commit;
struct commit_list *list = NULL, *seen = NULL; struct commit_list *list = NULL, *seen = NULL;
@ -573,7 +573,6 @@ int cmd_show_branch(int ac, const char **av, char **envp)
int topics = 0; int topics = 0;
int dense = 1; int dense = 1;
setup_git_directory();
git_config(git_show_branch_config); git_config(git_show_branch_config);
/* If nothing is specified, try the default first */ /* If nothing is specified, try the default first */

View File

@ -54,7 +54,7 @@ void stripspace(FILE *in, FILE *out)
fputc('\n', out); fputc('\n', out);
} }
int cmd_stripspace(int argc, const char **argv, char **envp) int cmd_stripspace(int argc, const char **argv, const char *prefix)
{ {
stripspace(stdin, stdout); stripspace(stdin, stdout);
return 0; return 0;

View File

@ -308,7 +308,7 @@ int git_tar_config(const char *var, const char *value)
return git_default_config(var, value); return git_default_config(var, value);
} }
static int generate_tar(int argc, const char **argv, char** envp) static int generate_tar(int argc, const char **argv, const char *prefix)
{ {
unsigned char sha1[20], tree_sha1[20]; unsigned char sha1[20], tree_sha1[20];
struct commit *commit; struct commit *commit;
@ -319,7 +319,6 @@ static int generate_tar(int argc, const char **argv, char** envp)
current_path.alloc = PATH_MAX; current_path.alloc = PATH_MAX;
current_path.len = current_path.eof = 0; current_path.len = current_path.eof = 0;
setup_git_directory();
git_config(git_tar_config); git_config(git_tar_config);
switch (argc) { switch (argc) {
@ -402,19 +401,19 @@ static int remote_tar(int argc, const char **argv)
return !!ret; return !!ret;
} }
int cmd_tar_tree(int argc, const char **argv, char **envp) int cmd_tar_tree(int argc, const char **argv, const char *prefix)
{ {
if (argc < 2) if (argc < 2)
usage(tar_tree_usage); usage(tar_tree_usage);
if (!strncmp("--remote=", argv[1], 9)) if (!strncmp("--remote=", argv[1], 9))
return remote_tar(argc, argv); return remote_tar(argc, argv);
return generate_tar(argc, argv, envp); return generate_tar(argc, argv, prefix);
} }
/* ustar header + extended global header content */ /* ustar header + extended global header content */
#define HEADERSIZE (2 * RECORDSIZE) #define HEADERSIZE (2 * RECORDSIZE)
int cmd_get_tar_commit_id(int argc, const char **argv, char **envp) int cmd_get_tar_commit_id(int argc, const char **argv, const char *prefix)
{ {
char buffer[HEADERSIZE]; char buffer[HEADERSIZE];
struct ustar_header *header = (struct ustar_header *)buffer; struct ustar_header *header = (struct ustar_header *)buffer;

View File

@ -476,12 +476,11 @@ static int do_reupdate(int ac, const char **av,
return 0; return 0;
} }
int cmd_update_index(int argc, const char **argv, char **envp) int cmd_update_index(int argc, const char **argv, const char *prefix)
{ {
int i, newfd, entries, has_errors = 0, line_termination = '\n'; int i, newfd, entries, has_errors = 0, line_termination = '\n';
int allow_options = 1; int allow_options = 1;
int read_from_stdin = 0; int read_from_stdin = 0;
const char *prefix = setup_git_directory();
int prefix_length = prefix ? strlen(prefix) : 0; int prefix_length = prefix ? strlen(prefix) : 0;
char set_executable_bit = 0; char set_executable_bit = 0;
unsigned int refresh_flags = 0; unsigned int refresh_flags = 0;

View File

@ -5,7 +5,7 @@
static const char git_update_ref_usage[] = static const char git_update_ref_usage[] =
"git-update-ref <refname> <value> [<oldval>] [-m <reason>]"; "git-update-ref <refname> <value> [<oldval>] [-m <reason>]";
int cmd_update_ref(int argc, const char **argv, char **envp) int cmd_update_ref(int argc, const char **argv, const char *prefix)
{ {
const char *refname=NULL, *value=NULL, *oldval=NULL, *msg=NULL; const char *refname=NULL, *value=NULL, *oldval=NULL, *msg=NULL;
struct ref_lock *lock; struct ref_lock *lock;
@ -13,7 +13,6 @@ int cmd_update_ref(int argc, const char **argv, char **envp)
int i; int i;
setup_ident(); setup_ident();
setup_git_directory();
git_config(git_default_config); git_config(git_default_config);
for (i = 1; i < argc; i++) { for (i = 1; i < argc; i++) {

View File

@ -15,7 +15,7 @@ static int nak(const char *reason)
return 1; return 1;
} }
int cmd_upload_tar(int argc, const char **argv, char **envp) int cmd_upload_tar(int argc, const char **argv, const char *prefix)
{ {
int len; int len;
const char *dir = argv[1]; const char *dir = argv[1];

View File

@ -60,14 +60,12 @@ int write_tree(unsigned char *sha1, int missing_ok, const char *prefix)
return 0; return 0;
} }
int cmd_write_tree(int argc, const char **argv, char **envp) int cmd_write_tree(int argc, const char **argv, const char *unused_prefix)
{ {
int missing_ok = 0, ret; int missing_ok = 0, ret;
const char *prefix = NULL; const char *prefix = NULL;
unsigned char sha1[20]; unsigned char sha1[20];
setup_git_directory();
while (1 < argc) { while (1 < argc) {
const char *arg = argv[1]; const char *arg = argv[1];
if (!strcmp(arg, "--missing-ok")) if (!strcmp(arg, "--missing-ok"))

View File

@ -15,54 +15,54 @@ void cmd_usage(int show_all, const char *exec_path, const char *fmt, ...)
#endif #endif
; ;
extern int cmd_help(int argc, const char **argv, char **envp); extern int cmd_help(int argc, const char **argv, const char *prefix);
extern int cmd_version(int argc, const char **argv, char **envp); extern int cmd_version(int argc, const char **argv, const char *prefix);
extern int cmd_whatchanged(int argc, const char **argv, char **envp); extern int cmd_whatchanged(int argc, const char **argv, const char *prefix);
extern int cmd_show(int argc, const char **argv, char **envp); extern int cmd_show(int argc, const char **argv, const char *prefix);
extern int cmd_log(int argc, const char **argv, char **envp); extern int cmd_log(int argc, const char **argv, const char *prefix);
extern int cmd_diff(int argc, const char **argv, char **envp); extern int cmd_diff(int argc, const char **argv, const char *prefix);
extern int cmd_format_patch(int argc, const char **argv, char **envp); extern int cmd_format_patch(int argc, const char **argv, const char *prefix);
extern int cmd_count_objects(int argc, const char **argv, char **envp); extern int cmd_count_objects(int argc, const char **argv, const char *prefix);
extern int cmd_prune(int argc, const char **argv, char **envp); extern int cmd_prune(int argc, const char **argv, const char *prefix);
extern int cmd_push(int argc, const char **argv, char **envp); extern int cmd_push(int argc, const char **argv, const char *prefix);
extern int cmd_grep(int argc, const char **argv, char **envp); extern int cmd_grep(int argc, const char **argv, const char *prefix);
extern int cmd_rm(int argc, const char **argv, char **envp); extern int cmd_rm(int argc, const char **argv, const char *prefix);
extern int cmd_add(int argc, const char **argv, char **envp); extern int cmd_add(int argc, const char **argv, const char *prefix);
extern int cmd_rev_list(int argc, const char **argv, char **envp); extern int cmd_rev_list(int argc, const char **argv, const char *prefix);
extern int cmd_check_ref_format(int argc, const char **argv, char **envp); extern int cmd_check_ref_format(int argc, const char **argv, const char *prefix);
extern int cmd_init_db(int argc, const char **argv, char **envp); extern int cmd_init_db(int argc, const char **argv, const char *prefix);
extern int cmd_tar_tree(int argc, const char **argv, char **envp); extern int cmd_tar_tree(int argc, const char **argv, const char *prefix);
extern int cmd_upload_tar(int argc, const char **argv, char **envp); extern int cmd_upload_tar(int argc, const char **argv, const char *prefix);
extern int cmd_get_tar_commit_id(int argc, const char **argv, char **envp); extern int cmd_get_tar_commit_id(int argc, const char **argv, const char *prefix);
extern int cmd_ls_files(int argc, const char **argv, char **envp); extern int cmd_ls_files(int argc, const char **argv, const char *prefix);
extern int cmd_ls_tree(int argc, const char **argv, char **envp); extern int cmd_ls_tree(int argc, const char **argv, const char *prefix);
extern int cmd_read_tree(int argc, const char **argv, char **envp); extern int cmd_read_tree(int argc, const char **argv, const char *prefix);
extern int cmd_commit_tree(int argc, const char **argv, char **envp); extern int cmd_commit_tree(int argc, const char **argv, const char *prefix);
extern int cmd_apply(int argc, const char **argv, char **envp); extern int cmd_apply(int argc, const char **argv, const char *prefix);
extern int cmd_show_branch(int argc, const char **argv, char **envp); extern int cmd_show_branch(int argc, const char **argv, const char *prefix);
extern int cmd_diff_files(int argc, const char **argv, char **envp); extern int cmd_diff_files(int argc, const char **argv, const char *prefix);
extern int cmd_diff_index(int argc, const char **argv, char **envp); extern int cmd_diff_index(int argc, const char **argv, const char *prefix);
extern int cmd_diff_stages(int argc, const char **argv, char **envp); extern int cmd_diff_stages(int argc, const char **argv, const char *prefix);
extern int cmd_diff_tree(int argc, const char **argv, char **envp); extern int cmd_diff_tree(int argc, const char **argv, const char *prefix);
extern int cmd_cat_file(int argc, const char **argv, char **envp); extern int cmd_cat_file(int argc, const char **argv, const char *prefix);
extern int cmd_rev_parse(int argc, const char **argv, char **envp); extern int cmd_rev_parse(int argc, const char **argv, const char *prefix);
extern int cmd_update_index(int argc, const char **argv, char **envp); extern int cmd_update_index(int argc, const char **argv, const char *prefix);
extern int cmd_update_ref(int argc, const char **argv, char **envp); extern int cmd_update_ref(int argc, const char **argv, const char *prefix);
extern int cmd_fmt_merge_msg(int argc, const char **argv, char **envp); extern int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix);
extern int cmd_mv(int argc, const char **argv, char **envp); extern int cmd_mv(int argc, const char **argv, const char *prefix);
extern int cmd_write_tree(int argc, const char **argv, char **envp); extern int cmd_write_tree(int argc, const char **argv, const char *prefix);
extern int write_tree(unsigned char *sha1, int missing_ok, const char *prefix); extern int write_tree(unsigned char *sha1, int missing_ok, const char *prefix);
extern int cmd_mailsplit(int argc, const char **argv, char **envp); extern int cmd_mailsplit(int argc, const char **argv, const char *prefix);
extern int split_mbox(const char **mbox, const char *dir, int allow_bare, int nr_prec, int skip); extern int split_mbox(const char **mbox, const char *dir, int allow_bare, int nr_prec, int skip);
extern int cmd_mailinfo(int argc, const char **argv, char **envp); extern int cmd_mailinfo(int argc, const char **argv, const char *prefix);
extern int mailinfo(FILE *in, FILE *out, int ks, const char *encoding, const char *msg, const char *patch); extern int mailinfo(FILE *in, FILE *out, int ks, const char *encoding, const char *msg, const char *patch);
extern int cmd_stripspace(int argc, const char **argv, char **envp); extern int cmd_stripspace(int argc, const char **argv, const char *prefix);
extern void stripspace(FILE *in, FILE *out); extern void stripspace(FILE *in, FILE *out);
#endif #endif

View File

@ -19,7 +19,7 @@ static const char daemon_usage[] =
"git-daemon [--verbose] [--syslog] [--inetd | --port=n] [--export-all]\n" "git-daemon [--verbose] [--syslog] [--inetd | --port=n] [--export-all]\n"
" [--timeout=n] [--init-timeout=n] [--strict-paths]\n" " [--timeout=n] [--init-timeout=n] [--strict-paths]\n"
" [--base-path=path] [--user-path | --user-path=path]\n" " [--base-path=path] [--user-path | --user-path=path]\n"
" [--reuseaddr] [directory...]"; " [--reuseaddr] [--detach] [--pid-file=file] [directory...]";
/* List of acceptable pathname prefixes */ /* List of acceptable pathname prefixes */
static char **ok_paths = NULL; static char **ok_paths = NULL;

124
fetch.c
View File

@ -7,9 +7,7 @@
#include "tag.h" #include "tag.h"
#include "blob.h" #include "blob.h"
#include "refs.h" #include "refs.h"
#include "strbuf.h"
const char *write_ref = NULL;
const char *write_ref_log_details = NULL;
int get_tree = 0; int get_tree = 0;
int get_history = 0; int get_history = 0;
@ -213,54 +211,106 @@ static int mark_complete(const char *path, const unsigned char *sha1)
return 0; return 0;
} }
int pull(char *target) int pull_targets_stdin(char ***target, const char ***write_ref)
{ {
struct ref_lock *lock = NULL; int targets = 0, targets_alloc = 0;
unsigned char sha1[20]; struct strbuf buf;
*target = NULL; *write_ref = NULL;
strbuf_init(&buf);
while (1) {
char *rf_one = NULL;
char *tg_one;
read_line(&buf, stdin, '\n');
if (buf.eof)
break;
tg_one = buf.buf;
rf_one = strchr(tg_one, '\t');
if (rf_one)
*rf_one++ = 0;
if (targets >= targets_alloc) {
targets_alloc = targets_alloc ? targets_alloc * 2 : 64;
*target = xrealloc(*target, targets_alloc * sizeof(**target));
*write_ref = xrealloc(*write_ref, targets_alloc * sizeof(**write_ref));
}
(*target)[targets] = strdup(tg_one);
(*write_ref)[targets] = rf_one ? strdup(rf_one) : NULL;
targets++;
}
return targets;
}
void pull_targets_free(int targets, char **target, const char **write_ref)
{
while (targets--) {
free(target[targets]);
if (write_ref && write_ref[targets])
free((char *) write_ref[targets]);
}
}
int pull(int targets, char **target, const char **write_ref,
const char *write_ref_log_details)
{
struct ref_lock **lock = xcalloc(targets, sizeof(struct ref_lock *));
unsigned char *sha1 = xmalloc(targets * 20);
char *msg; char *msg;
int ret; int ret;
int i;
save_commit_buffer = 0; save_commit_buffer = 0;
track_object_refs = 0; track_object_refs = 0;
if (write_ref) {
lock = lock_ref_sha1(write_ref, NULL, 0); for (i = 0; i < targets; i++) {
if (!lock) { if (!write_ref || !write_ref[i])
error("Can't lock ref %s", write_ref); continue;
return -1;
lock[i] = lock_ref_sha1(write_ref[i], NULL, 0);
if (!lock[i]) {
error("Can't lock ref %s", write_ref[i]);
goto unlock_and_fail;
} }
} }
if (!get_recover) if (!get_recover)
for_each_ref(mark_complete); for_each_ref(mark_complete);
if (interpret_target(target, sha1)) { for (i = 0; i < targets; i++) {
error("Could not interpret %s as something to pull", target); if (interpret_target(target[i], &sha1[20 * i])) {
if (lock) error("Could not interpret %s as something to pull", target[i]);
unlock_ref(lock); goto unlock_and_fail;
return -1; }
} if (process(lookup_unknown_object(&sha1[20 * i])))
if (process(lookup_unknown_object(sha1))) { goto unlock_and_fail;
if (lock)
unlock_ref(lock);
return -1;
}
if (loop()) {
if (lock)
unlock_ref(lock);
return -1;
} }
if (write_ref) { if (loop())
if (write_ref_log_details) { goto unlock_and_fail;
msg = xmalloc(strlen(write_ref_log_details) + 12);
sprintf(msg, "fetch from %s", write_ref_log_details); if (write_ref_log_details) {
} msg = xmalloc(strlen(write_ref_log_details) + 12);
else sprintf(msg, "fetch from %s", write_ref_log_details);
msg = NULL; } else {
ret = write_ref_sha1(lock, sha1, msg ? msg : "fetch (unknown)"); msg = NULL;
if (msg)
free(msg);
return ret;
} }
for (i = 0; i < targets; i++) {
if (!write_ref || !write_ref[i])
continue;
ret = write_ref_sha1(lock[i], &sha1[20 * i], msg ? msg : "fetch (unknown)");
lock[i] = NULL;
if (ret)
goto unlock_and_fail;
}
if (msg)
free(msg);
return 0; return 0;
unlock_and_fail:
for (i = 0; i < targets; i++)
if (lock[i])
unlock_ref(lock[i]);
return -1;
} }

17
fetch.h
View File

@ -22,12 +22,6 @@ extern void prefetch(unsigned char *sha1);
*/ */
extern int fetch_ref(char *ref, unsigned char *sha1); extern int fetch_ref(char *ref, unsigned char *sha1);
/* If set, the ref filename to write the target value to. */
extern const char *write_ref;
/* If set additional text will appear in the ref log. */
extern const char *write_ref_log_details;
/* Set to fetch the target tree. */ /* Set to fetch the target tree. */
extern int get_tree; extern int get_tree;
@ -46,6 +40,15 @@ extern int get_recover;
/* Report what we got under get_verbosely */ /* Report what we got under get_verbosely */
extern void pull_say(const char *, const char *); extern void pull_say(const char *, const char *);
extern int pull(char *target); /* Load pull targets from stdin */
extern int pull_targets_stdin(char ***target, const char ***write_ref);
/* Free up loaded targets */
extern void pull_targets_free(int targets, char **target, const char **write_ref);
/* If write_ref is set, the ref filename to write the target value to. */
/* If write_ref_log_details is set, additional text will appear in the ref log. */
extern int pull(int targets, char **target, const char **write_ref,
const char *write_ref_log_details);
#endif /* PULL_H */ #endif /* PULL_H */

View File

@ -1142,9 +1142,7 @@ sub req_ci
exit; exit;
} }
open FILE, ">", "$ENV{GIT_DIR}refs/heads/$state->{module}"; print LOCKFILE $commithash;
print FILE $commithash;
close FILE;
$updater->update(); $updater->update();
@ -1171,7 +1169,9 @@ sub req_ci
} }
close LOCKFILE; close LOCKFILE;
unlink($lockfile); my $reffile = "$ENV{GIT_DIR}refs/heads/$state->{module}";
unlink($reffile);
rename($lockfile, $reffile);
chdir "/"; chdir "/";
print "ok\n"; print "ok\n";

View File

@ -54,6 +54,10 @@ start_httpd () {
fi fi
done done
fi fi
if test $? != 0; then
echo "Could not execute http daemon $httpd."
exit 1
fi
} }
stop_httpd () { stop_httpd () {
@ -184,7 +188,7 @@ EOF
else else
# plain-old CGI # plain-old CGI
list_mods=`echo "$httpd" | sed "s/-f$/-l/"` list_mods=`echo "$httpd" | sed "s/-f$/-l/"`
$list_mods | grep 'mod_cgi\.c' >/dev/null || \ $list_mods | grep 'mod_cgi\.c' >/dev/null 2>&1 || \
echo "LoadModule cgi_module $module_path/mod_cgi.so" >> "$conf" echo "LoadModule cgi_module $module_path/mod_cgi.so" >> "$conf"
cat >> "$conf" <<EOF cat >> "$conf" <<EOF
AddHandler cgi-script .cgi AddHandler cgi-script .cgi
@ -234,4 +238,5 @@ esac
start_httpd start_httpd
test -z "$browser" && browser=echo test -z "$browser" && browser=echo
$browser http://127.0.0.1:$port url=http://127.0.0.1:$port
$browser $url || echo $url

View File

@ -12,7 +12,7 @@ fi
laf="$GIT_DIR/lost-found" laf="$GIT_DIR/lost-found"
rm -fr "$laf" && mkdir -p "$laf/commit" "$laf/other" || exit rm -fr "$laf" && mkdir -p "$laf/commit" "$laf/other" || exit
git fsck-objects | git fsck-objects --full |
while read dangling type sha1 while read dangling type sha1
do do
case "$dangling" in case "$dangling" in

View File

@ -52,7 +52,8 @@ then
else else
rm -f "$GIT_DIR/ORIG_HEAD" rm -f "$GIT_DIR/ORIG_HEAD"
fi fi
git-update-ref -m "reset $reset_type $@" HEAD "$rev" git-update-ref -m "reset $reset_type $*" HEAD "$rev"
update_ref_status=$?
case "$reset_type" in case "$reset_type" in
--hard ) --hard )
@ -66,3 +67,5 @@ case "$reset_type" in
esac esac
rm -f "$GIT_DIR/MERGE_HEAD" "$GIT_DIR/rr-cache/MERGE_RR" "$GIT_DIR/SQUASH_MSG" rm -f "$GIT_DIR/MERGE_HEAD" "$GIT_DIR/rr-cache/MERGE_RR" "$GIT_DIR/SQUASH_MSG"
exit $update_ref_status

178
git.c
View File

@ -35,6 +35,59 @@ static void prepend_to_path(const char *dir, int len)
setenv("PATH", path, 1); setenv("PATH", path, 1);
} }
static int handle_options(const char*** argv, int* argc)
{
int handled = 0;
while (*argc > 0) {
const char *cmd = (*argv)[0];
if (cmd[0] != '-')
break;
/*
* For legacy reasons, the "version" and "help"
* commands can be written with "--" prepended
* to make them look like flags.
*/
if (!strcmp(cmd, "--help") || !strcmp(cmd, "--version"))
break;
/*
* Check remaining flags.
*/
if (!strncmp(cmd, "--exec-path", 11)) {
cmd += 11;
if (*cmd == '=')
git_set_exec_path(cmd + 1);
else {
puts(git_exec_path());
exit(0);
}
} else if (!strcmp(cmd, "-p") || !strcmp(cmd, "--paginate")) {
setup_pager();
} else if (!strcmp(cmd, "--git-dir")) {
if (*argc < 1)
return -1;
setenv("GIT_DIR", (*argv)[1], 1);
(*argv)++;
(*argc)--;
} else if (!strncmp(cmd, "--git-dir=", 10)) {
setenv("GIT_DIR", cmd + 10, 1);
} else if (!strcmp(cmd, "--bare")) {
static char git_dir[1024];
setenv("GIT_DIR", getcwd(git_dir, 1024), 1);
} else {
fprintf(stderr, "Unknown option: %s\n", cmd);
cmd_usage(0, NULL, NULL);
}
(*argv)++;
(*argc)--;
handled++;
}
return handled;
}
static const char *alias_command; static const char *alias_command;
static char *alias_string = NULL; static char *alias_string = NULL;
@ -106,7 +159,7 @@ static int handle_alias(int *argcp, const char ***argv)
subdir = setup_git_directory_gently(&nongit); subdir = setup_git_directory_gently(&nongit);
if (!nongit) { if (!nongit) {
int count; int count, option_count;
const char** new_argv; const char** new_argv;
alias_command = (*argv)[0]; alias_command = (*argv)[0];
@ -114,6 +167,10 @@ static int handle_alias(int *argcp, const char ***argv)
if (alias_string) { if (alias_string) {
count = split_cmdline(alias_string, &new_argv); count = split_cmdline(alias_string, &new_argv);
option_count = handle_options(&new_argv, &count);
memmove(new_argv - option_count, new_argv,
count * sizeof(char *));
new_argv -= option_count;
if (count < 1) if (count < 1)
die("empty alias for %s", alias_command); die("empty alias for %s", alias_command);
@ -157,52 +214,55 @@ static int handle_alias(int *argcp, const char ***argv)
const char git_version_string[] = GIT_VERSION; const char git_version_string[] = GIT_VERSION;
#define NEEDS_PREFIX 1
static void handle_internal_command(int argc, const char **argv, char **envp) static void handle_internal_command(int argc, const char **argv, char **envp)
{ {
const char *cmd = argv[0]; const char *cmd = argv[0];
static struct cmd_struct { static struct cmd_struct {
const char *cmd; const char *cmd;
int (*fn)(int, const char **, char **); int (*fn)(int, const char **, const char *);
int prefix;
} commands[] = { } commands[] = {
{ "version", cmd_version }, { "version", cmd_version },
{ "help", cmd_help }, { "help", cmd_help },
{ "log", cmd_log }, { "log", cmd_log, NEEDS_PREFIX },
{ "whatchanged", cmd_whatchanged }, { "whatchanged", cmd_whatchanged, NEEDS_PREFIX },
{ "show", cmd_show }, { "show", cmd_show, NEEDS_PREFIX },
{ "push", cmd_push }, { "push", cmd_push },
{ "format-patch", cmd_format_patch }, { "format-patch", cmd_format_patch, NEEDS_PREFIX },
{ "count-objects", cmd_count_objects }, { "count-objects", cmd_count_objects },
{ "diff", cmd_diff }, { "diff", cmd_diff, NEEDS_PREFIX },
{ "grep", cmd_grep }, { "grep", cmd_grep, NEEDS_PREFIX },
{ "rm", cmd_rm }, { "rm", cmd_rm, NEEDS_PREFIX },
{ "add", cmd_add }, { "add", cmd_add, NEEDS_PREFIX },
{ "rev-list", cmd_rev_list }, { "rev-list", cmd_rev_list, NEEDS_PREFIX },
{ "init-db", cmd_init_db }, { "init-db", cmd_init_db },
{ "get-tar-commit-id", cmd_get_tar_commit_id }, { "get-tar-commit-id", cmd_get_tar_commit_id },
{ "upload-tar", cmd_upload_tar }, { "upload-tar", cmd_upload_tar },
{ "check-ref-format", cmd_check_ref_format }, { "check-ref-format", cmd_check_ref_format },
{ "ls-files", cmd_ls_files }, { "ls-files", cmd_ls_files, NEEDS_PREFIX },
{ "ls-tree", cmd_ls_tree }, { "ls-tree", cmd_ls_tree, NEEDS_PREFIX },
{ "tar-tree", cmd_tar_tree }, { "tar-tree", cmd_tar_tree, NEEDS_PREFIX },
{ "read-tree", cmd_read_tree }, { "read-tree", cmd_read_tree, NEEDS_PREFIX },
{ "commit-tree", cmd_commit_tree }, { "commit-tree", cmd_commit_tree, NEEDS_PREFIX },
{ "apply", cmd_apply }, { "apply", cmd_apply },
{ "show-branch", cmd_show_branch }, { "show-branch", cmd_show_branch, NEEDS_PREFIX },
{ "diff-files", cmd_diff_files }, { "diff-files", cmd_diff_files, NEEDS_PREFIX },
{ "diff-index", cmd_diff_index }, { "diff-index", cmd_diff_index, NEEDS_PREFIX },
{ "diff-stages", cmd_diff_stages }, { "diff-stages", cmd_diff_stages, NEEDS_PREFIX },
{ "diff-tree", cmd_diff_tree }, { "diff-tree", cmd_diff_tree, NEEDS_PREFIX },
{ "cat-file", cmd_cat_file }, { "cat-file", cmd_cat_file, NEEDS_PREFIX },
{ "rev-parse", cmd_rev_parse }, { "rev-parse", cmd_rev_parse, NEEDS_PREFIX },
{ "write-tree", cmd_write_tree }, { "write-tree", cmd_write_tree, NEEDS_PREFIX },
{ "mailsplit", cmd_mailsplit }, { "mailsplit", cmd_mailsplit },
{ "mailinfo", cmd_mailinfo }, { "mailinfo", cmd_mailinfo },
{ "stripspace", cmd_stripspace }, { "stripspace", cmd_stripspace },
{ "update-index", cmd_update_index }, { "update-index", cmd_update_index, NEEDS_PREFIX },
{ "update-ref", cmd_update_ref }, { "update-ref", cmd_update_ref, NEEDS_PREFIX },
{ "fmt-merge-msg", cmd_fmt_merge_msg }, { "fmt-merge-msg", cmd_fmt_merge_msg, NEEDS_PREFIX },
{ "prune", cmd_prune }, { "prune", cmd_prune, NEEDS_PREFIX },
{ "mv", cmd_mv }, { "mv", cmd_mv, NEEDS_PREFIX },
}; };
int i; int i;
@ -214,9 +274,13 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
for (i = 0; i < ARRAY_SIZE(commands); i++) { for (i = 0; i < ARRAY_SIZE(commands); i++) {
struct cmd_struct *p = commands+i; struct cmd_struct *p = commands+i;
const char *prefix;
if (strcmp(p->cmd, cmd)) if (strcmp(p->cmd, cmd))
continue; continue;
prefix = NULL;
if (p->prefix)
prefix = setup_git_directory();
if (getenv("GIT_TRACE")) { if (getenv("GIT_TRACE")) {
int i; int i;
fprintf(stderr, "trace: built-in: git"); fprintf(stderr, "trace: built-in: git");
@ -228,7 +292,7 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
fflush(stderr); fflush(stderr);
} }
exit(p->fn(argc, argv, envp)); exit(p->fn(argc, argv, prefix));
} }
} }
@ -269,51 +333,19 @@ int main(int argc, const char **argv, char **envp)
die("cannot handle %s internally", cmd); die("cannot handle %s internally", cmd);
} }
/* Default command: "help" */
cmd = "help";
/* Look for flags.. */ /* Look for flags.. */
while (argc > 1) { argv++;
cmd = *++argv; argc--;
argc--; handle_options(&argv, &argc);
if (argc > 0) {
if (!strcmp(cmd, "-p") || !strcmp(cmd, "--paginate")) { if (!strncmp(argv[0], "--", 2))
setup_pager(); argv[0] += 2;
continue; } else {
} /* Default command: "help" */
argv[0] = "help";
if (strncmp(cmd, "--", 2)) argc = 1;
break;
cmd += 2;
/*
* For legacy reasons, the "version" and "help"
* commands can be written with "--" prepended
* to make them look like flags.
*/
if (!strcmp(cmd, "help"))
break;
if (!strcmp(cmd, "version"))
break;
/*
* Check remaining flags (which by now must be
* "--exec-path", but maybe we will accept
* other arguments some day)
*/
if (!strncmp(cmd, "exec-path", 9)) {
cmd += 9;
if (*cmd == '=') {
git_set_exec_path(cmd + 1);
continue;
}
puts(git_exec_path());
exit(0);
}
cmd_usage(0, NULL, NULL);
} }
argv[0] = cmd; cmd = argv[0];
/* /*
* We search for git commands in the following order: * We search for git commands in the following order:

View File

@ -1199,6 +1199,20 @@ sub git_summary {
git_footer_html(); git_footer_html();
} }
sub git_print_page_path {
my $name = shift;
my $type = shift;
if (!defined $name) {
print "<div class=\"page_path\"><b>/</b></div>\n";
} elsif ($type =~ "blob") {
print "<div class=\"page_path\"><b>" .
$cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blob_plain;f=$file_name")}, esc_html($name)) . "</b><br/></div>\n";
} else {
print "<div class=\"page_path\"><b>" . esc_html($name) . "</b><br/></div>\n";
}
}
sub git_tag { sub git_tag {
my $head = git_read_head($project); my $head = git_read_head($project);
git_header_html(); git_header_html();
@ -1266,7 +1280,7 @@ sub git_blame {
"<div>" . "<div>" .
$cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commit;h=$hash_base"), -class => "title"}, esc_html($co{'title'})) . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commit;h=$hash_base"), -class => "title"}, esc_html($co{'title'})) .
"</div>\n"; "</div>\n";
print "<div class=\"page_path\"><b>" . esc_html($file_name) . "</b></div>\n"; git_print_page_path($file_name);
print "<div class=\"page_body\">\n"; print "<div class=\"page_body\">\n";
print <<HTML; print <<HTML;
<table class="blame"> <table class="blame">
@ -1531,6 +1545,14 @@ sub git_blob_plain_mimetype {
} }
sub git_blob_plain { sub git_blob_plain {
if (!defined $hash) {
if (defined $file_name) {
my $base = $hash_base || git_read_head($project);
$hash = git_get_hash_by_path($base, $file_name, "blob") || die_error(undef, "Error lookup file.");
} else {
die_error(undef, "No file name defined.");
}
}
my $type = shift; my $type = shift;
open my $fd, "-|", "$GIT cat-file blob $hash" or die_error("Couldn't cat $file_name, $hash"); open my $fd, "-|", "$GIT cat-file blob $hash" or die_error("Couldn't cat $file_name, $hash");
@ -1554,10 +1576,14 @@ sub git_blob_plain {
} }
sub git_blob { sub git_blob {
if (!defined $hash && defined $file_name) { if (!defined $hash) {
my $base = $hash_base || git_read_head($project); if (defined $file_name) {
$hash = git_get_hash_by_path($base, $file_name, "blob") || die_error(undef, "Error lookup file."); my $base = $hash_base || git_read_head($project);
} $hash = git_get_hash_by_path($base, $file_name, "blob") || die_error(undef, "Error lookup file.");
} else {
die_error(undef, "No file name defined.");
}
}
my $have_blame = git_get_project_config_bool ('blame'); my $have_blame = git_get_project_config_bool ('blame');
open my $fd, "-|", "$GIT cat-file blob $hash" or die_error(undef, "Open failed."); open my $fd, "-|", "$GIT cat-file blob $hash" or die_error(undef, "Open failed.");
my $mimetype = git_blob_plain_mimetype($fd, $file_name); my $mimetype = git_blob_plain_mimetype($fd, $file_name);
@ -1592,9 +1618,7 @@ sub git_blob {
"<br/><br/></div>\n" . "<br/><br/></div>\n" .
"<div class=\"title\">$hash</div>\n"; "<div class=\"title\">$hash</div>\n";
} }
if (defined $file_name) { git_print_page_path($file_name, "blob");
print "<div class=\"page_path\"><b>" . esc_html($file_name) . "</b></div>\n";
}
print "<div class=\"page_body\">\n"; print "<div class=\"page_body\">\n";
my $nr; my $nr;
while (my $line = <$fd>) { while (my $line = <$fd>) {
@ -1659,10 +1683,8 @@ sub git_tree {
} }
if (defined $file_name) { if (defined $file_name) {
$base = esc_html("$file_name/"); $base = esc_html("$file_name/");
print "<div class=\"page_path\"><b>/" . esc_html($file_name) . "</b></div>\n";
} else {
print "<div class=\"page_path\"><b>/</b></div>\n";
} }
git_print_page_path($file_name);
print "<div class=\"page_body\">\n"; print "<div class=\"page_body\">\n";
print "<table cellspacing=\"0\">\n"; print "<table cellspacing=\"0\">\n";
my $alternate = 0; my $alternate = 0;
@ -1687,7 +1709,7 @@ sub git_tree {
"<td class=\"link\">" . "<td class=\"link\">" .
$cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blob;h=$t_hash$base_key;f=$base$t_name")}, "blob") . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blob;h=$t_hash$base_key;f=$base$t_name")}, "blob") .
# " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blame;h=$t_hash$base_key;f=$base$t_name")}, "blame") . # " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blame;h=$t_hash$base_key;f=$base$t_name")}, "blame") .
" | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=history;h=$hash_base;f=$base$t_name")}, "history") . " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=history;h=$t_hash;hb=$hash_base;f=$base$t_name")}, "history") .
" | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blob_plain;h=$t_hash;f=$base$t_name")}, "raw") . " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blob_plain;h=$t_hash;f=$base$t_name")}, "raw") .
"</td>\n"; "</td>\n";
} elsif ($t_type eq "tree") { } elsif ($t_type eq "tree") {
@ -1696,7 +1718,7 @@ sub git_tree {
"</td>\n" . "</td>\n" .
"<td class=\"link\">" . "<td class=\"link\">" .
$cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=tree;h=$t_hash$base_key;f=$base$t_name")}, "tree") . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=tree;h=$t_hash$base_key;f=$base$t_name")}, "tree") .
" | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=history;h=$hash_base;f=$base$t_name")}, "history") . " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=history;hb=$hash_base;f=$base$t_name")}, "history") .
"</td>\n"; "</td>\n";
} }
print "</tr>\n"; print "</tr>\n";
@ -2041,7 +2063,7 @@ sub git_commit {
"<td><span class=\"file_status deleted\">[deleted " . file_type($from_mode). "]</span></td>\n" . "<td><span class=\"file_status deleted\">[deleted " . file_type($from_mode). "]</span></td>\n" .
"<td class=\"link\">" . "<td class=\"link\">" .
$cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blob;h=$from_id;hb=$hash;f=$file")}, "blob") . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blob;h=$from_id;hb=$hash;f=$file")}, "blob") .
" | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=history;h=$hash;f=$file")}, "history") . " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=history;hb=$hash;f=$file")}, "history") .
"</td>\n" "</td>\n"
} elsif ($status eq "M" || $status eq "T") { } elsif ($status eq "M" || $status eq "T") {
my $mode_chnge = ""; my $mode_chnge = "";
@ -2072,7 +2094,7 @@ sub git_commit {
if ($to_id ne $from_id) { if ($to_id ne $from_id) {
print " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blobdiff;h=$to_id;hp=$from_id;hb=$hash;f=$file")}, "diff"); print " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blobdiff;h=$to_id;hp=$from_id;hb=$hash;f=$file")}, "diff");
} }
print " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=history;h=$hash;f=$file")}, "history") . "\n"; print " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=history;hb=$hash;f=$file")}, "history") . "\n";
print "</td>\n"; print "</td>\n";
} elsif ($status eq "R") { } elsif ($status eq "R") {
my ($from_file, $to_file) = split "\t", $file; my ($from_file, $to_file) = split "\t", $file;
@ -2120,9 +2142,7 @@ sub git_blobdiff {
"<br/><br/></div>\n" . "<br/><br/></div>\n" .
"<div class=\"title\">$hash vs $hash_parent</div>\n"; "<div class=\"title\">$hash vs $hash_parent</div>\n";
} }
if (defined $file_name) { git_print_page_path($file_name, "blob");
print "<div class=\"page_path\"><b>/" . esc_html($file_name) . "</b></div>\n";
}
print "<div class=\"page_body\">\n" . print "<div class=\"page_body\">\n" .
"<div class=\"diff_info\">blob:" . "<div class=\"diff_info\">blob:" .
$cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blob;h=$hash_parent;hb=$hash_base;f=$file_name")}, $hash_parent) . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blob;h=$hash_parent;hb=$hash_base;f=$file_name")}, $hash_parent) .
@ -2293,10 +2313,11 @@ sub git_commitdiff_plain {
} }
sub git_history { sub git_history {
if (!defined $hash) { if (!defined $hash_base) {
$hash = git_read_head($project); $hash_base = git_read_head($project);
} }
my %co = git_read_commit($hash); my $ftype;
my %co = git_read_commit($hash_base);
if (!%co) { if (!%co) {
die_error(undef, "Unknown commit object."); die_error(undef, "Unknown commit object.");
} }
@ -2306,18 +2327,24 @@ sub git_history {
$cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=summary")}, "summary") . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=summary")}, "summary") .
" | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=shortlog")}, "shortlog") . " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=shortlog")}, "shortlog") .
" | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=log")}, "log") . " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=log")}, "log") .
" | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commit;h=$hash")}, "commit") . " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commit;h=$hash_base")}, "commit") .
" | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commitdiff;h=$hash")}, "commitdiff") . " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commitdiff;h=$hash_base")}, "commitdiff") .
" | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=tree;h=$co{'tree'};hb=$hash")}, "tree") . " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=tree;h=$co{'tree'};hb=$hash_base")}, "tree") .
"<br/><br/>\n" . "<br/><br/>\n" .
"</div>\n"; "</div>\n";
print "<div>\n" . print "<div>\n" .
$cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commit;h=$hash"), -class => "title"}, esc_html($co{'title'})) . "\n" . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commit;h=$hash_base"), -class => "title"}, esc_html($co{'title'})) . "\n" .
"</div>\n"; "</div>\n";
print "<div class=\"page_path\"><b>/" . esc_html($file_name) . "</b><br/></div>\n"; if (!defined $hash && defined $file_name) {
$hash = git_get_hash_by_path($hash_base, $file_name);
}
if (defined $hash) {
$ftype = git_get_type($hash);
}
git_print_page_path($file_name, $ftype);
open my $fd, "-|", open my $fd, "-|",
"$GIT rev-list --full-history $hash -- \'$file_name\'"; "$GIT rev-list --full-history $hash_base -- \'$file_name\'";
print "<table cellspacing=\"0\">\n"; print "<table cellspacing=\"0\">\n";
my $alternate = 0; my $alternate = 0;
while (my $line = <$fd>) { while (my $line = <$fd>) {
@ -2345,7 +2372,7 @@ sub git_history {
$cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commit;h=$commit")}, "commit") . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commit;h=$commit")}, "commit") .
" | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commitdiff;h=$commit")}, "commitdiff") . " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commitdiff;h=$commit")}, "commitdiff") .
" | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blob;hb=$commit;f=$file_name")}, "blob"); " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blob;hb=$commit;f=$file_name")}, "blob");
my $blob = git_get_hash_by_path($hash, $file_name); my $blob = git_get_hash_by_path($hash_base, $file_name);
my $blob_parent = git_get_hash_by_path($commit, $file_name); my $blob_parent = git_get_hash_by_path($commit, $file_name);
if (defined $blob && defined $blob_parent && $blob ne $blob_parent) { if (defined $blob && defined $blob_parent && $blob ne $blob_parent) {
print " | " . print " | " .

View File

@ -36,6 +36,8 @@ enum XML_Status {
#define PREV_BUF_SIZE 4096 #define PREV_BUF_SIZE 4096
#define RANGE_HEADER_SIZE 30 #define RANGE_HEADER_SIZE 30
static int commits_on_stdin = 0;
static int got_alternates = -1; static int got_alternates = -1;
static int corrupt_object_found = 0; static int corrupt_object_found = 0;
@ -43,7 +45,7 @@ static struct curl_slist *no_pragma_header;
struct alt_base struct alt_base
{ {
char *base; const char *base;
int path_len; int path_len;
int got_indices; int got_indices;
struct packed_git *packs; struct packed_git *packs;
@ -81,7 +83,7 @@ struct object_request
}; };
struct alternates_request { struct alternates_request {
char *base; const char *base;
char *url; char *url;
struct buffer *buffer; struct buffer *buffer;
struct active_request_slot *slot; struct active_request_slot *slot;
@ -142,7 +144,7 @@ static size_t fwrite_sha1_file(void *ptr, size_t eltsize, size_t nmemb,
return size; return size;
} }
static void fetch_alternates(char *base); static void fetch_alternates(const char *base);
static void process_object_response(void *callback_data); static void process_object_response(void *callback_data);
@ -507,7 +509,7 @@ static void process_alternates_response(void *callback_data)
(struct alternates_request *)callback_data; (struct alternates_request *)callback_data;
struct active_request_slot *slot = alt_req->slot; struct active_request_slot *slot = alt_req->slot;
struct alt_base *tail = alt; struct alt_base *tail = alt;
char *base = alt_req->base; const char *base = alt_req->base;
static const char null_byte = '\0'; static const char null_byte = '\0';
char *data; char *data;
int i = 0; int i = 0;
@ -612,7 +614,7 @@ static void process_alternates_response(void *callback_data)
got_alternates = 1; got_alternates = 1;
} }
static void fetch_alternates(char *base) static void fetch_alternates(const char *base)
{ {
struct buffer buffer; struct buffer buffer;
char *url; char *url;
@ -1185,7 +1187,7 @@ int fetch_ref(char *ref, unsigned char *sha1)
char *url; char *url;
char hex[42]; char hex[42];
struct buffer buffer; struct buffer buffer;
char *base = alt->base; const char *base = alt->base;
struct active_request_slot *slot; struct active_request_slot *slot;
struct slot_results results; struct slot_results results;
buffer.size = 41; buffer.size = 41;
@ -1214,10 +1216,12 @@ int fetch_ref(char *ref, unsigned char *sha1)
return 0; return 0;
} }
int main(int argc, char **argv) int main(int argc, const char **argv)
{ {
char *commit_id; int commits;
char *url; const char **write_ref = NULL;
char **commit_id;
const char *url;
char *path; char *path;
int arg = 1; int arg = 1;
int rc = 0; int rc = 0;
@ -1237,20 +1241,26 @@ int main(int argc, char **argv)
} else if (argv[arg][1] == 'v') { } else if (argv[arg][1] == 'v') {
get_verbosely = 1; get_verbosely = 1;
} else if (argv[arg][1] == 'w') { } else if (argv[arg][1] == 'w') {
write_ref = argv[arg + 1]; write_ref = &argv[arg + 1];
arg++; arg++;
} else if (!strcmp(argv[arg], "--recover")) { } else if (!strcmp(argv[arg], "--recover")) {
get_recover = 1; get_recover = 1;
} else if (!strcmp(argv[arg], "--stdin")) {
commits_on_stdin = 1;
} }
arg++; arg++;
} }
if (argc < arg + 2) { if (argc < arg + 2 - commits_on_stdin) {
usage("git-http-fetch [-c] [-t] [-a] [-d] [-v] [--recover] [-w ref] commit-id url"); usage("git-http-fetch [-c] [-t] [-a] [-v] [--recover] [-w ref] [--stdin] commit-id url");
return 1; return 1;
} }
commit_id = argv[arg]; if (commits_on_stdin) {
url = argv[arg + 1]; commits = pull_targets_stdin(&commit_id, &write_ref);
write_ref_log_details = url; } else {
commit_id = (char **) &argv[arg++];
commits = 1;
}
url = argv[arg];
http_init(); http_init();
@ -1268,13 +1278,16 @@ int main(int argc, char **argv)
alt->path_len = strlen(path); alt->path_len = strlen(path);
} }
if (pull(commit_id)) if (pull(commits, commit_id, write_ref, url))
rc = 1; rc = 1;
http_cleanup(); http_cleanup();
curl_slist_free_all(no_pragma_header); curl_slist_free_all(no_pragma_header);
if (commits_on_stdin)
pull_targets_free(commits, commit_id, write_ref);
if (corrupt_object_found) { if (corrupt_object_found) {
fprintf(stderr, fprintf(stderr,
"Some loose object were found to be corrupt, but they might be just\n" "Some loose object were found to be corrupt, but they might be just\n"

View File

@ -2521,7 +2521,7 @@ int main(int argc, char **argv)
commit_argv[3] = old_sha1_hex; commit_argv[3] = old_sha1_hex;
commit_argc++; commit_argc++;
} }
init_revisions(&revs); init_revisions(&revs, setup_git_directory());
setup_revisions(commit_argc, commit_argv, &revs, NULL); setup_revisions(commit_argc, commit_argv, &revs, NULL);
free(new_sha1_hex); free(new_sha1_hex);
if (old_sha1_hex) { if (old_sha1_hex) {

View File

@ -8,8 +8,9 @@
static int use_link = 0; static int use_link = 0;
static int use_symlink = 0; static int use_symlink = 0;
static int use_filecopy = 1; static int use_filecopy = 1;
static int commits_on_stdin = 0;
static char *path; /* "Remote" git repository */ static const char *path; /* "Remote" git repository */
void prefetch(unsigned char *sha1) void prefetch(unsigned char *sha1)
{ {
@ -194,17 +195,19 @@ int fetch_ref(char *ref, unsigned char *sha1)
} }
static const char local_pull_usage[] = static const char local_pull_usage[] =
"git-local-fetch [-c] [-t] [-a] [-d] [-v] [-w filename] [--recover] [-l] [-s] [-n] commit-id path"; "git-local-fetch [-c] [-t] [-a] [-v] [-w filename] [--recover] [-l] [-s] [-n] [--stdin] commit-id path";
/* /*
* By default we only use file copy. * By default we only use file copy.
* If -l is specified, a hard link is attempted. * If -l is specified, a hard link is attempted.
* If -s is specified, then a symlink is attempted. * If -s is specified, then a symlink is attempted.
* If -n is _not_ specified, then a regular file-to-file copy is done. * If -n is _not_ specified, then a regular file-to-file copy is done.
*/ */
int main(int argc, char **argv) int main(int argc, const char **argv)
{ {
char *commit_id; int commits;
const char **write_ref = NULL;
char **commit_id;
int arg = 1; int arg = 1;
setup_git_directory(); setup_git_directory();
@ -229,21 +232,30 @@ int main(int argc, char **argv)
else if (argv[arg][1] == 'v') else if (argv[arg][1] == 'v')
get_verbosely = 1; get_verbosely = 1;
else if (argv[arg][1] == 'w') else if (argv[arg][1] == 'w')
write_ref = argv[++arg]; write_ref = &argv[++arg];
else if (!strcmp(argv[arg], "--recover")) else if (!strcmp(argv[arg], "--recover"))
get_recover = 1; get_recover = 1;
else if (!strcmp(argv[arg], "--stdin"))
commits_on_stdin = 1;
else else
usage(local_pull_usage); usage(local_pull_usage);
arg++; arg++;
} }
if (argc < arg + 2) if (argc < arg + 2 - commits_on_stdin)
usage(local_pull_usage); usage(local_pull_usage);
commit_id = argv[arg]; if (commits_on_stdin) {
path = argv[arg + 1]; commits = pull_targets_stdin(&commit_id, &write_ref);
write_ref_log_details = path; } else {
commit_id = (char **) &argv[arg++];
commits = 1;
}
path = argv[arg];
if (pull(commit_id)) if (pull(commits, commit_id, write_ref, path))
return 1; return 1;
if (commits_on_stdin)
pull_targets_free(commits, commit_id, write_ref);
return 0; return 0;
} }

5
refs.c
View File

@ -294,6 +294,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *path,
int plen, int plen,
const unsigned char *old_sha1, int mustexist) const unsigned char *old_sha1, int mustexist)
{ {
const char *orig_path = path;
struct ref_lock *lock; struct ref_lock *lock;
struct stat st; struct stat st;
@ -303,7 +304,11 @@ static struct ref_lock *lock_ref_sha1_basic(const char *path,
plen = strlen(path) - plen; plen = strlen(path) - plen;
path = resolve_ref(path, lock->old_sha1, mustexist); path = resolve_ref(path, lock->old_sha1, mustexist);
if (!path) { if (!path) {
int last_errno = errno;
error("unable to resolve reference %s: %s",
orig_path, strerror(errno));
unlock_ref(lock); unlock_ref(lock);
errno = last_errno;
return NULL; return NULL;
} }
lock->lk = xcalloc(1, sizeof(struct lock_file)); lock->lk = xcalloc(1, sizeof(struct lock_file));

View File

@ -509,7 +509,7 @@ static int add_parents_only(struct rev_info *revs, const char *arg, int flags)
return 1; return 1;
} }
void init_revisions(struct rev_info *revs) void init_revisions(struct rev_info *revs, const char *prefix)
{ {
memset(revs, 0, sizeof(*revs)); memset(revs, 0, sizeof(*revs));
@ -521,7 +521,7 @@ void init_revisions(struct rev_info *revs)
revs->pruning.change = file_change; revs->pruning.change = file_change;
revs->lifo = 1; revs->lifo = 1;
revs->dense = 1; revs->dense = 1;
revs->prefix = setup_git_directory(); revs->prefix = prefix;
revs->max_age = -1; revs->max_age = -1;
revs->min_age = -1; revs->min_age = -1;
revs->max_count = -1; revs->max_count = -1;

View File

@ -87,7 +87,7 @@ struct rev_info {
extern int rev_same_tree_as_empty(struct rev_info *, struct tree *t1); extern int rev_same_tree_as_empty(struct rev_info *, struct tree *t1);
extern int rev_compare_tree(struct rev_info *, struct tree *t1, struct tree *t2); extern int rev_compare_tree(struct rev_info *, struct tree *t1, struct tree *t2);
extern void init_revisions(struct rev_info *revs); extern void init_revisions(struct rev_info *revs, const char *prefix);
extern int setup_revisions(int argc, const char **argv, struct rev_info *revs, const char *def); extern int setup_revisions(int argc, const char **argv, struct rev_info *revs, const char *def);
extern void prepare_revision_walk(struct rev_info *revs); extern void prepare_revision_walk(struct rev_info *revs);
extern struct commit *get_revision(struct rev_info *revs); extern struct commit *get_revision(struct rev_info *revs);

View File

@ -120,9 +120,10 @@ int fetch_ref(char *ref, unsigned char *sha1)
static const char ssh_fetch_usage[] = static const char ssh_fetch_usage[] =
MY_PROGRAM_NAME MY_PROGRAM_NAME
" [-c] [-t] [-a] [-v] [-d] [--recover] [-w ref] commit-id url"; " [-c] [-t] [-a] [-v] [--recover] [-w ref] commit-id url";
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
const char *write_ref = NULL;
char *commit_id; char *commit_id;
char *url; char *url;
int arg = 1; int arg = 1;
@ -159,7 +160,6 @@ int main(int argc, char **argv)
} }
commit_id = argv[arg]; commit_id = argv[arg];
url = argv[arg + 1]; url = argv[arg + 1];
write_ref_log_details = url;
if (setup_connection(&fd_in, &fd_out, prog, url, arg, argv + 1)) if (setup_connection(&fd_in, &fd_out, prog, url, arg, argv + 1))
return 1; return 1;
@ -167,7 +167,7 @@ int main(int argc, char **argv)
if (get_version()) if (get_version())
return 1; return 1;
if (pull(commit_id)) if (pull(1, &commit_id, &write_ref, url))
return 1; return 1;
return 0; return 0;

View File

@ -14,6 +14,8 @@ D=4444444444444444444444444444444444444444
E=5555555555555555555555555555555555555555 E=5555555555555555555555555555555555555555
F=6666666666666666666666666666666666666666 F=6666666666666666666666666666666666666666
m=refs/heads/master m=refs/heads/master
n_dir=refs/heads/gu
n=$n_dir/fixes
test_expect_success \ test_expect_success \
"create $m" \ "create $m" \
@ -25,6 +27,16 @@ test_expect_success \
test $B = $(cat .git/$m)' test $B = $(cat .git/$m)'
rm -f .git/$m rm -f .git/$m
test_expect_success \
"fail to create $n" \
'touch .git/$n_dir
git-update-ref $n $A >out 2>err
test $? = 1 &&
test "" = "$(cat out)" &&
grep "error: unable to resolve reference" err &&
grep $n err'
rm -f .git/$n_dir out err
test_expect_success \ test_expect_success \
"create $m (by HEAD)" \ "create $m (by HEAD)" \
'git-update-ref HEAD $A && 'git-update-ref HEAD $A &&

View File

@ -13,8 +13,8 @@ test_description='git-apply handling copy/rename patch.
cat >test-patch <<\EOF cat >test-patch <<\EOF
diff --git a/foo b/bar diff --git a/foo b/bar
similarity index 47% similarity index 47%
copy from foo rename from foo
copy to bar rename to bar
--- a/foo --- a/foo
+++ b/bar +++ b/bar
@@ -1 +1 @@ @@ -1 +1 @@
@ -39,4 +39,24 @@ else
'test -f bar && ls -l bar | grep "^-..x......"' 'test -f bar && ls -l bar | grep "^-..x......"'
fi fi
test_expect_success 'apply reverse' \
'git-apply -R --index --stat --summary --apply test-patch &&
test "$(cat foo)" = "This is foo"'
cat >test-patch <<\EOF
diff --git a/foo b/bar
similarity index 47%
copy from foo
copy to bar
--- a/foo
+++ b/bar
@@ -1 +1 @@
-This is foo
+This is bar
EOF
test_expect_success 'apply copy' \
'git-apply --index --stat --summary --apply test-patch &&
test "$(cat bar)" = "This is bar" -a "$(cat foo)" = "This is foo"'
test_done test_done

View File

@ -35,8 +35,8 @@ git-commit -m 'Second Version'
git-diff-tree -p master binary >B.diff git-diff-tree -p master binary >B.diff
git-diff-tree -p -C master binary >C.diff git-diff-tree -p -C master binary >C.diff
git-diff-tree -p --full-index master binary >BF.diff git-diff-tree -p --binary master binary >BF.diff
git-diff-tree -p --full-index -C master binary >CF.diff git-diff-tree -p --binary -C master binary >CF.diff
test_expect_success 'stat binary diff -- should not fail.' \ test_expect_success 'stat binary diff -- should not fail.' \
'git-checkout master 'git-checkout master