From: Johannes Schindelin <Johannes.Schindelin@gmx.de>
To: Edward Thomson <ethomson@edwardthomson.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH] add: add --chmod=+x / --chmod=-x options
Date: Wed, 25 May 2016 09:46:17 +0200 (CEST) [thread overview]
Message-ID: <alpine.DEB.2.20.1605250923120.4449@virtualbox> (raw)
In-Reply-To: <20160525020609.GA20123@zoidberg>
Hi Ed,
On Tue, 24 May 2016, Edward Thomson wrote:
> Users on deficient filesystems that lack an execute bit may still
> wish to add files to the repository with the appropriate execute
> bit set (or not). Although this can be done in two steps
> (`git add foo && git update-index --chmod=+x foo`), providing the
> `--chmod=+x` option to the add command allows users to set a file
> executable in a single command that they're already familiar with.
>
> Signed-off-by: Edward Thomson <ethomson@edwardthomson.com>
I like it! Some comments below:
> diff --git a/builtin/add.c b/builtin/add.c
> index 145f06e..2a9abf7 100644
> --- a/builtin/add.c
> +++ b/builtin/add.c
> @@ -238,6 +238,8 @@ static int ignore_add_errors, intent_to_add, ignore_missing;
> static int addremove = ADDREMOVE_DEFAULT;
> static int addremove_explicit = -1; /* unspecified */
>
> +static char should_chmod = 0;
> +
> static int ignore_removal_cb(const struct option *opt, const char *arg, int unset)
> {
> /* if we are told to ignore, we are not adding removals */
> @@ -245,6 +247,15 @@ static int ignore_removal_cb(const struct option *opt, const char *arg, int unse
> return 0;
> }
>
> +static int chmod_cb(const struct option *opt, const char *arg, int unset)
> +{
> + char *flip = opt->value;
> + if ((arg[0] != '-' && arg[0] != '+') || arg[1] != 'x' || arg[2])
> + return error("option 'chmod' expects \"+x\" or \"-x\"");
> + *flip = arg[0];
> + return 0;
> +}
> +
> static struct option builtin_add_options[] = {
> OPT__DRY_RUN(&show_only, N_("dry run")),
> OPT__VERBOSE(&verbose, N_("be verbose")),
> @@ -263,6 +274,9 @@ static struct option builtin_add_options[] = {
> OPT_BOOL( 0 , "refresh", &refresh_only, N_("don't add, only refresh the index")),
> OPT_BOOL( 0 , "ignore-errors", &ignore_add_errors, N_("just skip files which cannot be added because of errors")),
> OPT_BOOL( 0 , "ignore-missing", &ignore_missing, N_("check if - even missing - files are ignored in dry run")),
> + { OPTION_CALLBACK, 0, "chmod", &should_chmod, N_("(+/-)x"),
> + N_("override the executable bit of the listed files"),
> + PARSE_OPT_NONEG | PARSE_OPT_LITERAL_ARGHELP, chmod_cb},
I wonder, however, whether it would be "cleaner" to simply make this an
OPT_STRING and perform the validation after the option parsing. Something
like:
const char *chmod_string = NULL;
...
OPT_STRING( 0 , "chmod", &chmod_string, N_("( +x | -x )"),
N_("override the executable bit of the listed files")),
...
flags = ...
if (chmod_string) {
if (!strcmp("+x", chmod_string))
flags |= ADD_CACHE_FORCE_EXECUTABLE;
else if (!strcmp("-x", chmod_string))
flags |= ADD_CACHE_FORCE_NOTEXECUTABLE;
else
die(_("invalid --chmod value: %s"), chmod_string);
}
> diff --git a/cache.h b/cache.h
> index 6049f86..da03cd9 100644
> --- a/cache.h
> +++ b/cache.h
> @@ -581,6 +581,8 @@ extern int remove_file_from_index(struct index_state *, const char *path);
> #define ADD_CACHE_IGNORE_ERRORS 4
> #define ADD_CACHE_IGNORE_REMOVAL 8
> #define ADD_CACHE_INTENT 16
> +#define ADD_CACHE_FORCE_EXECUTABLE 32
> +#define ADD_CACHE_FORCE_NOTEXECUTABLE 64
Hmm. This change uses up 2 out of 31 available bits. I wonder whether a
better idea would be to extend struct update_callback_data to include a
`force_mode` field, pass a parameter of the same name to
add_files_to_cache() and then handle that in the update_callback().
Something like this:
case DIFF_STATUS_MODIFIED:
- case DIFF_STATUS_TYPE_CHANGED:
+ case DIFF_STATUS_TYPE_CHANGED: {
+ struct stat st;
+ if (lstat(path, &st))
+ die_errno("unable to stat '%s'", path);
+ if (S_ISREG(&st.st_mode) && data->force_mode)
+ st.st_mode = data->force_mode;
- if (add_file_to_index(&the_index, path, data->flags)) {
+ if (add_to_index(&the_index, path, &st, data->flags)) {
if (!(data->flags & ADD_CACHE_IGNORE_ERRORS))
die(_("updating files failed"));
data->add_errors++;
}
break;
+ }
This would not only contain the changes in builtin/add.c, it would also
force the mode change when core.filemode = true and core.symlinks = true
(which your version would handle in a surprising way, I believe).
> 2.6.4 (Apple Git-63)
Time to upgrade? ;-)
Ciao,
Dscho
next prev parent reply other threads:[~2016-05-25 7:52 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-25 2:06 [PATCH] add: add --chmod=+x / --chmod=-x options Edward Thomson
2016-05-25 7:36 ` Junio C Hamano
2016-05-25 12:19 ` Johannes Schindelin
2016-05-25 16:10 ` Junio C Hamano
2016-05-25 16:49 ` Johannes Schindelin
2016-05-25 16:00 ` Junio C Hamano
2016-05-27 4:41 ` Edward Thomson
2016-05-27 5:12 ` Mike Hommey
2016-05-27 6:36 ` Junio C Hamano
2016-05-27 18:30 ` Junio C Hamano
2016-05-31 22:06 ` Edward Thomson
2016-05-25 7:46 ` Johannes Schindelin [this message]
2016-05-27 18:35 ` Junio C Hamano
2016-05-25 7:51 ` Junio C Hamano
-- strict thread matches above, loose matches on Subject: below --
2016-05-31 22:08 Edward Thomson
2016-05-31 22:34 ` Junio C Hamano
2016-06-01 7:23 ` Johannes Schindelin
2016-06-01 10:19 ` Johannes Schindelin
2016-06-01 16:00 ` Junio C Hamano
2016-06-07 22:59 ` Edward Thomson
2016-06-08 0:39 ` Junio C Hamano
2016-06-08 11:46 ` Duy Nguyen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alpine.DEB.2.20.1605250923120.4449@virtualbox \
--to=johannes.schindelin@gmx.de \
--cc=ethomson@edwardthomson.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
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 read-only IMAP folder(s) and NNTP newsgroup(s).