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

This commit is contained in:
Johannes Sixt
2007-07-13 08:56:03 +02:00
23 changed files with 227 additions and 33 deletions

View File

@@ -0,0 +1,28 @@
GIT v1.5.2.4 Release Notes
==========================
Fixes since v1.5.2.3
--------------------
* Bugfixes
- "git-gui" bugfixes, including a handful fixes to run it
better on Cygwin/MSYS.
- "git checkout" failed to switch back and forth between
branches, one of which has "frotz -> xyzzy" symlink and
file "xyzzy/filfre", while the other one has a file
"frotz/filfre".
- "git prune" used to segfault upon seeing a commit that is
referred to by a tree object (aka "subproject").
- "git diff --name-status --no-index" mishandled an added file.
- "git apply --reverse --whitespace=warn" still complained
about whitespaces that a forward application would have
introduced.
* Documentation Fixes and Updates
- A handful documentation updates.

View File

@@ -481,8 +481,9 @@ It is recommended that `<path>` always be encoded using UTF-8.
`filedelete`
^^^^^^^^^^^^
Included in a `commit` command to remove a file from the branch.
If the file removal makes its directory empty, the directory will
Included in a `commit` command to remove a file or recursively
delete an entire directory from the branch. If the file or directory
removal makes its parent directory empty, the parent directory will
be automatically removed too. This cascades up the tree until the
first non-empty directory or the root is reached.
@@ -490,7 +491,8 @@ first non-empty directory or the root is reached.
'D' SP <path> LF
....
here `<path>` is the complete path of the file to be removed.
here `<path>` is the complete path of the file or subdirectory to
be removed from the branch.
See `filemodify` above for a detailed description of `<path>`.
`filedeleteall`

View File

@@ -50,6 +50,9 @@ OPTIONS
-------
include::diff-options.txt[]
-<n>::
Limits the number of patches to prepare.
-o|--output-directory <dir>::
Use <dir> to store the resulting files, instead of the
current working directory.

View File

@@ -330,6 +330,12 @@ This commit is referred to as a "merge commit", or sometimes just a
denotes a particular <<def_object,object>>. These may be stored in
`$GIT_DIR/refs/`.
[[def_reflog]]reflog::
A reflog shows the local "history" of a ref. In other words,
it can tell you what the 3rd last revision in _this_ repository
was, and what was the current state in _this_ repository,
yesterday 9:14pm. See gitlink:git-reflog[1] for details.
[[def_refspec]]refspec::
A "refspec" is used by <<def_fetch,fetch>> and
<<def_push,push>> to describe the mapping between remote

View File

@@ -304,7 +304,7 @@ it easier:
$ git remote add bob /home/bob/myrepo
------------------------------------------------
With this, you can perform the first operation alone using the
With this, Alice can perform the first operation alone using the
"git fetch" command without merging them with her own branch,
using:

View File

@@ -890,7 +890,7 @@ $ git archive --format=tar --prefix=project/ HEAD | gzip >latest.tar.gz
-------------------------------------------------
will use HEAD to produce a tar archive in which each filename is
preceded by "prefix/".
preceded by "project/".
If you're releasing a new version of a software project, you may want
to simultaneously make a changelog to include in the release
@@ -1528,9 +1528,9 @@ dangling tree b24c2473f1fd3d91352a624795be026d64c8841f
-------------------------------------------------
Dangling objects are not a problem. At worst they may take up a little
extra disk space. They can sometimes provide a last-resort method of
recovery lost work--see <<dangling-objects>> for details. However, if
you want, you may remove them with gitlink:git-prune[1] or the --prune
extra disk space. They can sometimes provide a last-resort method for
recovering lost work--see <<dangling-objects>> for details. However, if
you wish, you can remove them with gitlink:git-prune[1] or the --prune
option to gitlink:git-gc[1]:
-------------------------------------------------
@@ -1772,7 +1772,7 @@ repository, but it works just as well in the other direction.
If you and the maintainer both have accounts on the same machine, then
you can just pull changes from each other's repositories directly;
commands that accepts repository URLs as arguments will also accept a
commands that accept repository URLs as arguments will also accept a
local directory name:
-------------------------------------------------
@@ -1780,6 +1780,15 @@ $ git clone /path/to/repository
$ git pull /path/to/other/repository
-------------------------------------------------
or an ssh url:
-------------------------------------------------
$ git clone ssh://yourhost/~you/repository
-------------------------------------------------
For projects with few developers, or for synchronizing a few private
repositories, this may be all you need.
However, the more common way to do this is to maintain a separate public
repository (usually on a different host) for others to pull changes
from. This is usually more convenient, and allows you to cleanly
@@ -1802,6 +1811,8 @@ like this:
| they push V
their public repo <------------------- their repo
We explain how to do this in the following sections.
[[setting-up-a-public-repository]]
Setting up a public repository
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1913,6 +1924,12 @@ proceeding the branch name by a plus sign:
$ git push ssh://yourserver.com/~you/proj.git +master
-------------------------------------------------
Note that the target of a "push" is normally a
<<def_bare_repository,bare>> repository. You can also push to a
repository that has a checked-out working tree, but the working tree
will not be updated by the push. This may lead to unexpected results if
the branch you push to is the currently checked-out branch!
As with git-fetch, you may also set up configuration options to
save typing; so, for example, after

