Re: BUG: git request-pull broken for plain branches

2014-06-26 Thread Uwe Kleine-König
Hi Junio,

On Wed, Jun 25, 2014 at 01:41:23PM -0700, Junio C Hamano wrote:
 Uwe Kleine-König  u.kleine-koe...@pengutronix.de writes:
  On Wed, Jun 25, 2014 at 05:05:51AM -0700, Linus Torvalds wrote:
  On Wed, Jun 25, 2014 at 2:55 AM, Uwe Kleine-König
  u.kleine-koe...@pengutronix.de wrote:
  
   $ git rev-parse HEAD
   9e065e4a5a58308f1a0da4bb80b830929dfa90b3
   $ git ls-remote origin | grep 
   9e065e4a5a58308f1a0da4bb80b830929dfa90b3
   9e065e4a5a58308f1a0da4bb80b830929dfa90b3
   refs/heads/ukl/for-mainline
   $ git request-pull origin/master origin HEAD  /dev/null
   warn: No match for commit 
   9e065e4a5a58308f1a0da4bb80b830929dfa90b3 found at origin
   warn: Are you sure you pushed 'HEAD' there?
  
  Notice how HEAD does not match.
  
  The error message is perhaps misleading. It's not enough to match the
  commit. You need to match the branch name too. git used to guess the
  branch name (from the commit), and it often guessed wrongly. So now
  they need to match.
  
  So you should do
  
  git request-pull origin/master origin ukl/for-mainline
  
  to let request-pull know that you're requesting a pull for 
  ukl/for-mainline.
 
 Or
 
   git request-pull origin/master origin HEAD:ukl/for-mainline
 
 I am not Linus, and do not speak for him, but FWIW here are some
 comments on the ideas.
 
  I liked git guessing the branch name, maybe we can teach it to guess a
  bit better than it did before 2.0? Something like:
 
   - if there is a unique match on the remote side, use it.
 
 I am on the fence but slightly leaning to the negative side on this
 one.  The branch/ref the object was took from when git pull is run
 does matter, because the name is recorded in the merge summary, so
 we cannot say There are refs that happen to point at the object you
 wanted to be pulled, so we'll pick one of them let the integrator
 pull from that ref we randomly chose is not something we would
 want.  If there is a unique one, that must be the one the user has
 meant; there is nothing else possible feels like a strong argument,
 and I was actually contemplating about doing an enhancement on top
 of Linus's original myself along that line, back when we queued that
 patch exactly for that reason.
 
 But a counter-argument, in the context of Linus's change in question
 being primarily to avoid end-user mistakes resulting in a bogus
 request, is that the ref on the remote that happens to match the
 object but is different from what the user named may be a totally
 unrelated branch before the user actually has pushed the set of
 changes the request is going to ask to be pulled.  The mistake that
 this extra strictness tries to avoid is to compose request-pull
 before pushing what to be pulled and then forgetting to push.
Sounds sensible. Then the enhancements that come to my mind are:

Change git-request-pull to explicitly take a remote ref as end. This
makes sure that it is actually there and the right remote name is
picked. Don't require to specify a local ref even if there is no
local matching ref, just use the remote sha1 to generate the diffstat
and summary.

Another thing I'd like to have is to make git-request-pull not generate
the usual output if there is no match. Optionally introduce a -f to get
back the (maybe bogus) output; in this case a local rev would be needed.

Best regards
Uwe

-- 
Pengutronix e.K.   | Uwe Kleine-König|
Industrial Linux Solutions | http://www.pengutronix.de/  |
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH V2] branch.c: replace git_config with git_config_get_string

2014-06-26 Thread Tanay Abhra

