Skip to content

Commit

Permalink
Merge branch 'maint'
Browse files Browse the repository at this point in the history
* maint:
  Fix git-svn to handle svn not reporting the md5sum of a file, and test.
  Fix mishandling of $Id$ expanded in the repository copy in convert.c
  More echo "$user_message" fixes.
  Add tests for the last two fixes.
  git-commit: use printf '%s\n' instead of echo on user-supplied strings
  git-am: use printf instead of echo on user-supplied strings
  Documentation: Add definition of "evil merge" to GIT Glossary
  Replace the last 'dircache's by 'index'
  Documentation: Clean up links in GIT Glossary
  • Loading branch information
Junio C Hamano committed May 27, 2007
2 parents ddcf786 + d1c7c27 commit c56ed46
Show file tree
Hide file tree
Showing 11 changed files with 152 additions and 49 deletions.
2 changes: 1 addition & 1 deletion Documentation/git-ls-files.txt
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ which case it outputs:
detailed information on unmerged paths.

For an unmerged path, instead of recording a single mode/SHA1 pair,
the dircache records up to three such pairs; one from tree O in stage
the index records up to three such pairs; one from tree O in stage
1, A in stage 2, and B in stage 3. This information can be used by
the user (or the porcelain) to see what should eventually be recorded at the
path. (see git-read-tree for more information on state)
Expand Down
62 changes: 33 additions & 29 deletions Documentation/glossary.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ GIT Glossary
A bare repository is normally an appropriately
named <<def_directory,directory>> with a `.git` suffix that does not
have a locally checked-out copy of any of the files under
<<def_revision,revision>> control. That is, all of the `git`
revision control. That is, all of the `git`
administrative and control files that would normally be present in the
hidden `.git` sub-directory are directly present in the
`repository.git` directory instead,
Expand All @@ -37,7 +37,7 @@ GIT Glossary
[[def_chain]]chain::
A list of objects, where each <<def_object,object>> in the list contains
a reference to its successor (for example, the successor of a
<<def_commit,commit>> could be one of its parents).
<<def_commit,commit>> could be one of its <<def_parent,parents>>).

[[def_changeset]]changeset::
BitKeeper/cvsps speak for "<<def_commit,commit>>". Since git does not
Expand Down Expand Up @@ -77,10 +77,10 @@ to point at the new commit.

[[def_commit_object]]commit object::
An <<def_object,object>> which contains the information about a
particular <<def_revision,revision>>, such as parents, committer,
particular <<def_revision,revision>>, such as <<def_parent,parents>>, committer,
author, date and the <<def_tree_object,tree object>> which corresponds
to the top <<def_directory,directory>> of the stored
<<def_revision,revision>>.
revision.

[[def_core_git]]core git::
Fundamental data structures and utilities of git. Exposes only limited
Expand All @@ -101,26 +101,30 @@ to point at the new commit.

[[def_detached_HEAD]]detached HEAD::
Normally the <<def_HEAD,HEAD>> stores the name of a
<<def_branch,branch>>. However, git also allows you to check
out an arbitrary commit that isn't necessarily the tip of any
<<def_branch,branch>>. However, git also allows you to <<def_checkout,check out>>
an arbitrary <<def_commit,commit>> that isn't necessarily the tip of any
particular branch. In this case HEAD is said to be "detached".

[[def_dircache]]dircache::
You are *waaaaay* behind.
You are *waaaaay* behind. See <<def_index,index>>.

[[def_directory]]directory::
The list you get with "ls" :-)

[[def_dirty]]dirty::
A <<def_working_tree,working tree>> is said to be "dirty" if
it contains modifications which have not been committed to the current
it contains modifications which have not been <<def_commit,committed>> to the current
<<def_branch,branch>>.

[[def_ent]]ent::
Favorite synonym to "<<def_tree-ish,tree-ish>>" by some total geeks. See
`http://en.wikipedia.org/wiki/Ent_(Middle-earth)` for an in-depth
explanation. Avoid this term, not to confuse people.

[[def_evil_merge]]evil merge::
An evil merge is a <<def_merge,merge>> that introduces changes that
do not appear in any <<def_parent,parent>>.

