From: Johannes Schindelin <Johannes.Schindelin@gmx.de>
To: Carlos Rica <jasampler@gmail.com>
Cc: git@vger.kernel.org, Junio C Hamano <gitster@pobox.com>
Subject: Re: [PATCH] Make "git reset" a builtin. (incomplete)
Date: Thu, 23 Aug 2007 12:14:54 +0100 (BST) [thread overview]
Message-ID: <Pine.LNX.4.64.0708231158120.20400@racer.site> (raw)
In-Reply-To: <46CC3090.7080500@gmail.com>
Hi,
[I thought that it was high time in this thread to review the code]
On Wed, 22 Aug 2007, Carlos Rica wrote:
> The tests I made for it are not finished so they are not included, but
> it seems to pass the rest of the test suite.
AFAICS there are only "reset --hard"s in the test suite.
> diff --git a/builtin-reset.c b/builtin-reset.c
> [...]
> +
> +static int unmerged_files(void)
> +{
> + char b;
> + ssize_t len;
> + struct child_process cmd;
> + const char *argv_ls_files[] = {"ls-files", "--unmerged", NULL};
> +
> + memset(&cmd, 0, sizeof(cmd));
> + cmd.argv = argv_ls_files;
> + cmd.git_cmd = 1;
> + cmd.out = -1;
> +
> + if (start_command(&cmd))
> + die("Could not run sub-command: git ls-files");
> +
> + len = xread(cmd.out, &b, 1);
> + if (len < 0)
> + die("Could not read output from git ls-files: %s",
> + strerror(errno));
> + finish_command(&cmd);
> +
> + return len;
> +}
I think it is a good idea to start out using run_command, and if we ever
run into performance issues, we can always switch to calling the functions
directly.
> +static int print_line_current_head(void)
> +{
> + const char *argv_log[] = {"log", "--max-count=1", "--pretty=oneline",
> + "--abbrev-commit", "HEAD", NULL};
> + printf("HEAD is now at ");
> + unsetenv("GIT_PAGER");
> + return run_command_v_opt(argv_log, RUN_GIT_CMD);
> +}
This is a candidate to refactoring, using commit.c's get_one_line()
function.
> +int cmd_reset(int argc, const char **argv, const char *prefix)
> +{
> + int i = 1, reset_type = MIXED, update_ref_status = 0;
> + const char *rev = "HEAD";
> + unsigned char sha1[20], *orig = NULL, sha1_orig[20],
> + *old_orig = NULL, sha1_old_orig[20];
> + struct object *obj;
> + char *reflog_action;
> +
> + git_config(git_default_config);
> +
> + reflog_action = args_to_str(argv);
> + setenv("GIT_REFLOG_ACTION", reflog_action, 0);
> +
> + if (i < argc) {
> + if (!strcmp(argv[i], "--mixed")) {
> + reset_type = MIXED;
> + i++;
> + }
> + else if (!strcmp(argv[i], "--soft")) {
> + reset_type = SOFT;
> + i++;
> + }
> + else if (!strcmp(argv[i], "--hard")) {
> + reset_type = HARD;
> + i++;
> + }
> + }
> +
> + if (i < argc && argv[i][0] != '-')
> + rev = argv[i++];
> +
> + if (get_sha1(rev, sha1))
> + die("Failed to resolve '%s' as a valid ref.", rev);
> +
> + obj = deref_tag(parse_object(sha1), sha1_to_hex(sha1), 40);
IMHO it would be better to use "..., rev, strlen(rev));" instead.
> + if (!obj)
> + die("Could not parse object '%s'.", rev);
> + memcpy(sha1, obj->sha1, sizeof(sha1));
> +
> + if (i < argc && argv[i][0] == '-') {
> + if (strcmp(argv[i], "--"))
> + usage(builtin_reset_usage);
> + else
> + i++;
> + }
IMHO this would be clearer:
if (i < argc && !strcmp(argv[i], "--"))
i++;
else if (i < argc && argv[i][0] == '-')
usage(builtin_reset_usage);
but I do not care _that_ deeply.
> + /* git reset --mixed tree [--] paths... can be used to
> + * load chosen paths from the tree into the index without
> + * affecting the working tree nor HEAD. */
> + if (i < argc) {
> + if (reset_type != MIXED)
> + die("Cannot do partial %s reset.", argv[1]);
Hmm. Maybe use a static const array of "hard", "mixed" and "soft"?
> + /*
> + git diff-index --cached $rev -- "$@" |
> + sed -e 's/^:\([0-7][0-7]*\) [0-7][0-7]* \([0-9a-f][0-9a-f]*\) [0-9a-f][0-9a-f]* [A-Z] \(.*\)$/\1 \2 \3/' |
> + git update-index --add --remove --index-info || exit
> + */
> + update_index_refresh();
AFAICT this code misses out on added files, i.e. files which are in $rev,
but not in the index.
> + /* Any resets update HEAD to the head being switched to,
> + * saving the previous head in ORIG_HEAD before. */
> + if (!get_sha1("ORIG_HEAD", sha1_old_orig))
> + old_orig = sha1_old_orig;
> + if (!get_sha1("HEAD", sha1_orig)) {
> + orig = sha1_orig;
> + update_ref("updating ORIG_HEAD", "ORIG_HEAD", orig, old_orig);
> + }
> + else if (old_orig)
> + delete_ref("ORIG_HEAD", old_orig);
Why not put the get_sha1() into the else if()? You spare a variable and a
few lines there.
Otherwise it looks good to me. It would be good if you could post your
test script, though, so that people can get a feel what works and what
needs work.
Ciao,
Dscho
prev parent reply other threads:[~2007-08-23 11:15 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-08-22 12:48 [PATCH] Make "git reset" a builtin. (incomplete) Carlos Rica
2007-08-22 13:00 ` David Kastrup
2007-08-22 13:37 ` Andreas Ericsson
2007-08-22 14:29 ` David Kastrup
2007-08-22 14:49 ` Mike Hommey
2007-08-22 15:02 ` Chris Shoemaker
2007-08-22 15:41 ` David Kastrup
2007-08-22 16:07 ` Nicolas Pitre
2007-08-22 16:51 ` Johannes Schindelin
2007-08-22 17:17 ` David Kastrup
2007-08-22 19:05 ` Linus Torvalds
2007-08-22 19:36 ` David Kastrup
2007-08-22 19:58 ` Linus Torvalds
2007-08-22 22:25 ` David Kastrup
2007-08-22 23:10 ` Linus Torvalds
2007-08-22 23:39 ` David Kastrup
2007-08-23 1:30 ` Linus Torvalds
2007-08-23 0:24 ` Wincent Colaiuta
2007-08-23 1:15 ` Nicolas Pitre
2007-08-23 1:40 ` Jon Smirl
2007-08-23 3:23 ` Linus Torvalds
2007-08-23 4:21 ` Junio C Hamano
2007-08-23 9:15 ` Johannes Schindelin
2007-08-22 21:34 ` Reece Dunn
2007-08-23 9:10 ` Johannes Schindelin
2007-08-23 10:20 ` Theodore Tso
2007-08-23 10:31 ` Johannes Schindelin
2007-08-23 10:55 ` David Tweed
2007-08-23 11:24 ` Theodore Tso
2007-08-23 11:35 ` Johannes Schindelin
2007-08-23 16:30 ` Jon Smirl
2007-08-23 11:25 ` Reece Dunn
2007-08-23 20:26 ` Alex Riesen
2007-08-23 21:14 ` David Kastrup
2007-08-23 21:33 ` Alex Riesen
2007-08-23 22:05 ` David Kastrup
2007-08-22 17:21 ` Nicolas Pitre
2007-08-23 9:55 ` Johannes Schindelin
2007-08-23 15:19 ` Nicolas Pitre
2007-08-22 21:19 ` Reece Dunn
2007-08-23 9:05 ` Johannes Schindelin
2007-08-23 18:40 ` Robin Rosenberg
2007-08-23 2:05 ` Nguyen Thai Ngoc Duy
2007-08-22 13:42 ` Matthieu Moy
2007-08-22 22:28 ` David Kastrup
2007-08-22 14:27 ` Andy Parkins
2007-08-22 14:57 ` Johannes Sixt
2007-08-22 16:20 ` Alex Riesen
2007-08-23 11:14 ` Johannes Schindelin [this message]
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Pine.LNX.4.64.0708231158120.20400@racer.site \
--to=johannes.schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jasampler@gmail.com \
/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.
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).