On 6/25/2014 10:15 AM, Eric Sunshine wrote:
 On Mon, Jun 23, 2014 at 6:41 AM, Tanay Abhra tanay...@gmail.com wrote:

 diff --git a/branch.c b/branch.c
 index 660097b..c9a2a0d 100644
 --- a/branch.c
 +++ b/branch.c
 @@ -140,33 +140,25 @@ static int setup_tracking(const char *new_ref, const 
 char *orig_ref,
 return 0;
  }

 -struct branch_desc_cb {
 +struct branch_desc {
 const char *config_name;
 const char *value;
  };
 
 What is the purpose of retaining this structure? Following your
 changes, it is never used outside of read_branch_desc(), and
 'config_name' and 'value' would be more naturally declared as
 variables local to that function.

Done. :)

 
 -static int read_branch_desc_cb(const char *var, const char *value, void *cb)
 -{
 -   struct branch_desc_cb *desc = cb;
 -   if (strcmp(desc-config_name, var))
 -   return 0;
 -   free((char *)desc-value);
 -   return git_config_string(desc-value, var, value);
 -}
 -
  int read_branch_desc(struct strbuf *buf, const char *branch_name)
  {
 -   struct branch_desc_cb cb;
 +   const char *value = NULL;
 +   struct branch_desc desc;
 struct strbuf name = STRBUF_INIT;
 strbuf_addf(name, branch.%s.description, branch_name);
 -   cb.config_name = name.buf;
 -   cb.value = NULL;
 -   if (git_config(read_branch_desc_cb, cb)  0) {
 +   desc.config_name = name.buf;
 +   desc.value = NULL;
 +   git_config_get_string(desc.config_name, value);
 +   if (git_config_string(desc.value, desc.config_name, value)  0) {
 
 Although it works in this case, it's somewhat ugly that you ignore the
 return value of git_config_get_string(), and a person reading the code
 has to spend extra time digging into git_config_string() to figure out
 why this is safe. If might be clearer for future readers by rephrasing
 like this:
 
 if (git_config_get_string(desc.config_name, value)  0 ||
 git_config_string(desc.value, desc.config_name, value)  0) {


Noted, also didn't the old code leak desc.value as it was xstrduped
by git_config_string()? Thanks for the review.

 strbuf_release(name);
 return -1;
 }
 -   if (cb.value)
 -   strbuf_addstr(buf, cb.value);
 +   strbuf_addstr(buf, desc.value);
 strbuf_release(name);
 return 0;
  }
 --
 1.9.0.GIT
 
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] imap-send.c: replace git_config with git_config_get_string

2014-06-26 Thread Tanay Abhra


On 6/25/2014 12:39 PM, Eric Sunshine wrote:
 On Mon, Jun 23, 2014 at 6:41 AM, Tanay Abhra tanay...@gmail.com wrote:
 Use git_config_get_string instead of git_config to take advantage of
 the config hash-table api which provides a cleaner control flow.
 
 You may want to mention as a side-note the slight behavior change
 introduced by this patch. The original code complained about any
 unknown boolean imap.* key, whereas the new code does not.
 

Also, my code is error prone. Previous one had all NULL values returned
as config_non_boolean. But, now I have to add a NULL check to every strdup
in the code.

More below,

 
 Signed-off-by: Tanay Abhra tanay...@gmail.com
 ---
  imap-send.c | 68 
 ++---
  1 file changed, 29 insertions(+), 39 deletions(-)

 diff --git a/imap-send.c b/imap-send.c
 index 83a6ed2..87bd418 100644
 --- a/imap-send.c
 +++ b/imap-send.c
 @@ -1326,47 +1326,37 @@ static int split_msg(struct strbuf *all_msgs, struct 
 strbuf *msg, int *ofs)

  static char *imap_folder;

 -static int git_imap_config(const char *key, const char *val, void *cb)
 +static void git_imap_config(void)
  {
 -   char imap_key[] = imap.;
 -
 -   if (strncmp(key, imap_key, sizeof imap_key - 1))
 -   return 0;
 -
 -   key += sizeof imap_key - 1;
 -
 -   /* check booleans first, and barf on others */
 -   if (!strcmp(sslverify, key))
 -   server.ssl_verify = git_config_bool(key, val);
 -   else if (!strcmp(preformattedhtml, key))
 -   server.use_html = git_config_bool(key, val);
 -   else if (!val)
 -   return config_error_nonbool(key);
 -
 -   if (!strcmp(folder, key)) {
 -   imap_folder = xstrdup(val);
 -   } else if (!strcmp(host, key)) {
 -   if (starts_with(val, imap:))
 -   val += 5;
 -   else if (starts_with(val, imaps:)) {
 -   val += 6;
 +   const char *value;
 
 Observation: If you name this variable 'val', which is the name of the
 argument to the function in the original code, you will get a slightly
 smaller and more readable diff. 

Noted.

 
 +   if (!git_config_get_string(imap.sslverify, value))
 +   server.ssl_verify = git_config_bool(sslverify, value);
 
 I realize that you are just replicating the behavior of the original
 code, but the error message emitted here for a non-bool value is less
 than desirable since it throws away context (namely, the imap.
 prefix). You can improve the message, and help the user resolve the
 error more quickly, by presenting the full configuration key (namely,
 imap.sslverify). Such a change would deserve mention in the commit
 message. Alternately, it could be fixed in a follow-up patch.
 

Yes, I thought so also when writing the patch. Will change it in the next
iteration.

Thanks.
Tanay Abhra.

 +   if (!git_config_get_string(imap.preformattedhtml, value))
 +   server.use_html = git_config_bool(preformattedhtml, value);
 
 Ditto regarding error message: imap.preformattedhtml
 
 +   if (!git_config_get_string(imap.folder, value))
 +   imap_folder = xstrdup(value);
 +   if (!git_config_get_string(imap.host, value)) {
 +   if (starts_with(value, imap:))
 +   value += 5;
 +   else if (starts_with(value, imaps:)) {
 +   value += 6;
 server.use_ssl = 1;
 }
 -   if (starts_with(val, //))
 -   val += 2;
 -   server.host = xstrdup(val);
 -   } else if (!strcmp(user, key))
 -   server.user = xstrdup(val);
 -   else if (!strcmp(pass, key))
 -   server.pass = xstrdup(val);
 -   else if (!strcmp(port, key))
 -   server.port = git_config_int(key, val);
 -   else if (!strcmp(tunnel, key))
 -   server.tunnel = xstrdup(val);
 -   else if (!strcmp(authmethod, key))
 -   server.auth_method = xstrdup(val);
 -
 -   return 0;
 +   if (starts_with(value, //))
 +   value += 2;
 +   server.host = xstrdup(value);
 +   }
 +   if (!git_config_get_string(imap.user, value))
 +   server.user = xstrdup(value);
 +   if (!git_config_get_string(imap.pass, value))
 +   server.pass = xstrdup(value);
 +   if (!git_config_get_string(imap.port, value))
 +   server.port = git_config_int(port, value);
 
 Same regarding diagnostic: imap.port
 
 +   if (!git_config_get_string(imap.tunnel, value))
 +   server.tunnel = xstrdup(value);
 +   if (!git_config_get_string(imap.authmethod, value))
 +   server.auth_method = xstrdup(value);
  }

  int main(int argc, char **argv)
 @@ -1387,7 +1377,7 @@ int main(int argc, char **argv)
 usage(imap_send_usage);

 

Re: [RFC/PATCH] notes-util.c: replace git_config with git_config_get_string

2014-06-26 Thread Tanay Abhra


On 6/25/2014 1:24 PM, Eric Sunshine wrote:
 On Mon, Jun 23, 2014 at 6:41 AM, Tanay Abhra tanay...@gmail.com wrote:
 Use git_config_get_string instead of git_config to take advantage of
 the config hash-table api which provides a cleaner control flow.

 Signed-off-by: Tanay Abhra tanay...@gmail.com
 ---
  notes-utils.c | 31 +++
  1 file changed, 15 insertions(+), 16 deletions(-)

 diff --git a/notes-utils.c b/notes-utils.c
 index a0b1d7b..fdc9912 100644
 --- a/notes-utils.c
 +++ b/notes-utils.c
 @@ -68,22 +68,23 @@ static combine_notes_fn parse_combine_notes_fn(const 
 char *v)
 return NULL;
  }

 -static int notes_rewrite_config(const char *k, const char *v, void *cb)
 +static void notes_rewrite_config(struct notes_rewrite_cfg *c)
  {
 -   struct notes_rewrite_cfg *c = cb;
 -   if (starts_with(k, notes.rewrite.)  !strcmp(k+14, c-cmd)) {
 -   c-enabled = git_config_bool(k, v);
 -   return 0;
 -   } else if (!c-mode_from_env  !strcmp(k, notes.rewritemode)) {
 +   struct strbuf key = STRBUF_INIT;
 +   const char *v;
 +   strbuf_addf(key, notes.rewrite.%s, c-cmd);
 +
 +   if (!git_config_get_string(key.buf, v))
 +   c-enabled = git_config_bool(key.buf, v);
 +
 +   if (!c-mode_from_env  !git_config_get_string(notes.rewritemode, 
 v)) {
 if (!v)
 -   return config_error_nonbool(k);
 +   config_error_nonbool(notes.rewritemode);
 
 There's a behavior change here. In the original code, the callback
 function would return -1, which would cause the program to die() if
 the config.c:die_on_error flag was set. The new code merely emits an
 error.
 

Is this change serious enough? Can I ignore it?

 c-combine = parse_combine_notes_fn(v);
 
 Worse: Though you correctly emit an error when 'v' is NULL, you then
 (incorrectly) invoke parse_combine_notes_fn() with that NULL value,
 which will result in a crash.
 

Noted.

 -   if (!c-combine) {
 +   if (!c-combine)
 error(_(Bad notes.rewriteMode value: '%s'), v);
 -   return 1;
 -   }
 -   return 0;
 -   } else if (!c-refs_from_env  !strcmp(k, notes.rewriteref)) {
 +   }
 +   if (!c-refs_from_env  !git_config_get_string(notes.rewriteref, 
 v)) {
 /* note that a refs/ prefix is implied in the
  * underlying for_each_glob_ref */
 if (starts_with(v, refs/notes/))
 @@ -91,10 +92,8 @@ static int notes_rewrite_config(const char *k, const char 
 *v, void *cb)
 else
 warning(_(Refusing to rewrite notes in %s
  (outside of refs/notes/)), v);
 -   return 0;
 }
 -
 -   return 0;
 +   strbuf_release(key);
 
 It would be better to release the strbuf immediately after its final
 use rather than waiting until the end of function. Not only does that
 reduce cognitive load on people reading the code, but it also reduces
 likelihood of 'key' being leaked if some future programmer inserts an
 early 'return' into the function for some reason.
 

Noted. Thanks.

  }


 @@ -123,7 +122,7 @@ struct notes_rewrite_cfg 
 *init_copy_notes_for_rewrite(const char *cmd)
 c-refs_from_env = 1;
 string_list_add_refs_from_colon_sep(c-refs, 
 rewrite_refs_env);
 }
 -   git_config(notes_rewrite_config, c);
 +   notes_rewrite_config(c);
 if (!c-enabled || !c-refs-nr) {
 string_list_clear(c-refs, 0);
 free(c-refs);
 --
 1.9.0.GIT
 
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] notes.c: replace git_config with git_config_get_string

2014-06-26 Thread Tanay Abhra


On 6/25/2014 1:36 PM, Eric Sunshine wrote:
 On Mon, Jun 23, 2014 at 6:41 AM, Tanay Abhra tanay...@gmail.com wrote:
 Use git_config_get_string instead of git_config to take advantage of
 the config hash-table api which provides a cleaner control flow.

 Signed-off-by: Tanay Abhra tanay...@gmail.com
 ---
  notes.c | 20 ++--
  1 file changed, 6 insertions(+), 14 deletions(-)

 diff --git a/notes.c b/notes.c
 index 5fe691d..fc92eec 100644
 --- a/notes.c
 +++ b/notes.c
 @@ -961,19 +961,6 @@ void string_list_add_refs_from_colon_sep(struct 
 string_list *list,
 free(globs_copy);
  }

 -static int notes_display_config(const char *k, const char *v, void *cb)
 -{
 -   int *load_refs = cb;
 -
 -   if (*load_refs  !strcmp(k, notes.displayref)) {
 -   if (!v)
 -   config_error_nonbool(k);
 -   string_list_add_refs_by_glob(display_notes_refs, v);
 -   }
 -
 -   return 0;
 -}
 -
  const char *default_notes_ref(void)
  {
 const char *notes_ref = NULL;
 @@ -1041,6 +1028,7 @@ struct notes_tree **load_notes_trees(struct 
 string_list *refs)
  void init_display_notes(struct display_notes_opt *opt)
  {
 char *display_ref_env;
 +   const char *value;
 int load_config_refs = 0;
 display_notes_refs.strdup_strings = 1;

 @@ -1058,7 +1046,11 @@ void init_display_notes(struct display_notes_opt *opt)
 load_config_refs = 1;
 }

 -   git_config(notes_display_config, load_config_refs);
 +   if (load_config_refs  !git_config_get_string(notes.displayref, 
 value)) {
 +   if (!value)
 +   config_error_nonbool(notes.displayref);
 +   string_list_add_refs_by_glob(display_notes_refs, value);
 
 Although you correctly diagnose a NULL 'value', you then invoke
 string_list_add_refs_by_glob() with that NULL, which will result in a
 crash.
 
 This is not a new error. It dates back to 894a9d33 (Support showing
 notes from more than one notes tree; 2010-03-12), but your rewrite
 should not retain the brokenness. Whether you fix it in this patch or
 a lead-in fix-up patch, the fix deserves mention in the commit
 message.

Done. Thanks.

 +   }

 if (opt) {
 struct string_list_item *item;
 --
 1.9.0.GIT
 
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH V2] alias.c: replace git_config with git_config_get_string

2014-06-26 Thread Tanay Abhra


On 6/25/2014 7:42 AM, Eric Sunshine wrote:
 On Mon, Jun 23, 2014 at 6:41 AM, Tanay Abhra tanay...@gmail.com wrote:
 Use git_config_get_string instead of git_config to take advantage of
 the config hash-table api which provides a cleaner control flow.

 Signed-off-by: Tanay Abhra tanay...@gmail.com
 ---
  alias.c | 28 ++--
  1 file changed, 10 insertions(+), 18 deletions(-)

 diff --git a/alias.c b/alias.c
 index 5efc3d6..0fe32bc 100644
 --- a/alias.c
 +++ b/alias.c
 @@ -1,25 +1,17 @@
  #include cache.h

 -static const char *alias_key;
 -static char *alias_val;
 -
 -static int alias_lookup_cb(const char *k, const char *v, void *cb)
 -{
 -   if (starts_with(k, alias.)  !strcmp(k + 6, alias_key)) {
 -   if (!v)
 -   return config_error_nonbool(k);
 -   alias_val = xstrdup(v);
 -   return 0;
 -   }
 -   return 0;
 -}
 -
  char *alias_lookup(const char *alias)
  {
 -   alias_key = alias;
 -   alias_val = NULL;
 -   git_config(alias_lookup_cb, NULL);
 -   return alias_val;
 +   const char *v;
 +   char *value;
 +   struct strbuf key = STRBUF_INIT;
 +   strbuf_addf(key, alias.%s, alias);
 +   git_config_get_string(key.buf, v);
 +   if (!v)
 +   config_error_nonbool(key.buf);
 
 If 'v' is NULL, you correctly report an error, but then fall through
 and invoke xstrdup() with NULL, which invites undefined behavior [1].
 
 [1]: http://pubs.opengroup.org/onlinepubs/009695399/functions/strdup.html
 
 +   value = xstrdup(v);
 +   strbuf_release(key);
 +   return value;
 
 You could release the strbuf earlier, which would allow you to 'return
 xstrdup(v)' and drop the 'value' variable. Perhaps you want something
 like this:
 
 const char *v;
 struct strbuf key = STRBUF_INIT;
 strbuf_addf(key, alias.%s, alias);
 git_config_get_string(key.buf, v);
 if (v)
 config_error_nonbool(key.buf);
 strbuf_release(key);
 return v ? xstrdup(v) : NULL;
 

Done. Thanks.

  }

  #define SPLIT_CMDLINE_BAD_ENDING 1
 --
 1.9.0.GIT
 
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] pager.c: replace git_config with git_config_get_string

2014-06-26 Thread Tanay Abhra


On 6/25/2014 9:29 AM, Eric Sunshine wrote:
 On Mon, Jun 23, 2014 at 6:41 AM, Tanay Abhra tanay...@gmail.com wrote:
 Use git_config_get_string instead of git_config to take advantage of
 the config hash-table api which provides a cleaner control flow.

 Signed-off-by: Tanay Abhra tanay...@gmail.com
 ---
  pager.c | 44 +++-
  1 file changed, 15 insertions(+), 29 deletions(-)

 diff --git a/pager.c b/pager.c
 index 8b5cbc5..96abe6d 100644
 --- a/pager.c
 +++ b/pager.c
 @@ -6,12 +6,6 @@
  #define DEFAULT_PAGER less
  #endif

 -struct pager_config {
 -   const char *cmd;
 -   int want;
 -   char *value;
 -};
 -
  /*
   * This is split up from the rest of git so that we can do
   * something different on Windows.
 @@ -155,30 +149,22 @@ int decimal_width(int number)
 return width;
  }

 -static int pager_command_config(const char *var, const char *value, void 
 *data)
 -{
 -   struct pager_config *c = data;
 -   if (starts_with(var, pager.)  !strcmp(var + 6, c-cmd)) {
 -   int b = git_config_maybe_bool(var, value);
 -   if (b = 0)
 -   c-want = b;
 -   else {
 -   c-want = 1;
 -   c-value = xstrdup(value);
 -   }
 -   }
 -   return 0;
 -}
 -
  /* returns 0 for no pager, 1 for use pager, and -1 for not specified 
 */
  int check_pager_config(const char *cmd)
  {
 -   struct pager_config c;
 -   c.cmd = cmd;
 -   c.want = -1;
 -   c.value = NULL;
 -   git_config(pager_command_config, c);
 -   if (c.value)
 -   pager_program = c.value;
 -   return c.want;
 +   struct strbuf key = STRBUF_INIT;
 +   int want = -1;
 +   const char *value = NULL;
 +   strbuf_addf(key, pager.%s, cmd);
 +   if (!git_config_get_string(key.buf, value)) {
 +   int b = git_config_maybe_bool(key.buf, value);
 +   if (b = 0)
 +   want = b;
 +   else
 +   want = 1;
 +   }
 +   if (value)
 +   pager_program = value;
 
 Two issues:
 
 First, why is 'if(value)' standing by itself? Although this works, it
 seems to imply that 'value' might be able to become non-NULL by some
 mechanism other than the get_config_maybe_bool() call, which means
 that people reading this code have to spend extra time trying to
 understand the overall logic. If you follow the example of the
 original code, where 'value' is only ever set when 'b  0', then it is
 obvious even to the most casual reader that 'pager_program' is
 assigned only for that one condition.
 

Noted.

 Second, don't you want to xstrdup(value) when assigning to
 'pager_program'? If you don't, then 'pager_program' will become a
 dangling pointer when config_cache_free() is invoked.
 

Noted. Thanks.

 +   strbuf_release(key);
 +   return want;
  }
 --
 1.9.0.GIT
 
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 3/3] test-config: add usage examples for non-callback query functions

2014-06-26 Thread Tanay Abhra
Hi,

I thought about adding a test*.sh file after sending the series.
No worries, I will rectify it in the next patch.
Also, I have read all your comments.

Thanks for the review.

Cheers,
Tanay Abhra.

On 6/25/2014 4:49 PM, Eric Sunshine wrote:
 On Mon, Jun 23, 2014 at 6:11 AM, Tanay Abhra tanay...@gmail.com wrote:
 Add different usage examples for 'git_config_get_string' and
 `git_config_get_string_multi`. They will serve as documentation
 on how to query for config values in a non-callback manner.
 
 This is a good start, but it's not fully what Matthieu was suggesting
 when he said that you should prove to other developers, by way of
 reproducible tests, that your changes work. What he meant, was that
 you should write a test-config program which exposes (as a runnable
 command) the new config C API you've added, and then write tests which
 exercise that API and implementation exhaustively.
 
 For example, take a look at test-string-list.c and
 t/t0063-string-list.sh. The C program does no checking itself. It
 merely exposes the C API via command-line arguments, such as split,
 filter, etc. The test script then employs that program to perform
 the actual testing in a reproducible and (hopefully) exhaustive
 fashion. Because t/t0063-string-list.sh is part of the test suite, the
 string-list tests are run regularly by many developers. It's not just
 something that someone might remember to run once in a while.
 
 Contrary to your commit message and the comment in the program itself,
 the purpose of test-config is not to serve as documentation or to
 provide examples of usage. (Real documentation is better suited for
 those purposes.) Instead, test-config should exist in support of a
 real test script in t/ which is run regularly. The new script you add
 to t/ should exercise the exposed C API as exhaustively as possible.
 This means checking each possible state: for instance, (1) when a key
 is absent, (2) when a value is boolean (NULL), (3) one non-boolean
 (non-NULL) value, (4) multiple values, etc. Moreover, it should check
 expected success _and_ expected failure modes. Check not only that it
 returns expected values, but that it fails when appropriate.
 
 More below.
 
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[BUG/RFC] cherry-pick adds newline to last line of file

2014-06-26 Thread Max Kirillov
Hi.

If a file does not contain newline in the last line, and the file has
changed somewhere
in other branch, and the newline has not been not added in that
change, when I cherry-pick the commit, the commit does contain the
newline in the last line. This sometimes leads to conflict and in
general looks unexpected.

Such files are not uncommon nowadays and however bad it is, I think
merging and cherry-picking should try to keep is as long as the
newline is not added in some of the changes. Are there any option to
preserve the absence of the closing newline? Or maybe the commands
should preserve it unconditionally?

-- 
Max
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v20 13/48] refs.c: make resolve_ref_unsafe set errno to something meaningful on error

2014-06-26 Thread Karsten Blees
Am 20.06.2014 16:42, schrieb Ronnie Sahlberg:
 + errno = ELOOP;

This fails on MinGW and MSVC  2010. Perhaps add this to compat/mingw.h?

 #ifndef ELOOP
 #define ELOOP EMLINK
 #endif

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


GOOD DAY,

2014-06-26 Thread KONG HUI



My name is Kong Hui from Hong Kong, I want you to be my partner in a
business project.

If Interested Contact me back via my email address.


Thank you,
Mr. Kong Hui.

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH (performance tracing)] test git-status performance

2014-06-26 Thread Duy Nguyen
On Wed, Jun 25, 2014 at 5:56 AM, Karsten Blees karsten.bl...@gmail.com wrote:
  void wt_status_collect(struct wt_status *s)
  {
 +   uint64_t start = getnanotime();
 +
 wt_status_collect_changes_worktree(s);

 +   trace_performance_since(start, wt_status_collect_changes_worktree);
 +   start = getnanotime();
 +
 if (s-is_initial)
 wt_status_collect_changes_initial(s);
 else
 wt_status_collect_changes_index(s);
 +
 +   trace_performance_since(start, wt_status_collect_changes_index);
 +   start = getnanotime();
 +
 wt_status_collect_untracked(s);
 +
 +   trace_performance_since(start, wt_status_collect_untracked);
  }

Now that we have good perf measuring support, perhaps the next step is
remove gettimeofday() in advice_status_u_option related code in
wt_status_collect_untracked().
-- 
Duy
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Is it possible to list unpushed tags without accessing remote?

2014-06-26 Thread Kirill Likhodedov
Hi,

is it possible to know which tags are not yet pushed to a remote via a 
completely local command?

(e.g. the list of unpushed _commits_ may be received by ‘git log upstream..’)

I know it is possible to execute 'git ls-remote’ or 'git push --dry-run’, but 
both ask the remote server.
I’m almost sure that the answer is “NO”, but want to receive a confirmation 
from Git gurus :)


Thanks a lot!
-- Kirill.--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] Fix: wrong offset for CET timezone

