Re: [WIP/PATCH 9/9] submodule: teach unpack_trees() to update submodules

2014-02-07 Thread Jens Lehmann
Am 03.02.2014 21:19, schrieb W. Trevor King:
 On Mon, Feb 03, 2014 at 08:54:17PM +0100, Jens Lehmann wrote:
 Implement the functionality needed to enable work tree manipulating
 commands so that an changed submodule does not only affect the index but
 it also updates the work tree of any initialized submodule according to
 the SHA-1 recorded in the superproject.
 
 How about:
 
   …so that *a* changed submodule ** updates the index and work tree of
   any initialized submodule according to the SHA-1 recorded in the
   superproject.  Before this commit it updated neither; users had to
   run 'submodule update' to propagate gitlink updates into the
   submodule.
 
 I'm pretty sure that's accurate anyway ;).

And I like it better ;-)
--
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: [WIP/PATCH 9/9] submodule: teach unpack_trees() to update submodules

2014-02-07 Thread Jens Lehmann
Am 04.02.2014 01:11, schrieb Duy Nguyen:
 On Tue, Feb 4, 2014 at 2:54 AM, Jens Lehmann jens.lehm...@web.de wrote:
 Implement the functionality needed to enable work tree manipulating
 commands so that an changed submodule does not only affect the index but
 it also updates the work tree of any initialized submodule according to
 the SHA-1 recorded in the superproject.

 Signed-off-by: Jens Lehmann jens.lehm...@web.de
 ---
  entry.c| 15 --
  submodule.c| 86 
 ++
  submodule.h|  3 ++
  unpack-trees.c | 69 --
  unpack-trees.h |  1 +
  5 files changed, 157 insertions(+), 17 deletions(-)

 diff --git a/entry.c b/entry.c
 index d1bf6ec..61a2767 100644
 --- a/entry.c
 +++ b/entry.c
 @@ -265,7 +265,7 @@ int checkout_entry(struct cache_entry *ce,

 if (!check_path(path, len, st, state-base_dir_len)) {
 unsigned changed = ce_match_stat(ce, st, 
 CE_MATCH_IGNORE_VALID|CE_MATCH_IGNORE_SKIP_WORKTREE);
 -   if (!changed)
 +   if (!changed  (!S_ISDIR(st.st_mode) || 
 !S_ISGITLINK(ce-ce_mode)))
 return 0;
 
 Should we report something when ce is a gitlink, but path is not a
 directory, instead of siliently exit?

Good point.

 diff --git a/submodule.c b/submodule.c
 index 3907034..83e7595 100644
 --- a/submodule.c
 +++ b/submodule.c
 @@ -520,6 +520,42 @@ int depopulate_submodule(const char *path)
 return 0;
  }

 +int update_submodule(const char *path, const unsigned char sha1[20], int 
 force)
 +{
 +   struct strbuf buf = STRBUF_INIT;
 +   struct child_process cp;
 +   const char *hex_sha1 = sha1_to_hex(sha1);
 +   const char *argv[] = {
 +   checkout,
 +   force ? -fq : -q,
 
 respect state-quiet in checkout_entry() as well?

See below.

 +   hex_sha1,
 +   NULL,
 +   };
 +   const char *git_dir;
 +
 +   strbuf_addf(buf, %s/.git, path);
 +   git_dir = read_gitfile(buf.buf);
 +   if (!git_dir)
 +   git_dir = buf.buf;
 +   if (!is_directory(git_dir)) {
 +   strbuf_release(buf);
 +   /* The submodule is not populated, so we can't check it out 
 */
 +   return 0;
 +   }
 +   strbuf_release(buf);
 +
 +   memset(cp, 0, sizeof(cp));
 +   cp.argv = argv;
 +   cp.env = local_repo_env;
 +   cp.git_cmd = 1;
 +   cp.no_stdin = 1;
 +   cp.dir = path;   /* GIT_WORK_TREE doesn't work for git checkout */
 
 And if we do respect --quiet and it's not specified, paths printed by
 this process is relative to dir, not to user cwd. Could be
 confusing.

That's the reason I'm currently always passing -q to checkout. While
checkout would have to learn a --prefix= option to be able to print
the path relative to the superproject, some (most?) users don't want
to see this detailed information from inside the submodule. After all
git status and diff currently also only show a condensed view of the
submodule state and don't print any detailed information about files
inside the submodule. We might want to add means to enable that later,
and then we'd have to conditionally provide --quiet (and --prefix)
here.

 +   if (run_command(cp))
 +   return error(Could not checkout submodule %s, path);
 +
 +   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: [WIP/PATCH 9/9] submodule: teach unpack_trees() to update submodules

2014-02-03 Thread W. Trevor King
On Mon, Feb 03, 2014 at 08:54:17PM +0100, Jens Lehmann wrote:
 Implement the functionality needed to enable work tree manipulating
 commands so that an changed submodule does not only affect the index but
 it also updates the work tree of any initialized submodule according to
 the SHA-1 recorded in the superproject.

How about:

  …so that *a* changed submodule ** updates the index and work tree of
  any initialized submodule according to the SHA-1 recorded in the
  superproject.  Before this commit it updated neither; users had to
  run 'submodule update' to propagate gitlink updates into the
  submodule.

I'm pretty sure that's accurate anyway ;).

Cheers,
Trevor

-- 
This email may be signed or encrypted with GnuPG (http://www.gnupg.org).
For more information, see http://en.wikipedia.org/wiki/Pretty_Good_Privacy


signature.asc
Description: OpenPGP digital signature


Re: [WIP/PATCH 9/9] submodule: teach unpack_trees() to update submodules

2014-02-03 Thread Duy Nguyen
On Tue, Feb 4, 2014 at 2:54 AM, Jens Lehmann jens.lehm...@web.de wrote:
 Implement the functionality needed to enable work tree manipulating
 commands so that an changed submodule does not only affect the index but
 it also updates the work tree of any initialized submodule according to
 the SHA-1 recorded in the superproject.

 Signed-off-by: Jens Lehmann jens.lehm...@web.de
 ---
  entry.c| 15 --
  submodule.c| 86 
 ++
  submodule.h|  3 ++
  unpack-trees.c | 69 --
  unpack-trees.h |  1 +
  5 files changed, 157 insertions(+), 17 deletions(-)

 diff --git a/entry.c b/entry.c
 index d1bf6ec..61a2767 100644
 --- a/entry.c
 +++ b/entry.c
 @@ -265,7 +265,7 @@ int checkout_entry(struct cache_entry *ce,

 if (!check_path(path, len, st, state-base_dir_len)) {
 unsigned changed = ce_match_stat(ce, st, 
 CE_MATCH_IGNORE_VALID|CE_MATCH_IGNORE_SKIP_WORKTREE);
 -   if (!changed)
 +   if (!changed  (!S_ISDIR(st.st_mode) || 
 !S_ISGITLINK(ce-ce_mode)))
 return 0;

Should we report something when ce is a gitlink, but path is not a
directory, instead of siliently exit?

 diff --git a/submodule.c b/submodule.c
 index 3907034..83e7595 100644
 --- a/submodule.c
 +++ b/submodule.c
 @@ -520,6 +520,42 @@ int depopulate_submodule(const char *path)
 return 0;
  }

 +int update_submodule(const char *path, const unsigned char sha1[20], int 
 force)
 +{
 +   struct strbuf buf = STRBUF_INIT;
 +   struct child_process cp;
 +   const char *hex_sha1 = sha1_to_hex(sha1);
 +   const char *argv[] = {
 +   checkout,
 +   force ? -fq : -q,

respect state-quiet in checkout_entry() as well?

 +   hex_sha1,
 +   NULL,
 +   };
 +   const char *git_dir;
 +
 +   strbuf_addf(buf, %s/.git, path);
 +   git_dir = read_gitfile(buf.buf);
 +   if (!git_dir)
 +   git_dir = buf.buf;
 +   if (!is_directory(git_dir)) {
 +   strbuf_release(buf);
 +   /* The submodule is not populated, so we can't check it out */
 +   return 0;
 +   }
 +   strbuf_release(buf);
 +
 +   memset(cp, 0, sizeof(cp));
 +   cp.argv = argv;
 +   cp.env = local_repo_env;
 +   cp.git_cmd = 1;
 +   cp.no_stdin = 1;
 +   cp.dir = path;   /* GIT_WORK_TREE doesn't work for git checkout */

And if we do respect --quiet and it's not specified, paths printed by
this process is relative to dir, not to user cwd. Could be
confusing.

 +   if (run_command(cp))
 +   return error(Could not checkout submodule %s, path);
 +
 +   return 0;
 +}
 +
-- 
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