* [PATCH v3] init: support --import to add all files and commit right after init
@ 2009-03-26 9:49 Nguyễn Thái Ngọc Duy
2009-03-26 9:57 ` Jeff King
0 siblings, 1 reply; 2+ messages in thread
From: Nguyễn Thái Ngọc Duy @ 2009-03-26 9:49 UTC (permalink / raw)
To: git, Johannes Schindelin, Jeff King; +Cc: Nguyễn Thái Ngọc Duy
This is equivalent to "git init;git add .;git commit -q -m blah".
I find myself doing that too many times, hence this shortcut.
In future, --fast-import support would also be nice if the import
directory has a lot of files.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
Hopefully I don't make any mistake this time. -m will not take any argument
for two reasons:
- optional argument for short options does not appear anywhere in git AFAIK.
let's not make parse-opt migration more difficult with -mfoo or -m=foo
- you want it short, so make it short :) if you want your own message, you
probably won't mind typing a few more: --import=blah
Documentation/git-init.txt | 17 ++++++++++++++++-
builtin-init-db.c | 44 ++++++++++++++++++++++++++++++++++++++++----
t/t0001-init.sh | 44 ++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 100 insertions(+), 5 deletions(-)
diff --git a/Documentation/git-init.txt b/Documentation/git-init.txt
index 71749c0..52bc34a 100644
--- a/Documentation/git-init.txt
+++ b/Documentation/git-init.txt
@@ -8,7 +8,8 @@ git-init - Create an empty git repository or reinitialize an existing one
SYNOPSIS
--------
-'git init' [-q | --quiet] [--bare] [--template=<template_directory>] [--shared[=<permissions>]]
+'git init' [-q | --quiet] [--bare] [--template=<template_directory>]
+ [--shared[=<permissions>]] [-m | --import[=<message>]]
OPTIONS
@@ -68,6 +69,20 @@ By default, the configuration flag receive.denyNonFastForwards is enabled
in shared repositories, so that you cannot force a non fast-forwarding push
into it.
+-m::
+--import[=<message>]::
+
+Commit everything to the newly initialized repository. This is equivalent to:
+
+----------------
+$ git init
+$ git add .
+$ git commit -q -m <message>
+----------------
+
+If `-m` is used or no message is given to `--import`, "Initial commit" will be used.
+This option does not work with `--bare` nor already initialized repository.
+
--
diff --git a/builtin-init-db.c b/builtin-init-db.c
index ee3911f..c787909 100644
--- a/builtin-init-db.c
+++ b/builtin-init-db.c
@@ -6,6 +6,7 @@
#include "cache.h"
#include "builtin.h"
#include "exec_cmd.h"
+#include "run-command.h"
#ifndef DEFAULT_GIT_TEMPLATE_DIR
#define DEFAULT_GIT_TEMPLATE_DIR "/usr/share/git-core/templates"
@@ -19,6 +20,7 @@
static int init_is_bare_repository = 0;
static int init_shared_repository = -1;
+static int reinit;
static void safe_create_dir(const char *dir, int share)
{
@@ -279,7 +281,7 @@ int init_db(const char *template_dir, unsigned int flags)
{
const char *sha1_dir;
char *path;
- int len, reinit;
+ int len;
safe_create_dir(get_git_dir(), 0);
@@ -363,8 +365,29 @@ static int guess_repository_type(const char *git_dir)
return 1;
}
+static int import_files(const char *import_message)
+{
+ const char *args[6];
+ int i = 0;
+ int ret;
+
+ args[i++] = "add";
+ args[i++] = ".";
+ args[i] = NULL;
+ ret = run_command_v_opt(args, RUN_GIT_CMD);
+ if (ret)
+ return ret;
+ i = 0;
+ args[i++] = "commit";
+ args[i++] = "-q";
+ args[i++] = "-m";
+ args[i++] = import_message;
+ args[i] = NULL;
+ return run_command_v_opt(args, RUN_GIT_CMD);
+}
+
static const char init_db_usage[] =
-"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared[=<permissions>]]";
+"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared[=<permissions>]] [-m|--import[=<message>]]";
/*
* If you want to, you can share the DB area with any number of branches.
@@ -377,7 +400,8 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
const char *git_dir;
const char *template_dir = NULL;
unsigned int flags = 0;
- int i;
+ const char *import_message = NULL;
+ int ret, i;
for (i = 1; i < argc; i++, argv++) {
const char *arg = argv[1];
@@ -392,12 +416,19 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
init_shared_repository = PERM_GROUP;
else if (!prefixcmp(arg, "--shared="))
init_shared_repository = git_config_perm("arg", arg+9);
+ else if (!strcmp(arg, "--import") || !strcmp(arg, "-m"))
+ import_message = "Initial commit";
+ else if (!prefixcmp(arg, "--import="))
+ import_message = arg+9;
else if (!strcmp(arg, "-q") || !strcmp(arg, "--quiet"))
flags |= INIT_DB_QUIET;
else
usage(init_db_usage);
}
+ if (import_message && is_bare_repository_cfg == 1)
+ die("--import does not work with --bare");
+
/*
* GIT_WORK_TREE makes sense only in conjunction with GIT_DIR
* without --bare. Catch the error early.
@@ -440,5 +471,10 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
set_git_dir(make_absolute_path(git_dir));
- return init_db(template_dir, flags);
+ ret = init_db(template_dir, flags);
+ if (ret || !import_message)
+ return ret;
+ if (reinit)
+ die("--import does not work with already initialized repository");
+ return import_files(import_message);
}
diff --git a/t/t0001-init.sh b/t/t0001-init.sh
index 5ac0a27..b8e8bfc 100755
--- a/t/t0001-init.sh
+++ b/t/t0001-init.sh
@@ -199,4 +199,48 @@ test_expect_success 'init honors global core.sharedRepository' '
x`git config -f shared-honor-global/.git/config core.sharedRepository`
'
+test_expect_success 'init --import does not work with --bare' '
+ (
+ unset GIT_DIR GIT_WORK_TREE GIT_CONFIG
+ mkdir init-import-bare.git &&
+ cd init-import-bare.git &&
+ ! git init --bare --import
+ )
+
+'
+
+test_expect_success 'init --import no message' '
+ (
+ test_tick
+ unset GIT_DIR GIT_WORK_TREE GIT_CONFIG
+ mkdir init-import-nomsg &&
+ cd init-import-nomsg &&
+ touch foo bar &&
+ git init --import &&
+ test "$(git rev-parse HEAD)" = 4ff955458fd61a7b5d798b81e28c9249e8ebb5df
+ )
+'
+
+test_expect_success 'init --import=msg' '
+ (
+ test_tick
+ unset GIT_DIR GIT_WORK_TREE GIT_CONFIG
+ mkdir init-import &&
+ cd init-import &&
+ touch foo bar &&
+ git init --import=test &&
+ test "$(git rev-parse HEAD)" = 758aa5a579e42200a6fd4e4964c7e1dc1875d67d
+ )
+'
+
+test_expect_success 'init --import on already init(ed) should fail' '
+ (
+ test_tick
+ unset GIT_DIR GIT_WORK_TREE GIT_CONFIG
+ cd init-import &&
+ ! git init --import=testagain &&
+ test "$(git rev-parse HEAD)" = 758aa5a579e42200a6fd4e4964c7e1dc1875d67d
+ )
+'
+
test_done
--
1.6.1.446.gc7851
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH v3] init: support --import to add all files and commit right after init
2009-03-26 9:49 [PATCH v3] init: support --import to add all files and commit right after init Nguyễn Thái Ngọc Duy
@ 2009-03-26 9:57 ` Jeff King
0 siblings, 0 replies; 2+ messages in thread
From: Jeff King @ 2009-03-26 9:57 UTC (permalink / raw)
To: Nguyễn Thái Ngọc Duy; +Cc: git, Johannes Schindelin
On Thu, Mar 26, 2009 at 08:49:03PM +1100, Nguyễn Thái Ngọc Duy wrote:
> This is equivalent to "git init;git add .;git commit -q -m blah".
> I find myself doing that too many times, hence this shortcut.
This version looks OK to me, but I have a few comments:
> Hopefully I don't make any mistake this time. -m will not take any argument
> for two reasons:
>
> - optional argument for short options does not appear anywhere in git AFAIK.
> let's not make parse-opt migration more difficult with -mfoo or -m=foo
shortlog's -w has optional arguments (and is the option that spawned the
discussion that led to Pierre writing the gitcli(7) text, IIRC). So
parse-options does handle it, but you _cannot_ say "-m foo" anymore.
> +-m::
> +--import[=<message>]::
Nit: -m made sense when it specified a message. But now that it doesn't
take a message, maybe "-i" would be more appropriate?
> +If `-m` is used or no message is given to `--import`, "Initial commit" will be used.
Style nit: long line.
-Peff
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2009-03-26 9:59 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-03-26 9:49 [PATCH v3] init: support --import to add all files and commit right after init Nguyễn Thái Ngọc Duy
2009-03-26 9:57 ` Jeff King
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).