[[def_fast_forward]]fast forward::
A fast-forward is a special type of <<def_merge,merge>> where you have a
<<def_revision,revision>> and you are "merging" another
Expand Down Expand Up @@ -149,21 +153,21 @@ to point at the new commit.
[[def_grafts]]grafts::
Grafts enables two otherwise different lines of development to be joined
together by recording fake ancestry information for commits. This way
you can make git pretend the set of parents a <<def_commit,commit>> has
you can make git pretend the set of <<def_parent,parents>> a <<def_commit,commit>> has
is different from what was recorded when the commit was
created. Configured via the `.git/info/grafts` file.

[[def_hash]]hash::
In git's context, synonym to <<def_object_name,object name>>.

[[def_head]]head::
A named reference to the <<def_commit,commit>> at the tip of a
A <<def_ref,named reference>> to the <<def_commit,commit>> at the tip of a
<<def_branch,branch>>. Heads are stored in
`$GIT_DIR/refs/heads/`, except when using packed refs. (See
gitlink:git-pack-refs[1].)

[[def_HEAD]]HEAD::
The current branch. In more detail: Your <<def_working_tree,
The current <<def_branch,branch>>. In more detail: Your <<def_working_tree,
working tree>> is normally derived from the state of the tree
referred to by HEAD. HEAD is a reference to one of the
<<def_head,heads>> in your repository, except when using a
Expand All @@ -179,15 +183,15 @@ to point at the new commit.
checking. Typically, the hooks allow for a command to be pre-verified
and potentially aborted, and allow for a post-notification after the
operation is done. The hook scripts are found in the
`$GIT_DIR/hooks/` <<def_directory,directory>>, and are enabled by simply
`$GIT_DIR/hooks/` directory, and are enabled by simply
making them executable.

[[def_index]]index::
A collection of files with stat information, whose contents are stored
as objects. The index is a stored version of your working
<<def_tree,tree>>. Truth be told, it can also contain a second, and even
a third version of a <<def_working_tree,working tree>>, which are used
when merging.
as objects. The index is a stored version of your
<<def_working_tree,working tree>>. Truth be told, it can also contain a second, and even
a third version of a working tree, which are used
when <<def_merge,merging>>.

[[def_index_entry]]index entry::
The information regarding a particular file, stored in the
Expand Down Expand Up @@ -249,16 +253,16 @@ This commit is referred to as a "merge commit", or sometimes just a
describing the type of an <<def_object,object>>.

[[def_octopus]]octopus::
To <<def_merge,merge>> more than two branches. Also denotes an
To <<def_merge,merge>> more than two <<def_branch,branches>>. Also denotes an
intelligent predator.

[[def_origin]]origin::
The default upstream <<def_repository,repository>>. Most projects have
at least one upstream project which they track. By default
'origin' is used for that purpose. New upstream updates
will be fetched into remote tracking branches named
will be fetched into remote <<def_tracking_branch,tracking branches>> named
origin/name-of-upstream-branch, which you can see using
"git <<def_branch,branch>> -r".
"`git branch -r`".