View File

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

View File

@@ -1 +1 @@
Documentation/RelNotes-1.5.2.3.txt
Documentation/RelNotes-1.5.2.4.txt

View File

@@ -1003,12 +1003,16 @@ static int parse_fragment(char *line, unsigned long size, struct patch *patch, s
trailing++;
break;
case '-':
if (apply_in_reverse &&
new_whitespace != nowarn_whitespace)
check_whitespace(line, len);
deleted++;
oldlines--;
trailing = 0;
break;
case '+':
if (new_whitespace != nowarn_whitespace)
if (!apply_in_reverse &&
new_whitespace != nowarn_whitespace)
check_whitespace(line, len);
added++;
newlines--;

3
diff.c
View File

@@ -2402,7 +2402,8 @@ static void diff_flush_raw(struct diff_filepair *p,
printf("%s ",
diff_unique_abbrev(p->two->sha1, abbrev));
}
printf("%s%c%s", status, inter_name_termination, path_one);
printf("%s%c%s", status, inter_name_termination,
two_paths || p->one->mode ? path_one : path_two);
if (two_paths)
printf("%c%s", inter_name_termination, path_two);
putchar(line_termination);

View File

@@ -1042,15 +1042,17 @@ proc do_gitk {revs} {
# lets us bypass using shell process on Windows systems.
#
set cmd [list [info nameofexecutable]]
lappend cmd [gitexec gitk]
set exe [gitexec gitk]
lappend cmd $exe
if {$revs ne {}} {
append cmd { }
append cmd $revs
}
if {[catch {eval exec $cmd &} err]} {
error_popup "Failed to start gitk:\n\n$err"
if {! [file exists $exe]} {
error_popup "Unable to start gitk:\n\n$exe does not exist"
} else {
eval exec $cmd &
set ui_status_value $starting_gitk_msg
after 10000 {
if {$ui_status_value eq $starting_gitk_msg} {
@@ -1523,7 +1525,8 @@ if {[is_enabled transport]} {
menu .mbar.push
.mbar.push add command -label {Push...} \
-command do_push_anywhere
-command do_push_anywhere \
-accelerator $M1T-P
}
if {[is_MacOSX]} {
@@ -1819,6 +1822,10 @@ pack .vpane.lower.commarea.buttons.commit -side top -fill x
lappend disable_on_lock \
{.vpane.lower.commarea.buttons.commit conf -state}
button .vpane.lower.commarea.buttons.push -text {Push} \
-command do_push_anywhere
pack .vpane.lower.commarea.buttons.push -side top -fill x
# -- Commit Message Buffer
#
frame .vpane.lower.commarea.buffer
@@ -2146,10 +2153,14 @@ if {[is_enabled branch]} {
bind . <$M1B-Key-n> do_create_branch
bind . <$M1B-Key-N> do_create_branch
}
if {[is_enabled transport]} {
bind . <$M1B-Key-p> do_push_anywhere
bind . <$M1B-Key-P> do_push_anywhere
}
bind all <Key-F5> do_rescan
bind all <$M1B-Key-r> do_rescan
bind all <$M1B-Key-R> do_rescan
bind . <Key-F5> do_rescan
bind . <$M1B-Key-r> do_rescan
bind . <$M1B-Key-R> do_rescan
bind . <$M1B-Key-s> do_signoff
bind . <$M1B-Key-S> do_signoff
bind . <$M1B-Key-i> do_add_all

View File

@@ -547,6 +547,10 @@ method _read_blame {fd cur_w cur_d cur_s} {
set a_name {}
catch {set a_name $header($cmit,author)}
while {$a_name ne {}} {
if {$author_abbr ne {}
&& [string index $a_name 0] eq {'}} {
regsub {^'[^']+'\s+} $a_name {} a_name
}
if {![regexp {^([[:upper:]])} $a_name _a]} break
append author_abbr $_a
unset _a

View File

@@ -11,6 +11,8 @@ field browser_status {Starting...}
field browser_stack {}
field browser_busy 1
field ls_buf {}; # Buffered record output from ls-tree
constructor new {commit} {
global cursor_ptr M1B
make_toplevel top w
@@ -160,7 +162,7 @@ method _click {was_double_click pos} {
}
method _ls {tree_id {name {}}} {
set browser_buffer {}
set ls_buf {}
set browser_files {}
set browser_busy 1
@@ -185,17 +187,19 @@ method _ls {tree_id {name {}}} {
}
method _read {fd} {
append browser_buffer [read $fd]
set pck [split $browser_buffer "\0"]
set browser_buffer [lindex $pck end]
append ls_buf [read $fd]
set pck [split $ls_buf "\0"]
set ls_buf [lindex $pck end]
set n [llength $browser_files]
$w conf -state normal
foreach p [lrange $pck 0 end-1] {
set info [split $p "\t"]
set path [lindex $info 1]
set info [split [lindex $info 0] { }]
set type [lindex $info 1]
set tab [string first "\t" $p]
if {$tab == -1} continue
set info [split [string range $p 0 [expr {$tab - 1}]] { }]
set path [string range $p [expr {$tab + 1}] end]
set type [lindex $info 1]
set object [lindex $info 2]
switch -- $type {
@@ -225,7 +229,7 @@ method _read {fd} {
close $fd
set browser_status Ready.
set browser_busy 0
unset browser_buffer
set ls_buf {}
if {$n > 0} {
$w tag add in_sel 1.0 2.0
focus -force $w

View File

@@ -257,6 +257,34 @@ proc commit_committree {fd_wt curHEAD msg} {
return
}
# -- Verify this wasn't an empty change.
#
if {$commit_type eq {normal}} {
set fd_ot [open "| git cat-file commit $PARENT" r]
fconfigure $fd_ot -encoding binary -translation lf
set old_tree [gets $fd_ot]
close $fd_ot
if {[string equal -length 5 {tree } $old_tree]
&& [string length $old_tree] == 45} {
set old_tree [string range $old_tree 5 end]
} else {
error "Commit $PARENT appears to be corrupt"
}
if {$tree_id eq $old_tree} {
info_popup {No changes to commit.
No files were modified by this commit and it was not a merge commit.
A rescan will be automatically started now.
}
unlock_index
rescan {set ui_status_value {No changes to commit.}}
return
}
}
# -- Build the message.
#
set msg_p [gitdir COMMIT_EDITMSG]

View File

@@ -31,16 +31,20 @@ method _init {} {
-background white -borderwidth 1 \
-relief sunken \
-width 80 -height 10 \
-wrap none \
-font font_diff \
-state disabled \
-xscrollcommand [list $w.m.sbx set] \
-yscrollcommand [list $w.m.sby set]
label $w.m.s -text {Working... please wait...} \
-anchor w \
-justify left \
-font font_uibold
scrollbar $w.m.sbx -command [list $w.m.t xview] -orient h
scrollbar $w.m.sby -command [list $w.m.t yview]
pack $w.m.l1 -side top -fill x
pack $w.m.s -side bottom -fill x
pack $w.m.sbx -side bottom -fill x
pack $w.m.sby -side right -fill y
pack $w.m.t -side left -fill both -expand 1
pack $w.m -side top -fill both -expand 1 -padx 5 -pady 10

View File

@@ -213,7 +213,9 @@ proc dialog {} {
pack $w.buttons.visualize -side left
button $w.buttons.create -text Merge -command $_start
pack $w.buttons.create -side right
button $w.buttons.cancel -text {Cancel} -command [list destroy $w]
button $w.buttons.cancel \
-text {Cancel} \
-command "unlock_index;destroy $w"
pack $w.buttons.cancel -side right -padx 5
pack $w.buttons -side bottom -fill x -pady 10 -padx 10

View File

@@ -9,6 +9,9 @@ proc do_windows_shortcut {} {
-title "[appname] ([reponame]): Create Desktop Icon" \
-initialfile "Git [reponame].bat"]
if {$fn != {}} {
if {[file extension $fn] ne {.bat}} {
set fn ${fn}.bat
}
if {[catch {
set fd [open $fn w]
puts $fd "@ECHO Entering [reponame]"
@@ -42,6 +45,9 @@ proc do_cygwin_shortcut {} {
-initialdir $desktop \
-initialfile "Git [reponame].bat"]
if {$fn != {}} {
if {[file extension $fn] ne {.bat}} {
set fn ${fn}.bat
}
if {[catch {
set fd [open $fn w]
set sh [exec cygpath \

View File

@@ -360,10 +360,14 @@ static void read_info_alternates(const char * relative_base, int depth)
char *map;
size_t mapsz;
struct stat st;
char path[PATH_MAX];
const char alt_file_name[] = "info/alternates";
/* Given that relative_base is no longer than PATH_MAX,
ensure that "path" has enough space to append "/", the
file name, "info/alternates", and a trailing NUL. */
char path[PATH_MAX + 1 + sizeof alt_file_name];
int fd;
sprintf(path, "%s/info/alternates", relative_base);
sprintf(path, "%s/%s", relative_base, alt_file_name);
fd = open(path, O_RDONLY);
if (fd < 0)
return;
@@ -824,7 +828,10 @@ void install_packed_git(struct packed_git *pack)
static void prepare_packed_git_one(char *objdir, int local)
{
char path[PATH_MAX];
/* Ensure that this buffer is large enough so that we can
append "/pack/" without clobbering the stack even if
strlen(objdir) were PATH_MAX. */
char path[PATH_MAX + 1 + 4 + 1 + 1];
int len;
DIR *dir;
struct dirent *de;
@@ -846,6 +853,9 @@ static void prepare_packed_git_one(char *objdir, int local)
if (!has_extension(de->d_name, ".idx"))
continue;
if (len + namelen + 1 > sizeof(path))
continue;
/* Don't reopen a pack we already have. */
strcpy(path + len, de->d_name);
for (p = packed_git; p; p = p->next) {

50
t/t2007-checkout-symlink.sh Executable file
View File

@@ -0,0 +1,50 @@
#!/bin/sh
#
# Copyright (c) 2007 Junio C Hamano
test_description='git checkout to switch between branches with symlink<->dir'
. ./test-lib.sh
test_expect_success setup '
mkdir frotz &&
echo hello >frotz/filfre &&
git add frotz/filfre &&
test_tick &&
git commit -m "master has file frotz/filfre" &&
git branch side &&
echo goodbye >nitfol &&
git add nitfol
test_tick &&
git commit -m "master adds file nitfol" &&
git checkout side &&
git rm --cached frotz/filfre &&
mv frotz xyzzy &&
ln -s xyzzy frotz &&
git add xyzzy/filfre frotz &&
test_tick &&
git commit -m "side moves frotz/ to xyzzy/ and adds frotz->xyzzy/"
'
test_expect_success 'switch from symlink to dir' '
git checkout master
'
rm -fr frotz xyzzy nitfol &&
git checkout -f master || exit
test_expect_success 'switch from dir to symlink' '
git checkout side
'
test_done

View File

@@ -17,6 +17,7 @@ test_expect_success setup '
export GIT_AUTHOR_DATE GIT_COMMITTER_DATE &&
mkdir dir &&
mkdir dir2 &&
for i in 1 2 3; do echo $i; done >file0 &&
for i in A B; do echo $i; done >dir/sub &&
cat file0 >file2 &&
@@ -252,6 +253,7 @@ diff --patch-with-stat initial..side
diff --patch-with-raw initial..side
diff --patch-with-stat -r initial..side
diff --patch-with-raw -r initial..side
diff --name-status dir2 dir
EOF
test_done

View File

@@ -0,0 +1,3 @@
$ git diff --name-status dir2 dir
A dir/sub
$

View File

@@ -82,4 +82,10 @@ test_expect_success 'apply in reverse without postimage' '
)
'
test_expect_success 'reversing a whitespace introduction' '
sed "s/a/a /" < file1 > file1.new &&
mv file1.new file1 &&
git diff | git apply --reverse --whitespace=error
'
test_done

View File

@@ -495,6 +495,9 @@ static void verify_absent(const char *path, const char *action,
if (o->index_only || o->reset || !o->update)
return;
if (has_symlink_leading_path(path, NULL))
return;
if (!lstat(path, &st)) {
int cnt;