gitweb.git
Merge branch 'pt/pull-log-n'Junio C Hamano Tue, 26 May 2015 20:24:43 +0000 (13:24 -0700)

Merge branch 'pt/pull-log-n'

"git pull --log" and "git pull --no-log" worked as expected, but
"git pull --log=20" did not.

* pt/pull-log-n:
pull: handle --log=<n>

Merge branch 'jk/rerere-forget-check-enabled'Junio C Hamano Tue, 26 May 2015 20:24:42 +0000 (13:24 -0700)

Merge branch 'jk/rerere-forget-check-enabled'

"git rerere forget" in a repository without rerere enabled gave a
cryptic error message; it should be a silent no-op instead.

* jk/rerere-forget-check-enabled:
rerere: exit silently on "forget" when rerere is disabled

git-p4: tests: use test-chmtime in place of touchLuke Diamand Tue, 19 May 2015 22:23:18 +0000 (23:23 +0100)

git-p4: tests: use test-chmtime in place of touch

Using "touch" for P4EDITOR means that the tests can be a bit
racy, since git-p4 checks the timestamp has been updated and
fails if the timestamp is not updated.

Use test-chmtime instead, which is designed for this.

Signed-off-by: Luke Diamand <luke@diamand.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

t4015: separate common setup and per-test expectationJunio C Hamano Tue, 26 May 2015 18:43:08 +0000 (11:43 -0700)

t4015: separate common setup and per-test expectation

The last two tests in the script were to

- set up color.diff.* slots
- set up an expectation for a single test
- run that test and check the result

but split in a wrong way. It did the first two in the first test
and the third one in the second test. The latter two belong to each
other. This matters when you plan to add more of these tests that
share the common coloring.

While at it, make sure we use a color different from old, which is
also red.

Signed-off-by: Junio C Hamano <gitster@pobox.com>

t4015: modernise styleJunio C Hamano Tue, 26 May 2015 18:19:52 +0000 (11:19 -0700)

t4015: modernise style

Move the preparatory steps that create the expected output inside
the test bodies, remove unnecessary blank lines before and after the
test bodies, and drop SP between redirection operator and its target.

Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'jk/http-backend-deadlock-2.3' into jk... Junio C Hamano Tue, 26 May 2015 03:44:42 +0000 (20:44 -0700)

Merge branch 'jk/http-backend-deadlock-2.3' into jk/http-backend-deadlock

* jk/http-backend-deadlock-2.3:
http-backend: spool ref negotiation requests to buffer
t5551: factor out tag creation
http-backend: fix die recursion with custom handler

Merge branch 'jk/http-backend-deadlock-2.2' into jk... Junio C Hamano Tue, 26 May 2015 03:44:04 +0000 (20:44 -0700)

Merge branch 'jk/http-backend-deadlock-2.2' into jk/http-backend-deadlock-2.3

* jk/http-backend-deadlock-2.2:
http-backend: spool ref negotiation requests to buffer
t5551: factor out tag creation
http-backend: fix die recursion with custom handler

http-backend: spool ref negotiation requests to bufferJeff King Wed, 20 May 2015 07:37:09 +0000 (03:37 -0400)

http-backend: spool ref negotiation requests to buffer

When http-backend spawns "upload-pack" to do ref
negotiation, it streams the http request body to
upload-pack, who then streams the http response back to the
client as it reads. In theory, git can go full-duplex; the
client can consume our response while it is still sending
the request. In practice, however, HTTP is a half-duplex
protocol. Even if our client is ready to read and write
simultaneously, we may have other HTTP infrastructure in the
way, including the webserver that spawns our CGI, or any
intermediate proxies.

In at least one documented case[1], this leads to deadlock
when trying a fetch over http. What happens is basically:

1. Apache proxies the request to the CGI, http-backend.

2. http-backend gzip-inflates the data and sends
the result to upload-pack.

3. upload-pack acts on the data and generates output over
the pipe back to Apache. Apache isn't reading because
it's busy writing (step 1).

This works fine most of the time, because the upload-pack
output ends up in a system pipe buffer, and Apache reads
it as soon as it finishes writing. But if both the request
and the response exceed the system pipe buffer size, then we
deadlock (Apache blocks writing to http-backend,
http-backend blocks writing to upload-pack, and upload-pack
blocks writing to Apache).

We need to break the deadlock by spooling either the input
or the output. In this case, it's ideal to spool the input,
because Apache does not start reading either stdout _or_
stderr until we have consumed all of the input. So until we
do so, we cannot even get an error message out to the
client.

The solution is fairly straight-forward: we read the request
body into an in-memory buffer in http-backend, freeing up
Apache, and then feed the data ourselves to upload-pack. But
there are a few important things to note:

