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

This commit is contained in:
Johannes Sixt
2009-07-23 09:50:41 +02:00
30 changed files with 311 additions and 110 deletions

View File

@@ -22,13 +22,6 @@ branch pointed at by its HEAD, gets a large warning. You can choose what
should happen upon such a push by setting the configuration variable
receive.denyDeleteCurrent in the receiving repository.
When the user does not tell "git push" what to push, it has always
pushed matching refs. For some people it is unexpected, and a new
configuration variable push.default has been introduced to allow
changing a different default behaviour. To advertise the new feature,
a big warning is issued if this is not configured and a git push without
arguments is attempted.
Updates since v1.6.3
--------------------
@@ -38,26 +31,60 @@ Updates since v1.6.3
* gitweb Perl style clean-up.
* git-svn updates, including a new --authors-prog option to map author
names by invoking an external program.
names by invoking an external program, 'git svn reset' to unwind
'git svn fetch', support for more than one branches, etc.
(portability)
* We feed iconv with "UTF-8" instead of "utf8"; the former is
understood more widely.
understood more widely. Similarly updated test scripts to use
encoding names more widely understood (e.g. use "ISO8850-1" instead
of "ISO-8859-1").
* Various portability fixes/workarounds for different vintages of
SunOS, IRIX, and Windows.
* Git-over-ssh transport on Windows supports PuTTY plink and TortoisePlink.
(performance)
* Many repeated use of lstat() are optimized out in "checkout" codepath.
* git-status (and underlying git-diff-index --cached) are optimized
to take advantage of cache-tree information in the index.
(usability, bells and whistles)
* "git add --edit" lets users edit the whole patch text to fine-tune what
is added to the index.
* "git am" accepts StGIT series file as its input.
* "git bisect skip" skips to a more randomly chosen place in the hope
to avoid testing a commit that is too close to a commit that is
already known to be untestable.
* "git cvsexportcommit" learned -k option to stop CVS keywords expansion
* "git grep" learned -p option to show the location of the match using the
same context hunk marker "git diff" uses.
* https transport can optionally be told that the used client
certificate is password protected, in which case it asks the
password only once.
* "git imap-send" is IPv6 aware.
* "git log --graph" draws graphs more compactly by using horizonal lines
when able.
* "git log --decorate" shows shorter refnames by stripping well-known
refs/* prefix.
* "git push $name" honors remote.$name.pushurl if present before
using remote.$name.url. In other words, the URL used for fetching
and pushing can be different.
* "git send-email" understands quoted aliases in .mailrc files (might
have to be backported to 1.6.3.X).
@@ -69,6 +96,11 @@ Updates since v1.6.3
* "add" and "update" subcommands to "git submodule" learned --reference
option to use local clone with references.
* "git submodule update" learned --rebase option to update checked
out submodules by rebasing the local changes.
* "gitweb" can optionally use gravatar to adorn author/committer names.
(developers)
* A major part of the "git bisect" wrapper has moved to C.
@@ -82,6 +114,11 @@ release, unless otherwise noted.
Here are fixes that this release has, but have not been backported to
v1.6.3.X series.
* "git diff-tree -r -t" used to omit new or removed directories from
the output. df533f3 (diff-tree -r -t: include added/removed
directories in the output, 2009-06-13) may need to be cherry-picked
to backport this fix.
* The way Git.pm sets up a Repository object was not friendly to callers
that chdir around. It now internally records the repository location
as an absolute path when autodetected.
@@ -89,5 +126,5 @@ v1.6.3.X series.
---
exec >/var/tmp/1
echo O=$(git describe master)
O=v1.6.3.1-168-g23807fa
O=v1.6.4-rc1-7-gbba0fd2
git shortlog --no-merges $O..master ^maint

View File

@@ -1387,6 +1387,50 @@ rerere.enabled::
default enabled if you create `rr-cache` directory under
`$GIT_DIR`, but can be disabled by setting this option to false.
sendemail.identity::
A configuration identity. When given, causes values in the
'sendemail.<identity>' subsection to take precedence over
values in the 'sendemail' section. The default identity is
the value of 'sendemail.identity'.
sendemail.smtpencryption::
See linkgit:git-send-email[1] for description. Note that this
setting is not subject to the 'identity' mechanism.
sendemail.smtpssl::
Deprecated alias for 'sendemail.smtpencryption = ssl'.
sendemail.<identity>.*::
Identity-specific versions of the 'sendemail.*' parameters
found below, taking precedence over those when the this
identity is selected, through command-line or
'sendemail.identity'.
sendemail.aliasesfile::
sendemail.aliasfiletype::
sendemail.bcc::
sendemail.cc::
sendemail.cccmd::
sendemail.chainreplyto::
sendemail.confirm::
sendemail.envelopesender::
sendemail.from::
sendemail.multiedit::
sendemail.signedoffbycc::
sendemail.smtppass::
sendemail.suppresscc::
sendemail.suppressfrom::
sendemail.to::
sendemail.smtpserver::
sendemail.smtpserverport::
sendemail.smtpuser::
sendemail.thread::
sendemail.validate::
See linkgit:git-send-email[1] for description.
sendemail.signedoffcc::
Deprecated alias for 'sendemail.signedoffbycc'.
showbranch.default::
The default set of branches for linkgit:git-show-branch[1].
See linkgit:git-show-branch[1].

View File

@@ -10,7 +10,7 @@ SYNOPSIS
--------
[verse]
'git format-patch' [-k] [(-o|--output-directory) <dir> | --stdout]
[--thread[=<style>]]
[--no-thread | --thread[=<style>]]
[(--attach|--inline)[=<boundary>] | --no-attach]
[-s | --signoff]
[-n | --numbered | -N | --no-numbered]
@@ -124,17 +124,25 @@ include::diff-options.txt[]
second part, with "Content-Disposition: inline".
--thread[=<style>]::
Add In-Reply-To and References headers to make the second and
subsequent mails appear as replies to the first. Also generates
the Message-Id header to reference.
--no-thread::
Controls addition of In-Reply-To and References headers to
make the second and subsequent mails appear as replies to the
first. Also controls generation of the Message-Id header to
reference.
+
The optional <style> argument can be either `shallow` or `deep`.
'shallow' threading makes every mail a reply to the head of the
series, where the head is chosen from the cover letter, the
`\--in-reply-to`, and the first patch mail, in this order. 'deep'
threading makes every mail a reply to the previous one. If not
specified, defaults to the 'format.thread' configuration, or `shallow`
if that is not set.
threading makes every mail a reply to the previous one.
+
The default is --no-thread, unless the 'format.thread' configuration
is set. If --thread is specified without a style, it defaults to the
style specified by 'format.thread' if any, or else `shallow`.
+
Beware that the default for 'git send-email' is to thread emails
itself. If you want 'git format-patch' to take care of hreading, you
will want to ensure that threading is disabled for 'git send-email'.
--in-reply-to=Message-Id::
Make the first mail (or all the mails with --no-thread) appear as a

View File

@@ -212,11 +212,22 @@ specified, as well as 'body' if --no-signed-off-cc is specified.
value; if that is unspecified, default to --no-suppress-from.
--[no-]thread::
If this is set, the In-Reply-To header will be set on each email sent.
If disabled with "--no-thread", no emails will have the In-Reply-To
header set, unless specified with --in-reply-to.
Default is the value of the 'sendemail.thread' configuration
value; if that is unspecified, default to --thread.
If this is set, the In-Reply-To and References headers will be
added to each email sent. Whether each mail refers to the
previous email (`deep` threading per 'git format-patch'
wording) or to the first email (`shallow` threading) is
governed by "--[no-]chain-reply-to".
+
If disabled with "--no-thread", those headers will not be added
(unless specified with --in-reply-to). Default is the value of the
'sendemail.thread' configuration value; if that is unspecified,
default to --thread.
+
It is up to the user to ensure that no In-Reply-To header already
exists when 'git send-email' is asked to add it (especially note that
'git format-patch' can be configured to do the threading itself).
Failure to do so may not produce the expected result in the
recipient's MUA.
Administering

View File

@@ -64,36 +64,11 @@ static void setup_push_tracking(void)
add_refspec(refspec.buf);
}
static const char *warn_unconfigured_push_msg[] = {
"You did not specify any refspecs to push, and the current remote",
"has not configured any push refspecs. The default action in this",
"case is to push all matching refspecs, that is, all branches",
"that exist both locally and remotely will be updated. This may",
"not necessarily be what you want to happen.",
"",
"You can specify what action you want to take in this case, and",
"avoid seeing this message again, by configuring 'push.default' to:",
" 'nothing' : Do not push anything",
" 'matching' : Push all matching branches (default)",
" 'tracking' : Push the current branch to whatever it is tracking",
" 'current' : Push the current branch"
};
static void warn_unconfigured_push(void)
{
int i;
for (i = 0; i < ARRAY_SIZE(warn_unconfigured_push_msg); i++)
warning("%s", warn_unconfigured_push_msg[i]);
}
static void setup_default_push_refspecs(void)
{
git_config(git_default_config, NULL);
switch (push_default) {
case PUSH_DEFAULT_UNSPECIFIED:
warn_unconfigured_push();
/* fallthrough */
default:
case PUSH_DEFAULT_MATCHING:
add_refspec(":");
break;