2014-06-26 Thread Alan Franzoni
From: Alan Franzoni usern...@franzoni.eu

Signed-off-by: Alan Franzoni usern...@franzoni.eu
---
 Documentation/date-formats.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Documentation/date-formats.txt b/Documentation/date-formats.txt
index ccd1fc8..284308a 100644
--- a/Documentation/date-formats.txt
+++ b/Documentation/date-formats.txt
@@ -11,7 +11,7 @@ Git internal format::
It is `unix timestamp time zone offset`, where `unix
timestamp` is the number of seconds since the UNIX epoch.
`time zone offset` is a positive or negative offset from UTC.
-   For example CET (which is 2 hours ahead UTC) is `+0200`.
+   For example CET (which is 1 hour ahead UTC) is `+0100`.
 
 RFC 2822::
The standard email format as described by RFC 2822, for example
-- 
2.0.0

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 4/8] add functions for memory-efficient bitmaps

2014-06-26 Thread Jeff King
On Thu, Jun 26, 2014 at 05:15:05AM +0200, Torsten Bögershausen wrote:

  + */
  +static inline int bitset_sizeof(int num_bits)
  +{
  +   return (num_bits + CHAR_BIT - 1) / CHAR_BIT;
  +}
 Just a general question about the usage of int here (and at other places):
 Is there a special reason for new code to allow num_bits to be negative ?

No. I usually choose int when the word size is not likely to matter
(i.e., we do not expect it to overflow a 32-bit integer, nor to have so
many that I need to be careful not to waste space).

Probably unsigned int would be a more descriptive choice.

It may also help the compiler optimize better. Assuming CHAR_BIT is 8
(i.e., most everywhere), we get:

  (num_bits + 7) / 8

Presumably the compiler implements the division with a right-shift.
Marking num_bits as unsigned should let us do just a logical shift,
without worrying about the sign. And indeed, here are the signed and
unsigned versions produced by gcc -S -O2 (for an equivalent
non-inlined function):

  [signed]
leal14(%rdi), %edx
movl%edi, %eax
addl$7, %eax
cmovs   %edx, %eax
sarl$3, %eax
ret

  [unsigned]
leal7(%rdi), %eax
shrl$3, %eax
ret

Much simpler, though see below for practical considerations.

 To my knowledge all the size_t definitions these days are positive,
 because a size can not be negative.

size_t is perhaps a reasonable choice for the return value, given the name
sizeof. But if you really care about using the whole range of bits there, you
need a data type for num_bits that is CHAR_BIT times larger.

 Should we use
 unsigned here ?
 or unsigned int ?

Yes, I think so. Both are the same to the compiler. I have a vague
recollection that we prefer one over the other, but grepping seems to
find many examples of each in our code.

I'm squashing in the patch below. I couldn't measure any speed
improvement. I'm guessing because the functions are all inlined, which
means we likely get away with calculating bitset_sizeof once outside of
our loop. I think the result is still more obvious to read, though.

-Peff

---
diff --git a/bitset.h b/bitset.h
index 5fbc956..268545b 100644
--- a/bitset.h
+++ b/bitset.h
@@ -45,7 +45,7 @@
  *
  *   bits = xcalloc(1, bitset_sizeof(nr));
  */
-static inline int bitset_sizeof(int num_bits)
+static inline unsigned bitset_sizeof(unsigned num_bits)
 {
return (num_bits + CHAR_BIT - 1) / CHAR_BIT;
 }
@@ -54,7 +54,7 @@ static inline int bitset_sizeof(int num_bits)
  * Set the bit at position n. n is counted from zero, and must be
  * smaller than the num_bits given to bitset_sizeof when allocating the bitset.
  */
-static inline void bitset_set(unsigned char *bits, int n)
+static inline void bitset_set(unsigned char *bits, unsigned n)
 {
bits[n / CHAR_BIT] |= 1  (n % CHAR_BIT);
 }
@@ -62,7 +62,7 @@ static inline void bitset_set(unsigned char *bits, int n)
 /*
  * Return the bit at position n (see bitset_set for a description of n).
  */
-static inline int bitset_get(unsigned char *bits, int n)
+static inline unsigned bitset_get(unsigned char *bits, unsigned n)
 {
return !!(bits[n / CHAR_BIT]  (1  (n % CHAR_BIT)));
 }
@@ -75,9 +75,10 @@ static inline int bitset_get(unsigned char *bits, int n)
  * max (we assume any bits beyond max up to the next CHAR_BIT boundary are
  * zeroed padding).
  */