1. We limit the in-memory buffer to prevent an obvious
denial-of-service attack. This is a new hard limit on
requests, but it's unlikely to come into play. The
default value is 10MB, which covers even the ridiculous
100,000-ref negotation in the included test (that
actually caps out just over 5MB). But it's configurable
on the off chance that you don't mind spending some
extra memory to make even ridiculous requests work.

2. We must take care only to buffer when we have to. For
pushes, the incoming packfile may be of arbitrary
size, and we should connect the input directly to
receive-pack. There's no deadlock problem here, though,
because we do not produce any output until the whole
packfile has been read.

For upload-pack's initial ref advertisement, we
similarly do not need to buffer. Even though we may
generate a lot of output, there is no request body at
all (i.e., it is a GET, not a POST).

[1] http://article.gmane.org/gmane.comp.version-control.git/269020

Test-adapted-from: Dennis Kaarsemaker <dennis@kaarsemaker.net>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

struct ref_lock: convert old_sha1 member to object_idMichael Haggerty Mon, 25 May 2015 18:39:22 +0000 (18:39 +0000)

struct ref_lock: convert old_sha1 member to object_id

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

warn_if_dangling_symref(): convert local variable ... Michael Haggerty Mon, 25 May 2015 18:39:21 +0000 (18:39 +0000)

warn_if_dangling_symref(): convert local variable "junk" to object_id

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

each_ref_fn_adapter(): remove adapterMichael Haggerty Mon, 25 May 2015 18:39:20 +0000 (18:39 +0000)

each_ref_fn_adapter(): remove adapter

All of the callers of the for_each_ref family of functions have now
been rewritten to work with object_ids, so this adapter is no longer
needed.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

rev_list_insert_ref(): remove unneeded argumentsMichael Haggerty Mon, 25 May 2015 18:39:19 +0000 (18:39 +0000)

rev_list_insert_ref(): remove unneeded arguments

Now that the function is not being used as an each_ref_sha1_fn, we can
delete the unused arguments in its signature.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

rev_list_insert_ref_oid(): new function, taking an... Michael Haggerty Mon, 25 May 2015 18:39:18 +0000 (18:39 +0000)

rev_list_insert_ref_oid(): new function, taking an object_oid

This function can be used with for_each_ref() without having to be
wrapped.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

mark_complete(): remove unneeded argumentsMichael Haggerty Mon, 25 May 2015 18:39:17 +0000 (18:39 +0000)

mark_complete(): remove unneeded arguments

Now that the function is not being used as an each_ref_sha1_fn, we can
delete the unused arguments in its signature.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

mark_complete_oid(): new function, taking an object_oidMichael Haggerty Mon, 25 May 2015 18:39:16 +0000 (18:39 +0000)

mark_complete_oid(): new function, taking an object_oid

This function can be used with for_each_ref() without having to be
wrapped.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

clear_marks(): rewrite to take an object_id argumentMichael Haggerty Mon, 25 May 2015 18:39:15 +0000 (18:39 +0000)

clear_marks(): rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

mark_complete(): rewrite to take an object_id argumentMichael Haggerty Mon, 25 May 2015 18:39:14 +0000 (18:39 +0000)

mark_complete(): rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

send_ref(): convert local variable "peeled" to object_idMichael Haggerty Mon, 25 May 2015 18:39:13 +0000 (18:39 +0000)

send_ref(): convert local variable "peeled" to object_id

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

upload-pack: rewrite functions to take object_id argumentsMichael Haggerty Mon, 25 May 2015 18:39:12 +0000 (18:39 +0000)

upload-pack: rewrite functions to take object_id arguments

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

find_symref(): convert local variable "unused" to object_idMichael Haggerty Mon, 25 May 2015 18:39:11 +0000 (18:39 +0000)

find_symref(): convert local variable "unused" to object_id

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

find_symref(): rewrite to take an object_id argumentMichael Haggerty Mon, 25 May 2015 18:39:10 +0000 (18:39 +0000)

find_symref(): rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

write_one_ref(): rewrite to take an object_id argumentMichael Haggerty Mon, 25 May 2015 18:39:09 +0000 (18:39 +0000)

write_one_ref(): rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

write_refs_to_temp_dir(): convert local variable sha1... Michael Haggerty Mon, 25 May 2015 18:39:08 +0000 (18:39 +0000)

write_refs_to_temp_dir(): convert local variable sha1 to object_id

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

submodule: rewrite to take an object_id argumentMichael Haggerty Mon, 25 May 2015 18:39:07 +0000 (18:39 +0000)

submodule: rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

shallow: rewrite functions to take object_id argumentsMichael Haggerty Mon, 25 May 2015 18:39:06 +0000 (18:39 +0000)

