Thread (13 messages) flat view 13 messages, 4 authors, 2016-06-15

Re: [PATCH v2] fetch-pack: fix object_id of exact sha1

From: Gabriel Souza Franco <hidden>
Date: 2016-06-15 23:08:34

On Mon, Feb 29, 2016 at 5:30 AM, Johannes Schindelin
[off-list ref] wrote:
Having said that, this *might* be a good opportunity to imitate the
skip_prefix() function. If there are enough similar code constructs, we
could simplify all of them by introducing the function

        skip_oid_hex(const char *str, struct object_id *oid, const char **out)

that returns 1 if and only if an oid was parsed, and stores the pointer
after the oid in "out" (skipping an additional space if there is one)?
I don't think there's any other place that accepts all of "<sha1>",
"<sha1> <ref>" and "<ref>"
based on a quick grep for get_oid_hex.

On Mon, Feb 29, 2016 at 7:00 AM, Jeff King [off-list ref] wrote:
On Sun, Feb 28, 2016 at 07:22:24PM -0300, Gabriel Souza Franco wrote:
quoted
Commit 58f2ed0 (remote-curl: pass ref SHA-1 to fetch-pack as well,
2013-12-05) added support for specifying a SHA-1 as well as a ref name.
Add support for specifying just a SHA-1 and set the ref name to the same
value in this case.

Signed-off-by: Gabriel Souza Franco <redacted>
---

Not the cleanest conditional I've ever written, but it should handle
all cases correctly.
I think it does. But I wonder if it wouldn't be more readable to cover
the three formats independently, like:

  if (!get_oid_hex(name, &ref->old_oid) && name[GIT_SHA1_HEXSZ] == ' ') {
        /* <sha1> <ref>, find refname */
        name += GIT_SHA1_HEXSZ + 1;
  } else if (!get_oid_hex(name, &ref->old_oid) && name[GIT_SHA1_HEXSZ] == '\0') {
        /* <sha1>, leave sha1 as name */
  } else {
        /* <ref>, clear any cruft from get_oid_hex */
        oidclr(&ref->old_oid);
  }

And as a bonus you get rid of the separate "oid".  That does call into
get_oid_hex twice, but I doubt the performance impact is measurable.

We could also do:

  if (!get_oid_hex(name, &ref->old_oid)) {
        if (name[GIT_SHA1_HEXSZ] == ' ') {
                /* <sha1> <ref>, find refname */
                name += GIT_SHA1_HEXSZ + 1;
        } else if (name[GIT_SHA1_HEXSZ] == '\0') {
                /* <sha1>, leave sha1 as name */
        } else {
                /* <ref>, clear cruft from oid */
                oidclr(&ref->old_oid);
        }
  } else {
        /* <ref>, clear cruft from get_oid_hex */
        oidclr(&ref->old_oid);
  }

if you want to minimize the calls at the expense of having to repeat the
oidclr().
I think I like this version more, and is close to what I had initially
before I tried to be clever about it.
Besides, this isn't a performance critical function, so it shouldn't
matter much.
Will send a new (and hopefully final) version shortly.
-Peff
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help