-static inline int bitset_equal(unsigned char *a, unsigned char *b, int max)
+static inline int bitset_equal(unsigned char *a, unsigned char *b,
+  unsigned max)
 {
-   int i;
+   unsigned i;
for (i = bitset_sizeof(max); i  0; i--)
if (*a++ != *b++)
return 0;
@@ -89,9 +90,10 @@ static inline int bitset_equal(unsigned char *a, unsigned 
char *b, int max)
  *
  * See bitset_equal for the definition of max.
  */
-static inline void bitset_or(unsigned char *dst, const unsigned char *src, int 
max)
+static inline void bitset_or(unsigned char *dst, const unsigned char *src,
+unsigned max)
 {
-   int i;
+   unsigned i;
for (i = bitset_sizeof(max); i  0; i--)
*dst++ |= *src++;
 }
@@ -101,9 +103,9 @@ static inline void bitset_or(unsigned char *dst, const 
unsigned char *src, int m
  *
  * See bitset_equal for the definition of max.
  */
-static inline int bitset_empty(const unsigned char *bits, int max)
+static inline int bitset_empty(const unsigned char *bits, unsigned max)
 {
-   int i;
+   unsigned i;
for (i = bitset_sizeof(max); i  0; i--, bits++)
if (*bits)
return 0;
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 4/4] replace: add a --raw mode for --edit

2014-06-26 Thread Jeff King
On Wed, Jun 25, 2014 at 03:33:42PM -0700, Junio C Hamano wrote:

 Jeff King p...@peff.net writes:
 
  One of the purposes of git replace --edit is to help a
  user repair objects which are malformed or corrupted.
  Usually we pretty-print trees with ls-tree, which is much
  easier to work with than the raw binary data.  However, some
  forms of corruption break the tree-walker, in which case our
  pretty-printing fails, rendering --edit useless for the
  user.
 
  This patch introduces a --raw option, which lets you edit
  the binary data in these instances.
 
  Signed-off-by: Jeff King p...@peff.net
  ---
 
 Hm, this feels almost like inviting accidents to make it easy
 and limiting the attempt to only one shot at the transformation
 step.
 
 Will queue, but we can do the same with cat-file $type temp, do
 some transformation on temp, doubly make sure what is in temp is
 sensible and then finally hash-object -w -t $type temp.  And it
 makes me feel uneasy that the new feature seems to make it harder to
 do the doubly make sure part.

I do not think it is any worse than --edit is by itself. True, editing
the binary contents is hard, but we do check that the format is sane
when we read it back in (using the same checks that hash-object does). I
think it would be nice to take that a step further and actually let
hash-object (and replace --edit) do the more rigorous fsck checks on
created objects.

I do still think even with those automated sanity checks that it makes
sense to double-check the replacement manually. But I think that is one
of the features of replace objects: you are not doing anything
permanent, and can view the object in place. So not only can you examine
the object by git show $new_sha1, you can see it in place as git log
-p, etc. And easily back it out with git replace -d (or fix it up
again with git replace --edit) if need be.

-Peff
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: Is it possible to list unpushed tags without accessing remote?

2014-06-26 Thread Shawn Pearce
On Thu, Jun 26, 2014 at 5:42 AM, Kirill Likhodedov
kirill.likhode...@jetbrains.com wrote:
 is it possible to know which tags are not yet pushed to a remote via a 
 completely local command?

 (e.g. the list of unpushed _commits_ may be received by ‘git log 
 upstream..’)

 I know it is possible to execute 'git ls-remote’ or 'git push --dry-run’, but 
 both ask the remote server.
 I’m almost sure that the answer is “NO”, but want to receive a confirmation 
 from Git gurus :)

No. The client doesn't track what tags the remote has.

You may be able to guess by looking at `git log --decorate upstream..`
and seeing which tags, if any show up.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 2/3] config: add hashtable for config parsing retrieval

2014-06-26 Thread Matthieu Moy
Ramsay Jones ram...@ramsay1.demon.co.uk writes:

 Hmm, maybe. The ... take advantage of the new code refers to the
 possibility (or otherwise) of re-using your work to update these
 older API functions to the new API style. (also, see Junio's response).

I agree that, while caching the usual config files is the most
important, allowing other users of the config code to use non-callback
functions would be nice too.

Not really for efficiency, but because I find it far more natural to ask
what's the value of config key XYZ to the code than to ask can you
parse all config keys in the file, let me know, and I'll tell you later
which ones I'm interested in.

 [In order to do this, I would have expected to see one hash table
 for each file/blob, so the singleton object took me by surprise.]

The singleton could be fine as long as it is optional. We can have
an API looking like:

int git_config_get_string(const char *key, const char **value) {
return git_config_get_string_from(the singleton config cache,
  key, value);
}

int git_config_get_string_from(struct hashmap *map, const char *key, const char 
**value);

(or take a structure representing a set of config files instead of
directly the hashmap)

Now, the good news is that such API can be written later, without
breaking the API. So I'd say it's fine to keep the code as-is for now,
and make it more general later. No strong opinion, though.

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 2/3] config: add hashtable for config parsing retrieval

2014-06-26 Thread Matthieu Moy
Tanay Abhra tanay...@gmail.com writes:

 For the config_cache_free(), would this change be enough?

 +static void config_cache_free(void)
 +{
 + struct hashmap *config_cache;
 + struct config_cache_entry *entry;
 + struct hashmap_iter iter;
 + if (!hashmap_initialized)
 + return;
 + config_cache = get_config_cache();

That sounds better to me. And it justifies the different scopes: one can
ask whether the map is initialized from anywhere in the file, but can
only get the map after initialization, so it prevents mis-use of an
uninitialized pointer.

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH V2] alias.c: replace git_config with git_config_get_string

2014-06-26 Thread Matthieu Moy
Tanay Abhra tanay...@gmail.com writes:

 the config hash-table api which provides a cleaner control flow.

api - API

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 2/3] config: add hashtable for config parsing retrieval

2014-06-26 Thread Matthieu Moy
Tanay Abhra tanay...@gmail.com writes:

 +Querying For Specific Variables
 +---
 +
 +For programs wanting to query for specific variables in a non-callback
 +manner, the config API provides two functions `git_config_get_string`
 +and `git_config_get_string_multi`.They both read values from an internal
 +cache generated previously from reading the config files.
 +
 +`git_config_get_string` takes two parameters,
 +
 +- a key string in canonical flat form for which the corresponding value
 +  with the highest priority (i.e. value in the repo config will be
 +  preferred over value in user wide config for the same variable) will
 +  be retrieved.
 +
 +- a pointer to a string which will point to the retrieved value.
 +
 +`git_config_get_string` returns 0 for success, or -1 for no value found.
 +
 +`git_config_get_string_multi` returns a `string_list` containing all the
 +values for the key passed as parameter, sorted in order of increasing
 +priority (Note: NULL values are flagged as 1, check `util` for each
 +'string_list_item` for flag value).

I think you need to add something like:

   Both functions return pointers to values owned by the config cache. The
   caller need not free them, but should not modify them.

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: files deleted with no record?

2014-06-26 Thread Phil Hord
On Mon, Jun 23, 2014 at 9:15 PM, Jeremy Scott jer...@great-scotts.org wrote:
 I just encountered a situation where a merge was made, with no
 apparent changes in files (ie no log), but the result was that some
 files were deleted.

 person A adds some files
 person B adds some files from the same point

You mean from the same point in history, right?  Not files with the
same filename or path?

 person B commits and pushes.
 person A commits -- now merge is required
 a few more commits on top of person B's commit

I don't understand this step.  Who adds a few more commits on top of B and why?

 person A merges - this removes the files that B added. There is no log
 of the files being deleted

This sounds like an evil merge (see man gitglossary, and google),
but it's not clear to me how you arrived here.

When I tried to reproduce your issue with this script, it did not
remove any files unexpectedly:
---8---
#!/bin/sh

set -e
mkdir foo  cd foo  git init
echo foo  foo  git add foo  git commit -mfoo

git checkout -b PersonA master
echo bar  bar  git add bar
git commit -mPersonA: bar

git checkout -b PersonB master
echo baz  baz  git add baz
git commit -mPersonB: baz

echo foo-conflict  foo  git add foo
git commit -mPersonB: foo

git checkout PersonA
echo foo-different  foo  git add foo
git commit -mPersonA: foo (conflicts with PersonB)

git log --oneline --all --stat

if ! git merge PersonB ; then
  git checkout PersonA foo
  git commit --no-edit
fi
git log --oneline --graph --stat
---8---

A sneaky issue with merges is that they do not have a clear way to
show patch information -- the diff between the commit and its ancestor
-- because they have multiple ancestors.  You can show diffs for a
merge relative to each of its parents, but it is not usually done for
you automatically.  This is why making changes in a merge which are
not actually required for the merge is bad (evil).

 Clearly this is possible - was this a user error?

Probably, but we'd need to see how the user got there.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] imap-send.c: replace git_config with git_config_get_string

2014-06-26 Thread Matthieu Moy
Tanay Abhra tanay...@gmail.com writes:

 + if (!git_config_get_string(imap.user, value))
 + server.user = xstrdup(value);
 + if (!git_config_get_string(imap.pass, value))
 + server.pass = xstrdup(value);
 + if (!git_config_get_string(imap.port, value))
 + server.port = git_config_int(port, value);
 + if (!git_config_get_string(imap.tunnel, value))
 + server.tunnel = xstrdup(value);
 + if (!git_config_get_string(imap.authmethod, value))
 + server.auth_method = xstrdup(value);

Given this kind of systematic code, I find it very tempting to factor
this with a new helper function as

...
git_config_get_string_dup(imap.tunnel, server.tunnel)
git_config_get_string_dup(imap.authmethod, server.auth_method)

Is there any reason not to do so?

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: Is it possible to list unpushed tags without accessing remote?

2014-06-26 Thread Andreas Schwab
Shawn Pearce spea...@spearce.org writes:

 On Thu, Jun 26, 2014 at 5:42 AM, Kirill Likhodedov
 kirill.likhode...@jetbrains.com wrote:
 is it possible to know which tags are not yet pushed to a remote via a 
 completely local command?

 (e.g. the list of unpushed _commits_ may be received by ‘git log 
 upstream..’)

 I know it is possible to execute 'git ls-remote’ or 'git push --dry-run’, 
 but both ask the remote server.
 I’m almost sure that the answer is “NO”, but want to receive a confirmation 
 from Git gurus :)

 No. The client doesn't track what tags the remote has.

Not by default, but it is easy to configure your clone to fetch tags to
a separate namespace.

Andreas.

-- 
Andreas Schwab, sch...@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
And now for something completely different.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 2/3] config: add hashtable for config parsing retrieval

2014-06-26 Thread Matthieu Moy
Junio C Hamano gits...@pobox.com writes:

 When the submodule script that uses git config -f .gitmodules is
 converted into C, if the updated config API is ready, it may be able
 to do something like these in a single program:

   const char *url;
   struct config_set *gm_config;

 /* read from $GIT_DIR/config */
 url = git_config_get_string(remote.origin.url);

 /*
  * allow us to read from .gitmodules; the parameters are
  * list of files that make up the configset, perhaps.
  */
   gm_config = git_configset_new(.gitmodules, NULL);


 if (!git_configset_get_bool(gm_config, submodule.frotz.ignore)) {
   /* do a lot of stuff for the submodule */
 ...
   }

 /* when we are done with the configset */
 git_configset_clear(gm_config);