shallow: rewrite functions to take object_id arguments

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

handle_one_ref(): rewrite to take an object_id argumentMichael Haggerty Mon, 25 May 2015 18:39:05 +0000 (18:39 +0000)

handle_one_ref(): rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

add_info_ref(): rewrite to take an object_id argumentMichael Haggerty Mon, 25 May 2015 18:39:04 +0000 (18:39 +0000)

add_info_ref(): rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

handle_one_reflog(): rewrite to take an object_id argumentMichael Haggerty Mon, 25 May 2015 18:39:03 +0000 (18:39 +0000)

handle_one_reflog(): rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

register_replace_ref(): rewrite to take an object_id... Michael Haggerty Mon, 25 May 2015 18:39:02 +0000 (18:39 +0000)

register_replace_ref(): rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

remote: rewrite functions to take object_id argumentsMichael Haggerty Mon, 25 May 2015 18:39:01 +0000 (18:39 +0000)

remote: rewrite functions to take object_id arguments

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

add_one_ref(): rewrite to take an object_id argumentMichael Haggerty Mon, 25 May 2015 18:39:00 +0000 (18:39 +0000)

add_one_ref(): rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

string_list_add_one_ref(): rewrite to take an object_id... Michael Haggerty Mon, 25 May 2015 18:38:59 +0000 (18:38 +0000)

string_list_add_one_ref(): rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

add_ref_decoration(): convert local variable original_s... Michael Haggerty Mon, 25 May 2015 18:38:58 +0000 (18:38 +0000)

add_ref_decoration(): convert local variable original_sha1 to object_id

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

add_ref_decoration(): rewrite to take an object_id... Michael Haggerty Mon, 25 May 2015 18:38:57 +0000 (18:38 +0000)

add_ref_decoration(): rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

show_head_ref(): convert local variable "unused" to... Michael Haggerty Mon, 25 May 2015 18:38:56 +0000 (18:38 +0000)

show_head_ref(): convert local variable "unused" to object_id

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

http-backend: rewrite to take an object_id argumentMichael Haggerty Mon, 25 May 2015 18:38:55 +0000 (18:38 +0000)

http-backend: rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

append_similar_ref(): rewrite to take an object_id... Michael Haggerty Mon, 25 May 2015 18:38:54 +0000 (18:38 +0000)

append_similar_ref(): rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

builtin/show-ref: rewrite to take an object_id argumentMichael Haggerty Mon, 25 May 2015 18:38:53 +0000 (18:38 +0000)

builtin/show-ref: rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

show_ref(): convert local variable peeled to object_idMichael Haggerty Mon, 25 May 2015 18:38:52 +0000 (18:38 +0000)

show_ref(): convert local variable peeled to object_id

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

builtin/show-ref: rewrite to use object_idMichael Haggerty Mon, 25 May 2015 18:38:51 +0000 (18:38 +0000)

builtin/show-ref: rewrite to use object_id

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

fsck: change functions to use object_idMichael Haggerty Mon, 25 May 2015 18:38:50 +0000 (18:38 +0000)

fsck: change functions to use object_id

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

cmd_show_branch(): fix error messageMichael Haggerty Mon, 25 May 2015 18:38:49 +0000 (18:38 +0000)

cmd_show_branch(): fix error message

We need to convert the SHA-1 to hexadecimal before printing it.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

builtin/show-branch: rewrite functions to work with... Michael Haggerty Mon, 25 May 2015 18:38:48 +0000 (18:38 +0000)

builtin/show-branch: rewrite functions to work with object_id

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

append_one_rev(): rewrite to work with object_idMichael Haggerty Mon, 25 May 2015 18:38:47 +0000 (18:38 +0000)

append_one_rev(): rewrite to work with object_id

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

builtin/show-branch: rewrite functions to take object_i... Michael Haggerty Mon, 25 May 2015 18:38:46 +0000 (18:38 +0000)

builtin/show-branch: rewrite functions to take object_id arguments

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

append_matching_ref(): rewrite to take an object_id... Michael Haggerty Mon, 25 May 2015 18:38:45 +0000 (18:38 +0000)

append_matching_ref(): rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

show_reference(): rewrite to take an object_id argumentMichael Haggerty Mon, 25 May 2015 18:38:44 +0000 (18:38 +0000)

show_reference(): rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

builtin/remote: rewrite functions to take object_id... Michael Haggerty Mon, 25 May 2015 18:38:43 +0000 (18:38 +0000)

builtin/remote: rewrite functions to take object_id arguments

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

add_branch_for_removal(): don't set "util" field of... Michael Haggerty Mon, 25 May 2015 18:38:42 +0000 (18:38 +0000)

add_branch_for_removal(): don't set "util" field of string_list entries

They were never used.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

