From: Erick Mattos <erick.mattos@gmail•com>
To: Junio C Hamano <gitster@pobox•com>
Cc: git@vger•kernel.org, Erick Mattos <erick.mattos@gmail•com>
Subject: [PATCH 3/5] checkout --orphan: respect -l option always
Date: Fri, 21 May 2010 21:28:37 -0300 [thread overview]
Message-ID: <1274488119-6989-4-git-send-email-erick.mattos@gmail.com> (raw)
In-Reply-To: <1274488119-6989-1-git-send-email-erick.mattos@gmail.com>
Added changes to satisfy a corner case: creating reflogs by using -l
when core.logAllRefUpdates is set to false.
---
builtin/checkout.c | 31 ++++++++++++++++--
t/t2017-checkout-orphan.sh | 78 ++++++++++++++++++++++++++++++++------------
2 files changed, 85 insertions(+), 24 deletions(-)
diff --git a/builtin/checkout.c b/builtin/checkout.c
index c382521..024c936 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -493,7 +493,24 @@ static void update_refs_for_switch(struct checkout_opts *opts,
struct strbuf msg = STRBUF_INIT;
const char *old_desc;
if (opts->new_branch) {
- if (!opts->new_orphan_branch)
+ if (opts->new_orphan_branch) {
+ if (opts->new_branch_log && !log_all_ref_updates) {
+ int temp;
+ char *log_file;
+ char *ref_name = mkpath("refs/heads/%s", opts->new_orphan_branch);
+
+ temp = log_all_ref_updates;
+ log_all_ref_updates = 1;
+ if (log_ref_setup(ref_name, &log_file)) {
+ fprintf(stderr, "Can not do reflog for '%s'\n",
+ opts->new_orphan_branch);
+ log_all_ref_updates = temp;
+ return;
+ }
+ log_all_ref_updates = temp;
+ }
+ }
+ else
create_branch(old->name, opts->new_branch, new->name, 0,
opts->new_branch_log, opts->track);
new->name = opts->new_branch;
@@ -517,6 +534,14 @@ static void update_refs_for_switch(struct checkout_opts *opts,
opts->new_branch ? " a new" : "",
new->name);
}
+ if (old->path && old->name) {
+ char log_file[PATH_MAX], ref_file[PATH_MAX];
+
+ git_snpath(log_file, sizeof(log_file), "logs/%s", old->path);
+ git_snpath(ref_file, sizeof(ref_file), "%s", old->path);
+ if (!file_exists(ref_file) && file_exists(log_file))
+ remove_path(log_file);
+ }
} else if (strcmp(new->name, "HEAD")) {
update_ref(msg.buf, "HEAD", new->commit->object.sha1, NULL,
REF_NODEREF, DIE_ON_ERR);
@@ -684,8 +709,8 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
if (opts.new_orphan_branch) {
if (opts.new_branch)
die("--orphan and -b are mutually exclusive");
- if (opts.track > 0 || opts.new_branch_log)
- die("--orphan cannot be used with -t or -l");
+ if (opts.track > 0)
+ die("--orphan should not be used with -t");
opts.new_branch = opts.new_orphan_branch;
}
diff --git a/t/t2017-checkout-orphan.sh b/t/t2017-checkout-orphan.sh
index a8297c6..be88d4b 100755
--- a/t/t2017-checkout-orphan.sh
+++ b/t/t2017-checkout-orphan.sh
@@ -49,6 +49,62 @@ test_expect_success '--orphan must be rejected with -b' '
test refs/heads/master = "$(git symbolic-ref HEAD)"
'
+test_expect_success '--orphan must be rejected with -t' '
+ git checkout master &&
+ test_must_fail git checkout --orphan new -t master &&
+ test refs/heads/master = "$(git symbolic-ref HEAD)"
+'
+
+test_expect_success '--orphan ignores branch.autosetupmerge' '
+ git checkout master &&
+ git config branch.autosetupmerge always &&
+ git checkout --orphan gamma &&
+ test -z "$(git config branch.gamma.merge)" &&
+ test refs/heads/gamma = "$(git symbolic-ref HEAD)" &&
+ test_must_fail git rev-parse --verify HEAD^
+'
+
+test_expect_success '--orphan makes reflog by default' '
+ git checkout master &&
+ git config --unset core.logAllRefUpdates &&
+ git checkout --orphan delta &&
+ ! test -f .git/logs/refs/heads/delta &&
+ test_must_fail PAGER= git reflog show delta &&
+ git commit -m Delta &&
+ test -f .git/logs/refs/heads/delta &&
+ PAGER= git reflog show delta
+'
+
+test_expect_success '--orphan does not make reflog when core.logAllRefUpdates = false' '
+ git checkout master &&
+ git config core.logAllRefUpdates false &&
+ git checkout --orphan epsilon &&
+ ! test -f .git/logs/refs/heads/epsilon &&
+ test_must_fail PAGER= git reflog show epsilon &&
+ git commit -m Epsilon &&
+ ! test -f .git/logs/refs/heads/epsilon &&
+ test_must_fail PAGER= git reflog show epsilon
+'
+
+test_expect_success '--orphan with -l makes reflog when core.logAllRefUpdates = false' '
+ git checkout master &&
+ git checkout -l --orphan zeta &&
+ test -f .git/logs/refs/heads/zeta &&
+ test_must_fail PAGER= git reflog show zeta &&
+ git commit -m Zeta &&
+ PAGER= git reflog show zeta
+'
+
+test_expect_success 'giving up --orphan not committed when -l and core.logAllRefUpdates = false deletes reflog' '
+ git checkout master &&
+ git checkout -l --orphan eta &&
+ test -f .git/logs/refs/heads/eta &&
+ test_must_fail PAGER= git reflog show eta &&
+ git checkout master &&
+ ! test -f .git/logs/refs/heads/eta &&
+ test_must_fail PAGER= git reflog show eta
+'
+
test_expect_success '--orphan is rejected with an existing name' '
git checkout master &&
test_must_fail git checkout --orphan master &&
@@ -60,31 +116,11 @@ test_expect_success '--orphan refuses to switch if a merge is needed' '
git reset --hard &&
echo local >>"$TEST_FILE" &&
cat "$TEST_FILE" >"$TEST_FILE.saved" &&
- test_must_fail git checkout --orphan gamma master^ &&
+ test_must_fail git checkout --orphan new master^ &&
test refs/heads/master = "$(git symbolic-ref HEAD)" &&
test_cmp "$TEST_FILE" "$TEST_FILE.saved" &&
git diff-index --quiet --cached HEAD &&
git reset --hard
'
-test_expect_success '--orphan does not mix well with -t' '
- git checkout master &&
- test_must_fail git checkout -t master --orphan gamma &&
- test refs/heads/master = "$(git symbolic-ref HEAD)"
-'
-
-test_expect_success '--orphan ignores branch.autosetupmerge' '
- git checkout -f master &&
- git config branch.autosetupmerge always &&
- git checkout --orphan delta &&
- test -z "$(git config branch.delta.merge)" &&
- test refs/heads/delta = "$(git symbolic-ref HEAD)" &&
- test_must_fail git rev-parse --verify HEAD^
-'
-
-test_expect_success '--orphan does not mix well with -l' '
- git checkout -f master &&
- test_must_fail git checkout -l --orphan gamma
-'
-
test_done
--
1.7.1.231.g0687c.dirty
next prev parent reply other threads:[~2010-05-22 0:29 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-22 0:28 [PATCH 0/5] checkout --orphan improvements Erick Mattos
2010-05-22 0:28 ` [PATCH 1/5] Documentation: alter checkout --orphan description Erick Mattos
2010-05-22 0:28 ` [PATCH 2/5] refs: split log_ref_write logic into log_ref_setup Erick Mattos
2010-05-26 5:07 ` Junio C Hamano
2010-05-26 18:11 ` Erick Mattos
2010-06-02 18:14 ` Junio C Hamano
2010-06-02 23:16 ` Erick Mattos
2010-05-22 0:28 ` Erick Mattos [this message]
2010-05-26 5:07 ` [PATCH 3/5] checkout --orphan: respect -l option always Junio C Hamano
2010-05-26 14:52 ` Erick Mattos
2010-05-26 15:13 ` Erik Faye-Lund
2010-05-26 16:01 ` Erick Mattos
2010-06-03 16:28 ` Erick Mattos
2010-05-26 15:31 ` Michael J Gruber
2010-05-26 18:04 ` Erick Mattos
2010-05-27 7:50 ` Michael J Gruber
2010-05-22 0:28 ` [PATCH 4/5] t3200: test -l with core.logAllRefUpdates options Erick Mattos
2010-05-22 0:43 ` [PATCH 5/5] bash completion: add --orphan to 'git checkout' Erick Mattos
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=1274488119-6989-4-git-send-email-erick.mattos@gmail.com \
--to=erick.mattos@gmail$(echo .)com \
--cc=git@vger$(echo .)kernel.org \
--cc=gitster@pobox$(echo .)com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
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