Isn't that a bit overkill? Why not just let the caller manage a hashmap
directly instead of a config_set? Your code could become

  struct hashmap *gm_config;
  config_cache_init(gm_config);
  config_cache_read_from_file(.gitmodule, gm_config);
  /* possibly more calls to
 config_cache_read_from_file(some-other-file, ...). */
  
and then

  if (!git_configset_get_bool(gm_config, submodule.frotz.ignore)) {
 ...
  

Perhaps a bit more complicated to use, but much simpler to implement.
Since there are very few callers, I'd say it's better to keep the
implementation simple.

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 4/4] diff: mark any file larger than core.bigfilethreshold binary

2014-06-26 Thread Junio C Hamano
Nguyễn Thái Ngọc Duy  pclo...@gmail.com writes:

 Too large files may lead to failure to allocate memory. If it happens
 here, it could impact quite a few commands that involve
 diff. Moreover, too large files are inefficient to compare anyway (and
 most likely non-text), so mark them binary and skip looking at their
 content.
 ...
 diff --git a/diff.c b/diff.c
 index a489540..7a977aa 100644
 --- a/diff.c
 +++ b/diff.c
 @@ -2185,8 +2185,8 @@ int diff_filespec_is_binary(struct diff_filespec *one)
   one-is_binary = one-driver-binary;
   else {
   if (!one-data  DIFF_FILE_VALID(one))
 - diff_populate_filespec(one, 0);
 - if (one-data)
 + diff_populate_filespec(one, 
 DIFF_POPULATE_IS_BINARY);
 + if (one-is_binary == -1  one-data)
   one-is_binary = buffer_is_binary(one-data,
   one-size);
   if (one-is_binary == -1)

The name is misleading and forced me to read it twice before I
realized that this is populating the is-binary bit.  It might make
it a bit better if you renamed it to DIFF_POPULATE_IS_BINARY_BIT or
perhaps DIFF_POPULATE_CHECK_BINARY or something.  For consistency,
the other bit may want to be also renamed from SIZE_ONLY to either

 (1) CHECK_SIZE_ONLY

 (2) One bit for CHECK_SIZE, another for NO_CONTENTS, and optionally
 make SIZE_ONLY the union of two

I do not have strong preference either way; the latter may be more
logical in that not loading contents and check size are sort of
orthogonal in that you can later choose to check, without loading
contents, only the binary-ness without checking size, but no calles
that passes a non-zero flag to the populate-filespec function will
want to slurp in the contents in practice, so in that sense we could
declare that the NO_CONENTS bit is implied.

But more importantly, would this patch actually help?  For one
thing, this wouldn't (and shouldn't) help if the user wants --binary
diff out of us anyway, I suspect, but I wonder what the following
codepath in the builtin_diff() function would do:

...
} else if (!DIFF_OPT_TST(o, TEXT) 
( (!textconv_one  diff_filespec_is_binary(one)) ||
  (!textconv_two  diff_filespec_is_binary(two)) )) {
if (fill_mmfile(mf1, one)  0 || fill_mmfile(mf2, two)  0)
die(unable to read files to diff);
/* Quite common confusing case */
if (mf1.size == mf2.size 
!memcmp(mf1.ptr, mf2.ptr, mf1.size)) {
if (must_show_header)
fprintf(o-file, %s, header.buf);
goto free_ab_and_return;
}
fprintf(o-file, %s, header.buf);
strbuf_reset(header);
if (DIFF_OPT_TST(o, BINARY))
emit_binary_diff(o-file, mf1, mf2, line_prefix);
else
fprintf(o-file, %sBinary files %s and %s differ\n,
line_prefix, lbl[0], lbl[1]);
o-found_changes = 1;
} else {
...

If we weren't told with --text/-a to force textual output, and
at least one of the sides is marked as binary (and this patch marks
a large blob as binary unless attributes says otherwise), we still
call fill_mmfile() on them to slurp the contents to be compared, no?

And before you get to the DIFF_OPT_TST(o, BINARY), you memcmp(3) to
check if the sides are identical, so...

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 2/4] fsck: do not die when not enough memory to examine a pack entry

2014-06-26 Thread Junio C Hamano
Nguyễn Thái Ngọc Duy  pclo...@gmail.com writes:

 fsck is a tool that error() is more preferred than die(), but many

more preferred without justifying why it is more preferred is
not quite a justification, is it?  Also, an object failing to load
in-core is not a missing object, so if your aim is to let fsck
diagnose a too-large-to-load object as missing and let it continue,
I do not know if it is more preferred in the first place.  Adding
a too large--cannot check bin of objects may be needed for it to
be useful.  Also, we might need to give at the end oh by the way,
because we couldn't read some objects to even determine its type,
the unreachable report from this fsck run is totally useless.

The log message tries to justify that this may be a good thing for
fsck, but the patch actually tries to change the behaviour of all
code paths that try to load an object in-core without considering
the ramifications of such a change.  I _think_ all callers should be
prepared to receive NULL when we encounter a corrupt object (and
otherwise we should fix them), but it is unclear how much audit of
the callers (if any) was done to prepare this change.

Not very excited X-.

 functions embed die() inside beyond fsck's control.
 unpack_compressed_entry()'s using xmallocz is such a function,
 triggered from verify_packfile() - unpack_entry(). Make it use
 xmallocz_gentle() instead.

 Noticed-by: Dale R. Worley wor...@alum.mit.edu
 Signed-off-by: Nguyễn Thái Ngọc Duy pclo...@gmail.com
 ---
  sha1_file.c  | 4 +++-
  t/t1050-large.sh | 6 ++
  2 files changed, 9 insertions(+), 1 deletion(-)

 diff --git a/sha1_file.c b/sha1_file.c
 index 34d527f..eb69c78 100644
 --- a/sha1_file.c
 +++ b/sha1_file.c
 @@ -1925,7 +1925,9 @@ static void *unpack_compressed_entry(struct packed_git 
 *p,
   git_zstream stream;
   unsigned char *buffer, *in;
  
 - buffer = xmallocz(size);
 + buffer = xmallocz_gentle(size);
 + if (!buffer)
 + return NULL;
   memset(stream, 0, sizeof(stream));
   stream.next_out = buffer;
   stream.avail_out = size + 1;
 diff --git a/t/t1050-large.sh b/t/t1050-large.sh
 index aea4936..5642f84 100755
 --- a/t/t1050-large.sh
 +++ b/t/t1050-large.sh
 @@ -163,4 +163,10 @@ test_expect_success 'zip achiving, deflate' '
   git archive --format=zip HEAD /dev/null
  '
  
 +test_expect_success 'fsck' '
 + test_must_fail git fsck 2err 
 + n=$(grep error: attempting to allocate .* over limit err | wc -l) 
 + test $n -gt 1
 +'
 +
  test_done
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] pager.c: replace git_config with git_config_get_string

2014-06-26 Thread Karsten Blees
Am 25.06.2014 05:59, schrieb Eric Sunshine:
 On Mon, Jun 23, 2014 at 6:41 AM, Tanay Abhra tanay...@gmail.com wrote:

[...]

  /* returns 0 for no pager, 1 for use pager, and -1 for not specified 
 */
  int check_pager_config(const char *cmd)
  {
 -   struct pager_config c;
 -   c.cmd = cmd;
 -   c.want = -1;
 -   c.value = NULL;
 -   git_config(pager_command_config, c);
 -   if (c.value)
 -   pager_program = c.value;
 -   return c.want;
 +   struct strbuf key = STRBUF_INIT;
 +   int want = -1;
 +   const char *value = NULL;
 +   strbuf_addf(key, pager.%s, cmd);
 +   if (!git_config_get_string(key.buf, value)) {
 +   int b = git_config_maybe_bool(key.buf, value);
 +   if (b = 0)
 +   want = b;
 +   else
 +   want = 1;
 +   }
 +   if (value)
 +   pager_program = value;

[...]
 
 Second, don't you want to xstrdup(value) when assigning to
 'pager_program'? If you don't, then 'pager_program' will become a
 dangling pointer when config_cache_free() is invoked.
 

I don't think that values from the global config cache should be xstrdup()ed.
After all, caching the values during the lifetime of the git process is the
entire point of the config cache, isn't it?

The only reason to call config_cache_free() is to load a _different_
configuration. In this case, however, you would also need to call the relevant
config functions again, leaking all xstrdup()ed strings.

If for some reason a config string is accessed after config_cache_free()
(which would be a bug), you won't notice if strings are xstrdup()ed (i.e. git
will continue to run with some invalid configuration). This is IMO much worse
than failing with segfault.

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 6/8] commit: provide a fast multi-tip contains function

2014-06-26 Thread Junio C Hamano
Jeff King p...@peff.net writes:

 I haven't quite convinced myself that the stale logic in the middle is
 right. The origin paint_down function checks PARENT1 | PARENT2 to see
 if we found a merge base (even though PARENT2 may represent many tips).
 Here I check whether we have _any_ left parent flag and _any_ right
 parent flag. I'm not sure if I actually need to be finding the merge
 base of _all_ of the commits.

In the one-each-on-two-side case (i.e. the original algorithm), it
is any commit we will encounter by digging further down from a
STALE one will all be reachable from a newer merge base (e.g. the
commit that caused it to be marked as STALE originally).  It will
never be a useful merge base, so let's mark it as STALE.  Even if a
future traversal that comes from sideways (i.e. not passing the
commit that caused it to be marked as STALE) reach this STALE one,
digging further from there won't give us anything new.

If you see a commit can be reached from L1 and R2, the only thing
you know is that its parents can also be reached from L1 and R2, but
it does not tell you if it is reachable from other tips, e.g. L2 or
R1.  When a traversal reaches such a node from sideways, trying to
paint it with L2 for example, you do need to continue digging.

I think the traversal optimization based on the STALE bit is merely
a halfway optimization to cull obvious duplicates.  See how
get_merge_bases_many() needs to clean up redundant ones in the
result of merge_bases_many(), the latter of which does use the STALE
bit to remove obvious duplicates, in order to make sure it won't
include a commit in the result that can be reached from another
commit in the result, without having to resort to the SLOP trick.

Because your end-goal is to tell if Ln is reachable from Rm (for
number of n's and m's), coming up with the independent/non-redundant
set of merge-bases is not necessary, I think.  I suspect that you do
not need the STALE half-optimization in the first place.

The only time you can say Ah, we've seen this one and no need to
dig further is when you are propagating a colour C and the parent
in question is already painted in C (it is OK to be painted as
reachable from more tips), I would think, so shouldn't the loop be
more like, after painting each tip and placing it in the queue:

 * Dequeue one, check the L/R bits in it and call that C

 * Iterate over its parents P:

   * check the L/R bits in P and call that Cp.

   * If Cp is already a superset of C, there is no point putting P
 to the queue to be processed.

   * If Cp is not a superset of C, then update L/R bits in P to mark
 it reachable from tips represented by C and put P to the queue.

