Re: [PATCH RFC] init-db: introduce new -c/--config option

2015-03-25 Thread Alexander Kuleshov
Hello All,

I'm not sure about two things:

1. Is there any way to do this with the current git? At least i didn't
find how to do it, so decided to write this patch.
If there is already ability to do the same without this patch, please
let me know.

2. Now current patch overwrite the value of the configuration option
from config,
if there is given option with the same key. For example, when we do git init,
.git/config contains core.filemode = true. If we will pass
core.filemode = false with this patch to git init,
there will be core.filemode = false in the .git/config. So, I'm not
sure about it.
I looked on git clone -c/--config, it just adds the same option to the
.git/config, but it looks strange to me

So, I'm wating for any feedback.

Thank you.
--
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 RFC] init-db: introduce new -c/--config option

2015-03-25 Thread Alexander Kuleshov
For now we can clone repository with the `git clone` command and pass
-c/--config with configuration option to it and these configuration
options will be set in the clonned repository config.

This patch provides the same functional, but for the `git init` command.
It allows to pass -c/--config option to the `git init` command and
given configuration option will be added to the newly created repository,
after it will be created.

This option can be used multiply times. If given configuration option
is the same that in the default config, given option will overwrite.

Main purpose of this option is to get rid of the manual editing of
the config.

Signed-off-by: Alexander Kuleshov kuleshovm...@gmail.com
---
 Documentation/git-init.txt | 11 ++-
 builtin/init-db.c  | 33 +++--
 t/t0001-init.sh| 16 
 3 files changed, 57 insertions(+), 3 deletions(-)

diff --git a/Documentation/git-init.txt b/Documentation/git-init.txt
index 8174d27..3ecbf2a 100644
--- a/Documentation/git-init.txt
+++ b/Documentation/git-init.txt
@@ -10,7 +10,7 @@ SYNOPSIS
 
 [verse]
 'git init' [-q | --quiet] [--bare] [--template=template_directory]
- [--separate-git-dir git dir]
+ [--separate-git-dir git dir] [--config key=value]
  [--shared[=permissions]] [directory]
 
 
@@ -111,6 +111,15 @@ into it.
 If you provide a 'directory', the command is run inside it. If this directory
 does not exist, it will be created.
 
+--config key=value::
+-c key=value::
+Set a new configuration option in the new repository. The key expected in
+the same format as linkgit:git-config[1] (e.g., `core.eol=true`). If
+This option can be used multiply times. If multiply options are given with
+the same keys, each value will be written to the config. If given key is
+the same that used in the default configuration file, previous value
+will be overwritten.
+
 --
 
 TEMPLATE DIRECTORY
diff --git a/builtin/init-db.c b/builtin/init-db.c
index 280454a..184de40 100644
--- a/builtin/init-db.c
+++ b/builtin/init-db.c
@@ -471,6 +471,26 @@ static const char *const init_db_usage[] = {
NULL
 };
 
+static int write_one_config(const char *key, const char *value, void *data) {
+   char *v = NULL;
+   git_config_get_string(key, v);
+   if (v) {
+   git_config_set(key, value);
+   return 1
+   } else
+   return git_config_set_multivar(key, value ? value : true, 
^$, 0);
+}
+
+static void write_config(struct string_list *config){
+   int i;
+
+   for (i = 0; i  config-nr; i++) {
+   if (git_config_parse_parameter(config-items[i].string,
+  write_one_config, NULL)  0)
+   die(unable to write parameters to config file);
+   }
+}
+
 /*
  * If you want to, you can share the DB area with any number of branches.
  * That has advantages: you can save space by sharing all the SHA1 objects.
@@ -479,11 +499,13 @@ static const char *const init_db_usage[] = {
  */
 int cmd_init_db(int argc, const char **argv, const char *prefix)
 {
+   int ret;
const char *git_dir;
const char *real_git_dir = NULL;
const char *work_tree;
const char *template_dir = NULL;
unsigned int flags = 0;
+   static struct string_list option_config;
const struct option init_db_options[] = {
OPT_STRING(0, template, template_dir, 
N_(template-directory),
N_(directory from which templates will be 
used)),
@@ -496,6 +518,8 @@ int cmd_init_db(int argc, const char **argv, const char 
*prefix)
OPT_BIT('q', quiet, flags, N_(be quiet), INIT_DB_QUIET),
OPT_STRING(0, separate-git-dir, real_git_dir, N_(gitdir),
   N_(separate git dir from working tree)),
+   OPT_STRING_LIST('c', config, option_config, N_(key=value),
+  N_(set config inside the new repository)),
OPT_END()
};
 
@@ -592,6 +616,11 @@ int cmd_init_db(int argc, const char **argv, const char 
*prefix)
}
 
set_git_dir_init(git_dir, real_git_dir, 1);
-
-   return init_db(template_dir, flags);
+   ret = init_db(template_dir, flags);
+   /*
+* new repository already created, so we can update .git/config if
+* -c/--config passed
+*/
+   write_config(option_config);
+   return ret;
 }