add_branch_for_removal(): rewrite to take an object_id... Michael Haggerty Mon, 25 May 2015 18:38:41 +0000 (18:38 +0000)

add_branch_for_removal(): rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

builtin/reflog: rewrite ref functions to take an object... Michael Haggerty Mon, 25 May 2015 18:38:40 +0000 (18:38 +0000)

builtin/reflog: rewrite ref functions to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

show_ref_cb(): rewrite to take an object_id argumentMichael Haggerty Mon, 25 May 2015 18:38:39 +0000 (18:38 +0000)

show_ref_cb(): rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

builtin/pack-objects: rewrite to take an object_id... Michael Haggerty Mon, 25 May 2015 18:38:38 +0000 (18:38 +0000)

builtin/pack-objects: rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

name_ref(): rewrite to take an object_id argumentMichael Haggerty Mon, 25 May 2015 18:38:37 +0000 (18:38 +0000)

name_ref(): rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

grab_single_ref(): rewrite to take an object_id argumentMichael Haggerty Mon, 25 May 2015 18:38:36 +0000 (18:38 +0000)

grab_single_ref(): rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

builtin/fetch: rewrite to take an object_id argumentMichael Haggerty Mon, 25 May 2015 18:38:35 +0000 (18:38 +0000)

builtin/fetch: rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

get_name(): rewrite to take an object_id argumentMichael Haggerty Mon, 25 May 2015 18:38:34 +0000 (18:38 +0000)

get_name(): rewrite to take an object_id argument

Rewrite to take an object_id argument and convert the local variable
"peeled" object_id.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

add_pending_uninteresting_ref(): rewrite to take an... Michael Haggerty Mon, 25 May 2015 18:38:33 +0000 (18:38 +0000)

add_pending_uninteresting_ref(): rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

append_ref(): rewrite to take an object_id argumentMichael Haggerty Mon, 25 May 2015 18:38:32 +0000 (18:38 +0000)

append_ref(): rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

register_ref(): rewrite to take an object_id argumentMichael Haggerty Mon, 25 May 2015 18:38:31 +0000 (18:38 +0000)

register_ref(): rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

handle_one_ref(): rewrite to take an object_id argumentMichael Haggerty Mon, 25 May 2015 18:38:30 +0000 (18:38 +0000)

handle_one_ref(): rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

builtin/rev-parse: rewrite to take an object_id argumentMichael Haggerty Mon, 25 May 2015 18:38:29 +0000 (18:38 +0000)

builtin/rev-parse: rewrite to take an object_id argument

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

each_ref_fn: change to take an object_id parameterMichael Haggerty Mon, 25 May 2015 18:38:28 +0000 (18:38 +0000)

each_ref_fn: change to take an object_id parameter

Change typedef each_ref_fn to take a "const struct object_id *oid"
parameter instead of "const unsigned char *sha1".

To aid this transition, implement an adapter that can be used to wrap
old-style functions matching the old typedef, which is now called
"each_ref_sha1_fn"), and make such functions callable via the new
interface. This requires the old function and its cb_data to be
wrapped in a "struct each_ref_fn_sha1_adapter", and that object to be
used as the cb_data for an adapter function, each_ref_fn_adapter().

This is an enormous diff, but most of it consists of simple,
mechanical changes to the sites that call any of the "for_each_ref"
family of functions. Subsequent to this change, the call sites can be
rewritten one by one to use the new interface.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

refs: convert struct ref_entry to use struct object_idbrian m. carlson Mon, 25 May 2015 18:38:27 +0000 (18:38 +0000)

refs: convert struct ref_entry to use struct object_id

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

git-p4: fix handling of multi-word P4EDITORLuke Diamand Tue, 19 May 2015 22:23:17 +0000 (23:23 +0100)

git-p4: fix handling of multi-word P4EDITOR

This teaches git-p4 to pass the P4EDITOR variable to the
shell for expansion, so that any command-line arguments are
correctly handled. Without this, git-p4 can only launch the
editor if P4EDITOR is solely the path to the binary, without
any arguments.

This also adjusts t9805, which relied on the previous behaviour.

Suggested-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Luke Diamand <luke@diamand.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

git-p4: add failing test for P4EDITOR handlingLuke Diamand Tue, 19 May 2015 22:23:16 +0000 (23:23 +0100)

git-p4: add failing test for P4EDITOR handling

Add test case that git-p4 handles a setting of P4EDITOR
that takes arguments, e.g. "gvim -f". This currently fails.

Signed-off-by: Luke Diamand <luke@diamand.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

upload-pack: optionally allow fetching reachable sha1Fredrik Medley Thu, 21 May 2015 20:23:39 +0000 (22:23 +0200)

upload-pack: optionally allow fetching reachable sha1