until you ran out of queue?




 +void commit_contains(const struct commit_list *left,
 +  const struct commit_list *right,
 +  unsigned char *left_contains,
 +  unsigned char *right_contains)
 +{
 + struct prio_queue queue = { compare_commits_by_commit_date };
 + struct bit_slab left_bits, right_bits, stale_bits;
 + int left_nr, right_nr;
 +
 + left_nr = init_contains_bits(left, left_bits, queue);
 + right_nr = init_contains_bits(right, right_bits, queue);
 + init_bit_slab(stale_bits);
 +
 + while (queue_has_nonstale_bits(queue, stale_bits)) {
 + struct commit *commit = prio_queue_get(queue);
 + struct commit_list *parents;
 + unsigned char *c_left, *c_right, *c_stale;
 +
 + c_left = bit_slab_at(left_bits, commit);
 + c_right = bit_slab_at(right_bits, commit);
 + c_stale = bit_slab_at(stale_bits, commit);
 +
 + if (!bitset_empty(c_left, left_nr) 
 + !bitset_empty(c_right, right_nr))
 + *c_stale = 1;

Hmph, is this one-char-a bit?
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 2/3] config: add hashtable for config parsing retrieval

2014-06-26 Thread Junio C Hamano
Matthieu Moy matthieu@grenoble-inp.fr writes:

 Junio C Hamano gits...@pobox.com writes:

 When the submodule script that uses git config -f .gitmodules is
 converted into C, if the updated config API is ready, it may be able
 to do something like these in a single program:

  const char *url;
  struct config_set *gm_config;

 /* read from $GIT_DIR/config */
 url = git_config_get_string(remote.origin.url);

 /*
  * allow us to read from .gitmodules; the parameters are
  * list of files that make up the configset, perhaps.
  */
  gm_config = git_configset_new(.gitmodules, NULL);


 if (!git_configset_get_bool(gm_config, submodule.frotz.ignore)) {
  /* do a lot of stuff for the submodule */
 ...
  }

 /* when we are done with the configset */
 git_configset_clear(gm_config);

 Isn't that a bit overkill? Why not just let the caller manage a hashmap
 directly instead of a config_set?

Because I had an experience under my belt of a painful refactoring
of the_index which turned out to be not just a single array, I
simply suspect that the final data structure to represent a set of
config-like things will not be just a single hashmap, hence I do
prefer to have one layer of abstraction struct config_set, which
would contain a hashmap and possibly more.  Doesn't is the hashmap
initialized bit belong there, for example?
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: Is it possible to list unpushed tags without accessing remote?

2014-06-26 Thread Junio C Hamano
Andreas Schwab sch...@linux-m68k.org writes:

 Shawn Pearce spea...@spearce.org writes:

 On Thu, Jun 26, 2014 at 5:42 AM, Kirill Likhodedov
 kirill.likhode...@jetbrains.com wrote:
 is it possible to know which tags are not yet pushed to a remote via a 
 completely local command?

 (e.g. the list of unpushed _commits_ may be received by ‘git log 
 upstream..’)

 I know it is possible to execute 'git ls-remote’ or 'git push --dry-run’, 
 but both ask the remote server.
 I’m almost sure that the answer is “NO”, but want to receive a confirmation 
 from Git gurus :)

 No. The client doesn't track what tags the remote has.

 Not by default, but it is easy to configure your clone to fetch tags to
 a separate namespace.

But then in order to learn what tags the remote has, you need to
talk to the remote and it won't be complately a local operation
anymore, no?
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 2/3] config: add hashtable for config parsing retrieval

2014-06-26 Thread Karsten Blees
Am 26.06.2014 21:00, schrieb Junio C Hamano:
 Matthieu Moy matthieu@grenoble-inp.fr writes:
 
 Junio C Hamano gits...@pobox.com writes:

 When the submodule script that uses git config -f .gitmodules is
 converted into C, if the updated config API is ready, it may be able
 to do something like these in a single program:

 const char *url;
 struct config_set *gm_config;

 /* read from $GIT_DIR/config */
 url = git_config_get_string(remote.origin.url);

 /*
  * allow us to read from .gitmodules; the parameters are
  * list of files that make up the configset, perhaps.
  */
 gm_config = git_configset_new(.gitmodules, NULL);


 if (!git_configset_get_bool(gm_config, submodule.frotz.ignore)) {
 /* do a lot of stuff for the submodule */
 ...
 }

 /* when we are done with the configset */
 git_configset_clear(gm_config);

 Isn't that a bit overkill? Why not just let the caller manage a hashmap
 directly instead of a config_set?
 
 Because I had an experience under my belt of a painful refactoring
 of the_index which turned out to be not just a single array, I
 simply suspect that the final data structure to represent a set of
 config-like things will not be just a single hashmap, hence I do
 prefer to have one layer of abstraction struct config_set, which
 would contain a hashmap and possibly more.  Doesn't is the hashmap
 initialized bit belong there, for example?

Would an additional

  int hashmap_is_initialized(constr struct hashmap *map)
  {
return !!map-table;
  }

API help? (Note that hashmap_free() already does memset(0), so the usual notion 
of zero memory means unitialized applies).
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 6/8] commit: provide a fast multi-tip contains function

2014-06-26 Thread Junio C Hamano
Junio C Hamano gits...@pobox.com writes:

 The only time you can say Ah, we've seen this one and no need to
 dig further is when you are propagating a colour C and the parent
 in question is already painted in C (it is OK to be painted as
 reachable from more tips), I would think, so shouldn't the loop be
 more like, after painting each tip and placing it in the queue:

  * Dequeue one, check the L/R bits in it and call that C

  * Iterate over its parents P:

* check the L/R bits in P and call that Cp.

* If Cp is already a superset of C, there is no point putting P
  to the queue to be processed.

* If Cp is not a superset of C, then update L/R bits in P to mark
  it reachable from tips represented by C and put P to the queue.

 until you ran out of queue?

Actually that will cause you to dig down to the root, so it won't be
nice.

If you are trying to do branch --with $commit, what you would want
is not exactly paint-down-to-common(all branches, $commit), but
something that paints down to $commit from all branches, with an
optimization that cuts off the traversal at a commit that is
reachable from $commit.  If a traversal from branch B reached such a
commit that is reachable from $commit, you can stop the traversal
because propagating the bit for B further down to its parents will
not reach the $commit you are interested in.

So the termination condition for this a single Left (I'll use Left
for $commit and Right for all branches) case is if a commit is
already painted as reachable from $commit, do not propagate bits
further down.

What does it mean to look for branch --with $commit1 $commit2
(i.e. more than one in the Left set)?  If we are trying to see which
branches reach _both_ of these commits, then replace the ablve with
if a commit is already painted as reachable from both $commit{1,2},
then painting it with any branch bits is futile---its parents will
never reach either $commit1 nor $commit2, so the additional
termination condition will be If left bits are full, then stop.

I do not know how you can optimize the traversal if you are trying
to see which branches reach at least one of these commits, though.





--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: Is it possible to list unpushed tags without accessing remote?

2014-06-26 Thread Kirill Likhodedov

On 26 Jun 2014, at 23:04 , Junio C Hamano gits...@pobox.com wrote:

 Andreas Schwab sch...@linux-m68k.org writes:
 
 Not by default, but it is easy to configure your clone to fetch tags to
 a separate namespace.
 
 But then in order to learn what tags the remote has, you need to
 talk to the remote and it won't be complately a local operation
 anymore, no?

If I understand the solution correctly, it looks like it is not needed, if I’m 
OK with knowing which tags the remote had during the last fetch. 

Just like with commits: 'git log origin/master..’ can give me incorrect results 
if e.g. commits were rebased on the remote site. But we usually ignore such 
possibility as improbable.

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 6/8] commit: provide a fast multi-tip contains function

2014-06-26 Thread Junio C Hamano
Junio C Hamano gits...@pobox.com writes:

 What does it mean to look for branch --with $commit1 $commit2
 (i.e. more than one in the Left set)?  If we are trying to see which
 branches reach _both_ of these commits, then replace the ablve with
 if a commit is already painted as reachable from both $commit{1,2},
 then painting it with any branch bits is futile---its parents will
 never reach either $commit1 nor $commit2, so the additional
 termination condition will be If left bits are full, then stop.

 I do not know how you can optimize the traversal if you are trying
 to see which branches reach at least one of these commits, though.

By the way, don't we do 80% of this already in show-branch?
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: files deleted with no record?

2014-06-26 Thread Philip Oakley

From: Phil Hord phil.h...@gmail.com
On Mon, Jun 23, 2014 at 9:15 PM, Jeremy Scott 
jer...@great-scotts.org wrote:

I just encountered a situation where a merge was made, with no
apparent changes in files (ie no log), but the result was that some
files were deleted.

person A adds some files
person B adds some files from the same point


You mean from the same point in history, right?  Not files with the
same filename or path?


person B commits and pushes.
person A commits -- now merge is required
a few more commits on top of person B's commit


I don't understand this step.  Who adds a few more commits on top of B 
and why?


person A merges - this removes the files that B added. There is no 
log

of the files being deleted


A similar issue, by reference, just came up on the [git-users] list. The 
reference was:

1. http://randyfay.com/content/avoiding-git-disasters-gory-story

In that case the problem was a mixture of tools and  misunderstandings.

It may not be the same as your case, but could give insights into what's 
happening between different developers.


Which Tools are You, person A and Person B using, with --version?



This sounds like an evil merge (see man gitglossary, and google),
but it's not clear to me how you arrived here.

When I tried to reproduce your issue with this script, it did not
remove any files unexpectedly:
---8---
#!/bin/sh

set -e
mkdir foo  cd foo  git init
echo foo  foo  git add foo  git commit -mfoo

git checkout -b PersonA master
echo bar  bar  git add bar
git commit -mPersonA: bar

git checkout -b PersonB master
echo baz  baz  git add baz
git commit -mPersonB: baz

echo foo-conflict  foo  git add foo
git commit -mPersonB: foo

git checkout PersonA
echo foo-different  foo  git add foo
git commit -mPersonA: foo (conflicts with PersonB)

git log --oneline --all --stat

if ! git merge PersonB ; then
 git checkout PersonA foo
 git commit --no-edit
fi
git log --oneline --graph --stat
---8---

A sneaky issue with merges is that they do not have a clear way to
show patch information -- the diff between the commit and its ancestor
-- because they have multiple ancestors.  You can show diffs for a
merge relative to each of its parents, but it is not usually done for
you automatically.  This is why making changes in a merge which are
not actually required for the merge is bad (evil).


Clearly this is possible - was this a user error?


Probably, but we'd need to see how the user got there.
--
Philip 