diff --git a/t/t0001-init.sh b/t/t0001-init.sh
index 7de8d85..8ce3537 100755
--- a/t/t0001-init.sh
+++ b/t/t0001-init.sh
@@ -339,4 +339,20 @@ test_expect_success SYMLINKS 're-init to move gitdir 
symlink' '
test_path_is_dir realgitdir/refs
 '
 
+test_expect_success 'git init -c key=value' '
+   rm -rf newdir realgitdir 
+   git init -c core.foo=bar newdir 
+   echo bar expect 
+   git --git-dir=newdir/.git config core.foo actual 
+   test_cmp expect 

Re: [PATCH RFC] init-db: introduce new -c/--config option

2015-03-25 Thread Jeff King
On Thu, Mar 26, 2015 at 12:30:13AM +0600, Alexander Kuleshov wrote:

 I'm not sure about two things:
 
 1. Is there any way to do this with the current git? At least i didn't
 find how to do it, so decided to write this patch.
 If there is already ability to do the same without this patch, please
 let me know.

The reason we originally added -c to clone and not init is that clone
performs several other follow-on actions after the repository is
initialized. For example, you might want to run:

  git clone -c core.autocrlf=true ...

to have that option in place before clone checks out files to the
working tree. There is no direct way to have git init set the config
for you, but there is no harm in doing:

  git init
  git config core.autocrlf=true

because init returns control to you immediatel.

 2. Now current patch overwrite the value of the configuration option
 from config,
 if there is given option with the same key. For example, when we do git init,
 .git/config contains core.filemode = true. If we will pass
 core.filemode = false with this patch to git init,
 there will be core.filemode = false in the .git/config. So, I'm not
 sure about it.
 I looked on git clone -c/--config, it just adds the same option to the
 .git/config, but it looks strange to me

Most options, when there are multiple present, will use the last-seen
value (core.filemode is one of these, so having it there twice means the
second one takes precedence). Some options form a list (e.g., fetch
refspecs). So if you run:

  git clone -c remote.origin.fetch=refs/notes/*:refs/notes/* ...

you add a new refspec, but do not replace the default one to fetch the
actual branches. The knowledge of which config keys are which is known
only to the config callbacks, so it is generally safer for generic
config-munging code to add a potentially overriding key (the downside is
that you cannot use -c to clear a list-like key, but the inability
to do that is a failing of the config code in general).

-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: [PATCH RFC] init-db: introduce new -c/--config option

2015-03-25 Thread Eric Sunshine
On Wed, Mar 25, 2015 at 2:22 PM, Alexander Kuleshov
kuleshovm...@gmail.com wrote:
 For now we can clone repository with the `git clone` command and pass
 -c/--config with configuration option to it and these configuration
 options will be set in the clonned repository config.

s/clonned/cloned/

 This patch provides the same functional, but for the `git init` command.

s/functional/functionality/

 It allows to pass -c/--config option to the `git init` command and
 given configuration option will be added to the newly created repository,
 after it will be created.

 This option can be used multiply times. If given configuration option

s/multiply/multiple/

 is the same that in the default config, given option will overwrite.

 Main purpose of this option is to get rid of the manual editing of
 the config.

 Signed-off-by: Alexander Kuleshov kuleshovm...@gmail.com
 ---
 diff --git a/Documentation/git-init.txt b/Documentation/git-init.txt
 index 8174d27..3ecbf2a 100644
 --- a/Documentation/git-init.txt
 +++ b/Documentation/git-init.txt
 @@ -111,6 +111,15 @@ into it.
  If you provide a 'directory', the command is run inside it. If this directory
  does not exist, it will be created.

 +--config key=value::
 +-c key=value::
 +Set a new configuration option in the new repository. The key expected in
 +the same format as linkgit:git-config[1] (e.g., `core.eol=true`). If

If what?

 +This option can be used multiply times. If multiply options are given with

s/multiply/multiple/g

 +the same keys, each value will be written to the config. If given key is
 +the same that used in the default configuration file, previous value
 +will be overwritten.
 diff --git a/t/t0001-init.sh b/t/t0001-init.sh
 index 7de8d85..8ce3537 100755
 --- a/t/t0001-init.sh
 +++ b/t/t0001-init.sh
 @@ -339,4 +339,20 @@ test_expect_success SYMLINKS 're-init to move gitdir 
 symlink' '
 test_path_is_dir realgitdir/refs
  '

 +test_expect_success 'git init -c key=value' '
 +   rm -rf newdir realgitdir 
 +   git init -c core.foo=bar newdir 
 +   echo bar expect 
 +   git --git-dir=newdir/.git config core.foo actual 

Maybe git -C newdir ... instead?

 +   test_cmp expect actual
 +'
 +
 +test_expect_success 'git init -c key=value override default value' '
 +   rm -rf newdir 
 +   git init -c core.filemode=false newdir 
 +   echo false expect 
 +   git --git-dir=newdir/.git config core.filemode actual 
 +   test_cmp expect actual

git-init automatically detects an appropriate value for core.filemode,
so this test may not be telling us anything useful on some platforms.

 +'
 +
  test_done
 --
 2.3.3.611.g09038fc.dirty
--
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