With uploadpack.allowReachableSHA1InWant configuration option set on the
server side, "git fetch" can make a request with a "want" line that names
an object that has not been advertised (likely to have been obtained out
of band or from a submodule pointer). Only objects reachable from the
branch tips, i.e. the union of advertised branches and branches hidden by
transfer.hideRefs, will be processed. Note that there is an associated
cost of having to walk back the history to check the reachability.

This feature can be used when obtaining the content of a certain commit,
for which the sha1 is known, without the need of cloning the whole
repository, especially if a shallow fetch is used. Useful cases are e.g.
repositories containing large files in the history, fetching only the
needed data for a submodule checkout, when sharing a sha1 without telling
which exact branch it belongs to and in Gerrit, if you think in terms of
commits instead of change numbers. (The Gerrit case has already been
solved through allowTipSHA1InWant as every Gerrit change has a ref.)

Signed-off-by: Fredrik Medley <fredrik.medley@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

upload-pack: prepare to extend allow-tip-sha1-in-wantFredrik Medley Thu, 21 May 2015 20:23:38 +0000 (22:23 +0200)

upload-pack: prepare to extend allow-tip-sha1-in-want

To allow future extensions, e.g. allowing non-tip sha1, replace the
boolean allow_tip_sha1_in_want variable with the flag-style
allow_request_with_bare_object_name variable.

Signed-off-by: Fredrik Medley <fredrik.medley@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Fourth batch for 2.5 cycleJunio C Hamano Fri, 22 May 2015 19:53:21 +0000 (12:53 -0700)

Fourth batch for 2.5 cycle

Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'ps/doc-packfile-vs-pack-file'Junio C Hamano Fri, 22 May 2015 19:42:00 +0000 (12:42 -0700)

Merge branch 'ps/doc-packfile-vs-pack-file'

Doc consistency updates.

* ps/doc-packfile-vs-pack-file:
doc: fix inconsistent spelling of "packfile"
pack-protocol.txt: fix insconsistent spelling of "packfile"
git-unpack-objects.txt: fix inconsistent spelling of "packfile"
git-verify-pack.txt: fix inconsistent spelling of "packfile"

Merge branch 'sb/t1020-cleanup'Junio C Hamano Fri, 22 May 2015 19:41:59 +0000 (12:41 -0700)

Merge branch 'sb/t1020-cleanup'

There was a commented-out (instead of being marked to expect
failure) test that documented a breakage that was fixed since the
test was written; turn it into a proper test.

* sb/t1020-cleanup:
subdirectory tests: code cleanup, uncomment test

Merge branch 'lm/squelch-bg-progress'Junio C Hamano Fri, 22 May 2015 19:41:58 +0000 (12:41 -0700)

Merge branch 'lm/squelch-bg-progress'

