Code

git.git
14 years agoutf8.c: remove print_wrapped_text()
René Scharfe [Fri, 19 Feb 2010 22:15:01 +0000 (23:15 +0100)]
utf8.c: remove print_wrapped_text()

strbuf_add_wrapped_text() is called only from print_wrapped_text()
without a strbuf (in which case it writes its results to stdout).

At its only callsite, supply a strbuf, call strbuf_add_wrapped_text()
directly and remove the wrapper function.

Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agogit-p4: fix bug in symlink handling
Evan Powers [Tue, 16 Feb 2010 08:44:08 +0000 (00:44 -0800)]
git-p4: fix bug in symlink handling

Fix inadvertent breakage from b932705 (git-p4: stream from perforce to
speed up clones, 2009-07-30) in the code that strips the trailing '\n'
from p4 print on a symlink. (In practice, contents is of the form
['target\n', ''].)

Signed-off-by: Evan Powers <evan.powers@gmail.com>
Acked-by: Pete Wyckoff <pw@padd.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agot1450: fix testcases that were wrongly expecting failure
Thomas Rast [Sat, 20 Feb 2010 00:18:44 +0000 (01:18 +0100)]
t1450: fix testcases that were wrongly expecting failure

Almost exactly a year ago in 02a6552 (Test fsck a bit harder), I
introduced two testcases that were expecting failure.

However, the only bug was that the testcases wrote *blobs* because I
forgot to pass -t tag to hash-object.  Fix this, and then adjust the
rest of the test to properly check the result.

Signed-off-by: Thomas Rast <trast@student.ethz.ch>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agomailinfo: do not strip leading spaces even for a header line
Junio C Hamano [Sat, 20 Feb 2010 05:55:33 +0000 (21:55 -0800)]
mailinfo: do not strip leading spaces even for a header line

Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoDocumentation: Fix indentation problem in git-commit(1)
Jacob Helwig [Mon, 15 Feb 2010 12:33:06 +0000 (04:33 -0800)]
Documentation: Fix indentation problem in git-commit(1)

Ever since the "See linkgit:git-config[1]..." paragraph was added to the
description for --untracked-files (d6293d1), the paragraphs for the
following options were indented at the same level as the "See
linkgit:git-config[1]" paragraph.  This problem showed up in the
manpages, but not in the HTML documentation.

While this does fix the alignment of the options following
--untracked-files in the manpage, the "See linkgit..." portion of the
description does not retain its previous indentation level in the
manpages, or HTML documentation.

Signed-off-by: Jacob Helwig <jacob.helwig@gmail.com>
Acked-by: Thomas Rast <trast@student.ethz.ch>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoMerge branch 'maint'
Junio C Hamano [Fri, 19 Feb 2010 09:31:42 +0000 (01:31 -0800)]
Merge branch 'maint'

* maint:
  rm: fix bug in recursive subdirectory removal
  Documentation: describe --thin more accurately

14 years agoMerge branch 'jk/maint-rmdir-fix' into maint
Junio C Hamano [Fri, 19 Feb 2010 09:31:37 +0000 (01:31 -0800)]
Merge branch 'jk/maint-rmdir-fix' into maint

* jk/maint-rmdir-fix:
  rm: fix bug in recursive subdirectory removal

14 years agorm: fix bug in recursive subdirectory removal
Jeff King [Fri, 19 Feb 2010 05:57:21 +0000 (00:57 -0500)]
rm: fix bug in recursive subdirectory removal

If we remove a path in a/deep/subdirectory, we should try to
remove as many trailing components as possible (i.e.,
subdirectory, then deep, then a). However, the test for the
return value of rmdir was reversed, so we only ever deleted
at most one level.

The fix is in remove_path, so "apply" and "merge-recursive"
also are fixed.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoAdd an optional argument for --color options
Mark Lodato [Wed, 17 Feb 2010 04:55:58 +0000 (23:55 -0500)]
Add an optional argument for --color options

Make git-branch, git-show-branch, git-grep, and all the diff-based
programs accept an optional argument <when> for --color.  The argument
is a colorbool: "always", "never", or "auto".  If no argument is given,
"always" is used;  --no-color is an alias for --color=never.  This makes
the command-line interface consistent with other GNU tools, such as `ls'
and `grep', and with the git-config color options.  Note that, without
an argument, --color and --no-color work exactly as before.

To implement this, two internal changes were made:

1. Allow the first argument of git_config_colorbool() to be NULL,
   in which case it returns -1 if the argument isn't "always", "never",
   or "auto".

2. Add OPT_COLOR_FLAG(), OPT__COLOR(), and parse_opt_color_flag_cb()
   to the option parsing library.  The callback uses
   git_config_colorbool(), so color.h is now a dependency
   of parse-options.c.

Signed-off-by: Mark Lodato <lodatom@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoDocumentation: describe --thin more accurately
Stephen Boyd [Thu, 18 Feb 2010 09:10:28 +0000 (01:10 -0800)]
Documentation: describe --thin more accurately

The description for --thin was misleading and downright wrong. Correct
it with some inspiration from the description of index-pack's --fix-thin
and some background information from Nicolas Pitre <nico@fluxnic.net>.

Signed-off-by: Stephen Boyd <bebarino@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoMerge branch 'maint'
Junio C Hamano [Thu, 18 Feb 2010 07:03:46 +0000 (23:03 -0800)]
Merge branch 'maint'

* maint:
  docs: don't talk about $GIT_DIR/refs/ everywhere

14 years agodocs: don't talk about $GIT_DIR/refs/ everywhere
Jeff King [Thu, 18 Feb 2010 01:16:20 +0000 (20:16 -0500)]
docs: don't talk about $GIT_DIR/refs/ everywhere

