Browse Source

Sync with 1.7.11.7

maint
Junio C Hamano 13 years ago
parent
commit
c336bc104c
  1. 1
      .gitignore
  2. 46
      Documentation/RelNotes/1.7.11.7.txt
  3. 12
      Documentation/git-checkout.txt
  4. 3
      Documentation/git.txt
  5. 19
      Documentation/gitcli.txt
  6. 1
      Makefile
  7. 17
      builtin/commit.c
  8. 2
      builtin/log.c
  9. 17
      gitk-git/gitk
  10. 6
      ident.c
  11. 5
      t/t0070-fundamental.sh
  12. 12
      t/t7007-show.sh
  13. 20
      test-regex.c

1
.gitignore vendored

@ -189,6 +189,7 @@
/test-mktemp /test-mktemp
/test-parse-options /test-parse-options
/test-path-utils /test-path-utils
/test-regex
/test-revision-walking /test-revision-walking
/test-run-command /test-run-command
/test-sha1 /test-sha1

46
Documentation/RelNotes/1.7.11.7.txt

@ -0,0 +1,46 @@
Git v1.7.11.7 Release Notes
===========================

Fixes since v1.7.11.6
---------------------

* The synopsis said "checkout [-B branch]" to make it clear the
branch name is a parameter to the option, but the heading for the
option description was "-B::", not "-B branch::", making the
documentation misleading.

* Git ships with a fall-back regexp implementation for platforms with
buggy regexp library, but it was easy for people to keep using their
platform regexp. A new test has been added to check this.

* "git apply -p0" did not parse pathnames on "diff --git" line
correctly. This caused patches that had pathnames in no other
places to be mistakenly rejected (most notably, binary patch that
does not rename nor change mode). Textual patches, renames or mode
changes have preimage and postimage pathnames in different places
in a form that can be parsed unambiguously and did not suffer from
this problem.

* After "gitk" showed the contents of a tag, neither "Reread
references" nor "Reload" did not update what is shown as the
contents of it, when the user overwrote the tag with "git tag -f".

* "git for-each-ref" did not currectly support more than one --sort
option.

* "git log .." errored out saying it is both rev range and a path
when there is no disambiguating "--" is on the command line.
Update the command line parser to interpret ".." as a path in such
a case.

* Pushing to smart HTTP server with recent Git fails without having
the username in the URL to force authentication, if the server is
configured to allow GET anonymously, while requiring authentication
for POST.

* "git show --format='%ci'" did not give timestamp correctly for
commits created without human readable name on "committer" line.
(merge e27ddb6 jc/maint-ident-missing-human-name later to maint).

* "git show --quiet" ought to be a synonym for "git show -s", but
wasn't.

12
Documentation/git-checkout.txt

@ -367,6 +367,18 @@ $ git checkout hello.c <3>
<2> take a file out of another commit <2> take a file out of another commit
<3> restore hello.c from the index <3> restore hello.c from the index
+ +
If you want to check out _all_ C source files out of the index,
you can say
+
------------
$ git checkout -- '*.c'
------------
+
Note the quotes around `*.c`. The file `hello.c` will also be
checked out, even though it is no longer in the working tree,
because the file globbing is used to match entries in the index
(not in the working tree by the shell).
+
If you have an unfortunate branch that is named `hello.c`, this If you have an unfortunate branch that is named `hello.c`, this
step would be confused as an instruction to switch to that branch. step would be confused as an instruction to switch to that branch.
You should instead write: You should instead write:

3
Documentation/git.txt

@ -48,9 +48,10 @@ Documentation for older releases are available here:
* release notes for * release notes for
link:RelNotes/1.7.12.txt[1.7.12]. link:RelNotes/1.7.12.txt[1.7.12].


* link:v1.7.11.6/git.html[documentation for release 1.7.11.6] * link:v1.7.11.7/git.html[documentation for release 1.7.11.7]


* release notes for * release notes for
link:RelNotes/1.7.11.7.txt[1.7.11.7],
link:RelNotes/1.7.11.6.txt[1.7.11.6], link:RelNotes/1.7.11.6.txt[1.7.11.6],
link:RelNotes/1.7.11.5.txt[1.7.11.5], link:RelNotes/1.7.11.5.txt[1.7.11.5],
link:RelNotes/1.7.11.4.txt[1.7.11.4], link:RelNotes/1.7.11.4.txt[1.7.11.4],

19
Documentation/gitcli.txt

@ -37,11 +37,28 @@ arguments. Here are the rules:
file called HEAD in your work tree, `git diff HEAD` is ambiguous, and file called HEAD in your work tree, `git diff HEAD` is ambiguous, and
you have to say either `git diff HEAD --` or `git diff -- HEAD` to you have to say either `git diff HEAD --` or `git diff -- HEAD` to
disambiguate. disambiguate.