The controlling tty-based heuristics to squelch progress output did
not consider that the process may not be talking to a tty at all
(e.g. sending the progress to sideband #2). This is a finishing
touch to a topic that is already in 'master'.

* lm/squelch-bg-progress:
progress: treat "no terminal" as being in the foreground

Merge branch 'jc/ignore-epipe-in-filter'Junio C Hamano Fri, 22 May 2015 19:41:57 +0000 (12:41 -0700)

Merge branch 'jc/ignore-epipe-in-filter'

Filter scripts were run with SIGPIPE disabled on the Git side,
expecting that they may not read what Git feeds them to filter.
We however treated a filter that does not read its input fully
before exiting as an error.

This changes semantics, but arguably in a good way. If a filter
can produce its output without consuming its input using whatever
magic, we now let it do so, instead of diagnosing it as a
programming error.

* jc/ignore-epipe-in-filter:
filter_buffer_or_fd(): ignore EPIPE
copy.c: make copy_fd() report its status silently

Merge branch 'mh/clone-verbosity-fix'Junio C Hamano Fri, 22 May 2015 19:41:56 +0000 (12:41 -0700)

Merge branch 'mh/clone-verbosity-fix'

Git 2.4 broke setting verbosity and progress levels on "git clone"
with native transports.

* mh/clone-verbosity-fix:
clone: call transport_set_verbosity before anything else on the newly created transport

Merge branch 'pt/pull-tags-error-diag'Junio C Hamano Fri, 22 May 2015 19:41:56 +0000 (12:41 -0700)

Merge branch 'pt/pull-tags-error-diag'

There was a dead code that used to handle "git pull --tags" and
show special-cased error message, which was made irrelevant when
the semantics of the option changed back in Git 1.9 days.

* pt/pull-tags-error-diag:
pull: remove --tags error in no merge candidates case

Merge branch 'mh/lockfile-retry'Junio C Hamano Fri, 22 May 2015 19:41:55 +0000 (12:41 -0700)

Merge branch 'mh/lockfile-retry'

Instead of dying immediately upon failing to obtain a lock, retry
after a short while with backoff.

* mh/lockfile-retry:
lock_packed_refs(): allow retries when acquiring the packed-refs lock
lockfile: allow file locking to be retried with a timeout

Merge branch 'jk/add-e-kill-editor'Junio C Hamano Fri, 22 May 2015 19:41:55 +0000 (12:41 -0700)

Merge branch 'jk/add-e-kill-editor'

"git add -e" did not allow the user to abort the operation by
killing the editor.

* jk/add-e-kill-editor:
add: check return value of launch_editor

Merge branch 'sg/completion-config'Junio C Hamano Fri, 22 May 2015 19:41:53 +0000 (12:41 -0700)

Merge branch 'sg/completion-config'

Code clean-up for completion script (in contrib/).

* sg/completion-config:
completion: simplify query for config variables
completion: add a helper function to get config variables

Merge branch 'mh/ref-directory-file'Junio C Hamano Fri, 22 May 2015 19:41:53 +0000 (12:41 -0700)

Merge branch 'mh/ref-directory-file'

The ref API did not handle cases where 'refs/heads/xyzzy/frotz' is
removed at the same time as 'refs/heads/xyzzy' is added (or vice
versa) very well.

* mh/ref-directory-file:
reflog_expire(): integrate lock_ref_sha1_basic() errors into ours
ref_transaction_commit(): delete extra "the" from error message
ref_transaction_commit(): provide better error messages
rename_ref(): integrate lock_ref_sha1_basic() errors into ours
lock_ref_sha1_basic(): improve diagnostics for ref D/F conflicts
lock_ref_sha1_basic(): report errors via a "struct strbuf *err"
verify_refname_available(): report errors via a "struct strbuf *err"
verify_refname_available(): rename function
refs: check for D/F conflicts among refs created in a transaction
ref_transaction_commit(): use a string_list for detecting duplicates
is_refname_available(): use dirname in first loop
struct nonmatching_ref_data: store a refname instead of a ref_entry
report_refname_conflict(): inline function
entry_matches(): inline function
is_refname_available(): convert local variable "dirname" to strbuf
is_refname_available(): avoid shadowing "dir" variable
is_refname_available(): revamp the comments
t1404: new tests of ref D/F conflicts within transactions

Merge branch 'mh/write-refs-sooner-2.4'Junio C Hamano Fri, 22 May 2015 19:41:52 +0000 (12:41 -0700)

Merge branch 'mh/write-refs-sooner-2.4'

Multi-ref transaction support we merged a few releases ago
unnecessarily kept many file descriptors open, risking to fail with
resource exhaustion. This is for 2.4.x track.

* mh/write-refs-sooner-2.4:
ref_transaction_commit(): fix atomicity and avoid fd exhaustion
ref_transaction_commit(): remove the local flags variable
ref_transaction_commit(): inline call to write_ref_sha1()
rename_ref(): inline calls to write_ref_sha1() from this function
commit_ref_update(): new function, extracted from write_ref_sha1()
write_ref_to_lockfile(): new function, extracted from write_ref_sha1()
t7004: rename ULIMIT test prerequisite to ULIMIT_STACK_SIZE
update-ref: test handling large transactions properly
ref_transaction_commit(): fix atomicity and avoid fd exhaustion
ref_transaction_commit(): remove the local flags variable
ref_transaction_commit(): inline call to write_ref_sha1()
rename_ref(): inline calls to write_ref_sha1() from this function
commit_ref_update(): new function, extracted from write_ref_sha1()
write_ref_to_lockfile(): new function, extracted from write_ref_sha1()
t7004: rename ULIMIT test prerequisite to ULIMIT_STACK_SIZE
update-ref: test handling large transactions properly

Merge branch 'mg/log-decorate-HEAD'Junio C Hamano Fri, 22 May 2015 19:41:51 +0000 (12:41 -0700)

Merge branch 'mg/log-decorate-HEAD'

The "log --decorate" enhancement in Git 2.4 that shows the commit
at the tip of the current branch e.g. "HEAD -> master", did not
work with --decorate=full.

* mg/log-decorate-HEAD:
log: do not shorten decoration names too early
log: decorate HEAD with branch name under --decorate=full, too

Merge branch 'jk/asciidoc-markup-fix'Junio C Hamano Fri, 22 May 2015 19:41:50 +0000 (12:41 -0700)

Merge branch 'jk/asciidoc-markup-fix'

Various documentation mark-up fixes to make the output more
consistent in general and also make AsciiDoctor (an alternative
formatter) happier.

* jk/asciidoc-markup-fix:
doc: convert AsciiDoc {?foo} to ifdef::foo[]
doc: put example URLs and emails inside literal backticks
doc: drop backslash quoting of some curly braces
doc: convert \--option to --option
doc/add: reformat `--edit` option
doc: fix length of underlined section-title
doc: fix hanging "+"-continuation
doc: fix unquoted use of "{type}"
doc: fix misrendering due to `single quote'

Merge branch 'jk/stripspace-asciidoctor-fix'Junio C Hamano Fri, 22 May 2015 19:41:49 +0000 (12:41 -0700)

Merge branch 'jk/stripspace-asciidoctor-fix'

A literal block in the tutorial had lines with unequal lengths to
delimit it from the rest of the document, which choke GitHub's
AsciiDoc renderer.

* jk/stripspace-asciidoctor-fix:
doc: fix unmatched code fences in git-stripspace

Merge branch 'ja/tutorial-asciidoctor-fix'Junio C Hamano Fri, 22 May 2015 19:41:48 +0000 (12:41 -0700)

Merge branch 'ja/tutorial-asciidoctor-fix'

A literal block in the tutorial had lines with unequal lengths to
delimit it from the rest of the document, which choke GitHub's
AsciiDoc renderer.

* ja/tutorial-asciidoctor-fix:
doc: fix unmatched code fences

Merge branch 'sg/help-subcommands'Junio C Hamano Fri, 22 May 2015 19:41:47 +0000 (12:41 -0700)

Merge branch 'sg/help-subcommands'

A preparatory clean-up step.

* sg/help-subcommands:
command-list.txt: fix whitespace inconsistency

Merge branch 'ps/bundle-verify-arg'Junio C Hamano Fri, 22 May 2015 19:41:46 +0000 (12:41 -0700)

Merge branch 'ps/bundle-verify-arg'

"git bundle verify" did not diagnose extra parameters on the
command line.

* ps/bundle-verify-arg:
bundle: verify arguments more strictly

Merge branch 'ls/http-ssl-cipher-list'Junio C Hamano Fri, 22 May 2015 19:41:45 +0000 (12:41 -0700)

Merge branch 'ls/http-ssl-cipher-list'

Introduce http.<url>.SSLCipherList configuration variable to tweak
the list of cipher suite to be used with libcURL when talking with
https:// sites.

* ls/http-ssl-cipher-list:
http: add support for specifying an SSL cipher list

Merge branch 'dl/subtree-avoid-tricky-echo'Junio C Hamano Fri, 22 May 2015 19:41:45 +0000 (12:41 -0700)

Merge branch 'dl/subtree-avoid-tricky-echo'

"git subtree" script (in contrib/) used "echo -n" to produce
progress messages in a non-portable way.

* dl/subtree-avoid-tricky-echo:
contrib/subtree: portability fix for string printing

Merge branch 'jk/skip-http-tests-under-no-curl'Junio C Hamano Fri, 22 May 2015 19:41:44 +0000 (12:41 -0700)

Merge branch 'jk/skip-http-tests-under-no-curl'

Test clean-up.

* jk/skip-http-tests-under-no-curl:
tests: skip dav http-push tests under NO_EXPAT=NoThanks
t/lib-httpd.sh: skip tests if NO_CURL is defined

Merge branch 'dl/subtree-push-no-squash'Junio C Hamano Fri, 22 May 2015 19:41:43 +0000 (12:41 -0700)

Merge branch 'dl/subtree-push-no-squash'

"git subtree" script (in contrib/) does not have --squash option
when pushing, but the documentation and help text pretended as if
it did.

* dl/subtree-push-no-squash:
contrib/subtree: there's no push --squash

Merge branch 'sg/completion-omit-credential-helpers'Junio C Hamano Fri, 22 May 2015 19:41:42 +0000 (12:41 -0700)

Merge branch 'sg/completion-omit-credential-helpers'

The Git subcommand completion (in contrib/) listed credential
helpers among candidates, which is not something the end user would
invoke interatively.

* sg/completion-omit-credential-helpers:
completion: remove credential helpers from porcelain commands

Merge branch 'dl/branch-error-message'Junio C Hamano Fri, 22 May 2015 19:41:41 +0000 (12:41 -0700)

Merge branch 'dl/branch-error-message'

Error messages from "git branch" called remote-tracking branches as
"remote branches".

* dl/branch-error-message:
branch: do not call a "remote-tracking branch" a "remote branch"

for-each-ref: accept "%(push)" formatJeff King Thu, 21 May 2015 04:45:55 +0000 (00:45 -0400)

for-each-ref: accept "%(push)" format

Just as we have "%(upstream)" to report the "@{upstream}"
for each ref, this patch adds "%(push)" to match "@{push}".
It supports the same tracking format modifiers as upstream
(because you may want to know, for example, which branches
have commits to push).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

for-each-ref: use skip_prefix instead of starts_withJeff King Thu, 21 May 2015 04:45:51 +0000 (00:45 -0400)

for-each-ref: use skip_prefix instead of starts_with

This saves us having to maintain a magic number to skip past
the matched prefix.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

sha1_name: implement @{push} shorthandJeff King Thu, 21 May 2015 04:45:47 +0000 (00:45 -0400)

sha1_name: implement @{push} shorthand

In a triangular workflow, each branch may have two distinct
points of interest: the @{upstream} that you normally pull
from, and the destination that you normally push to. There
isn't a shorthand for the latter, but it's useful to have.

For instance, you may want to know which commits you haven't
pushed yet:

git log @{push}..

Or as a more complicated example, imagine that you normally
pull changes from origin/master (which you set as your
@{upstream}), and push changes to your own personal fork
(e.g., as myfork/topic). You may push to your fork from
multiple machines, requiring you to integrate the changes
from the push destination, rather than upstream. With this
patch, you can just do:

git rebase @{push}

rather than typing out the full name.

The heavy lifting is all done by branch_get_push; here we
just wire it up to the "@{push}" syntax.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

sha1_name: refactor interpret_upstream_markJeff King Thu, 21 May 2015 04:45:43 +0000 (00:45 -0400)

sha1_name: refactor interpret_upstream_mark

Now that most of the logic for our local get_upstream_branch
has been pushed into the generic branch_get_upstream, we can
fold the remainder into interpret_upstream_mark.

Furthermore, what remains is generic to any branch-related
"@{foo}" we might add in the future, and there's enough
boilerplate that we'd like to reuse it. Let's parameterize
the two operations (parsing the mark and computing its
value) so that we can reuse this for "@{push}" in the near
future.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

sha1_name: refactor upstream_markJeff King Thu, 21 May 2015 04:45:39 +0000 (00:45 -0400)

sha1_name: refactor upstream_mark

We will be adding new mark types in the future, so separate
the suffix data from the logic.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

remote.c: add branch_get_pushJeff King Thu, 21 May 2015 04:45:36 +0000 (00:45 -0400)

remote.c: add branch_get_push

In a triangular workflow, the place you pull from and the
place you push to may be different. As we have
branch_get_upstream for the former, this patch adds
branch_get_push for the latter (and as the former implements
@{upstream}, so will this implement @{push} in a future
patch).

Note that the memory-handling for the return value bears
some explanation. Some code paths require allocating a new
string, and some let us return an existing string. We should
provide a consistent interface to the caller, so it knows
whether to free the result or not.

We could do so by xstrdup-ing any existing strings, and
having the caller always free. But that makes us
inconsistent with branch_get_upstream, so we would prefer to
simply take ownership of the resulting string. We do so by
storing it inside the "struct branch", just as we do with
the upstream refname (in that case we compute it when the
branch is created, but there's no reason not to just fill
it in lazily in this case).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

remote.c: return upstream name from stat_tracking_infoJeff King Fri, 22 May 2015 00:49:11 +0000 (20:49 -0400)

remote.c: return upstream name from stat_tracking_info

After calling stat_tracking_info, callers often want to
print the name of the upstream branch (in addition to the
tracking count). To do this, they have to access
branch->merge->dst[0] themselves. This is not wrong, as the
return value from stat_tracking_info tells us whether we
have an upstream branch or not. But it is a bit leaky, as we
make an assumption about how it calculated the upstream
name.

Instead, let's add an out-parameter that lets the caller
know the upstream name we found.

As a bonus, we can get rid of the unusual tri-state return
from the function. We no longer need to use it to
differentiate between "no tracking config" and "tracking ref
does not exist" (since you can check the upstream_name for
that), so we can just use the usual 0/-1 convention for
success/error.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

remote.c: untangle error logic in branch_get_upstreamJeff King Fri, 22 May 2015 00:46:43 +0000 (20:46 -0400)

remote.c: untangle error logic in branch_get_upstream

The error-diagnosis logic in branch_get_upstream was copied
straight from sha1_name.c in the previous commit. However,
because we check all error cases and upfront and then later
diagnose them, the logic is a bit tangled. In particular:

- if branch->merge[0] is NULL, we may end up dereferencing
it for an error message (in practice, it should never be
NULL, so this is probably not a triggerable bug).

- We may enter the code path because branch->merge[0]->dst
is NULL, but we then start our error diagnosis by
checking whether our local branch exists. But that is
only relevant to diagnosing missing merge config, not a
missing tracking ref; our diagnosis may hide the real
problem.

Instead, let's just use a sequence of "if" blocks to check
for each error type, diagnose it, and return NULL.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>