View File

@@ -543,7 +543,6 @@ enum rebase_setup_type {
};
enum push_default_type {
PUSH_DEFAULT_UNSPECIFIED = -1,
PUSH_DEFAULT_NOTHING = 0,
PUSH_DEFAULT_MATCHING,
PUSH_DEFAULT_TRACKING,

View File

@@ -80,6 +80,7 @@ struct lline {
/* Lines surviving in the merge result */
struct sline {
struct lline *lost_head, **lost_tail;
struct lline *next_lost;
char *bol;
int len;
/* bit 0 up to (N-1) are on if the parent has this line (i.e.
@@ -121,18 +122,12 @@ static void append_lost(struct sline *sline, int n, const char *line, int len)
/* Check to see if we can squash things */
if (sline->lost_head) {
struct lline *last_one = NULL;
/* We cannot squash it with earlier one */
for (lline = sline->lost_head;
lline;
lline = lline->next)
if (lline->parent_map & this_mask)
last_one = lline;
lline = last_one ? last_one->next : sline->lost_head;
lline = sline->next_lost;
while (lline) {
if (lline->len == len &&
!memcmp(lline->line, line, len)) {
lline->parent_map |= this_mask;
sline->next_lost = lline->next;
return;
}
lline = lline->next;
@@ -147,6 +142,7 @@ static void append_lost(struct sline *sline, int n, const char *line, int len)
lline->line[len] = 0;
*sline->lost_tail = lline;
sline->lost_tail = &lline->next;
sline->next_lost = NULL;
}
struct combine_diff_state {
@@ -168,25 +164,28 @@ static void consume_line(void *state_, char *line, unsigned long len)
&state->nb, &state->nn))
return;
state->lno = state->nb;
if (!state->nb)
/* @@ -1,2 +0,0 @@ to remove the
* first two lines...
*/
state->nb = 1;
if (state->nn == 0)
if (state->nn == 0) {
/* @@ -X,Y +N,0 @@ removed Y lines
* that would have come *after* line N
* in the result. Our lost buckets hang
* to the line after the removed lines,
*
* Note that this is correct even when N == 0,
* in which case the hunk removes the first
* line in the file.
*/
state->lost_bucket = &state->sline[state->nb];
else
if (!state->nb)
state->nb = 1;
} else {
state->lost_bucket = &state->sline[state->nb-1];
}
if (!state->sline[state->nb-1].p_lno)
state->sline[state->nb-1].p_lno =
xcalloc(state->num_parent,
sizeof(unsigned long));
state->sline[state->nb-1].p_lno[state->n] = state->ob;
state->lost_bucket->next_lost = state->lost_bucket->lost_head;
return;
}
if (!state->lost_bucket)

View File

@@ -34,6 +34,7 @@ NO_LIBGEN_H=@NO_LIBGEN_H@
NEEDS_LIBICONV=@NEEDS_LIBICONV@
NEEDS_SOCKET=@NEEDS_SOCKET@
NEEDS_RESOLV=@NEEDS_RESOLV@
NEEDS_LIBGEN=@NEEDS_LIBGEN@
NO_SYS_SELECT_H=@NO_SYS_SELECT_H@
NO_D_INO_IN_DIRENT=@NO_D_INO_IN_DIRENT@
NO_D_TYPE_IN_DIRENT=@NO_D_TYPE_IN_DIRENT@

View File

@@ -342,9 +342,8 @@ GIT_STASH_FLAGS($OPENSSLDIR)
AC_CHECK_LIB([crypto], [SHA1_Init],
[NEEDS_SSL_WITH_CRYPTO=],
[AC_CHECK_LIB([ssl], [SHA1_Init],
[NEEDS_SSL_WITH_CRYPTO=YesPlease
NEEDS_SSL_WITH_CRYPTO=],
[NO_OPENSSL=YesPlease])])
[NEEDS_SSL_WITH_CRYPTO=YesPlease],
[NEEDS_SSL_WITH_CRYPTO= NO_OPENSSL=YesPlease])])
GIT_UNSTASH_FLAGS($OPENSSLDIR)
@@ -479,13 +478,13 @@ test -n "$NEEDS_SOCKET" && LIBS="$LIBS -lsocket"
# Define NEEDS_RESOLV if linking with -lnsl and/or -lsocket is not enough.
# Notably on Solaris hstrerror resides in libresolv and on Solaris 7
# inet_ntop and inet_pton additionally reside there.
AC_CHECK_LIB([resolv], [hstrerror],
AC_CHECK_LIB([c], [hstrerror],
[NEEDS_RESOLV=],
[NEEDS_RESOLV=YesPlease])
AC_SUBST(NEEDS_RESOLV)
test -n "$NEEDS_RESOLV" && LIBS="$LIBS -lresolv"
AC_CHECK_LIB([gen], [basename],
AC_CHECK_LIB([c], [basename],
[NEEDS_LIBGEN=],
[NEEDS_LIBGEN=YesPlease])
AC_SUBST(NEEDS_LIBGEN)

View File

@@ -42,7 +42,7 @@ enum safe_crlf safe_crlf = SAFE_CRLF_WARN;
unsigned whitespace_rule_cfg = WS_DEFAULT_RULE;
enum branch_track git_branch_track = BRANCH_TRACK_REMOTE;
enum rebase_setup_type autorebase = AUTOREBASE_NEVER;
enum push_default_type push_default = PUSH_DEFAULT_UNSPECIFIED;
enum push_default_type push_default = PUSH_DEFAULT_MATCHING;
#ifndef OBJECT_CREATION_MODE
#define OBJECT_CREATION_MODE OBJECT_CREATION_USES_HARDLINKS
#endif

View File

@@ -26,6 +26,7 @@
#endif
#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
#define bitsizeof(x) (CHAR_BIT * sizeof(x))
#ifdef __GNUC__
#define TYPEOF(x) (__typeof__(x))
@@ -33,9 +34,11 @@
#define TYPEOF(x)
#endif
#define MSB(x, bits) ((x) & TYPEOF(x)(~0ULL << (sizeof(x) * 8 - (bits))))
#define MSB(x, bits) ((x) & TYPEOF(x)(~0ULL << (bitsizeof(x) - (bits))))
#define HAS_MULTI_BITS(i) ((i) & ((i) - 1)) /* checks if an integer has more than 1 bit set */
#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
/* Approximation of the length of the decimal representation of this type. */
#define decimal_length(x) ((int)(sizeof(x) * 2.56 + 0.5) + 1)

View File

@@ -203,7 +203,7 @@ apply_stash () {
git diff-tree --binary $s^2^..$s^2 | git apply --cached
test $? -ne 0 &&
die 'Conflicts in index. Try without --index.'
unstashed_index_tree=$(git-write-tree) ||
unstashed_index_tree=$(git write-tree) ||
die 'Could not save index tree'
git reset
fi
@@ -219,7 +219,7 @@ apply_stash () {
then
export GIT_MERGE_VERBOSITY=0
fi
if git-merge-recursive $b_tree -- $c_tree $w_tree
if git merge-recursive $b_tree -- $c_tree $w_tree
then
# No conflict
if test -n "$unstashed_index_tree"
@@ -297,7 +297,7 @@ apply_to_branch () {
fi
stash=$2
git-checkout -b $branch $stash^ &&
git checkout -b $branch $stash^ &&
apply_stash --index $stash &&
drop_stash $stash
}

View File

@@ -4525,10 +4525,12 @@ sub gs_do_switch {
my $full_url = $self->{url};
my $old_url = $full_url;
$full_url .= '/' . escape_uri_only($path) if length $path;
$full_url .= '/' . $path if length $path;
my ($ra, $reparented);
if ($old_url =~ m#^svn(\+ssh)?://#) {
if ($old_url =~ m#^svn(\+ssh)?://# ||
($full_url =~ m#^https?://# &&
escape_url($full_url) ne $full_url)) {
$_[0] = undef;
$self = undef;
$RA = undef;

View File

@@ -893,7 +893,7 @@ static struct column *find_new_column_by_commit(struct git_graph *graph,
if (graph->new_columns[i].commit == commit)
return &graph->new_columns[i];
}
return 0;
return NULL;
}
static void graph_output_post_merge_line(struct git_graph *graph, struct strbuf *sb)

2
help.c
View File

@@ -100,7 +100,7 @@ static void pretty_print_string_list(struct cmdnames *cmds, int longest)
if (space < max_cols)
cols = max_cols / space;
rows = (cmds->cnt + cols - 1) / cols;
rows = DIV_ROUND_UP(cmds->cnt, cols);
for (i = 0; i < rows; i++) {
printf(" ");

View File

@@ -149,8 +149,7 @@ void discard_revindex(void)
if (pack_revindex_hashsz) {
int i;
for (i = 0; i < pack_revindex_hashsz; i++)
if (pack_revindex[i].revindex)
free(pack_revindex[i].revindex);
free(pack_revindex[i].revindex);
free(pack_revindex);
pack_revindex_hashsz = 0;
}

View File

@@ -76,7 +76,7 @@ static void preload_index(struct index_state *index, const char **pathspec)
if (threads > MAX_PARALLEL)
threads = MAX_PARALLEL;
offset = 0;
work = (index->cache_nr + threads - 1) / threads;
work = DIV_ROUND_UP(index->cache_nr, threads);
for (i = 0; i < threads; i++) {
struct thread_data *p = data+i;
p->index = index;

4
refs.c
View File

@@ -1525,8 +1525,10 @@ int for_each_recent_reflog_ent(const char *ref, each_reflog_ent_fn fn, long ofs,
if (fstat(fileno(logfp), &statbuf) ||
statbuf.st_size < ofs ||
fseek(logfp, -ofs, SEEK_END) ||
fgets(buf, sizeof(buf), logfp))
fgets(buf, sizeof(buf), logfp)) {
fclose(logfp);
return -1;
}
}
while (fgets(buf, sizeof(buf), logfp)) {

View File

@@ -1170,7 +1170,7 @@ unsigned long unpack_object_header_buffer(const unsigned char *buf,
size = c & 15;
shift = 4;
while (c & 0x80) {
if (len <= used || sizeof(long) * 8 <= shift) {
if (len <= used || bitsizeof(long) <= shift) {
error("bad object header");
return 0;
}

View File

@@ -777,8 +777,6 @@ int interpret_branch_name(const char *name, struct strbuf *buf)
for_each_recent_reflog_ent("HEAD", grab_nth_branch_switch, 40960, &cb);
if (cb.cnt < nth) {
cb.cnt = 0;
for (i = 0; i < nth; i++)
strbuf_release(&cb.buf[i]);
for_each_reflog_ent("HEAD", grab_nth_branch_switch, &cb);
}
if (cb.cnt < nth)

84
t/t4038-diff-combined.sh Executable file
View File

@@ -0,0 +1,84 @@
#!/bin/sh
test_description='combined diff'
. ./test-lib.sh
setup_helper () {
one=$1 branch=$2 side=$3 &&
git branch $side $branch &&
for l in $one two three fyra
do
echo $l
done >file &&
git add file &&
test_tick &&
git commit -m $branch &&
git checkout $side &&
for l in $one two three quatro
do
echo $l
done >file &&
git add file &&
test_tick &&
git commit -m $side &&
test_must_fail git merge $branch &&
for l in $one three four
do
echo $l
done >file &&
git add file &&
test_tick &&
git commit -m "merge $branch into $side"
}
verify_helper () {
it=$1 &&
# Ignore lines that were removed only from the other parent
sed -e '
1,/^@@@/d
/^ -/d
s/^\(.\)./\1/
' "$it" >"$it.actual.1" &&
sed -e '
1,/^@@@/d
/^- /d
s/^.\(.\)/\1/
' "$it" >"$it.actual.2" &&
git diff "$it^" "$it" -- | sed -e '1,/^@@/d' >"$it.expect.1" &&
test_cmp "$it.expect.1" "$it.actual.1" &&
git diff "$it^2" "$it" -- | sed -e '1,/^@@/d' >"$it.expect.2" &&
test_cmp "$it.expect.2" "$it.actual.2"
}
test_expect_success setup '
>file &&
git add file &&
test_tick &&
git commit -m initial &&
git branch withone &&
git branch sansone &&
git checkout withone &&
setup_helper one withone sidewithone &&
git checkout sansone &&
setup_helper "" sansone sidesansone
'
test_expect_success 'check combined output (1)' '
git show sidewithone -- >sidewithone &&
verify_helper sidewithone
'
test_expect_failure 'check combined output (2)' '
git show sidesansone -- >sidesansone &&
verify_helper sidesansone
'
test_done

View File

@@ -148,4 +148,22 @@ do
done
done
create_patch () {
sed -e "s/_/ /" <<-\EOF
diff --git a/target b/target
index e69de29..8bd6648 100644
--- a/target
+++ b/target
@@ -0,0 +1 @@
+A line with trailing whitespace and no newline_
\ No newline at end of file
EOF
}
test_expect_success 'trailing whitespace & no newline at the end of file' '
>target &&
create_patch | git apply --whitespace=fix - &&
grep "newline$" target
'
test_done

View File

@@ -149,6 +149,26 @@ test_expect_success 'git log --follow' '
'
cat > expect << EOF
804a787 sixth
394ef78 fifth
5d31159 fourth
EOF
test_expect_success 'git log --no-walk <commits> sorts by commit time' '
git log --no-walk --oneline 5d31159 804a787 394ef78 > actual &&
test_cmp expect actual
'
cat > expect << EOF
5d31159 fourth
804a787 sixth
394ef78 fifth
EOF
test_expect_success 'git show <commits> leaves list of commits as given' '
git show --oneline -s 5d31159 804a787 394ef78 > actual &&
test_cmp expect actual
'
test_expect_success 'setup case sensitivity tests' '
echo case >one &&
test_tick &&

View File

@@ -288,6 +288,27 @@ test_expect_success 'check files before directories' '
'
test_expect_success 're-commit a removed filename which remains in CVS attic' '
(cd "$CVSWORK" &&
echo >attic_gremlin &&
cvs -Q add attic_gremlin &&
cvs -Q ci -m "added attic_gremlin" &&
rm attic_gremlin &&
cvs -Q rm attic_gremlin &&
cvs -Q ci -m "removed attic_gremlin") &&
echo > attic_gremlin &&
git add attic_gremlin &&
git commit -m "Added attic_gremlin" &&
git cvsexportcommit -w "$CVSWORK" -c HEAD &&
(cd "$CVSWORK"; cvs -Q update -d) &&
test -f "$CVSWORK/attic_gremlin"
'
# the state of the CVS sandbox may be indeterminate for ' space'
# after this test on some platforms / with some versions of CVS
# consider adding new tests above this point
test_expect_success 'commit a file with leading spaces in the name' '
echo space > " space" &&
@@ -295,7 +316,7 @@ test_expect_success 'commit a file with leading spaces in the name' '
git commit -m "Add a file with a leading space" &&
id=$(git rev-parse HEAD) &&
git cvsexportcommit -w "$CVSWORK" -c $id &&
check_entries "$CVSWORK" " space/1.1/|DS/1.1/|release-notes/1.2/" &&
check_entries "$CVSWORK" " space/1.1/|DS/1.1/|attic_gremlin/1.3/|release-notes/1.2/" &&
test_cmp "$CVSWORK/ space" " space"
'
@@ -317,22 +338,4 @@ test_expect_success 'use the same checkout for Git and CVS' '
'
test_expect_success 're-commit a removed filename which remains in CVS attic' '
(cd "$CVSWORK" &&
echo >attic_gremlin &&
cvs -Q add attic_gremlin &&
cvs -Q ci -m "added attic_gremlin" &&
rm attic_gremlin &&
cvs -Q rm attic_gremlin &&
cvs -Q ci -m "removed attic_gremlin") &&
echo > attic_gremlin &&
git add attic_gremlin &&
git commit -m "Added attic_gremlin" &&
git cvsexportcommit -w "$CVSWORK" -c HEAD &&
(cd "$CVSWORK"; cvs -Q update -d) &&
test -f "$CVSWORK/attic_gremlin"
'
test_done

View File

@@ -999,7 +999,7 @@ int oneway_merge(struct cache_entry **src, struct unpack_trees_options *o)
return error("Cannot do a oneway merge of %d trees",
o->merge_size);
if (!a)
if (!a || a == o->df_conflict_entry)
return deleted_entry(old, old, o);
if (old && same(old, a)) {

View File

@@ -245,7 +245,7 @@ void walker_targets_free(int targets, char **target, const char **write_ref)
{
while (targets--) {
free(target[targets]);
if (write_ref && write_ref[targets])
if (write_ref)
free((char *) write_ref[targets]);
}
}

5
ws.c
View File

@@ -261,9 +261,8 @@ int ws_fix_copy(char *dst, const char *src, int len, unsigned ws_rule, int *erro
/*
* Strip trailing whitespace
*/
if ((ws_rule & WS_TRAILING_SPACE) &&
(2 <= len && isspace(src[len-2]))) {
if (src[len - 1] == '\n') {
if (ws_rule & WS_TRAILING_SPACE) {
if (1 < len && src[len - 1] == '\n') {
add_nl_to_tail = 1;
len--;
if (1 < len && src[len - 1] == '\r') {

View File

@@ -26,7 +26,7 @@
#define XDL_MAX_COST_MIN 256
#define XDL_HEUR_MIN_COST 256
#define XDL_LINE_MAX (long)((1UL << (8 * sizeof(long) - 1)) - 1)
#define XDL_LINE_MAX (long)((1UL << (CHAR_BIT * sizeof(long) - 1)) - 1)
#define XDL_SNAKE_CNT 20
#define XDL_K_HEUR 4