[[def_pack]]pack::
A set of objects which have been compressed into one file (to save space
Expand Down Expand Up @@ -327,7 +331,7 @@ This commit is referred to as a "merge commit", or sometimes just a
`$GIT_DIR/refs/`.

[[def_refspec]]refspec::
A <<def_refspec,refspec>> is used by <<def_fetch,fetch>> and
A "refspec" is used by <<def_fetch,fetch>> and
<<def_push,push>> to describe the mapping between remote
<<def_ref,ref>> and local ref. They are combined with a colon in
the format <src>:<dst>, preceded by an optional plus sign, +.
Expand All @@ -340,11 +344,12 @@ This commit is referred to as a "merge commit", or sometimes just a
gitlink:git-push[1]

[[def_repository]]repository::
A collection of refs together with an
A collection of <<def_ref,refs>> together with an
<<def_object_database,object database>> containing all objects
which are <<def_reachable,reachable>> from the refs, possibly
accompanied by meta data from one or more porcelains. A
repository can share an object database with other repositories.
accompanied by meta data from one or more <<def_porcelain,porcelains>>. A
repository can share an object database with other repositories
via <<def_alternate_object_database,alternates mechanism>>.

[[def_resolve]]resolve::
The action of fixing up manually what a failed automatic
Expand All @@ -366,8 +371,8 @@ This commit is referred to as a "merge commit", or sometimes just a
Synonym for <<def_object_name,object name>>.

[[def_shallow_repository]]shallow repository::
A shallow repository has an incomplete
history some of whose commits have parents cauterized away (in other
A shallow <<def_repository,repository>> has an incomplete
history some of whose <<def_commit,commits>> have <<def_parent,parents>> cauterized away (in other
words, git is told to pretend that these commits do not have the
parents, even though they are recorded in the <<def_commit_object,commit
object>>). This is sometimes useful when you are interested only in the
Expand All @@ -385,7 +390,7 @@ This commit is referred to as a "merge commit", or sometimes just a
command.

[[def_tag]]tag::
A <<def_ref,ref>> pointing to a tag or
A <<def_ref,ref>> pointing to a <<def_tag_object,tag>> or
<<def_commit_object,commit object>>. In contrast to a <<def_head,head>>,
a tag is not changed by a <<def_commit,commit>>. Tags (not
<<def_tag_object,tag objects>>) are stored in `$GIT_DIR/refs/tags/`. A
Expand All @@ -398,8 +403,7 @@ This commit is referred to as a "merge commit", or sometimes just a
An <<def_object,object>> containing a <<def_ref,ref>> pointing to
another object, which can contain a message just like a
<<def_commit_object,commit object>>. It can also contain a (PGP)
signature, in which case it is called a "signed <<def_tag_object,tag
object>>".
signature, in which case it is called a "signed tag object".

[[def_topic_branch]]topic branch::
A regular git <<def_branch,branch>> that is used by a developer to
Expand All @@ -418,7 +422,7 @@ This commit is referred to as a "merge commit", or sometimes just a

[[def_tree]]tree::
Either a <<def_working_tree,working tree>>, or a <<def_tree_object,tree
object>> together with the dependent blob and tree objects
object>> together with the dependent <<def_blob_object,blob>> and tree objects
(i.e. a stored representation of a working tree).

[[def_tree_object]]tree object::
Expand Down
39 changes: 37 additions & 2 deletions convert.c
Original file line number Diff line number Diff line change
Expand Up @@ -509,36 +509,71 @@ static char *ident_to_worktree(const char *path, const char *src, unsigned long

for (dst = buf; size; size--) {
const char *cp;
/* Fetch next source character, move the pointer on */
char ch = *src++;
/* Copy the current character to the destination */
*dst++ = ch;
/* If the current character is "$" or there are less than three
* remaining bytes or the two bytes following this one are not
* "Id", then simply read the next character */
if ((ch != '$') || (size < 3) || memcmp("Id", src, 2))
continue;
/*
* Here when
* - There are more than 2 bytes remaining
* - The current three bytes are "$Id"
* with
* - ch == "$"
* - src[0] == "I"
*/

/*
* It's possible that an expanded Id has crept its way into the
* repository, we cope with that by stripping the expansion out
*/
if (src[2] == ':') {
/* Expanded keywords have "$Id:" at the front */

/* discard up to but not including the closing $ */
unsigned long rem = size - 3;
/* Point at first byte after the ":" */
cp = src + 3;
/*
* Throw away characters until either
* - we reach a "$"
* - we run out of bytes (rem == 0)
*/
do {
ch = *cp++;
ch = *cp;
if (ch == '$')
break;
cp++;
rem--;
} while (rem);
/* If the above finished because it ran out of characters, then
* this is an incomplete keyword, so don't run the expansion */
if (!rem)
continue;
size -= (cp - src);
} else if (src[2] == '$')
cp = src + 2;
else
/* Anything other than "$Id:XXX$" or $Id$ and we skip the
* expansion */
continue;

/* cp is now pointing at the last $ of the keyword */

memcpy(dst, "Id: ", 4);
dst += 4;
memcpy(dst, sha1_to_hex(sha1), 40);
dst += 40;
*dst++ = ' ';

/* Adjust for the characters we've discarded */
size -= (cp - src);
src = cp;

/* Copy the final "$" */
*dst++ = *src++;
size--;
}
Expand Down
2 changes: 1 addition & 1 deletion diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -1349,7 +1349,7 @@ void fill_filespec(struct diff_filespec *spec, const unsigned char *sha1,
}

/*
* Given a name and sha1 pair, if the dircache tells us the file in
* Given a name and sha1 pair, if the index tells us the file in
* the work tree has that object contents, return true, so that
* prepare_temp_file() does not have to inflate and extract.
*/
Expand Down
8 changes: 4 additions & 4 deletions git-am.sh
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ stop_here () {

stop_here_user_resolve () {
if [ -n "$resolvemsg" ]; then
echo "$resolvemsg"
printf '%s\n' "$resolvemsg"
stop_here $1
fi
cmdline=$(basename $0)
Expand Down Expand Up @@ -146,7 +146,7 @@ do
git_apply_opt="$git_apply_opt $1"; shift ;;

--resolvemsg=*)
resolvemsg=$(echo "$1" | sed -e "s/^--resolvemsg=//"); shift ;;
resolvemsg=${1#--resolvemsg=}; shift ;;

--)
shift; break ;;
Expand Down Expand Up @@ -331,7 +331,7 @@ do
ADD_SIGNOFF=
fi
{
echo "$SUBJECT"
printf '%s\n' "$SUBJECT"
if test -s "$dotest/msg-clean"
then
echo
Expand Down Expand Up @@ -394,7 +394,7 @@ do
fi

echo
echo "Applying '$SUBJECT'"
printf 'Applying %s\n' "$SUBJECT"
echo

case "$resolved" in
Expand Down
8 changes: 4 additions & 4 deletions git-commit.sh
Original file line number Diff line number Diff line change
Expand Up @@ -376,12 +376,12 @@ t,)
rm -f "$TMP_INDEX"
fi || exit

echo "$commit_only" |
printf '%s\n' "$commit_only" |
GIT_INDEX_FILE="$TMP_INDEX" \
git-update-index --add --remove --stdin &&

save_index &&
echo "$commit_only" |
printf '%s\n' "$commit_only" |
(
GIT_INDEX_FILE="$NEXT_INDEX"
export GIT_INDEX_FILE
Expand Down Expand Up @@ -432,7 +432,7 @@ fi

if test "$log_message" != ''
then
echo "$log_message"
printf '%s\n' "$log_message"
elif test "$logfile" != ""
then
if test "$logfile" = -
Expand Down Expand Up @@ -475,7 +475,7 @@ if test -f "$GIT_DIR/MERGE_HEAD" && test -z "$no_edit"; then
echo "#"
echo "# It looks like you may be committing a MERGE."
echo "# If this is not correct, please remove the file"
echo "# $GIT_DIR/MERGE_HEAD"
printf '%s\n' "# $GIT_DIR/MERGE_HEAD"
echo "# and try again"
echo "#"
fi >>"$GIT_DIR"/COMMIT_EDITMSG
Expand Down
6 changes: 3 additions & 3 deletions git-merge.sh
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,7 @@ f,*)
then
echo "Wonderful."
result_commit=$(
echo "$merge_msg" |
printf '%s\n' "$merge_msg" |
git-commit-tree $result_tree -p HEAD -p "$1"
) || exit
finish "$result_commit" "In-index merge"
Expand Down Expand Up @@ -434,7 +434,7 @@ done
if test '' != "$result_tree"
then
parents=$(git-show-branch --independent "$head" "$@" | sed -e 's/^/-p /')
result_commit=$(echo "$merge_msg" | git-commit-tree $result_tree $parents) || exit
result_commit=$(printf '%s\n' "$merge_msg" | git-commit-tree $result_tree $parents) || exit
finish "$result_commit" "Merge made by $wt_strategy."
dropsave
exit 0
Expand Down Expand Up @@ -473,7 +473,7 @@ else
do
echo $remote
done >"$GIT_DIR/MERGE_HEAD"
echo "$merge_msg" >"$GIT_DIR/MERGE_MSG"
printf '%s\n' "$merge_msg" >"$GIT_DIR/MERGE_MSG"
fi

if test "$merge_was_ok" = t
Expand Down
2 changes: 1 addition & 1 deletion git-svn.perl
Original file line number Diff line number Diff line change
Expand Up @@ -2477,7 +2477,7 @@ sub close_file {
$md5->addfile($fh);
my $got = $md5->hexdigest;
die "Checksum mismatch: $path\n",
"expected: $exp\n got: $got\n" if ($got ne $exp);
"expected: $exp\n got: $got\n" if (defined $exp && $got ne $exp);
sysseek($fh, 0, 0) or croak $!;
if ($fb->{mode_b} == 120000) {
sysread($fh, my $buf, 5) == 5 or croak $!;
Expand Down
Loading

0 comments on commit c56ed46

Please sign in to comment.