It is misleading to say that we pull refs from $GIT_DIR/refs/*, because we
may also consult the packed refs mechanism. These days we tend to treat
the "refs hierarchy" as more of an abstract namespace that happens to be
represented as $GIT_DIR/refs. At best, this is a minor inaccuracy, but at
worst it can confuse users who then look in $GIT_DIR/refs and find that it
is missing some of the refs they expected to see.

This patch drops most uses of "$GIT_DIR/refs/*", changing them into just
"refs/*", under the assumption that users can handle the concept of an
abstract refs namespace. There are a few things to note:

  - most cases just dropped the $GIT_DIR/ portion. But for cases where
    that left _just_ the word "refs", I changed it to "refs/" to help
    indicate that it was a hierarchy.  I didn't do the same for longer
    paths (e.g., "refs/heads" remained, instead of becoming
    "refs/heads/").

  - in some cases, no change was made, as the text was explicitly about
    unpacked refs (e.g., the discussion in git-pack-refs).

  - In some cases it made sense instead to note the existence of packed
    refs (e.g., in check-ref-format and rev-parse).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agorefactor duplicated encode_header in pack-objects and fast-import
Michael Lukashov [Tue, 16 Feb 2010 23:42:54 +0000 (23:42 +0000)]
refactor duplicated encode_header in pack-objects and fast-import

The following function is duplicated:

  encode_header

Move this function to sha1_file.c and rename it 'encode_in_pack_object_header',
as suggested by Junio C Hamano

Signed-off-by: Michael Lukashov <michael.lukashov@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoMerge branch 'np/fast-import-idx-v2'
Junio C Hamano [Wed, 17 Feb 2010 23:28:25 +0000 (15:28 -0800)]
Merge branch 'np/fast-import-idx-v2'

* np/fast-import-idx-v2:
  fast-import: use the diff_delta() max_delta_size argument
  fast-import: honor pack.indexversion and pack.packsizelimit config vars
  fast-import: make default pack size unlimited
  fast-import: use write_idx_file() instead of custom code
  fast-import: use sha1write() for pack data
  fast-import: start using struct pack_idx_entry

Acked-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agorefactor duplicated fill_mm() in checkout and merge-recursive
Michael Lukashov [Tue, 16 Feb 2010 23:42:55 +0000 (23:42 +0000)]
refactor duplicated fill_mm() in checkout and merge-recursive

The following function is duplicated:

  fill_mm

Move it to xdiff-interface.c and rename it 'read_mmblob', as suggested
by Junio C Hamano.

Also, change parameters order for consistency with read_mmfile().

Signed-off-by: Michael Lukashov <michael.lukashov@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agorefactor duplicated code in builtin-send-pack.c and transport.c
Michael Lukashov [Tue, 16 Feb 2010 23:42:52 +0000 (23:42 +0000)]
refactor duplicated code in builtin-send-pack.c and transport.c

The following functions are (almost) identical:

  verify_remote_names
  update_tracking_ref
  refs_pushed
  print_push_status

Move common versions of these functions to transport.c and rename
them, as suggested by Jeff King and Junio C Hamano.

These functions have been removed entirely from builtin-send-pack.c,
since they are only used internally by print_push_status():

  print_ref_status
  status_abbrev
  print_ok_ref_status
  print_one_push_status

Also, move #define SUMMARY_WIDTH to transport.h and rename it
TRANSPORT_SUMMARY_WIDTH as it is used in builtin-fetch.c and
transport.c

Signed-off-by: Michael Lukashov <michael.lukashov@gmail.com>
Acked-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoconnect.c: move duplicated code to a new function 'get_host_and_port'
Michael Lukashov [Wed, 17 Feb 2010 20:56:02 +0000 (20:56 +0000)]
connect.c: move duplicated code to a new function 'get_host_and_port'

The following functions:

  git_tcp_connect_sock (IPV6 version)
  git_tcp_connect_sock (no IPV6 version),
  git_proxy_connect

have common block of code. Move it to a new function 'get_host_and_port'

Signed-off-by: Michael Lukashov <michael.lukashov@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoUpdate draft release notes to 1.7.1
Junio C Hamano [Wed, 17 Feb 2010 23:01:11 +0000 (15:01 -0800)]
Update draft release notes to 1.7.1

Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoMerge branch 'maint'
Junio C Hamano [Wed, 17 Feb 2010 23:00:10 +0000 (15:00 -0800)]
Merge branch 'maint'

* maint:
  Update 1.7.0.1 release notes

14 years agoUpdate 1.7.0.1 release notes
Junio C Hamano [Wed, 17 Feb 2010 23:00:00 +0000 (15:00 -0800)]
Update 1.7.0.1 release notes

Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoMerge branch 'jk/cherry-pick-reword' into maint
Junio C Hamano [Wed, 17 Feb 2010 22:55:24 +0000 (14:55 -0800)]
Merge branch 'jk/cherry-pick-reword' into maint

* jk/cherry-pick-reword:
  cherry-pick: prettify the advice message
  cherry-pick: show commit name instead of sha1
  cherry-pick: format help message as strbuf
  cherry-pick: refactor commit parsing code
  cherry-pick: rewrap advice message

14 years agoMerge branch 'jk/grep-double-dash' into maint
Junio C Hamano [Wed, 17 Feb 2010 22:55:15 +0000 (14:55 -0800)]
Merge branch 'jk/grep-double-dash' into maint

* jk/grep-double-dash:
  accept "git grep -- pattern"

14 years agoMerge branch 'jc/typo' into maint
Junio C Hamano [Wed, 17 Feb 2010 22:55:09 +0000 (14:55 -0800)]
Merge branch 'jc/typo' into maint

* jc/typo:
  Typofixes outside documentation area

14 years agostatus: preload index to optimize lstat(2) calls
Junio C Hamano [Wed, 17 Feb 2010 20:30:41 +0000 (12:30 -0800)]
status: preload index to optimize lstat(2) calls

Noticed by James Pickens

Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoAdd a "TEMPLATE DIRECTORY" section to git-init[1].
Steven Drake [Tue, 16 Feb 2010 23:44:46 +0000 (12:44 +1300)]
Add a "TEMPLATE DIRECTORY" section to git-init[1].

Create a more inoformative section to describe template directory and
refer to it in config.txt and with the '--template' option of git-init
and git-clone commands.

Signed-off-by: Steven Drake <sdrake@xnet.co.nz>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoAdd `init.templatedir` configuration variable.
Steven Drake [Tue, 16 Feb 2010 23:42:31 +0000 (12:42 +1300)]
Add `init.templatedir` configuration variable.

Rather than having to pass --template to git init and clone for a custom
setup, `init.templatedir` may be set in '~/.gitconfig'.  The environment
variable GIT_TEMPLATE_DIR can already be used for this but this is nicer.

System administrators may prefer using this variable in the system-wide
config file to point at a locally modified copy (e.g. /etc/gittemplate)
rather than editing vanilla template files in '/usr/share'.

Signed-off-by: Steven Drake <sdrake@xnet.co.nz>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agogitweb: Protect escaping functions against calling on undef
Jakub Narebski [Sun, 7 Feb 2010 20:52:25 +0000 (21:52 +0100)]
gitweb: Protect escaping functions against calling on undef

This is a bit of future-proofing esc_html and friends: when called
with undefined value they would now would return undef... which would
probably mean that error would still occur, but closer to the source
of problem.

This means that we can safely use
  esc_html(shift) || "Internal Server Error"
in die_error() instead of
  esc_html(shift || "Internal Server Error")

Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agogitweb: esc_html (short) error message in die_error
Jakub Narebski [Sun, 7 Feb 2010 20:51:18 +0000 (21:51 +0100)]
gitweb: esc_html (short) error message in die_error

The error message (second argument to die_error) is meant to be short,
one-line text description of given error.  A few callers call
die_error with error message containing unescaped user supplied data
($hash, $file_name).  Instead of forcing callers to escape data,
simply call esc_html on the parameter.

Note that optional third parameter, which contains detailed error
description, is meant to be HTML formatted, and therefore should be
not escaped.

While at it update esc_html synopsis/usage, and bring default error
description to read 'Internal Server Error' (titlecased).

Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agosubmodule summary: Don't barf when invoked in an empty repo
Johan Herland [Tue, 16 Feb 2010 10:21:14 +0000 (11:21 +0100)]
submodule summary: Don't barf when invoked in an empty repo

When invoking "git submodule summary" in an empty repo (which can be
indirectly done by setting status.submodulesummary = true), it currently
emits an error message (via "git diff-index") since HEAD points to an
unborn branch.

This patch adds handling of the HEAD-points-to-unborn-branch special case,
so that "git submodule summary" no longer emits this error message.

The patch also adds a test case that verifies the fix.

Suggested-by: Jeff King <peff@peff.net>
Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agofast-import: use the diff_delta() max_delta_size argument
Nicolas Pitre [Wed, 17 Feb 2010 19:05:56 +0000 (14:05 -0500)]
fast-import: use the diff_delta() max_delta_size argument

This let diff_delta() abort early if it is going to bust the given
size limit.  Also, only objects larger than 20 bytes are considered
as objects smaller than that are most certainly going to produce
larger deltas than the original object due to the additional headers.

Signed-off-by: Nicolas Pitre <nico@fluxnic.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agofast-import: honor pack.indexversion and pack.packsizelimit config vars
Nicolas Pitre [Wed, 17 Feb 2010 19:05:55 +0000 (14:05 -0500)]
fast-import: honor pack.indexversion and pack.packsizelimit config vars

Signed-off-by: Nicolas Pitre <nico@fluxnic.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agofast-import: make default pack size unlimited
Nicolas Pitre [Wed, 17 Feb 2010 19:05:54 +0000 (14:05 -0500)]
fast-import: make default pack size unlimited

Now that fast-import is creating packs with index version 2, there is
no point limiting the pack size by default.  A pack split will still
happen if off_t is not sufficiently large to hold large offsets.

While updating the doc, let's remove the "packfiles fit on CDs"
suggestion.  Pack files created by fast-import are still suboptimal and
a 'git repack -a -f -d' or even 'git gc --aggressive' would be a pretty
good idea before considering storage on CDs.

Signed-off-by: Nicolas Pitre <nico@fluxnic.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agofast-import: use write_idx_file() instead of custom code
Nicolas Pitre [Wed, 17 Feb 2010 19:05:53 +0000 (14:05 -0500)]
fast-import: use write_idx_file() instead of custom code

This allows for the creation of pack index version 2 with its object
CRC and the possibility for a pack to be larger than 4 GB.

Signed-off-by: Nicolas Pitre <nico@fluxnic.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agofast-import: use sha1write() for pack data
Nicolas Pitre [Wed, 17 Feb 2010 19:05:52 +0000 (14:05 -0500)]
fast-import: use sha1write() for pack data

This is in preparation for using write_idx_file().  Also, by using
sha1write() we get some buffering to reduces the number of write
syscalls, and the written data is SHA1 summed which allows for the extra
data integrity validation check performed in fixup_pack_header_footer()
(details on this in commit abeb40e5aa).

Signed-off-by: Nicolas Pitre <nico@fluxnic.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agofast-import: start using struct pack_idx_entry
Nicolas Pitre [Wed, 17 Feb 2010 19:05:51 +0000 (14:05 -0500)]
fast-import: start using struct pack_idx_entry

This is in preparation for using write_idx_file().

Signed-off-by: Nicolas Pitre <nico@fluxnic.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agorequire_work_tree broken with NONGIT_OK
Gabriel Filion [Wed, 17 Feb 2010 04:18:50 +0000 (23:18 -0500)]
require_work_tree broken with NONGIT_OK

With NONGIT_OK set, require_work_tree function outside a git repository
gives a syntax error.  This is caused by an incorrect use of "test" that
didn't anticipate $(git rev-parse --is-inside-work-tree) may return an
empty string.

Properly quote the argument to "test", and send the standard error stream
to /dev/null to avoid giving duplicate error messages.

Signed-off-by: Gabriel Filion <lelutin@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoimap-send: support CRAM-MD5 authentication
Hitoshi Mitake [Tue, 16 Feb 2010 06:34:07 +0000 (22:34 -0800)]
imap-send: support CRAM-MD5 authentication

CRAM-MD5 authentication ought to be independent from SSL, but NO_OPENSSL
build will not support this because the base64 and md5 code are used from
the OpenSSL library in this implementation.

Signed-off-by: Hitoshi Mitake <mitake@dcl.info.waseda.ac.jp>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agolog.decorate: usability fixes
Junio C Hamano [Wed, 17 Feb 2010 18:20:49 +0000 (10:20 -0800)]
log.decorate: usability fixes

The configuration is meant to suppliment --decorate command line option
that can be used as a boolean to turn the feature on, so it is natural
to expect

[log]
decorate
decorate = yes

to work.  The original commit would segfault with the first one, and
would not understand the second one.

Once a user has this configuration in ~/.gitconfig, there needs to be a
way to override it from the command line.  Add --no-decorate option to
log family and also allow --decorate=no to mean the same thing.  Since
we allow setting log.decorate to 'true', the command line also should
accept --decorate=yes and behave accordingly.

New tests in t4202 are designed to exercise the interaction between the
configuration variable and the command line option that overrides it.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoAdd `log.decorate' configuration variable.
Steven Drake [Tue, 16 Feb 2010 23:39:52 +0000 (12:39 +1300)]
Add `log.decorate' configuration variable.

This alows the 'git-log --decorate' to be enabled by default so that normal
log outout contains ant ref names of commits that are shown.

Signed-off-by: Steven Drake <sdrake@xnet.co.nz>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agogit_config_maybe_bool()
Junio C Hamano [Wed, 17 Feb 2010 07:59:46 +0000 (23:59 -0800)]
git_config_maybe_bool()

Some configuration variables can take boolean values in addition to
enumeration specific to them.  Introduce git_config_maybe_bool() that
returns 0 or 1 if the given value is boolean, or -1 if not, so that
a parser for such a variable can check for boolean first and then
parse other kinds of values as a fallback.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agogrep documentation: clarify what files match
Mark Lodato [Tue, 16 Feb 2010 00:25:40 +0000 (19:25 -0500)]
grep documentation: clarify what files match

Clarify that git-grep(1) searches only tracked files, and that each
<pathspec> is a pathspec, as in any other ordinary git commands.

Add an example to show a simple use case for searching all .c and .h
files in the current directory and below.

Signed-off-by: Mark Lodato <lodatom@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agotest for add with non-existent pathspec
Chris Packham [Tue, 9 Feb 2010 22:30:48 +0000 (17:30 -0500)]
test for add with non-existent pathspec

Add a test for 'git add -u pathspec' and 'git add pathspec' where
pathspec does not exist. The expected result is that git add exits with
an error message and an appropriate exit code.

Signed-off-by: Chris Packham <judge.packham@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agogit add -u: die on unmatched pathspec
Junio C Hamano [Tue, 9 Feb 2010 22:30:49 +0000 (17:30 -0500)]
git add -u: die on unmatched pathspec

If a pathspec is supplied to 'git add -u' and no path matches
the pattern, fail with an approriate error message and exit code.

Tested-by: Chris Packham <judge.packham@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoMerge branch 'jc/typo'
Junio C Hamano [Wed, 17 Feb 2010 06:45:14 +0000 (22:45 -0800)]
Merge branch 'jc/typo'

* jc/typo:
  Typofixes outside documentation area

14 years agoMerge branch 'maint'
Junio C Hamano [Wed, 17 Feb 2010 06:40:45 +0000 (22:40 -0800)]
Merge branch 'maint'

* maint:
  Prepare 1.7.0.1 release notes
  Fix use of mutex in threaded grep
  dwim_ref: fix dangling symref warning
  stash pop: remove 'apply' options during 'drop' invocation
  diff: make sure --output=/bad/path is caught
  Remove hyphen from "git-command" in two error messages

14 years agoPrepare 1.7.0.1 release notes
Junio C Hamano [Wed, 17 Feb 2010 06:25:03 +0000 (22:25 -0800)]
Prepare 1.7.0.1 release notes

Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoMerge branch 'jc/maint-grep-one-thread-mutex-fix' into maint
Junio C Hamano [Wed, 17 Feb 2010 06:23:25 +0000 (22:23 -0800)]
Merge branch 'jc/maint-grep-one-thread-mutex-fix' into maint

* jc/maint-grep-one-thread-mutex-fix:
  Fix use of mutex in threaded grep

14 years agoFix use of mutex in threaded grep
Junio C Hamano [Tue, 16 Feb 2010 02:34:28 +0000 (18:34 -0800)]
Fix use of mutex in threaded grep

The program can decide at runtime not to use threading even if the support
is compiled in.  In such a case, mutexes are not necessary and left
uninitialized.  But the code incorrectly tried to take and release the
read_sha1_mutex unconditionally.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Acked-by: Fredrik Kuivinen <frekui@gmail.com>
14 years agoMerge branch 'maint-1.6.6' into maint
Junio C Hamano [Tue, 16 Feb 2010 23:05:02 +0000 (15:05 -0800)]
Merge branch 'maint-1.6.6' into maint

* maint-1.6.6:
  dwim_ref: fix dangling symref warning
  stash pop: remove 'apply' options during 'drop' invocation
  diff: make sure --output=/bad/path is caught
  Remove hyphen from "git-command" in two error messages

14 years agoMerge branch 'maint-1.6.5' into maint-1.6.6
Junio C Hamano [Tue, 16 Feb 2010 23:04:55 +0000 (15:04 -0800)]
Merge branch 'maint-1.6.5' into maint-1.6.6

* maint-1.6.5:
  dwim_ref: fix dangling symref warning
  stash pop: remove 'apply' options during 'drop' invocation
  diff: make sure --output=/bad/path is caught

14 years agotransport: add got_remote_refs flag
Tay Ray Chuan [Tue, 16 Feb 2010 07:18:21 +0000 (15:18 +0800)]
transport: add got_remote_refs flag

transport_get_remote_refs() in tranport.c checks transport->remote_refs
to determine whether transport->get_refs_list() should be invoked.  The
logic is "if it is NULL, we haven't run ls-remote to find out yet".

However, transport->remote_refs could still be NULL while cloning from
an empty repository.  This causes get_refs_list() to be run unnecessarily.

Introduce a flag, transport->got_remote_refs, to more explicitly record
if we have run transport->get_refs_list() already.

Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Acked-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agodwim_ref: fix dangling symref warning
Jeff King [Tue, 16 Feb 2010 07:03:16 +0000 (02:03 -0500)]
dwim_ref: fix dangling symref warning

If we encounter a symref that is dangling, in most cases we will warn
about it. The one exception is a dangling HEAD, as that indicates a
branch yet to be born.

However, the check in dwim_ref was not quite right. If we were fed
something like "HEAD^0" we would try to resolve "HEAD", see that it is
dangling, and then check whether the _original_ string we got was
"HEAD" (which it wasn't in this case). And that makes no sense; the
dangling thing we found was not "HEAD^0" but rather "HEAD".

Fixing this squelches a scary warning from "submodule summary HEAD" (and
consequently "git status" with status.submodulesummary set) in an empty
repo, as the submodule script calls "git rev-parse -q --verify HEAD^0".

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoAdd test for using Git at root of file system
Nguyễn Thái Ngọc Duy [Sun, 14 Feb 2010 15:44:45 +0000 (22:44 +0700)]
Add test for using Git at root of file system

This kind of test requires a throw-away root filesystem so that it can
play on. If you have such a system, go ahead, "chmod 777 /" and run
this test manually. Because this is a dangerous test, you are required
to set an env variable, and not to use root to run it.

Script prepare-root.sh may help you set up a chroot environment with
Git test suite inside. You will need Linux, static linked busybox,
rsync and root permission to use it.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoSupport working directory located at root
Nguyễn Thái Ngọc Duy [Sun, 14 Feb 2010 15:44:44 +0000 (22:44 +0700)]
Support working directory located at root

Git should work regardless where the working directory is located,
even at root. This patch fixes two places where it assumes working
directory always have parent directory.

In setup_git_directory_gently(), when Git goes up to root and finds
.git there, it happily sets worktree to "" instead of "/".

In prefix_path(), loosen the outside repo check a little bit. Usually
when a path XXX is inside worktree /foo, it must be either "/foo", or
"/foo/...". When worktree is simply "/", we can safely ignore the
check: we have a slash at the beginning already.

Not related to worktree, but also set gitdir correctly if a bare repo
is placed (insanely?) at root.

Thanks João Carlos Mendes Luís for pointing out this problem.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoMove offset_1st_component() to path.c
Nguyễn Thái Ngọc Duy [Tue, 16 Feb 2010 05:22:08 +0000 (12:22 +0700)]
Move offset_1st_component() to path.c

The implementation is also lightly modified to use is_dir_sep()
instead of hardcoding '/'.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agogit diff --quiet -w: check and report the status
Larry D'Anna [Tue, 16 Feb 2010 06:55:21 +0000 (01:55 -0500)]
git diff --quiet -w: check and report the status

The option -w tells the diff machinery to inspect the contents to set the
exit status, instead of checking the blob object level difference alone.
However, --quiet tells the diff machinery not to look at the contents, which
means DIFF_FROM_CONTENTS has no chance to inspect the change.

Work it around by calling diff_flush_patch() with output sent to /dev/null.

Signed-off-by: Larry D'Anna <larry@elder-gods.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agostash pop: remove 'apply' options during 'drop' invocation
Thomas Rast [Mon, 15 Feb 2010 16:05:46 +0000 (17:05 +0100)]
stash pop: remove 'apply' options during 'drop' invocation

The 'git stash pop' option parsing used to remove the first argument
in --index mode.  At the time this was implemented, this first
argument was always --index.  However, since the invention of the -q
option in fcdd0e9 (stash: teach quiet option, 2009-06-17) you can
cause an internal invocation of

  git stash drop --index

by running

  git stash pop -q --index

which then of course fails because drop doesn't know --index.

To handle this, instead let 'git stash apply' decide what the future
argument to 'drop' should be.

Warning: this means that 'git stash apply' must parse all options that
'drop' can take, and deal with them in the same way.  This is
currently true for its only option -q.

Signed-off-by: Thomas Rast <trast@student.ethz.ch>
Acked-by: Stephen Boyd <bebarino@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agodiff: make sure --output=/bad/path is caught
Larry D'Anna [Tue, 16 Feb 2010 04:10:45 +0000 (23:10 -0500)]
diff: make sure --output=/bad/path is caught

The return value from fopen wasn't being checked.

Signed-off-by: Larry D'Anna <larry@elder-gods.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoRemove hyphen from "git-command" in two error messages
Pete Harlan [Mon, 15 Feb 2010 23:33:18 +0000 (15:33 -0800)]
Remove hyphen from "git-command" in two error messages

Signed-off-by: Pete Harlan <pgit@pcharlan.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoam: Fix launching of pager
Jonathan Nieder [Mon, 15 Feb 2010 05:04:13 +0000 (23:04 -0600)]
am: Fix launching of pager

The pagination functionality in git am has some problems:

 - It does not check if stdout is a tty, so it always paginates.

 - If $GIT_PAGER uses any environment variables, they are being
   ignored, since it does not run $GIT_PAGER through eval.

 - If $GIT_PAGER is set to the empty string, instead of passing
   output through to stdout, it tries to run $dotest/patch.

Fix them.  While at it, move the definition of git_pager() to
git-sh-setup so authors of other commands are not tempted to
reimplement it with the same mistakes.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoMerge branch 'maint'
Junio C Hamano [Mon, 15 Feb 2010 02:59:20 +0000 (18:59 -0800)]
Merge branch 'maint'

* maint:
  fix minor memory leak in get_tree_entry()

14 years agoMerge branch 'maint-1.6.6' into maint
Junio C Hamano [Mon, 15 Feb 2010 02:59:14 +0000 (18:59 -0800)]
Merge branch 'maint-1.6.6' into maint

* maint-1.6.6:
  fix minor memory leak in get_tree_entry()

14 years agogitweb: Die if there are parsing errors in config file
Jakub Narebski [Sun, 14 Feb 2010 21:46:28 +0000 (22:46 +0100)]
gitweb: Die if there are parsing errors in config file

Otherwise the errors can propagate, and show in damnest places, and
you would spend your time chasing ghosts instead of debugging real
problem (yes, it is from personal experience).

This follows (parts of) advice in `perldoc -f do` documentation.

This required restructoring code a bit, so we die only if we are reading
(executing) config file.  As a side effect $GITWEB_CONFIG_SYSTEM is always
available, even when we use $GITWEB_CONFIG.

Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agogit svn: Fix launching of pager
Jonathan Nieder [Sun, 14 Feb 2010 12:06:10 +0000 (06:06 -0600)]
git svn: Fix launching of pager

In commit dec543e (am -i, git-svn: use "git var GIT_PAGER"), I tried
to teach git svn to defer to git var on what pager to use. In the
process, I introduced two bugs:

 - The value set for $pager in config_pager has local scope, so
   run_pager never sees it;

 - git var cannot tell whether git svn’s output is going to a
   terminal, so the value chosen for $pager does not reflect that
   information.

Fix them.

Reported-by: Sebastian Celis <sebastian@sebastiancelis.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agogit.1: Clarify the behavior of the --paginate option
Jonathan Nieder [Sun, 14 Feb 2010 12:02:35 +0000 (06:02 -0600)]
git.1: Clarify the behavior of the --paginate option

The --paginate option is meant to negate the effect of an explicit or
implicit pager.<cmd> = false setting.  Thus it turns the pager on if
output is going to a terminal rather than unconditionally.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoMake 'git var GIT_PAGER' always print the configured pager
Jonathan Nieder [Sun, 14 Feb 2010 11:59:59 +0000 (05:59 -0600)]
Make 'git var GIT_PAGER' always print the configured pager

Scripted commands that want to use git’s configured pager know better
than ‘git var’ does whether stdout is going to be a tty at the
appropriate time.  Checking isatty(1) as git_pager() does now won’t
cut it, since the output of git var itself is almost never a terminal.
The symptom is that when used by humans, ‘git var GIT_PAGER’ behaves
as it should, but when used by scripts, it always returns ‘cat’!

So avoid tricks with isatty() and just always print the configured
pager.

This does not fix the callers to check isatty(1) themselves yet.
Nevertheless, this patch alone is enough to fix 'am --interactive'.

Thanks to Sebastian Celis for the report and Jeff King for the
analysis.

Reported-by: Sebastian Celis <sebastian@sebastiancelis.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoFix 'git var' usage synopsis
Jonathan Nieder [Sun, 14 Feb 2010 11:55:53 +0000 (05:55 -0600)]
Fix 'git var' usage synopsis

The parameter to 'git var' is not optional.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoinit-db, rev-parse --git-dir: do not append redundant slash
Nguyễn Thái Ngọc Duy [Sun, 14 Feb 2010 15:44:42 +0000 (22:44 +0700)]
init-db, rev-parse --git-dir: do not append redundant slash

If git_dir already has the trailing slash, don't put another one
before .git. This only happens when git_dir is '/' or 'C:/'

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agomake_absolute_path(): Do not append redundant slash
Nguyễn Thái Ngọc Duy [Sun, 14 Feb 2010 15:44:41 +0000 (22:44 +0700)]
make_absolute_path(): Do not append redundant slash

When concatenating two paths, if the first one already have '/', do
not put another '/' in between the two paths.

Usually this is not the case as getcwd() won't return '/foo/bar/',
except when you are standing at root, then it will return '/'.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agofix minor memory leak in get_tree_entry()
René Scharfe [Sun, 14 Feb 2010 09:56:46 +0000 (10:56 +0100)]
fix minor memory leak in get_tree_entry()

Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agobuiltin-notes: Add "copy" subcommand for copying notes between objects
Johan Herland [Sat, 13 Feb 2010 21:28:38 +0000 (22:28 +0100)]
builtin-notes: Add "copy" subcommand for copying notes between objects

This is useful for keeping notes to objects that are being rewritten by e.g.
'git commit --amend', 'git rebase', or 'git cherry-pick'.

"git notes copy <from> <to>" is in practice equivalent to
"git notes add -C $(git notes list <from>) <to>", although it is somewhat
more convenient for regular users.

"git notes copy" takes the same -f option as "git add", to overwrite existing
notes at the target (instead of aborting with an error message).

If the <from>-object has no notes, "git notes copy" will abort with an error
message.

The patch includes tests verifying correct behaviour of the new subcommand.

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agobuiltin-notes: Misc. refactoring of argc and exit value handling
Johan Herland [Sat, 13 Feb 2010 21:28:37 +0000 (22:28 +0100)]
builtin-notes: Misc. refactoring of argc and exit value handling

This is in preparation of future patches that add additional subcommands.

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agobuiltin-notes: Add -c/-C options for reusing notes
Johan Herland [Sat, 13 Feb 2010 21:28:36 +0000 (22:28 +0100)]
builtin-notes: Add -c/-C options for reusing notes

Inspired by the -c/-C options to "git commit", we teach these options to
"git notes add/append" to allow reuse of note objects.

With this patch in place, it is now easy to copy or move notes between
objects. For example, to copy object A's notes to object B:
git notes add [-f] -C $(git notes list A) B
To move instead of copying, you simply remove the notes from the source
object afterwards, e.g.:
git notes remove A

The patch includes tests verifying correct behaviour of the new functionality.

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agobuiltin-notes: Refactor handling of -F option to allow combining -m and -F
Johan Herland [Sat, 13 Feb 2010 21:28:35 +0000 (22:28 +0100)]
builtin-notes: Refactor handling of -F option to allow combining -m and -F

By moving the -F option handling into a separate function (parse_file_arg),
we can start allowing several -F options, and mixed usage of -m and -F
options. Each -m/-F given appends to the note message, in the order they are
given on the command-line.

The patch includes tests verifying correct behaviour of the new functionality.

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agobuiltin-notes: Deprecate the -m/-F options for "git notes edit"
Johan Herland [Sat, 13 Feb 2010 21:28:34 +0000 (22:28 +0100)]
builtin-notes: Deprecate the -m/-F options for "git notes edit"

The semantics for "git notes edit -m/-F" overlap with those for
"git notes add -f", and the behaviour (i.e. overwriting existing
notes with the given message/file) is more intuitively captured
by (and better documented with) "git notes add -f".

Suggested-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agobuiltin-notes: Add "append" subcommand for appending to note objects
Johan Herland [Sat, 13 Feb 2010 21:28:33 +0000 (22:28 +0100)]
builtin-notes: Add "append" subcommand for appending to note objects

"git notes append" is equivalent to "git notes edit" except that instead
of editing existing notes contents, you can only append to it. This is
useful for quickly adding annotations like e.g.:
git notes append -m "Acked-by: A U Thor <author@example.com>"

"git notes append" takes the same -m/-F options as "git notes add".

If there is no existing note to append to, "git notes append" is identical
to "git notes add" (i.e. it adds a new note).

The patch includes tests verifying correct behaviour of the new subcommand.

Suggested-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agobuiltin-notes: Add "add" subcommand for adding notes to objects
Johan Herland [Sat, 13 Feb 2010 21:28:32 +0000 (22:28 +0100)]
builtin-notes: Add "add" subcommand for adding notes to objects

"git notes add" is identical to "git notes edit" except that instead of
editing existing notes for a given object, you can only add notes to an
object that currently has none. If "git notes add" finds existing notes
for the given object, the addition is aborted. However, if the new
-f/--force option is used, "git notes add" will _overwrite_ the existing
notes with the new notes contents.

If there is no existing notes for the given object. "git notes add" is
identical to "git notes edit" (i.e. it adds a new note).

The patch includes tests verifying correct behaviour of the new subcommand.

Suggested-by: Joey Hess <joey@kitenet.net>
Improved-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agobuiltin-notes: Add --message/--file aliases for -m/-F options
Johan Herland [Sat, 13 Feb 2010 21:28:31 +0000 (22:28 +0100)]
builtin-notes: Add --message/--file aliases for -m/-F options

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agobuiltin-notes: Add "list" subcommand for listing note objects
Johan Herland [Sat, 13 Feb 2010 21:28:30 +0000 (22:28 +0100)]
builtin-notes: Add "list" subcommand for listing note objects

"git notes list" will list all note objects in the current notes ref (in the
format "<note object> <annotated object>"). "git notes list <object>" will
list the note object associated with the given <object>, or fail loudly if
the given <object> has no associated notes.

If no arguments are given to "git notes", it defaults to the "list"
subcommand. This is for pseudo-compatibility with "git tag" and "git branch".

The patch includes tests verifying correct behaviour of the new subcommand.

Suggested-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoDocumentation: Generalize git-notes docs to 'objects' instead of 'commits'
Johan Herland [Sat, 13 Feb 2010 21:28:29 +0000 (22:28 +0100)]
Documentation: Generalize git-notes docs to 'objects' instead of 'commits'

Notes can annotate arbitrary objects (not only commits), but this is not
reflected in the current documentation.

This patch rewrites the git-notes documentation to talk about 'objects'
instead of 'commits'. However, the discussion on commit notes and how
they are displayed by 'git log' is largely preserved.

Finally, I add myself to the Author/Documentation credits, since most of
the lines in the git-notes code and docs are blamed on me.

Cc: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agobuiltin-notes: Add "prune" subcommand for removing notes for missing objects
Johan Herland [Sat, 13 Feb 2010 21:28:28 +0000 (22:28 +0100)]
builtin-notes: Add "prune" subcommand for removing notes for missing objects

"git notes prune" will remove all notes that annotate unreachable/non-
existing objects.

The patch includes tests verifying correct behaviour of the new subcommand.

Suggested-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoNotes API: prune_notes(): Prune notes that belong to non-existing objects
Johan Herland [Sat, 13 Feb 2010 21:28:27 +0000 (22:28 +0100)]
Notes API: prune_notes(): Prune notes that belong to non-existing objects

When an object is made unreachable by Git, any notes that annotate that object
are not automagically made unreachable, since all notes are always trivially
reachable from a notes ref. In order to remove notes for non-existing objects,
we therefore need to add functionality for traversing the notes tree and
explicitly removing references to notes that annotate non-reachable objects.
Thus the notes objects themselves also become unreachable, and are removed
by a later garbage collect.

prune_notes() performs this traversal (by using for_each_note() internally),
and removes the notes in question from the notes tree.

Note that the effect of prune_notes() is not persistent unless a subsequent
call to write_notes_tree() is made.

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agot3305: Verify that removing notes triggers automatic fanout consolidation
Johan Herland [Sat, 13 Feb 2010 21:28:26 +0000 (22:28 +0100)]
t3305: Verify that removing notes triggers automatic fanout consolidation

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agobuiltin-notes: Add "remove" subcommand for removing existing notes
Johan Herland [Sat, 13 Feb 2010 21:28:25 +0000 (22:28 +0100)]
builtin-notes: Add "remove" subcommand for removing existing notes

Using "git notes remove" is equivalent to specifying an empty note message.

The patch includes tests verifying correct behaviour of the new subcommand.

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoTeach builtin-notes to remove empty notes
Johan Herland [Sat, 13 Feb 2010 21:28:24 +0000 (22:28 +0100)]
Teach builtin-notes to remove empty notes

When the result of editing a note is an empty string, the associated note
entry should be deleted from the notes tree.

This allows deleting notes by invoking either "git notes -m ''" or
"git notes -F /dev/null".

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoTeach notes code to properly preserve non-notes in the notes tree
Johan Herland [Sat, 13 Feb 2010 21:28:23 +0000 (22:28 +0100)]
Teach notes code to properly preserve non-notes in the notes tree

The note tree structure allows for non-note entries to coexist with note
entries in a notes tree. Although we certainly expect there to be very
few non-notes in a notes tree, we should still support them to a certain
degree.

This patch teaches the notes code to preserve non-notes when updating the
notes tree with write_notes_tree(). Non-notes are not affected by fanout
restructuring.

For non-notes to be handled correctly, we can no longer allow subtree
entries that do not match the fanout structure produced by the notes code
itself. This means that fanouts like 4/36, 6/34, 8/32, 4/4/32, etc. are
no longer recognized as note subtrees; only 2-based fanouts are allowed
(2/38, 2/2/36, 2/2/2/34, etc.). Since the notes code has never at any point
_produced_ non-2-based fanouts, it is highly unlikely that this change will
cause problems for anyone.

The patch also adds some tests verifying the correct handling of non-notes
in a notes tree.

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agot3305: Verify that adding many notes with git-notes triggers increased fanout
Johan Herland [Sat, 13 Feb 2010 21:28:22 +0000 (22:28 +0100)]
t3305: Verify that adding many notes with git-notes triggers increased fanout

Add a test verifying that the notes code automatically restructures the
notes tree into a deeper fanout level, when many notes are added with
"git notes".

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agot3301: Verify successful annotation of non-commits
Johan Herland [Sat, 13 Feb 2010 21:28:21 +0000 (22:28 +0100)]
t3301: Verify successful annotation of non-commits

Adds a testcase verifying that git-notes works successfully on
tree, blob, and tag objects.

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoBuiltin-ify git-notes
Johan Herland [Sat, 13 Feb 2010 21:28:20 +0000 (22:28 +0100)]
Builtin-ify git-notes

The builtin-ification includes some minor behavioural changes to the
command-line interface: It is no longer allowed to mix the -m and -F
arguments, and it is not allowed to use multiple -F options.

As part of the builtin-ification, we add the commit_notes() function
to the builtin API. This function (together with the notes.h API) can
be easily used from other builtins to manipulate the notes tree.

Also includes needed changes to t3301.

This patch has been improved by the following contributions:
- Stephen Boyd: Use die() instead of fprintf(stderr, ...) followed by exit(1)

Cc: Stephen Boyd <bebarino@gmail.com>
Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoRefactor notes concatenation into a flexible interface for combining notes
Johan Herland [Sat, 13 Feb 2010 21:28:19 +0000 (22:28 +0100)]
Refactor notes concatenation into a flexible interface for combining notes

When adding a note to an object that already has an existing note, the
current solution is to concatenate the contents of the two notes. However,
the caller may instead wish to _overwrite_ the existing note with the new
note, or maybe even _ignore_ the new note, and keep the existing one. There
might also be other ways of combining notes that are only known to the
caller.

Therefore, instead of unconditionally concatenating notes, we let the caller
specify how to combine notes, by passing in a pointer to a function for
combining notes. The caller may choose to implement its own function for
notes combining, but normally one of the following three conveniently
supplied notes combination functions will be sufficient:

- combine_notes_concatenate() combines the two notes by appending the
  contents of the new note to the contents of the existing note.

- combine_notes_overwrite() replaces the existing note with the new note.

- combine_notes_ignore() keeps the existing note, and ignores the new note.

A combine_notes function can be passed to init_notes() to choose a default
combine_notes function for that notes tree. If NULL is given, the notes tree
falls back to combine_notes_concatenate() as the ultimate default.

A combine_notes function can also be passed directly to add_note(), to
control the notes combining behaviour for a note addition in particular.
If NULL is passed, the combine_notes function registered for the given
notes tree is used.

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoNotes API: Allow multiple concurrent notes trees with new struct notes_tree
Johan Herland [Sat, 13 Feb 2010 21:28:18 +0000 (22:28 +0100)]
Notes API: Allow multiple concurrent notes trees with new struct notes_tree

The new struct notes_tree encapsulates access to a specific notes tree.
It is provided to allow callers to make use of several different notes trees
simultaneously.

A struct notes_tree * parameter is added to every function in the notes API.
In all cases, NULL can be passed, in which case the fallback "default" notes
tree (default_notes_tree) is used.

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoNotes API: write_notes_tree(): Store the notes tree in the database
Johan Herland [Sat, 13 Feb 2010 21:28:17 +0000 (22:28 +0100)]
Notes API: write_notes_tree(): Store the notes tree in the database

Uses for_each_note() to traverse the notes tree, and produces tree
objects on the fly representing the "on-disk" version of the notes
tree with appropriate fanout.

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoNotes API: for_each_note(): Traverse the entire notes tree with a callback
Johan Herland [Sat, 13 Feb 2010 21:28:16 +0000 (22:28 +0100)]
Notes API: for_each_note(): Traverse the entire notes tree with a callback

This includes a first attempt at creating an optimal fanout scheme (which
is calculated on-the-fly, while traversing).

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoNotes API: get_note(): Return the note annotating the given object
Johan Herland [Sat, 13 Feb 2010 21:28:15 +0000 (22:28 +0100)]
Notes API: get_note(): Return the note annotating the given object

Created by a simple cleanup and rename of lookup_notes().

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoNotes API: remove_note(): Remove note objects from the notes tree structure
Johan Herland [Sat, 13 Feb 2010 21:28:14 +0000 (22:28 +0100)]
Notes API: remove_note(): Remove note objects from the notes tree structure

This includes adding internal functions for maintaining a healthy notes tree
structure after removing individual notes.

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoNotes API: add_note(): Add note objects to the internal notes tree structure
Johan Herland [Sat, 13 Feb 2010 21:28:13 +0000 (22:28 +0100)]
Notes API: add_note(): Add note objects to the internal notes tree structure

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoNotes API: init_notes(): Initialize the notes tree from the given notes ref
Johan Herland [Sat, 13 Feb 2010 21:28:12 +0000 (22:28 +0100)]
Notes API: init_notes(): Initialize the notes tree from the given notes ref

Created by a simple refactoring of initialize_notes().

Also add a new 'flags' parameter, which is a bitwise combination of notes
initialization flags. For now, there is only one flag - NOTES_INIT_EMPTY -
which indicates that the notes tree should not auto-load the contents of
the given (or default) notes ref, but rather should leave the notes tree
initialized to an empty state. This will become useful in the future when
manipulating the notes tree through the notes API.

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoAdd tests for checking correct handling of $GIT_NOTES_REF and core.notesRef
Johan Herland [Sat, 13 Feb 2010 21:28:11 +0000 (22:28 +0100)]
Add tests for checking correct handling of $GIT_NOTES_REF and core.notesRef

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoNotes API: get_commit_notes() -> format_note() + remove the commit restriction
Johan Herland [Sat, 13 Feb 2010 21:28:10 +0000 (22:28 +0100)]
Notes API: get_commit_notes() -> format_note() + remove the commit restriction

There is really no reason why only commit objects can be annotated. By
changing the struct commit parameter to get_commit_notes() into a sha1 we
gain the ability to annotate any object type. To reflect this in the function
naming as well, we rename get_commit_notes() to format_note().

This patch also fixes comments and variable names throughout notes.c as a
consequence of the removal of the unnecessary 'commit' restriction.

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 years agoMinor cosmetic fixes to notes.c
Johan Herland [Sat, 13 Feb 2010 21:28:09 +0000 (22:28 +0100)]
Minor cosmetic fixes to notes.c

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>