+
When writing a script that is expected to handle random user-input, it is When writing a script that is expected to handle random user-input, it is
a good practice to make it explicit which arguments are which by placing a good practice to make it explicit which arguments are which by placing
disambiguating `--` at appropriate places. disambiguating `--` at appropriate places.


* Many commands allow wildcards in paths, but you need to protect
them from getting globbed by the shell. These two mean different
things:
+
--------------------------------
$ git checkout -- *.c
$ git checkout -- \*.c
--------------------------------
+
The former lets your shell expand the fileglob, and you are asking
the dot-C files in your working tree to be overwritten with the version
in the index. The latter passes the `*.c` to Git, and you are asking
the paths in the index that match the pattern to be checked out to your
working tree. After running `git add hello.c; rm hello.c`, you will _not_
see `hello.c` in your working tree with the former, but with the latter
you will.

Here are the rules regarding the "flags" that you should follow when you are Here are the rules regarding the "flags" that you should follow when you are
scripting git: scripting git:



1
Makefile

@ -496,6 +496,7 @@ TEST_PROGRAMS_NEED_X += test-mergesort
TEST_PROGRAMS_NEED_X += test-mktemp TEST_PROGRAMS_NEED_X += test-mktemp
TEST_PROGRAMS_NEED_X += test-parse-options TEST_PROGRAMS_NEED_X += test-parse-options
TEST_PROGRAMS_NEED_X += test-path-utils TEST_PROGRAMS_NEED_X += test-path-utils
TEST_PROGRAMS_NEED_X += test-regex
TEST_PROGRAMS_NEED_X += test-revision-walking TEST_PROGRAMS_NEED_X += test-revision-walking
TEST_PROGRAMS_NEED_X += test-run-command TEST_PROGRAMS_NEED_X += test-run-command
TEST_PROGRAMS_NEED_X += test-scrap-cache-tree TEST_PROGRAMS_NEED_X += test-scrap-cache-tree

17
builtin/commit.c

@ -478,6 +478,20 @@ static void export_one(const char *var, const char *s, const char *e, int hack)
strbuf_release(&buf); strbuf_release(&buf);
} }


static int sane_ident_split(struct ident_split *person)
{
if (!person->name_begin || !person->name_end ||
person->name_begin == person->name_end)
return 0; /* no human readable name */
if (!person->mail_begin || !person->mail_end ||
person->mail_begin == person->mail_end)
return 0; /* no usable mail */
if (!person->date_begin || !person->date_end ||
!person->tz_begin || !person->tz_end)
return 0;
return 1;
}

static void determine_author_info(struct strbuf *author_ident) static void determine_author_info(struct strbuf *author_ident)
{ {
char *name, *email, *date; char *name, *email, *date;
@ -530,7 +544,8 @@ static void determine_author_info(struct strbuf *author_ident)
if (force_date) if (force_date)
date = force_date; date = force_date;
strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT)); strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT));
if (!split_ident_line(&author, author_ident->buf, author_ident->len)) { if (!split_ident_line(&author, author_ident->buf, author_ident->len) &&
sane_ident_split(&author)) {
export_one("GIT_AUTHOR_NAME", author.name_begin, author.name_end, 0); export_one("GIT_AUTHOR_NAME", author.name_begin, author.name_end, 0);
export_one("GIT_AUTHOR_EMAIL", author.mail_begin, author.mail_end, 0); export_one("GIT_AUTHOR_EMAIL", author.mail_begin, author.mail_end, 0);
export_one("GIT_AUTHOR_DATE", author.date_begin, author.tz_end, '@'); export_one("GIT_AUTHOR_DATE", author.date_begin, author.tz_end, '@');

2
builtin/log.c

@ -109,9 +109,9 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN | PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN |
PARSE_OPT_KEEP_DASHDASH); PARSE_OPT_KEEP_DASHDASH);


argc = setup_revisions(argc, argv, rev, opt);
if (quiet) if (quiet)
rev->diffopt.output_format |= DIFF_FORMAT_NO_OUTPUT; rev->diffopt.output_format |= DIFF_FORMAT_NO_OUTPUT;
argc = setup_revisions(argc, argv, rev, opt);


/* Any arguments at this point are not recognized */ /* Any arguments at this point are not recognized */
if (argc > 1) if (argc > 1)

17
gitk-git/gitk

