Merge branch 'master' of git://repo.or.cz/alt-git

This commit is contained in:
Johannes Sixt
2009-12-17 07:35:39 +01:00
19 changed files with 140 additions and 211 deletions

View File

@@ -0,0 +1,23 @@
Git v1.6.5.6 Release Notes
==========================
Fixes since v1.6.5.5
--------------------
* "git add -p" had a regression since v1.6.5.3 that broke deletion of
non-empty files.
* "git archive -o o.zip -- Makefile" produced an archive in o.zip
but in POSIX tar format.
* Error message given to "git pull --rebase" when the user didn't give
enough clue as to what branch to integrate with still talked about
"merging with" the branch.
* Error messages given by "git merge" when the merge resulted in a
fast-forward still were in plumbing lingo, even though in v1.6.5
we reworded messages in other cases.
* The post-upload-hook run by upload-pack in response to "git fetch" has
been removed, due to security concerns (the hook first appeared in
1.6.5).

View File

@@ -0,0 +1,19 @@
Git v1.6.5.7 Release Notes
==========================
Fixes since v1.6.5.6
--------------------
* If a user specifies a color for a <slot> (i.e. a class of things to show
in a particular color) that is known only by newer versions of git
(e.g. "color.diff.func" was recently added for upcoming 1.6.6 release),
an older version of git should just ignore them. Instead we diagnosed
it as an error.
* With help.autocorrect set to non-zero value, the logic to guess typoes
in the subcommand name misfired and ran a random nonsense command.
* If a command is run with an absolute path as a pathspec inside a bare
repository, e.g. "rev-list HEAD -- /home", the code tried to run
strlen() on NULL, which is the result of get_git_work_tree(), and
segfaulted.

View File

@@ -222,25 +222,3 @@ Fixes since v1.6.5
All of the fixes in v1.6.5.X maintenance series are included in this
release, unless otherwise noted.
* Enumeration of available merge strategies iterated over the list of
commands in a wrong way, sometimes producing an incorrect result.
Will backport by merging ed87465 (builtin-merge.c: call
exclude_cmds() correctly., 2009-11-25).
* "git format-patch revisions... -- path" issued an incorrect error
message that suggested to use "--" on the command line when path
does not exist in the current work tree (it is a separate matter if
it makes sense to limit format-patch with pathspecs like that
without using the --full-diff option). Will backport by merging
7e93d3b (format-patch: add test for parsing of "--", 2009-11-26).
* "git shortlog" did not honor the "encoding" header embedded in the
commit object like "git log" did. Will backport by merging 79f7ca0
(shortlog: respect commit encoding, 2009-11-25).
---
exec >/var/tmp/1
echo O=$(git describe master)
O=v1.6.6-rc1-79-g529f8c6
git shortlog --no-merges $O..master --not maint

View File

@@ -20,8 +20,6 @@ The UI for the protocol is on the 'git-fetch-pack' side, and the
program pair is meant to be used to pull updates from a remote
repository. For push operations, see 'git-send-pack'.
After finishing the operation successfully, `post-upload-pack`
hook is called (see linkgit:githooks[5]).
OPTIONS
-------

View File

@@ -43,9 +43,11 @@ unreleased) version of git, that is available from 'master'
branch of the `git.git` repository.
Documentation for older releases are available here:
* link:v1.6.5.5/git.html[documentation for release 1.6.5.5]
* link:v1.6.5.7/git.html[documentation for release 1.6.5.7]
* release notes for
link:RelNotes-1.6.5.7.txt[1.6.5.7],
link:RelNotes-1.6.5.6.txt[1.6.5.6],
link:RelNotes-1.6.5.5.txt[1.6.5.5],
link:RelNotes-1.6.5.4.txt[1.6.5.4],
link:RelNotes-1.6.5.3.txt[1.6.5.3],

View File