--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] gitk: catch mkdtemp errors

2014-06-26 Thread Junio C Hamano
David Aguilar dav...@gmail.com writes:

 105b5d3fbb1c00bb0aeaf9d3e0fbe26a7b1993fc introduced a dependency
 on mkdtemp, which is not available on Windows.

 Use the original temporary directory behavior when mkdtemp fails.
 This makes the code use mkdtemp when available and gracefully
 fallback to the existing behavior when it is not available.

 Helped-by: Junio C Hamano gits...@pobox.com
 Helped-by: brian m. carlson sand...@crustytoothpaste.net
 Signed-off-by: David Aguilar dav...@gmail.com
 ---

Does this still need to be applied before I can pull from Paulus?

  gitk | 4 +++-
  1 file changed, 3 insertions(+), 1 deletion(-)

 diff --git a/gitk b/gitk
 index 41e5071..9237830 100755
 --- a/gitk
 +++ b/gitk
 @@ -3504,7 +3504,9 @@ proc gitknewtmpdir {} {
   set tmpdir $gitdir
   }
   set gitktmpformat [file join $tmpdir .gitk-tmp.XX]
 - set gitktmpdir [exec mktemp -d $gitktmpformat]
 + if {[catch {set gitktmpdir [exec mktemp -d $gitktmpformat]}]} {
 + set gitktmpdir [file join $gitdir [format .gitk-tmp.%s [pid]]]
 + }
   if {[catch {file mkdir $gitktmpdir} err]} {
   error_popup [mc Error creating temporary directory %s: 
 $gitktmpdir] $err
   unset gitktmpdir
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] gitk: catch mkdtemp errors

2014-06-26 Thread Junio C Hamano
David Aguilar dav...@gmail.com writes:

 105b5d3fbb1c00bb0aeaf9d3e0fbe26a7b1993fc introduced a dependency
 on mkdtemp, which is not available on Windows.

 Use the original temporary directory behavior when mkdtemp fails.
 This makes the code use mkdtemp when available and gracefully
 fallback to the existing behavior when it is not available.

 Helped-by: Junio C Hamano gits...@pobox.com
 Helped-by: brian m. carlson sand...@crustytoothpaste.net
 Signed-off-by: David Aguilar dav...@gmail.com
 ---

In the meantime, I've fetched from you and merged up to your
master~2 aka 17f9836c (gitk: Show staged submodules regardless of
ignore config, 2014-04-08).

Thanks.

  gitk | 4 +++-
  1 file changed, 3 insertions(+), 1 deletion(-)

 diff --git a/gitk b/gitk
 index 41e5071..9237830 100755
 --- a/gitk
 +++ b/gitk
 @@ -3504,7 +3504,9 @@ proc gitknewtmpdir {} {
   set tmpdir $gitdir
   }
   set gitktmpformat [file join $tmpdir .gitk-tmp.XX]
 - set gitktmpdir [exec mktemp -d $gitktmpformat]
 + if {[catch {set gitktmpdir [exec mktemp -d $gitktmpformat]}]} {
 + set gitktmpdir [file join $gitdir [format .gitk-tmp.%s [pid]]]
 + }
   if {[catch {file mkdir $gitktmpdir} err]} {
   error_popup [mc Error creating temporary directory %s: 
 $gitktmpdir] $err
   unset gitktmpdir
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: files deleted with no record?

2014-06-26 Thread Jeremy Scott
Hi. Thanks for getting back to me.

here is a screenshot from source tree to visualise the scenario:

https://drive.google.com/file/d/0B-Wn7DfHsuhyTEVkRHAzeGVZelpMWjFxZW1kbVBKVlNab3pR/edit?usp=sharing

I will attempt a script to reproduce this later today.

Thanks

On Fri, Jun 27, 2014 at 5:53 AM, Philip Oakley philipoak...@iee.org wrote:
 From: Phil Hord phil.h...@gmail.com

 On Mon, Jun 23, 2014 at 9:15 PM, Jeremy Scott jer...@great-scotts.org
 wrote:

 I just encountered a situation where a merge was made, with no
 apparent changes in files (ie no log), but the result was that some
 files were deleted.

 person A adds some files
 person B adds some files from the same point


 You mean from the same point in history, right?  Not files with the
 same filename or path?

 person B commits and pushes.
 person A commits -- now merge is required
 a few more commits on top of person B's commit


 I don't understand this step.  Who adds a few more commits on top of B and
 why?

 person A merges - this removes the files that B added. There is no log
 of the files being deleted


 A similar issue, by reference, just came up on the [git-users] list. The
 reference was:
 1. http://randyfay.com/content/avoiding-git-disasters-gory-story

 In that case the problem was a mixture of tools and  misunderstandings.

 It may not be the same as your case, but could give insights into what's
 happening between different developers.

 Which Tools are You, person A and Person B using, with --version?


 This sounds like an evil merge (see man gitglossary, and google),
 but it's not clear to me how you arrived here.

 When I tried to reproduce your issue with this script, it did not
 remove any files unexpectedly:
 ---8---
 #!/bin/sh

 set -e
 mkdir foo  cd foo  git init
 echo foo  foo  git add foo  git commit -mfoo

 git checkout -b PersonA master
 echo bar  bar  git add bar
 git commit -mPersonA: bar

 git checkout -b PersonB master
 echo baz  baz  git add baz
 git commit -mPersonB: baz

 echo foo-conflict  foo  git add foo
 git commit -mPersonB: foo

 git checkout PersonA
 echo foo-different  foo  git add foo
 git commit -mPersonA: foo (conflicts with PersonB)

 git log --oneline --all --stat

 if ! git merge PersonB ; then
  git checkout PersonA foo
  git commit --no-edit
 fi
 git log --oneline --graph --stat
 ---8---

 A sneaky issue with merges is that they do not have a clear way to
 show patch information -- the diff between the commit and its ancestor
 -- because they have multiple ancestors.  You can show diffs for a
 merge relative to each of its parents, but it is not usually done for
 you automatically.  This is why making changes in a merge which are
 not actually required for the merge is bad (evil).

 Clearly this is possible - was this a user error?


 Probably, but we'd need to see how the user got there.
 --

 Philip
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: files deleted with no record?

2014-06-26 Thread Jeremy Scott
we're all using source tree. I'm really interested to try and
reproduce this so I'll find some time today to do it.

Thanks again

On Fri, Jun 27, 2014 at 6:56 AM, Jeremy Scott jer...@great-scotts.org wrote:
 Hi. Thanks for getting back to me.

 here is a screenshot from source tree to visualise the scenario:

 https://drive.google.com/file/d/0B-Wn7DfHsuhyTEVkRHAzeGVZelpMWjFxZW1kbVBKVlNab3pR/edit?usp=sharing

 I will attempt a script to reproduce this later today.

 Thanks









 On Fri, Jun 27, 2014 at 5:53 AM, Philip Oakley philipoak...@iee.org wrote:

 From: Phil Hord phil.h...@gmail.com

 On Mon, Jun 23, 2014 at 9:15 PM, Jeremy Scott jer...@great-scotts.org
 wrote:

 I just encountered a situation where a merge was made, with no
 apparent changes in files (ie no log), but the result was that some
 files were deleted.

 person A adds some files
 person B adds some files from the same point


 You mean from the same point in history, right?  Not files with the
 same filename or path?

 person B commits and pushes.
 person A commits -- now merge is required
 a few more commits on top of person B's commit


 I don't understand this step.  Who adds a few more commits on top of B
 and why?

 person A merges - this removes the files that B added. There is no log
 of the files being deleted


 A similar issue, by reference, just came up on the [git-users] list. The
 reference was:
 1. http://randyfay.com/content/avoiding-git-disasters-gory-story

 In that case the problem was a mixture of tools and  misunderstandings.

 It may not be the same as your case, but could give insights into what's
 happening between different developers.

 Which Tools are You, person A and Person B using, with --version?


 This sounds like an evil merge (see man gitglossary, and google),
 but it's not clear to me how you arrived here.

 When I tried to reproduce your issue with this script, it did not
 remove any files unexpectedly:
 ---8---
 #!/bin/sh

 set -e
 mkdir foo  cd foo  git init
 echo foo  foo  git add foo  git commit -mfoo

 git checkout -b PersonA master
 echo bar  bar  git add bar
 git commit -mPersonA: bar

 git checkout -b PersonB master
 echo baz  baz  git add baz
 git commit -mPersonB: baz

 echo foo-conflict  foo  git add foo
 git commit -mPersonB: foo

 git checkout PersonA
 echo foo-different  foo  git add foo
 git commit -mPersonA: foo (conflicts with PersonB)

 git log --oneline --all --stat

 if ! git merge PersonB ; then
  git checkout PersonA foo
  git commit --no-edit
 fi
 git log --oneline --graph --stat
 ---8---

 A sneaky issue with merges is that they do not have a clear way to
 show patch information -- the diff between the commit and its ancestor
 -- because they have multiple ancestors.  You can show diffs for a
 merge relative to each of its parents, but it is not usually done for
 you automatically.  This is why making changes in a merge which are
 not actually required for the merge is bad (evil).

 Clearly this is possible - was this a user error?


 Probably, but we'd need to see how the user got there.
 --

 Philip


--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 2/3] config: add hashtable for config parsing retrieval

2014-06-26 Thread Junio C Hamano
Karsten Blees karsten.bl...@gmail.com writes:

 Because I had an experience under my belt of a painful refactoring
 of the_index which turned out to be not just a single array, I
 simply suspect that the final data structure to represent a set of
 config-like things will not be just a single hashmap, hence I do
 prefer to have one layer of abstraction struct config_set, which
 would contain a hashmap and possibly more.  Doesn't is the hashmap
 initialized bit belong there, for example?

 Would an additional

   int hashmap_is_initialized(constr struct hashmap *map)
   {
 return !!map-table;
   }

 API help? (Note that hashmap_free() already does memset(0), so the
 usual notion of zero memory means unitialized applies).

It may remove the need for the separate hashmap_initialized bit
that was implemented as a file-scope global in the patch.

I however am not convinced that it will be the _only_ thing other
than the hashmap we would need to use to keep track of the in-core
set of config-like things, and usually a blanket statement these
are the only thing we would ever need tends not to hold for long,
so...


--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


What's cooking in git.git (Jun 2014, #06; Thu, 26)

2014-06-26 Thread Junio C Hamano
Here are the topics that have been cooking.  Commits prefixed with
'-' are only in 'pu' (proposed updates) while commits prefixed with
'+' are in 'next'.

Fixes accumulated on the 'master' front made into 2.0.1.  The topics
in flight continue to separate into two distinct layers (i.e.
stalled-and-need-to-be-rerolld vs sure-to-graduate-soon).

Four mingw series are still in limbo--are they in good enough shape
for Windows folks who wanted to upstream them?

You can find the changes described here in the integration branches
of the repositories listed at

http://git-blame.blogspot.com/p/git-public-repositories.html

