mirror of
https://github.com/git/git.git
synced 2026-03-13 10:23:30 +01:00
Merge commit 'v1.6.0.1' into devel
This commit is contained in:
36
Documentation/RelNotes-1.6.0.1.txt
Normal file
36
Documentation/RelNotes-1.6.0.1.txt
Normal file
@@ -0,0 +1,36 @@
|
||||
GIT v1.6.0.1 Release Notes
|
||||
==========================
|
||||
|
||||
Fixes since v1.6.0
|
||||
------------------
|
||||
|
||||
* "git diff --cc" did not honor content mangling specified by
|
||||
gitattributes and core.autocrlf when reading from the work tree.
|
||||
|
||||
* "git diff --check" incorrectly detected new trailing blank lines when
|
||||
whitespace check was in effect.
|
||||
|
||||
* "git for-each-ref" tried to dereference NULL when asked for '%(body)" on
|
||||
a tag with a single incomplete line as its payload.
|
||||
|
||||
* "git format-patch" peeked before the beginning of a string when
|
||||
"format.headers" variable is empty (a misconfiguration).
|
||||
|
||||
* "git help help" did not work correctly.
|
||||
|
||||
* "git mailinfo" (hence "git am") was unhappy when MIME multipart message
|
||||
contained garbage after the finishing boundary.
|
||||
|
||||
* "git mailinfo" also was unhappy when the "From: " line only had a bare
|
||||
e-mail address.
|
||||
|
||||
* "git merge" did not refresh the index correctly when a merge resulted in
|
||||
a fast-forward.
|
||||
|
||||
* "git merge" did not resolve a truly trivial merges that can be done
|
||||
without content level merges.
|
||||
|
||||
* "git svn dcommit" to a repository with URL that has embedded usernames
|
||||
did not work correctly.
|
||||
|
||||
Contains other various documentation fixes.
|
||||
@@ -358,8 +358,13 @@ core.editor::
|
||||
`EDITOR` environment variables and then finally `vi`.
|
||||
|
||||
core.pager::
|
||||
The command that git will use to paginate output. Can be overridden
|
||||
with the `GIT_PAGER` environment variable.
|
||||
The command that git will use to paginate output. Can
|
||||
be overridden with the `GIT_PAGER` environment
|
||||
variable. Note that git sets the `LESS` environment
|
||||
variable to `FRSX` if it is unset when it runs the
|
||||
pager. One can change these settings by setting the
|
||||
`LESS` variable to some other value or by giving the
|
||||
`core.pager` option a value such as "`less -+FRSX`".
|
||||
|
||||
core.whitespace::
|
||||
A comma separated list of common whitespace problems to
|
||||
@@ -979,9 +984,11 @@ pack.packSizeLimit::
|
||||
linkgit:git-repack[1].
|
||||
|
||||
pager.<cmd>::
|
||||
Allows to set your own pager preferences for each command, overriding
|
||||
the default. If `\--pager` or `\--no-pager` is specified on the command
|
||||
line, it takes precedence over this option.
|
||||
Allows turning on or off pagination of the output of a
|
||||
particular git subcommand when writing to a tty. If
|
||||
`\--paginate` or `\--no-pager` is specified on the command line,
|
||||
it takes precedence over this option. To disable pagination for
|
||||
all commands, set `core.pager` or 'GIT_PAGER' to "`cat`".
|
||||
|
||||
pull.octopus::
|
||||
The default merge strategy to use when pulling multiple branches
|
||||
|
||||
@@ -11,7 +11,7 @@ SYNOPSIS
|
||||
SSH:
|
||||
|
||||
[verse]
|
||||
export CVS_SERVER=git-cvsserver
|
||||
export CVS_SERVER="git cvsserver"
|
||||
'cvs' -d :ext:user@server/path/repo.git co <HEAD_name>
|
||||
|
||||
pserver (/etc/inetd.conf):
|
||||
@@ -109,7 +109,7 @@ Note: Newer CVS versions (>= 1.12.11) also support specifying
|
||||
CVS_SERVER directly in CVSROOT like
|
||||
|
||||
------
|
||||
cvs -d ":ext;CVS_SERVER=git-cvsserver:user@server/path/repo.git" co <HEAD_name>
|
||||
cvs -d ":ext;CVS_SERVER=git cvsserver:user@server/path/repo.git" co <HEAD_name>
|
||||
------
|
||||
This has the advantage that it will be saved in your 'CVS/Root' files and
|
||||
you don't need to worry about always setting the correct environment
|
||||
@@ -158,7 +158,7 @@ allowing access over SSH.
|
||||
--
|
||||
------
|
||||
export CVSROOT=:ext:user@server:/var/git/project.git
|
||||
export CVS_SERVER=git-cvsserver
|
||||
export CVS_SERVER="git cvsserver"
|
||||
------
|
||||
--
|
||||
4. For SSH clients that will make commits, make sure their server-side
|
||||
@@ -283,7 +283,7 @@ To get a checkout with the Eclipse CVS client:
|
||||
Protocol notes: If you are using anonymous access via pserver, just select that.
|
||||
Those using SSH access should choose the 'ext' protocol, and configure 'ext'
|
||||
access on the Preferences->Team->CVS->ExtConnection pane. Set CVS_SERVER to
|
||||
'git-cvsserver'. Note that password support is not good when using 'ext',
|
||||
"'git cvsserver'". Note that password support is not good when using 'ext',
|
||||
you will definitely want to have SSH keys setup.
|
||||
|
||||
Alternatively, you can just use the non-standard extssh protocol that Eclipse
|
||||
|
||||
@@ -15,6 +15,15 @@ Given one existing commit, revert the change the patch introduces, and record a
|
||||
new commit that records it. This requires your working tree to be clean (no
|
||||
modifications from the HEAD commit).
|
||||
|
||||
Note: 'git revert' is used to record a new commit to reverse the
|
||||
effect of an earlier commit (often a faulty one). If you want to
|
||||
throw away all uncommitted changes in your working directory, you
|
||||
should see linkgit:git-reset[1], particularly the '--hard' option. If
|
||||
you want to extract specific files as they were in another commit, you
|
||||
should see linkgit:git-checkout[1], specifically the 'git checkout
|
||||
<commit> -- <filename>' syntax. Take care with these alternatives as
|
||||
both will discard uncommitted changes in your working directory.
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
<commit>::
|
||||
|
||||
@@ -497,7 +497,8 @@ other
|
||||
'GIT_PAGER'::
|
||||
This environment variable overrides `$PAGER`. If it is set
|
||||
to an empty string or to the value "cat", git will not launch
|
||||
a pager.
|
||||
a pager. See also the `core.pager` option in
|
||||
linkgit:git-config[1].
|
||||
|
||||
'GIT_SSH'::
|
||||
If this environment variable is set then 'git-fetch'
|
||||
|
||||
1
Makefile
1
Makefile
@@ -727,6 +727,7 @@ ifeq ($(uname_S),HP-UX)
|
||||
NO_UNSETENV = YesPlease
|
||||
NO_HSTRERROR = YesPlease
|
||||
NO_SYS_SELECT_H = YesPlease
|
||||
SNPRINTF_RETURNS_BOGUS = YesPlease
|
||||
endif
|
||||
ifneq (,$(findstring MINGW,$(uname_S)))
|
||||
NO_MMAP = YesPlease
|
||||
|
||||
2
RelNotes
2
RelNotes
@@ -1 +1 @@
|
||||
Documentation/RelNotes-1.6.0.txt
|
||||
Documentation/RelNotes-1.6.0.1.txt
|
||||
@@ -459,8 +459,10 @@ static void find_subpos(const char *buf, unsigned long sz, const char **sub, con
|
||||
return;
|
||||
*sub = buf; /* first non-empty line */
|
||||
buf = strchr(buf, '\n');
|
||||
if (!buf)
|
||||
if (!buf) {
|
||||
*body = "";
|
||||
return; /* no body */
|
||||
}
|
||||
while (*buf == '\n')
|
||||
buf++; /* skip blank between subject and body */
|
||||
*body = buf;
|
||||
|
||||
@@ -461,7 +461,7 @@ static int extra_cc_alloc;
|
||||
static void add_header(const char *value)
|
||||
{
|
||||
int len = strlen(value);
|
||||
while (value[len - 1] == '\n')
|
||||
while (len && value[len - 1] == '\n')
|
||||
len--;
|
||||
if (!strncasecmp(value, "to: ", 4)) {
|
||||
ALLOC_GROW(extra_to, extra_to_nr + 1, extra_to_alloc);
|
||||
|
||||
@@ -107,7 +107,7 @@ static void handle_from(const struct strbuf *from)
|
||||
el = strcspn(at, " \n\t\r\v\f>");
|
||||
strbuf_reset(&email);
|
||||
strbuf_add(&email, at, el);
|
||||
strbuf_remove(&f, at - f.buf, el + 1);
|
||||
strbuf_remove(&f, at - f.buf, el + (at[el] ? 1 : 0));
|
||||
|
||||
/* The remainder is name. It could be "John Doe <john.doe@xz>"
|
||||
* or "john.doe@xz (John Doe)", but we have removed the
|
||||
@@ -175,7 +175,7 @@ static void handle_content_type(struct strbuf *line)
|
||||
message_type = TYPE_OTHER;
|
||||
if (slurp_attr(line->buf, "boundary=", boundary)) {
|
||||
strbuf_insert(boundary, 0, "--", 2);
|
||||
if (content_top++ >= &content[MAX_BOUNDARIES]) {
|
||||
if (++content_top > &content[MAX_BOUNDARIES]) {
|
||||
fprintf(stderr, "Too many boundaries to handle\n");
|
||||
exit(1);
|
||||
}
|
||||
@@ -603,7 +603,7 @@ static void handle_filter(struct strbuf *line);
|
||||
static int find_boundary(void)
|
||||
{
|
||||
while (!strbuf_getline(&line, fin, '\n')) {
|
||||
if (is_multipart_boundary(&line))
|
||||
if (*content_top && is_multipart_boundary(&line))
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
@@ -626,7 +626,7 @@ again:
|
||||
/* technically won't happen as is_multipart_boundary()
|
||||
will fail first. But just in case..
|
||||
*/
|
||||
if (content_top-- < content) {
|
||||
if (--content_top < content) {
|
||||
fprintf(stderr, "Detected mismatched boundaries, "
|
||||
"can't recover\n");
|
||||
exit(1);
|
||||
|
||||
@@ -564,8 +564,7 @@ static int checkout_fast_forward(unsigned char *head, unsigned char *remote)
|
||||
struct dir_struct dir;
|
||||
struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
|
||||
|
||||
if (read_cache_unmerged())
|
||||
die("you need to resolve your current index first");
|
||||
refresh_cache(REFRESH_QUIET);
|
||||
|
||||
fd = hold_locked_index(lock_file, 1);
|
||||
|
||||
@@ -650,13 +649,15 @@ static void add_strategies(const char *string, unsigned attr)
|
||||
static int merge_trivial(void)
|
||||
{
|
||||
unsigned char result_tree[20], result_commit[20];
|
||||
struct commit_list parent;
|
||||
struct commit_list *parent = xmalloc(sizeof(struct commit_list *));
|
||||
|
||||
write_tree_trivial(result_tree);
|
||||
printf("Wonderful.\n");
|
||||
parent.item = remoteheads->item;
|
||||
parent.next = NULL;
|
||||
commit_tree(merge_msg.buf, result_tree, &parent, result_commit);
|
||||
parent->item = lookup_commit(head);
|
||||
parent->next = xmalloc(sizeof(struct commit_list *));
|
||||
parent->next->item = remoteheads->item;
|
||||
parent->next->next = NULL;
|
||||
commit_tree(merge_msg.buf, result_tree, parent, result_commit);
|
||||
finish(result_commit, "In-index merge");
|
||||
drop_save();
|
||||
return 0;
|
||||
@@ -742,6 +743,7 @@ static int evaluate_result(void)
|
||||
int cnt = 0;
|
||||
struct rev_info rev;
|
||||
|
||||
discard_cache();
|
||||
if (read_cache() < 0)
|
||||
die("failed to read the cache");
|
||||
|
||||
@@ -775,7 +777,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
|
||||
struct commit_list **remotes = &remoteheads;
|
||||
|
||||
setup_work_tree();
|
||||
if (unmerged_cache())
|
||||
if (read_cache_unmerged())
|
||||
die("You are in the middle of a conflicted merge.");
|
||||
|
||||
/*
|
||||
@@ -936,7 +938,6 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
|
||||
hex,
|
||||
find_unique_abbrev(remoteheads->item->object.sha1,
|
||||
DEFAULT_ABBREV));
|
||||
refresh_cache(REFRESH_QUIET);
|
||||
strbuf_init(&msg, 0);
|
||||
strbuf_addstr(&msg, "Fast forward");
|
||||
if (have_message)
|
||||
@@ -1073,6 +1074,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
|
||||
}
|
||||
|
||||
/* Automerge succeeded. */
|
||||
discard_cache();
|
||||
write_tree_trivial(result_tree);
|
||||
automerge_was_ok = 1;
|
||||
break;
|
||||
|
||||
3
cache.h
3
cache.h
@@ -222,7 +222,8 @@ struct index_state {
|
||||
struct cache_tree *cache_tree;
|
||||
time_t timestamp;
|
||||
void *alloc;
|
||||
unsigned name_hash_initialized : 1;
|
||||
unsigned name_hash_initialized : 1,
|
||||
initialized : 1;
|
||||
struct hash_table name_hash;
|
||||
};
|
||||
|
||||
|
||||
@@ -727,6 +727,18 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
|
||||
die("early EOF '%s'", elem->path);
|
||||
|
||||
result[len] = 0;
|
||||
|
||||
/* If not a fake symlink, apply filters, e.g. autocrlf */
|
||||
if (is_file) {
|
||||
struct strbuf buf;
|
||||
|
||||
strbuf_init(&buf, 0);
|
||||
if (convert_to_git(elem->path, result, len, &buf, safe_crlf)) {
|
||||
free(result);
|
||||
result = strbuf_detach(&buf, &len);
|
||||
result_size = len;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
deleted_file:
|
||||
|
||||
@@ -17,6 +17,8 @@ int git_vsnprintf(char *str, size_t maxsize, const char *format, va_list ap)
|
||||
|
||||
if (maxsize > 0) {
|
||||
ret = vsnprintf(str, maxsize-SNPRINTF_SIZE_CORR, format, ap);
|
||||
if (ret == maxsize-1)
|
||||
ret = -1;
|
||||
/* Windows does not NUL-terminate if result fills buffer */
|
||||
str[maxsize-1] = 0;
|
||||
}
|
||||
@@ -34,6 +36,8 @@ int git_vsnprintf(char *str, size_t maxsize, const char *format, va_list ap)
|
||||
break;
|
||||
s = str;
|
||||
ret = vsnprintf(str, maxsize-SNPRINTF_SIZE_CORR, format, ap);
|
||||
if (ret == maxsize-1)
|
||||
ret = -1;
|
||||
}
|
||||
free(s);
|
||||
return ret;
|
||||
|
||||
@@ -271,15 +271,17 @@ __git_merge_strategies ()
|
||||
echo "$__git_merge_strategylist"
|
||||
return
|
||||
fi
|
||||
sed -n "/^all_strategies='/{
|
||||
s/^all_strategies='//
|
||||
s/'//
|
||||
git merge -s help 2>&1 |
|
||||
sed -n -e '/[Aa]vailable strategies are: /,/^$/{
|
||||
s/\.$//
|
||||
s/.*://
|
||||
s/^[ ]*//
|
||||
s/[ ]*$//
|
||||
p
|
||||
q
|
||||
}" "$(git --exec-path)/git-merge"
|
||||
}'
|
||||
}
|
||||
__git_merge_strategylist=
|
||||
__git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
|
||||
__git_merge_strategylist=$(__git_merge_strategies 2>/dev/null)
|
||||
|
||||
__git_complete_file ()
|
||||
{
|
||||
@@ -769,7 +771,7 @@ _git_diff ()
|
||||
__gitcomp "--cached --stat --numstat --shortstat --summary
|
||||
--patch-with-stat --name-only --name-status --color
|
||||
--no-color --color-words --no-renames --check
|
||||
--full-index --binary --abbrev --diff-filter
|
||||
--full-index --binary --abbrev --diff-filter=
|
||||
--find-copies-harder --pickaxe-all --pickaxe-regex
|
||||
--text --ignore-space-at-eol --ignore-space-change
|
||||
--ignore-all-space --exit-code --quiet --ext-diff
|
||||
|
||||
@@ -76,7 +76,7 @@ def write_pipe(c, str):
|
||||
|
||||
def p4_write_pipe(c, str):
|
||||
real_cmd = p4_build_cmd(c)
|
||||
return write_pipe(c, str)
|
||||
return write_pipe(real_cmd, str)
|
||||
|
||||
def read_pipe(c, ignore_error=False):
|
||||
if verbose:
|
||||
|
||||
@@ -3,14 +3,16 @@ git-p4 - Perforce <-> Git converter using git-fast-import
|
||||
Usage
|
||||
=====
|
||||
|
||||
git-p4 supports two main modes: Importing from Perforce to a Git repository is
|
||||
done using "git-p4 sync" or "git-p4 rebase". Submitting changes from Git back
|
||||
to Perforce is done using "git-p4 submit".
|
||||
git-p4 can be used in two different ways:
|
||||
|
||||
1) To import changes from Perforce to a Git repository, using "git-p4 sync".
|
||||
|
||||
2) To submit changes from Git back to Perforce, using "git-p4 submit".
|
||||
|
||||
Importing
|
||||
=========
|
||||
|
||||
You can simply start with
|
||||
Simply start with
|
||||
|
||||
git-p4 clone //depot/path/project
|
||||
|
||||
@@ -18,11 +20,18 @@ or
|
||||
|
||||
git-p4 clone //depot/path/project myproject
|
||||
|
||||
This will create an empty git repository in a subdirectory called "project" (or
|
||||
"myproject" with the second command), import the head revision from the
|
||||
specified perforce path into a git "p4" branch (remotes/p4 actually), create a
|
||||
master branch off it and check it out. If you want the entire history (not just
|
||||
the head revision) then you can simply append a "@all" to the depot path:
|
||||
This will:
|
||||
|
||||
1) Create an empty git repository in a subdirectory called "project" (or
|
||||
"myproject" with the second command)
|
||||
|
||||
2) Import the head revision from the given Perforce path into a git branch
|
||||
called "p4" (remotes/p4 actually)
|
||||
|
||||
3) Create a master branch based on it and check it out.
|
||||
|
||||
If you want the entire history (not just the head revision) then you can simply
|
||||
append a "@all" to the depot path:
|
||||
|
||||
git-p4 clone //depot/project/main@all myproject
|
||||
|
||||
@@ -37,31 +46,40 @@ If you want more control you can also use the git-p4 sync command directly:
|
||||
|
||||
This will import the current head revision of the specified depot path into a
|
||||
"remotes/p4/master" branch of your git repository. You can use the
|
||||
--branch=mybranch option to use a different branch.
|
||||
--branch=mybranch option to import into a different branch.
|
||||
|
||||
If you want to import the entire history of a given depot path just use
|
||||
If you want to import the entire history of a given depot path simply use:
|
||||
|
||||
git-p4 sync //path/in/depot@all
|
||||
|
||||
|
||||
Note:
|
||||
|
||||
To achieve optimal compression you may want to run 'git repack -a -d -f' after
|
||||
a big import. This may take a while.
|
||||
|
||||
Support for Perforce integrations is still work in progress. Don't bother
|
||||
trying it unless you want to hack on it :)
|
||||
|
||||
Incremental Imports
|
||||
===================
|
||||
|
||||
After an initial import you can easily synchronize your git repository with
|
||||
newer changes from the Perforce depot by just calling
|
||||
After an initial import you can continue to synchronize your git repository
|
||||
with newer changes from the Perforce depot by just calling
|
||||
|
||||
git-p4 sync
|
||||
|
||||
in your git repository. By default the "remotes/p4/master" branch is updated.
|
||||
|
||||
It is recommended to run 'git repack -a -d -f' from time to time when using
|
||||
incremental imports to optimally combine the individual git packs that each
|
||||
incremental import creates through the use of git-fast-import.
|
||||
Advanced Setup
|
||||
==============
|
||||
|
||||
Suppose you have a periodically updated git repository somewhere, containing a
|
||||
complete import of a Perforce project. This repository can be cloned and used
|
||||
with git-p4. When updating the cloned repository with the "sync" command,
|
||||
git-p4 will try to fetch changes from the original repository first. The git
|
||||
protocol used with this is usually faster than importing from Perforce
|
||||
directly.
|
||||
|
||||
This behaviour can be disabled by setting the "git-p4.syncFromOrigin" git
|
||||
configuration variable to "false".
|
||||
|
||||
Updating
|
||||
========
|
||||
@@ -79,7 +97,7 @@ Submitting
|
||||
==========
|
||||
|
||||
git-p4 has support for submitting changes from a git repository back to the
|
||||
Perforce depot. This requires a Perforce checkout separate to your git
|
||||
Perforce depot. This requires a Perforce checkout separate from your git
|
||||
repository. To submit all changes that are in the current git branch but not in
|
||||
the "p4" branch (or "origin" if "p4" doesn't exist) simply call
|
||||
|
||||
@@ -97,17 +115,6 @@ continue importing the remaining changes with
|
||||
|
||||
git-p4 submit --continue
|
||||
|
||||
After submitting you should sync your perforce import branch ("p4" or "origin")
|
||||
from Perforce using git-p4's sync command.
|
||||
|
||||
If you have changes in your working directory that you haven't committed into
|
||||
git yet but that you want to commit to Perforce directly ("quick fixes") then
|
||||
you do not have to go through the intermediate step of creating a git commit
|
||||
first but you can just call
|
||||
|
||||
git-p4 submit --direct
|
||||
|
||||
|
||||
Example
|
||||
=======
|
||||
|
||||
|
||||
11
decorate.c
11
decorate.c
@@ -6,13 +6,13 @@
|
||||
#include "object.h"
|
||||
#include "decorate.h"
|
||||
|
||||
static unsigned int hash_obj(struct object *obj, unsigned int n)
|
||||
static unsigned int hash_obj(const struct object *obj, unsigned int n)
|
||||
{
|
||||
unsigned int hash = *(unsigned int *)obj->sha1;
|
||||
return hash % n;
|
||||
}
|
||||
|
||||
static void *insert_decoration(struct decoration *n, struct object *base, void *decoration)
|
||||
static void *insert_decoration(struct decoration *n, const struct object *base, void *decoration)
|
||||
{
|
||||
int size = n->size;
|
||||
struct object_decoration *hash = n->hash;
|
||||
@@ -44,7 +44,7 @@ static void grow_decoration(struct decoration *n)
|
||||
n->nr = 0;
|
||||
|
||||
for (i = 0; i < old_size; i++) {
|
||||
struct object *base = old_hash[i].base;
|
||||
const struct object *base = old_hash[i].base;
|
||||
void *decoration = old_hash[i].decoration;
|
||||
|
||||
if (!base)
|
||||
@@ -55,7 +55,8 @@ static void grow_decoration(struct decoration *n)
|
||||
}
|
||||
|
||||
/* Add a decoration pointer, return any old one */
|
||||
void *add_decoration(struct decoration *n, struct object *obj, void *decoration)
|
||||
void *add_decoration(struct decoration *n, const struct object *obj,
|
||||
void *decoration)
|
||||
{
|
||||
int nr = n->nr + 1;
|
||||
|
||||
@@ -65,7 +66,7 @@ void *add_decoration(struct decoration *n, struct object *obj, void *decoration)
|
||||
}
|
||||
|
||||
/* Lookup a decoration pointer */
|
||||
void *lookup_decoration(struct decoration *n, struct object *obj)
|
||||
void *lookup_decoration(struct decoration *n, const struct object *obj)
|
||||
{
|
||||
int j;
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#define DECORATE_H
|
||||
|
||||
struct object_decoration {
|
||||
struct object *base;
|
||||
const struct object *base;
|
||||
void *decoration;
|
||||
};
|
||||
|
||||
@@ -12,7 +12,7 @@ struct decoration {
|
||||
struct object_decoration *hash;
|
||||
};
|
||||
|
||||
extern void *add_decoration(struct decoration *n, struct object *obj, void *decoration);
|
||||
extern void *lookup_decoration(struct decoration *n, struct object *obj);
|
||||
extern void *add_decoration(struct decoration *n, const struct object *obj, void *decoration);
|
||||
extern void *lookup_decoration(struct decoration *n, const struct object *obj);
|
||||
|
||||
#endif
|
||||
|
||||
1
diff.c
1
diff.c
@@ -1627,6 +1627,7 @@ static void builtin_checkdiff(const char *name_a, const char *name_b,
|
||||
xdemitcb_t ecb;
|
||||
|
||||
memset(&xecfg, 0, sizeof(xecfg));
|
||||
xecfg.ctxlen = 1; /* at least one context line */
|
||||
xpp.flags = XDF_NEED_MINIMAL;
|
||||
ecb.outf = xdiff_outf;
|
||||
ecb.priv = &data;
|
||||
|
||||
@@ -421,7 +421,7 @@ sub cmd_dcommit {
|
||||
$head ||= 'HEAD';
|
||||
my @refs;
|
||||
my ($url, $rev, $uuid, $gs) = working_head_info($head, \@refs);
|
||||
$url = $_commit_url if defined $_commit_url;
|
||||
$url = defined $_commit_url ? $_commit_url : $gs->full_url;
|
||||
my $last_rev = $_revision if defined $_revision;
|
||||
if ($url) {
|
||||
print "Committing to $url ...\n";
|
||||
@@ -437,6 +437,8 @@ sub cmd_dcommit {
|
||||
"If these changes depend on each other, re-running ",
|
||||
"without --no-rebase may be required."
|
||||
}
|
||||
my $expect_url = $url;
|
||||
Git::SVN::remove_username($expect_url);
|
||||
while (1) {
|
||||
my $d = shift @$linear_refs or last;
|
||||
unless (defined $last_rev) {
|
||||
@@ -511,9 +513,9 @@ sub cmd_dcommit {
|
||||
$gs->refname,
|
||||
"\nBefore dcommitting";
|
||||
}
|
||||
if ($url_ ne $url) {
|
||||
if ($url_ ne $expect_url) {
|
||||
fatal "URL mismatch after rebase: ",
|
||||
"$url_ != $url";
|
||||
"$url_ != $expect_url";
|
||||
}
|
||||
if ($uuid_ ne $uuid) {
|
||||
fatal "uuid mismatch after rebase: ",
|
||||
|
||||
3
help.c
3
help.c
@@ -555,7 +555,8 @@ static int is_git_command(const char *s)
|
||||
{
|
||||
load_command_list();
|
||||
return is_in_cmdlist(&main_cmds, s) ||
|
||||
is_in_cmdlist(&other_cmds, s);
|
||||
is_in_cmdlist(&other_cmds, s) ||
|
||||
!strcmp(s, "help");
|
||||
}
|
||||
|
||||
static const char *prepend(const char *prefix, const char *cmd)
|
||||
|
||||
@@ -1155,7 +1155,7 @@ int read_index_from(struct index_state *istate, const char *path)
|
||||
size_t mmap_size;
|
||||
|
||||
errno = EBUSY;
|
||||
if (istate->alloc)
|
||||
if (istate->initialized)
|
||||
return istate->cache_nr;
|
||||
|
||||
errno = ENOENT;
|
||||
@@ -1195,6 +1195,7 @@ int read_index_from(struct index_state *istate, const char *path)
|
||||
* index size
|
||||
*/
|
||||
istate->alloc = xmalloc(estimate_cache_size(mmap_size, istate->cache_nr));
|
||||
istate->initialized = 1;
|
||||
|
||||
src_offset = sizeof(*hdr);
|
||||
dst_offset = 0;
|
||||
@@ -1247,6 +1248,7 @@ int discard_index(struct index_state *istate)
|
||||
cache_tree_free(&(istate->cache_tree));
|
||||
free(istate->alloc);
|
||||
istate->alloc = NULL;
|
||||
istate->initialized = 0;
|
||||
|
||||
/* no need to throw away allocated active_cache */
|
||||
return 0;
|
||||
|
||||
3
remote.c
3
remote.c
@@ -579,8 +579,7 @@ int valid_fetch_refspec(const char *fetch_refspec_str)
|
||||
struct refspec *refspec;
|
||||
|
||||
refspec = parse_refspec_internal(1, fetch_refspec, 1, 1);
|
||||
if (refspec)
|
||||
free(refspec);
|
||||
free(refspec);
|
||||
return !!refspec;
|
||||
}
|
||||
|
||||
|
||||
@@ -119,7 +119,7 @@ struct rev_info {
|
||||
void read_revisions_from_stdin(struct rev_info *revs);
|
||||
|
||||
typedef void (*show_early_output_fn_t)(struct rev_info *, struct commit_list *);
|
||||
volatile show_early_output_fn_t show_early_output;
|
||||
extern volatile show_early_output_fn_t show_early_output;
|
||||
|
||||
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);
|
||||
|
||||
@@ -20,6 +20,8 @@ _x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
|
||||
_x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
|
||||
compare_change () {
|
||||
sed >current \
|
||||
-e '1{/^diff --git /d;}' \
|
||||
-e '2{/^index /d;}' \
|
||||
-e '/^--- /d; /^+++ /d; /^@@ /d;' \
|
||||
-e 's/^\(.[0-7][0-7][0-7][0-7][0-7][0-7]\) '"$_x40"' /\1 X /' "$1"
|
||||
test_cmp expected current
|
||||
@@ -81,7 +83,7 @@ test_expect_success \
|
||||
git update-index --add yomin &&
|
||||
git read-tree -m -u $treeH $treeM &&
|
||||
git ls-files --stage >4.out || return 1
|
||||
diff -U0 M.out 4.out >4diff.out
|
||||
git diff -U0 --no-index M.out 4.out >4diff.out
|
||||
compare_change 4diff.out expected &&
|
||||
check_cache_at yomin clean &&
|
||||
sum bozbar frotz nitfol >actual4.sum &&
|
||||
@@ -100,7 +102,7 @@ test_expect_success \
|
||||
echo yomin yomin >yomin &&
|
||||
git read-tree -m -u $treeH $treeM &&
|
||||
git ls-files --stage >5.out || return 1
|
||||
diff -U0 M.out 5.out >5diff.out
|
||||
git diff -U0 --no-index M.out 5.out >5diff.out
|
||||
compare_change 5diff.out expected &&
|
||||
check_cache_at yomin dirty &&
|
||||
sum bozbar frotz nitfol >actual5.sum &&
|
||||
@@ -212,7 +214,7 @@ test_expect_success \
|
||||
git update-index --add nitfol &&
|
||||
git read-tree -m -u $treeH $treeM &&
|
||||
git ls-files --stage >14.out || return 1
|
||||
diff -U0 M.out 14.out >14diff.out
|
||||
git diff -U0 --no-index M.out 14.out >14diff.out
|
||||
compare_change 14diff.out expected &&
|
||||
sum bozbar frotz >actual14.sum &&
|
||||
grep -v nitfol M.sum > expected14.sum &&
|
||||
@@ -233,7 +235,7 @@ test_expect_success \
|
||||
echo nitfol nitfol nitfol >nitfol &&
|
||||
git read-tree -m -u $treeH $treeM &&
|
||||
git ls-files --stage >15.out || return 1
|
||||
diff -U0 M.out 15.out >15diff.out
|
||||
git diff -U0 --no-index M.out 15.out >15diff.out
|
||||
compare_change 15diff.out expected &&
|
||||
check_cache_at nitfol dirty &&
|
||||
sum bozbar frotz >actual15.sum &&
|
||||
|
||||
@@ -269,6 +269,17 @@ test_expect_success 'merge-recursive result' '
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'fail if the index has unresolved entries' '
|
||||
|
||||
rm -fr [abcd] &&
|
||||
git checkout -f "$c1" &&
|
||||
|
||||
test_must_fail git merge "$c5" &&
|
||||
test_must_fail git merge "$c5" 2> out &&
|
||||
grep "You are in the middle of a conflicted merge" out
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'merge-recursive remove conflict' '
|
||||
|
||||
rm -fr [abcd] &&
|
||||
|
||||
@@ -341,4 +341,31 @@ test_expect_success 'checkdiff detects trailing blank lines' '
|
||||
git diff --check | grep "ends with blank"
|
||||
'
|
||||
|
||||
test_expect_success 'checkdiff allows new blank lines' '
|
||||
git checkout x &&
|
||||
mv x y &&
|
||||
(
|
||||
echo "/* This is new */" &&
|
||||
echo "" &&
|
||||
cat y
|
||||
) >x &&
|
||||
git diff --check
|
||||
'
|
||||
|
||||
test_expect_success 'combined diff with autocrlf conversion' '
|
||||
|
||||
git reset --hard &&
|
||||
echo >x hello &&
|
||||
git commit -m "one side" x &&
|
||||
git checkout HEAD^ &&
|
||||
echo >x goodbye &&
|
||||
git commit -m "the other side" x &&
|
||||
git config core.autocrlf true &&
|
||||
test_must_fail git merge master &&
|
||||
|
||||
git diff | sed -e "1,/^@@@/d" >actual &&
|
||||
! grep "^-" actual
|
||||
|
||||
'
|
||||
|
||||
test_done
|
||||
|
||||
@@ -43,4 +43,15 @@ test_expect_success 'Preserve NULs out of MIME encoded message' '
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'mailinfo on from header without name works' '
|
||||
|
||||
mkdir info-from &&
|
||||
git mailsplit -oinfo-from "$TEST_DIRECTORY"/t5100/info-from.in &&
|
||||
test_cmp "$TEST_DIRECTORY"/t5100/info-from.in info-from/0001 &&
|
||||
git mailinfo info-from/msg info-from/patch \
|
||||
<info-from/0001 >info-from/out &&
|
||||
test_cmp "$TEST_DIRECTORY"/t5100/info-from.expect info-from/out
|
||||
|
||||
'
|
||||
|
||||
test_done
|
||||
|
||||
5
t/t5100/info-from.expect
Normal file
5
t/t5100/info-from.expect
Normal file
@@ -0,0 +1,5 @@
|
||||
Author: bare@example.com
|
||||
Email: bare@example.com
|
||||
Subject: testing bare address in from header
|
||||
Date: Sun, 25 May 2008 00:38:18 -0700
|
||||
|
||||
8
t/t5100/info-from.in
Normal file
8
t/t5100/info-from.in
Normal file
@@ -0,0 +1,8 @@
|
||||
From 667d8940e719cddee1cfe237cbbe215e20270b09 Mon Sep 17 00:00:00 2001
|
||||
From: bare@example.com
|
||||
Date: Sun, 25 May 2008 00:38:18 -0700
|
||||
Subject: [PATCH] testing bare address in from header
|
||||
|
||||
commit message
|
||||
---
|
||||
patch
|
||||
@@ -500,3 +500,4 @@ index 3e5fe51..aabfe5c 100644
|
||||
1.6.0.rc2
|
||||
|
||||
--=-=-=--
|
||||
|
||||
|
||||
@@ -262,4 +262,14 @@ for i in "--perl --shell" "-s --python" "--python --tcl" "--tcl --perl"; do
|
||||
"
|
||||
done
|
||||
|
||||
test_expect_success 'an unusual tag with an incomplete line' '
|
||||
|
||||
git tag -m "bogo" bogo &&
|
||||
bogo=$(git cat-file tag bogo) &&
|
||||
bogo=$(printf "%s" "$bogo" | git mktag) &&
|
||||
git tag -f bogo "$bogo" &&
|
||||
git for-each-ref --format "%(body)" refs/tags/bogo
|
||||
|
||||
'
|
||||
|
||||
test_done
|
||||
|
||||
@@ -488,4 +488,23 @@ test_expect_success 'merge c1 with c1 and c2' '
|
||||
|
||||
test_debug 'gitk --all'
|
||||
|
||||
test_expect_success 'merge fast-forward in a dirty tree' '
|
||||
git reset --hard c0 &&
|
||||
mv file file1 &&
|
||||
cat file1 >file &&
|
||||
rm -f file1 &&
|
||||
git merge c2
|
||||
'
|
||||
|
||||
test_debug 'gitk --all'
|
||||
|
||||
test_expect_success 'in-index merge' '
|
||||
git reset --hard c0 &&
|
||||
git merge --no-ff -s resolve c1 > out &&
|
||||
grep "Wonderful." out &&
|
||||
verify_parents $c0 $c1
|
||||
'
|
||||
|
||||
test_debug 'gitk --all'
|
||||
|
||||
test_done
|
||||
|
||||
@@ -36,7 +36,9 @@ test_expect_success 'merge c1 to c2' '
|
||||
git diff --exit-code &&
|
||||
test -f c0.c &&
|
||||
test -f c1.c &&
|
||||
test -f c2.c
|
||||
test -f c2.c &&
|
||||
test 3 = $(git ls-tree -r HEAD | wc -l) &&
|
||||
test 3 = $(git ls-files | wc -l)
|
||||
'
|
||||
|
||||
test_expect_success 'merge c2 to c3 (fails)' '
|
||||
|
||||
@@ -48,4 +48,4 @@ clean:
|
||||
install: all
|
||||
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(template_instdir_SQ)'
|
||||
(cd blt && $(TAR) cf - .) | \
|
||||
(cd '$(DESTDIR_SQ)$(template_instdir_SQ)' && umask 022 && $(TAR) xf -)
|
||||
(cd '$(DESTDIR_SQ)$(template_instdir_SQ)' && umask 022 && $(TAR) xfo -)
|
||||
|
||||
@@ -376,6 +376,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
|
||||
state.refresh_cache = 1;
|
||||
|
||||
memset(&o->result, 0, sizeof(o->result));
|
||||
o->result.initialized = 1;
|
||||
if (o->src_index)
|
||||
o->result.timestamp = o->src_index->timestamp;
|
||||
o->merge_size = len;
|
||||
|
||||
Reference in New Issue
Block a user