@@ -197,6 +197,25 @@ intent is that if someone unsets the filter driver definition,
or does not have the appropriate filter program, the project
should still be usable.
For example, in .gitattributes, you would assign the `filter`
attribute for paths.
------------------------
*.c filter=indent
------------------------
Then you would define a "filter.indent.clean" and "filter.indent.smudge"
configuration in your .git/config to specify a pair of commands to
modify the contents of C programs when the source files are checked
in ("clean" is run) and checked out (no change is made because the
command is "cat").
------------------------
[filter "indent"]
clean = indent
smudge = cat
------------------------
Interaction between checkin/checkout attributes
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@@ -310,35 +310,6 @@ Both standard output and standard error output are forwarded to
'git-send-pack' on the other end, so you can simply `echo` messages
for the user.
post-upload-pack
----------------
After upload-pack successfully finishes its operation, this hook is called
for logging purposes.
The hook is passed various pieces of information, one per line, from its
standard input. Currently the following items can be fed to the hook, but
more types of information may be added in the future:
want SHA-1::
40-byte hexadecimal object name the client asked to include in the
resulting pack. Can occur one or more times in the input.
have SHA-1::
40-byte hexadecimal object name the client asked to exclude from
the resulting pack, claiming to have them already. Can occur zero
or more times in the input.
time float::
Number of seconds spent for creating the packfile.
size decimal::
Size of the resulting packfile in bytes.
kind string:
Either "clone" (when the client did not give us any "have", and asked
for all our refs with "want"), or "fetch" (otherwise).
pre-auto-gc
~~~~~~~~~~~

View File

@@ -1,7 +1,7 @@
#!/bin/sh
GVF=GIT-VERSION-FILE
DEF_VER=v1.6.6-rc2.GIT
DEF_VER=v1.6.6-rc3.GIT
LF='
'

View File

@@ -106,13 +106,17 @@ int cmd_archive(int argc, const char **argv, const char *prefix)
if (format) {
sprintf(fmt_opt, "--format=%s", format);
/*
* This is safe because either --format and/or --output must
* have been given on the original command line if we get to
* this point, and parse_options() must have eaten at least
* one argument, i.e. we have enough room to append to argv[].
* We have enough room in argv[] to muck it in place,
* because either --format and/or --output must have
* been given on the original command line if we get
* to this point, and parse_options() must have eaten
* it, i.e. we can add back one element to the array.
* But argv[] may contain "--"; we should make it the
* first option.
*/
argv[argc++] = fmt_opt;
argv[argc] = NULL;
memmove(argv + 2, argv + 1, sizeof(*argv) * argc);
argv[1] = fmt_opt;
argv[++argc] = NULL;
}
if (remote)

View File

@@ -65,7 +65,7 @@ static int parse_branch_color_slot(const char *var, int ofs)
return BRANCH_COLOR_LOCAL;
if (!strcasecmp(var+ofs, "current"))
return BRANCH_COLOR_CURRENT;
die("bad config variable '%s'", var);
return -1;
}
static int git_branch_config(const char *var, const char *value, void *cb)
@@ -76,6 +76,8 @@ static int git_branch_config(const char *var, const char *value, void *cb)
}
if (!prefixcmp(var, "color.branch.")) {
int slot = parse_branch_color_slot(var, 13);
if (slot < 0)
return 0;
if (!value)
return config_error_nonbool(var);
color_parse(value, var, branch_colors[slot]);

View File

@@ -890,7 +890,7 @@ static int parse_status_slot(const char *var, int offset)
return WT_STATUS_NOBRANCH;
if (!strcasecmp(var+offset, "unmerged"))
return WT_STATUS_UNMERGED;
die("bad config variable '%s'", var);
return -1;
}
static int git_status_config(const char *k, const char *v, void *cb)
@@ -910,6 +910,8 @@ static int git_status_config(const char *k, const char *v, void *cb)
}
if (!prefixcmp(k, "status.color.") || !prefixcmp(k, "color.status.")) {
int slot = parse_status_slot(k, 13);
if (slot < 0)
return 0;
if (!v)
return config_error_nonbool(k);
color_parse(v, k, s->color_palette[slot]);

View File

@@ -417,7 +417,17 @@ __git_complete_remote_or_refspec ()
while [ $c -lt $COMP_CWORD ]; do
i="${COMP_WORDS[c]}"
case "$i" in
--all|--mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
--mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
--all)
case "$cmd" in
push) no_complete_refspec=1 ;;
fetch)
COMPREPLY=()
return
;;
*) ;;
esac
;;
-*) ;;
*) remote="$i"; break ;;
esac
@@ -1002,7 +1012,7 @@ _git_difftool ()
__git_fetch_options="
--quiet --verbose --append --upload-pack --force --keep --depth=
--tags --no-tags
--tags --no-tags --all --prune --dry-run
"
_git_fetch ()

4
diff.c
View File