@ -2038,7 +2038,7 @@ proc makewindow {} {
set file { set file {
mc "File" cascade { mc "File" cascade {
{mc "Update" command updatecommits -accelerator F5} {mc "Update" command updatecommits -accelerator F5}
{mc "Reload" command reloadcommits -accelerator Meta1-F5} {mc "Reload" command reloadcommits -accelerator Shift-F5}
{mc "Reread references" command rereadrefs} {mc "Reread references" command rereadrefs}
{mc "List references" command showrefs -accelerator F2} {mc "List references" command showrefs -accelerator F2}
{xx "" separator} {xx "" separator}
@ -2495,7 +2495,7 @@ proc makewindow {} {
bindkey ? {dofind -1 1} bindkey ? {dofind -1 1}
bindkey f nextfile bindkey f nextfile
bind . <F5> updatecommits bind . <F5> updatecommits
bind . <$M1B-F5> reloadcommits bind . <Shift-F5> reloadcommits
bind . <F2> showrefs bind . <F2> showrefs
bind . <Shift-F4> {newview 0} bind . <Shift-F4> {newview 0}
catch { bind . <Shift-Key-XF86_Switch_VT_4> {newview 0} } catch { bind . <Shift-Key-XF86_Switch_VT_4> {newview 0} }
@ -10599,7 +10599,7 @@ proc movedhead {hid head} {
} }


proc changedrefs {} { proc changedrefs {} {
global cached_dheads cached_dtags cached_atags global cached_dheads cached_dtags cached_atags cached_tagcontent
global arctags archeads arcnos arcout idheads idtags global arctags archeads arcnos arcout idheads idtags


foreach id [concat [array names idheads] [array names idtags]] { foreach id [concat [array names idheads] [array names idtags]] {
@ -10611,6 +10611,7 @@ proc changedrefs {} {
} }
} }
} }
catch {unset cached_tagcontent}
catch {unset cached_dtags} catch {unset cached_dtags}
catch {unset cached_atags} catch {unset cached_atags}
catch {unset cached_dheads} catch {unset cached_dheads}
@ -10663,7 +10664,7 @@ proc listrefs {id} {
} }


proc showtag {tag isnew} { proc showtag {tag isnew} {
global ctext tagcontents tagids linknum tagobjid global ctext cached_tagcontent tagids linknum tagobjid


if {$isnew} { if {$isnew} {
addtohistory [list showtag $tag 0] savectextpos addtohistory [list showtag $tag 0] savectextpos
@ -10672,13 +10673,13 @@ proc showtag {tag isnew} {
clear_ctext clear_ctext
settabs 0 settabs 0
set linknum 0 set linknum 0
if {![info exists tagcontents($tag)]} { if {![info exists cached_tagcontent($tag)]} {
catch { catch {
set tagcontents($tag) [exec git cat-file tag $tag] set cached_tagcontent($tag) [exec git cat-file tag $tag]
} }
} }
if {[info exists tagcontents($tag)]} { if {[info exists cached_tagcontent($tag)]} {
set text $tagcontents($tag) set text $cached_tagcontent($tag)
} else { } else {
set text "[mc "Tag"]: $tag\n[mc "Id"]: $tagids($tag)" set text "[mc "Tag"]: $tag\n[mc "Id"]: $tagids($tag)"
} }

6
ident.c

@ -210,8 +210,10 @@ int split_ident_line(struct ident_split *split, const char *line, int len)
split->name_end = cp + 1; split->name_end = cp + 1;
break; break;
} }
if (!split->name_end) if (!split->name_end) {
return status; /* no human readable name */
split->name_end = split->name_begin;
}


for (cp = split->mail_begin; cp < line + len; cp++) for (cp = split->mail_begin; cp < line + len; cp++)
if (*cp == '>') { if (*cp == '>') {

5
t/t0070-fundamental.sh

@ -25,4 +25,9 @@ test_expect_success POSIXPERM 'mktemp to unwritable directory prints filename' '
grep "cannotwrite/test" err grep "cannotwrite/test" err
' '


test_expect_success 'check for a bug in the regex routines' '
# if this test fails, re-build git with NO_REGEX=1
test-regex
'

test_done test_done

12
t/t7007-show.sh

@ -108,4 +108,16 @@ test_expect_success 'showing range' '
test_cmp expect actual.filtered test_cmp expect actual.filtered
' '


test_expect_success '-s suppresses diff' '
echo main3 >expect &&
git show -s --format=%s main3 >actual &&
test_cmp expect actual
'

test_expect_success '--quiet suppresses diff' '
echo main3 >expect &&
git show --quiet --format=%s main3 >actual &&
test_cmp expect actual
'

test_done test_done

20
test-regex.c

@ -0,0 +1,20 @@
#include <git-compat-util.h>

int main(int argc, char **argv)
{
char *pat = "[^={} \t]+";
char *str = "={}\nfred";
regex_t r;
regmatch_t m[1];

if (regcomp(&r, pat, REG_EXTENDED | REG_NEWLINE))
die("failed regcomp() for pattern '%s'", pat);
if (regexec(&r, str, 1, m, 0))
die("no match of pattern '%s' to string '%s'", pat, str);

/* http://sourceware.org/bugzilla/show_bug.cgi?id=3957 */
if (m[0].rm_so == 3) /* matches '\n' when it should not */
die("regex bug confirmed: re-build git with NO_REGEX=1");

exit(0);
}
Loading…
Cancel
Save