--
[Graduated to master]

* ep/avoid-test-a-o (2014-06-19) 20 commits
  (merged to 'next' on 2014-06-20 at c47322b)
 + git-submodule.sh: avoid echo path-like values
 + git-submodule.sh: avoid test cond -a/-o cond
 + t/test-lib-functions.sh: avoid test cond -a/-o cond
 + t/t9814-git-p4-rename.sh: avoid test cond -a/-o cond
 + t/t5538-push-shallow.sh: avoid test cond -a/-o cond
 + t/t5403-post-checkout-hook.sh: avoid test cond -a/-o cond
 + t/t5000-tar-tree.sh: avoid test cond -a/-o cond
 + t/t4102-apply-rename.sh: avoid test cond -a/-o cond
 + t/t0026-eol-config.sh: avoid test cond -a/-o cond
 + t/t0025-crlf-auto.sh: avoid test cond -a/-o cond
 + t/lib-httpd.sh: avoid test cond -a/-o cond
 + git-rebase--interactive.sh: avoid test cond -a/-o cond
 + git-mergetool.sh: avoid test cond -a/-o cond
 + git-bisect.sh: avoid test cond -a/-o cond
 + contrib/examples/git-resolve.sh: avoid test cond -a/-o cond
 + contrib/examples/git-repack.sh: avoid test cond -a/-o cond
 + contrib/examples/git-merge.sh: avoid test cond -a/-o cond
 + contrib/examples/git-commit.sh: avoid test cond -a/-o cond
 + contrib/examples/git-clone.sh: avoid test cond -a/-o cond
 + check_bindir: avoid test cond -a/-o cond

 Update tests and scripts to avoid test ... -a ..., which is often
 more error-prone than test ...  test 

 Squashed misconversion fix-up into git-submodule.sh updates.


* fr/sequencer-fail-with-not-one-upon-no-ff (2014-06-09) 1 commit
  (merged to 'next' on 2014-06-16 at 29734cc)
 + sequencer: signal failed ff as an aborted, not a conflicted merge


* jk/repack-pack-keep-objects (2014-06-10) 3 commits
  (merged to 'next' on 2014-06-16 at 89716c9)
 + repack: s/write_bitmap/s/ in code
 + repack: respect pack.writebitmaps
 + repack: do not accidentally pack kept objects by default
 (this branch is used by jk/repack-pack-writebitmaps-config.)

 Recent updates to git repack started to duplicate objects that
 are in packfiles marked with .keep flag into the new packfile by
 mistake.


* jk/repack-pack-writebitmaps-config (2014-06-12) 4 commits
  (merged to 'next' on 2014-06-16 at 777005d)
 + t7700: drop explicit --no-pack-kept-objects from .keep test
 + repack: introduce repack.writeBitmaps config option
 + repack: simplify handling of --write-bitmap-index
 + pack-objects: stop respecting pack.writebitmaps
 (this branch uses jk/repack-pack-keep-objects.)


* jm/dedup-name-compare (2014-06-20) 2 commits
 + cleanup duplicate name_compare() functions
 + name-hash.c: replace cache_name_compare() with memcmp(3)


* mc/doc-submodule-sync-recurse (2014-06-13) 1 commit
  (merged to 'next' on 2014-06-20 at 04815e3)
 + submodule: document sync --recursive


* mc/git-p4-prepare-p4-only (2014-06-13) 1 commit
  (merged to 'next' on 2014-06-16 at 3c05e19)
 + git-p4: fix submit in non --prepare-p4-only mode


* nd/init-restore-env (2014-06-10) 1 commit
  (merged to 'next' on 2014-06-16 at ecbbfca)
 + git potty: restore environments after alias expansion


* pb/trim-trailing-spaces (2014-06-13) 1 commit
  (merged to 'next' on 2014-06-20 at 6985153)
 + t0008: do not depend on 'echo' handling backslashes specially


* rs/blame-refactor (2014-06-13) 2 commits
  (merged to 'next' on 2014-06-20 at ddaa722)
 + blame: simplify prepare_lines()
 + blame: factor out get_next_line()


* sp/complete-ext-alias (2014-06-13) 1 commit
  (merged to 'next' on 2014-06-16 at 399679e)
 + completion: handle '!f() { ... }; f' and !sh -c '...' - aliases


* tb/unicode-7.0-display-width (2014-06-18) 1 commit
  (merged to 'next' on 2014-06-20 at 111b246)
 + Update of unicode_width.h to Unicode Version 7.0


* ye/doc-http-proto (2014-06-16) 1 commit
  (merged to 'next' on 2014-06-20 at 24f347d)
 + http-protocol.txt: Basic Auth is defined in RFC 2617, not RFC 2616

--
[New Topics]

* jc/fix-clone-single-starting-at-a-tag (2014-06-23) 1 commit
 - builtin/clone.c: detect a clone starting at a tag correctly

 Will merge to 'next'.

--
[Stalled]

* cc/replace-graft (2014-06-09) 5 commits
 - DONTMERGE: wise to wait for peff's commit-buffer length series
 - contrib: add convert-grafts-to-replace-refs.sh
 - Documentation: replace: add --graft option
 - replace: add test for --graft
 - replace: add --graft option

 git 

Re: [PATCH] Fix: wrong offset for CET timezone

2014-06-26 Thread Robin Rosenberg


- Ursprungligt meddelande -
 Från: Alan Franzoni mail...@franzoni.eu
 Till: git@vger.kernel.org
 Kopia: Alan Franzoni usern...@franzoni.eu
 Skickat: torsdag, 26 jun 2014 15:53:32
 Ämne: [PATCH] Fix: wrong offset for CET timezone
 
 From: Alan Franzoni usern...@franzoni.eu
 
 Signed-off-by: Alan Franzoni usern...@franzoni.eu
 ---
  Documentation/date-formats.txt | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/Documentation/date-formats.txt b/Documentation/date-formats.txt
 index ccd1fc8..284308a 100644
 --- a/Documentation/date-formats.txt
 +++ b/Documentation/date-formats.txt
 @@ -11,7 +11,7 @@ Git internal format::
   It is `unix timestamp time zone offset`, where `unix
   timestamp` is the number of seconds since the UNIX epoch.
   `time zone offset` is a positive or negative offset from UTC.
 - For example CET (which is 2 hours ahead UTC) is `+0200`.
 + For example CET (which is 1 hour ahead UTC) is `+0100`.

1 hour in winter and 2 in summer, although some standards seem to say
that summer time is really called CEST, computers apply DST to CET in summer.

$ TZ=UTC date
Tor 26 Jun 2014 22:08:01 UTC

$ TZ=CET date
Fre 27 Jun 2014 00:08:05 CEST

-- robin
 
  RFC 2822::
   The standard email format as described by RFC 2822, for example
 --
 2.0.0
 
 --
 To unsubscribe from this list: send the line unsubscribe git in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html
 
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] imap-send.c: replace git_config with git_config_get_string

2014-06-26 Thread Karsten Blees
Am 26.06.2014 18:50, schrieb Matthieu Moy:
 Tanay Abhra tanay...@gmail.com writes:
 
 +if (!git_config_get_string(imap.user, value))
 +server.user = xstrdup(value);
 +if (!git_config_get_string(imap.pass, value))
 +server.pass = xstrdup(value);
 +if (!git_config_get_string(imap.port, value))
 +server.port = git_config_int(port, value);
 +if (!git_config_get_string(imap.tunnel, value))
 +server.tunnel = xstrdup(value);
 +if (!git_config_get_string(imap.authmethod, value))
 +server.auth_method = xstrdup(value);
 
 Given this kind of systematic code, I find it very tempting to factor
 this with a new helper function as
 
 ...
 git_config_get_string_dup(imap.tunnel, server.tunnel)
 git_config_get_string_dup(imap.authmethod, server.auth_method)
 
 Is there any reason not to do so?
 


With a pull-style API, you no longer need global variables for
everything, so IMO the helper functions should _return_ the values
rather than taking an output parameter.

E.g. with helper functions as suggested here [1] we could have:

  if (git_config_get_bool(imap.preformattedhtml, 0))
wrap_in_html(msg);

...rather than needing an extra variable:

  int bool_value;
  git_config_get_bool(imap.preformattedhtml, bool_value);
  if (bool_value)
wrap_in_html(msg);

...and specify default values along with their respective keys:

  server.ssl_verify = git_config_get_bool(imap.sslverify, 1);
  server.port = git_config_get_int(imap.port, server.use_ssl ? 993 : 143);

...rather than ~1300 lines apart (yuck):

  static struct imap_server_conf server = {
NULL,  /* name */
NULL,  /* tunnel */
NULL,  /* host */
0, /* port */
NULL,  /* user */
NULL,  /* pass */
0, /* use_ssl */
1, /* ssl_verify */
0, /* use_html */
NULL,  /* auth_method */
  };


Regarding xstrdup(), I think this is a remnant from the callback
version, which _requires_ you to xstrdup() (the value parameter is
invalidated after returning from the callback).

Side note: with the current callback design, config variables may
get passed to the callback multiple times (last value wins), so
each xstrdup() in current 'git_*_config' functions actually
causes memory leaks (unless prefixed with 'free(my_config_var);').

[1] 
http://git.661346.n2.nabble.com/PATCH-v3-0-3-git-config-cache-special-querying-api-utilizing-the-cache-tp7613911p7614050.html

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] gitk: catch mkdtemp errors

2014-06-26 Thread David Aguilar
On Thu, Jun 26, 2014 at 01:42:04PM -0700, Junio C Hamano wrote:
 David Aguilar dav...@gmail.com writes:
 
  105b5d3fbb1c00bb0aeaf9d3e0fbe26a7b1993fc introduced a dependency
  on mkdtemp, which is not available on Windows.
 
  Use the original temporary directory behavior when mkdtemp fails.
  This makes the code use mkdtemp when available and gracefully
  fallback to the existing behavior when it is not available.
 
  Helped-by: Junio C Hamano gits...@pobox.com
  Helped-by: brian m. carlson sand...@crustytoothpaste.net
  Signed-off-by: David Aguilar dav...@gmail.com
  ---
 
 Does this still need to be applied before I can pull from Paulus?

Yes, it would be nice to have this, especially for Windows users.
-- 
David
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


How to populate index/worktree when recursive merge merges multiple common ancestors?

2014-06-26 Thread Christian Halstrick
Imagine git does a recursive merge between A and B and finds multiple
common ancestors X1,X2 for these commits.
- Does git try to create an implicit/temporary common ancestor X3 by
merging X1 and X2?
- How should workingtree, index (stage1,2,3) look like if during that
merge of common ancestors a conflict occurs? Will I see in stage2 and
stage3 really see content of X1 and X2?
- How is the end user supposed to fix this? Imaging merging X1 and X2
leads to conflicts solved by the end user leading to a implicit common
ancestor X3. Then merging A and B with X3 as common base again
conflicts occur.

Ciao
  Chris
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html