@@ -63,7 +63,7 @@ static int parse_diff_color_slot(const char *var, int ofs)
return DIFF_WHITESPACE;
if (!strcasecmp(var+ofs, "func"))
return DIFF_FUNCINFO;
die("bad config variable '%s'", var);
return -1;
}
static int git_config_rename(const char *var, const char *value)
@@ -122,6 +122,8 @@ int git_diff_basic_config(const char *var, const char *value, void *cb)
if (!prefixcmp(var, "diff.color.") || !prefixcmp(var, "color.diff.")) {
int slot = parse_diff_color_slot(var, 11);
if (slot < 0)
return 0;
if (!value)
return config_error_nonbool(var);
color_parse(value, var, diff_colors[slot]);

7
help.c
View File

@@ -297,6 +297,9 @@ static void add_cmd_list(struct cmdnames *cmds, struct cmdnames *old)
old->names = NULL;
}
/* An empirically derived magic number */
#define SIMILAR_ENOUGH(x) ((x) < 6)
const char *help_unknown_cmd(const char *cmd)
{
int i, n, best_similarity = 0;
@@ -331,7 +334,7 @@ const char *help_unknown_cmd(const char *cmd)
n = 1;
while (n < main_cmds.cnt && best_similarity == main_cmds.names[n]->len)
++n;
if (autocorrect && n == 1) {
if (autocorrect && n == 1 && SIMILAR_ENOUGH(best_similarity)) {
const char *assumed = main_cmds.names[0]->name;
main_cmds.names[0] = NULL;
clean_cmdnames(&main_cmds);
@@ -349,7 +352,7 @@ const char *help_unknown_cmd(const char *cmd)
fprintf(stderr, "git: '%s' is not a git-command. See 'git --help'.\n", cmd);
if (best_similarity < 6) {
if (SIMILAR_ENOUGH(best_similarity)) {
fprintf(stderr, "\nDid you mean %s?\n",
n < 2 ? "this": "one of these");

View File

@@ -18,9 +18,12 @@ const char *prefix_path(const char *prefix, int len, const char *path)
if (normalize_path_copy(sanitized, sanitized))
goto error_out;
if (is_absolute_path(orig)) {
size_t len, total;
const char *work_tree = get_git_work_tree();
size_t len = strlen(work_tree);
size_t total = strlen(sanitized) + 1;
if (!work_tree)
goto error_out;
len = strlen(work_tree);
total = strlen(sanitized) + 1;
if (strncmp(sanitized, work_tree, len) ||
(sanitized[len] != '\0' && sanitized[len] != '/')) {
error_out:

View File

@@ -174,4 +174,19 @@ test_expect_success 'git grep' '
GIT_DIR=../.. GIT_WORK_TREE=.. git grep -l changed | grep dir/tracked)
'
test_expect_success 'git commit' '
(
cd repo.git &&
GIT_DIR=. GIT_WORK_TREE=work git commit -a -m done
)
'
test_expect_success 'absolute pathspec should fail gracefully' '
(
cd repo.git || exit 1
git config --unset core.worktree
test_must_fail git log HEAD -- /home
)
'
test_done

View File

@@ -66,4 +66,21 @@ test_expect_success 'extra character after attribute' '
invalid_color "dimX"
'
test_expect_success 'unknown color slots are ignored (diff)' '
git config --unset diff.color.new
git config color.diff.nosuchslotwilleverbedefined white &&
git diff --color
'
test_expect_success 'unknown color slots are ignored (branch)' '
git config color.branch.nosuchslotwilleverbedefined white &&
git branch -a
'
test_expect_success 'unknown color slots are ignored (status)' '
git config color.status.nosuchslotwilleverbedefined white || exit
git status
case $? in 0|1) : ok ;; *) false ;; esac
'
test_done

View File

@@ -1,69 +0,0 @@
#!/bin/sh
test_description='post upload-hook'
. ./test-lib.sh
LOGFILE=".git/post-upload-pack-log"
test_expect_success setup '
test_commit A &&
test_commit B &&
git reset --hard A &&
test_commit C &&
git branch prev B &&
mkdir -p .git/hooks &&
{
echo "#!$SHELL_PATH" &&
echo "cat >post-upload-pack-log"
} >".git/hooks/post-upload-pack" &&
chmod +x .git/hooks/post-upload-pack
'
test_expect_success initial '
rm -fr sub &&
git init sub &&
(
cd sub &&
git fetch --no-tags .. prev
) &&
want=$(sed -n "s/^want //p" "$LOGFILE") &&
test "$want" = "$(git rev-parse --verify B)" &&
! grep "^have " "$LOGFILE" &&
kind=$(sed -n "s/^kind //p" "$LOGFILE") &&
test "$kind" = fetch
'
test_expect_success second '
rm -fr sub &&
git init sub &&
(
cd sub &&
git fetch --no-tags .. prev:refs/remotes/prev &&
git fetch --no-tags .. master
) &&
want=$(sed -n "s/^want //p" "$LOGFILE") &&
test "$want" = "$(git rev-parse --verify C)" &&
have=$(sed -n "s/^have //p" "$LOGFILE") &&
test "$have" = "$(git rev-parse --verify B)" &&
kind=$(sed -n "s/^kind //p" "$LOGFILE") &&
test "$kind" = fetch
'
test_expect_success all '
rm -fr sub &&
HERE=$(pwd) &&
git init sub &&
(
cd sub &&
git clone "file://$HERE/.git" new
) &&
sed -n "s/^want //p" "$LOGFILE" | sort >actual &&
git rev-parse A B C | sort >expect &&
test_cmp expect actual &&
! grep "^have " "$LOGFILE" &&
kind=$(sed -n "s/^kind //p" "$LOGFILE") &&
test "$kind" = clone
'
test_done

View File

@@ -148,66 +148,8 @@ static int do_rev_list(int fd, void *create_full_pack)
return 0;
}
static int feed_msg_to_hook(int fd, const char *fmt, ...)
{
int cnt;
char buf[1024];
va_list params;
va_start(params, fmt);
cnt = vsprintf(buf, fmt, params);
va_end(params);
return write_in_full(fd, buf, cnt) != cnt;
}
static int feed_obj_to_hook(const char *label, struct object_array *oa, int i, int fd)
{
return feed_msg_to_hook(fd, "%s %s\n", label,
sha1_to_hex(oa->objects[i].item->sha1));
}
static int run_post_upload_pack_hook(size_t total, struct timeval *tv)
{
const char *argv[2];
struct child_process proc;
int err, i;
argv[0] = "hooks/post-upload-pack";
argv[1] = NULL;
if (access(argv[0], X_OK) < 0)
return 0;
memset(&proc, 0, sizeof(proc));
proc.argv = argv;
proc.in = -1;
proc.stdout_to_stderr = 1;
err = start_command(&proc);
if (err)
return err;
for (i = 0; !err && i < want_obj.nr; i++)
err |= feed_obj_to_hook("want", &want_obj, i, proc.in);
for (i = 0; !err && i < have_obj.nr; i++)
err |= feed_obj_to_hook("have", &have_obj, i, proc.in);
if (!err)
err |= feed_msg_to_hook(proc.in, "time %ld.%06ld\n",
(long)tv->tv_sec, (long)tv->tv_usec);
if (!err)
err |= feed_msg_to_hook(proc.in, "size %ld\n", (long)total);
if (!err)
err |= feed_msg_to_hook(proc.in, "kind %s\n",
(nr_our_refs == want_obj.nr && !have_obj.nr)
? "clone" : "fetch");
if (close(proc.in))
err = 1;
if (finish_command(&proc))
err = 1;
return err;
}
static void create_pack_file(void)
{
struct timeval start_tv, tv;
struct async rev_list;
struct child_process pack_objects;
int create_full_pack = (nr_our_refs == want_obj.nr && !have_obj.nr);
@@ -215,12 +157,10 @@ static void create_pack_file(void)
char abort_msg[] = "aborting due to possible repository "
"corruption on the remote side.";
int buffered = -1;
ssize_t sz, total_sz;
ssize_t sz;
const char *argv[10];
int arg = 0;
gettimeofday(&start_tv, NULL);
total_sz = 0;
if (shallow_nr) {
rev_list.proc = do_rev_list;
rev_list.data = 0;
@@ -346,7 +286,7 @@ static void create_pack_file(void)
sz = xread(pack_objects.out, cp,
sizeof(data) - outsz);
if (0 < sz)
total_sz += sz;
;
else if (sz == 0) {
close(pack_objects.out);
pack_objects.out = -1;
@@ -383,16 +323,6 @@ static void create_pack_file(void)
}
if (use_sideband)
packet_flush(1);
gettimeofday(&tv, NULL);
tv.tv_sec -= start_tv.tv_sec;
if (tv.tv_usec < start_tv.tv_usec) {
tv.tv_sec--;
tv.tv_usec += 1000000;
}
tv.tv_usec -= start_tv.tv_usec;
if (run_post_upload_pack_hook(total_sz, &tv))
warning("post-upload-hook failed");
return;
fail: