From: Glen Choo <chooglen@google.com>
To: git@vger.kernel.org
Cc: "Glen Choo" <chooglen@google.com>,
"Jonathan Tan" <jonathantanmy@google.com>,
"Josh Steadmon" <steadmon@google.com>,
"Emily Shaffer" <emilyshaffer@google.com>,
"Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
"Philippe Blain" <levraiphilippeblain@gmail.com>,
"Junio C Hamano" <gitster@pobox.com>
Subject: [PATCH v5 0/5] implement branch --recurse-submodules
Date: Thu, 16 Dec 2021 15:33:19 -0800 [thread overview]
Message-ID: <20211216233324.65126-1-chooglen@google.com> (raw)
In-Reply-To: <20211216003213.99135-1-chooglen@google.com>
Submodule branching RFC:
https://lore.kernel.org/git/kl6lv912uvjv.fsf@chooglen-macbookpro.roam.corp.google.com/
Original Submodule UX RFC/Discussion:
https://lore.kernel.org/git/YHofmWcIAidkvJiD@google.com/
Contributor Summit submodules Notes:
https://lore.kernel.org/git/nycvar.QRO.7.76.6.2110211148060.56@tvgsbejvaqbjf.bet/
Submodule UX overhaul updates:
https://lore.kernel.org/git/?q=Submodule+UX+overhaul+update
This series implements branch --recurse-submodules as laid out in the
Submodule branching RFC (linked above). If there are concerns about the
UX/behavior, I would appreciate feedback on the RFC thread as well :)
This series is based off js/branch-track-inherit.
Future work:
* `git branch -d --recurse-submodules` so that users can clean up
extraneous branches.
* `git [checkout | switch] --recurse-submodules` +
submodule.propagateBranches so that users can actually checkout the
branches.
* After [1], it seems clear that --recurse-submodules parsing could
really benefit from some standardization. It's not obvious which
RECURSE_SUBMODULE_* enums are applicable to which commands, and there
is no way to distinguish between an explicit --recurse-submodules from
argv vs submodule.recurse from the config.
I chose not to use them in this series because their usage is already
inconsistent (grep.c doesn't use them either), and it would be _more_
confusing to use the enum (handling RECURSE_SUBMODULES_DEFAULT = 1 is
trickier than boolean 0 and 1).
At this point, I think it would be too noisy to introduce the enum,
but this would be a nice cleanup to do later.
* As documented in branch.c, we create branches using a child process
only because install_branch_config() does not support submodules.
It should be possible to remove the child process once we make the
appropriate changes to config.c. I attempted this in [2] but chose to
punt it because it was too time-consuming at the time.
Changes since v4:
* Rebase correctly onto 'gitster/seen^{/^Merge branch .js/branch-track-inherit.}'
(see base-commit) as suggested in [3] (thanks Junio!)
* These patches were also verified on top of 'next'.
Changes since v3:
* Split up the old patch 1. Patch 1 had a big diff because it used to
move lines, remove dead code and introduce repo_* functions (thanks
Jonathan!)
** repo_* functions have been dropped; they added noise and are not
necessary for correctness.
* Use a new, harder-to-misuse function in --set-upstream-to,
dwim_and_setup_tracking(). Now, setup_tracking() never does DWIM and
dwim_and_setup_tracking() always does DWIM.
* Move create_branch() dry_run to its own patch.
* Fix an oversight where submodules in subtrees were ignored. This was
because submodules_of_tree() and tree_entry() didn't recurse into
subtrees. Test this accordingly (thanks Jonathan!).
* cmd_branch() possible actions are more consistently ordered.
* Documentation fixes (thanks Philippe!).
* Additional comments and explanation.
* Drop patch 5 (optional cleanup).
* Rebase onto js/branch-track-inherit v6.
Changes since v2:
* Rebase onto js/branch-track-inherit. This series should continue to be
the case going forward.
* Patch 1 has a smaller diff because the introduction of
validate_branch_start() no longer changes the function order thanks to a
forward declaration. This artificial forward declaration is removed in a
patch 2 (which can just be squashed into patch 1).
* Optional cleanup: fix questionable exit codes in patch 5.
Changes since v1:
* Move the functionality of "git branch --dry-run" into "git submodule-helper create-branch --dry-run"
* Add more fields to the submodules_of_tree() struct to reduce the
number of allocations made by the caller. Move this functionality
to patch 3 (formerly patch 4) and drop patch 1.
* Make submodules_of_tree() ignore inactive submodules
* Structure the output of the submodules a bit better by adding prefixes
to the child process' output (instead of inconsistently indenting the
output).
** I wasn't able to find a good way to interleave stdout/stderr
correctly, so a less-than-desirable workaround was to route the child
process output to stdout/stderr depending on the exit code.
** Eventually, I would like to structure the output of submodules in a
report, as Ævar suggested. But at this stage, I think that it's
better to spend time getting user feedback on the submodules
branching UX and it'll be easier to standardize the output when we've
implemented more of the UX :)
[1] https://lore.kernel.org/git/kl6lbl1p9zjf.fsf@chooglen-macbookpro.roam.corp.google.com/
[2] https://lore.kernel.org/git/kl6lv90ytd4v.fsf@chooglen-macbookpro.roam.corp.google.com/
[3] https://lore.kernel.org/git/xmqqlf0lz6os.fsf@gitster.g
Glen Choo (5):
branch: move --set-upstream-to behavior to dwim_and_setup_tracking()
branch: make create_branch() always create a branch
branch: add a dry_run parameter to create_branch()
builtin/branch: clean up action-picking logic in cmd_branch()
branch: add --recurse-submodules option for branch creation
Documentation/config/advice.txt | 3 +
Documentation/config/submodule.txt | 24 ++-
Documentation/git-branch.txt | 11 +-
advice.c | 1 +
advice.h | 1 +
branch.c | 257 ++++++++++++++++++++-----
branch.h | 57 +++++-
builtin/branch.c | 70 +++++--
builtin/checkout.c | 3 +-
builtin/submodule--helper.c | 38 ++++
submodule-config.c | 60 ++++++
submodule-config.h | 34 ++++
submodule.c | 11 +-
submodule.h | 3 +
t/t3200-branch.sh | 17 ++
t/t3207-branch-submodule.sh | 291 +++++++++++++++++++++++++++++
16 files changed, 805 insertions(+), 76 deletions(-)
create mode 100755 t/t3207-branch-submodule.sh
Range-diff against v4:
1: 751e8ae566 < -: ---------- branch: accept multiple upstream branches for tracking
2: 5d1ebe1495 < -: ---------- branch: add flags and config to inherit tracking
3: 0080a1fb35 < -: ---------- config: require lowercase for branch.autosetupmerge
4: dfdbbaaca5 ! 1: a9d1108b3e branch: move --set-upstream-to behavior to dwim_and_setup_tracking()
@@ Commit message
This refactor is motivated by a desire to add a "dry_run" parameter to
create_branch() that will validate whether or not a branch can be
- created without actually creating it - this behavior be used in a
+ created without actually creating it - this behavior will be used in a
subsequent commit that adds `git branch --recurse-submodules topic`.
Adding "dry_run" is not obvious because create_branch() is also used to
@@ branch.c: N_("\n"
@@ branch.c: void create_branch(struct repository *r,
if ((commit = lookup_commit_reference(r, &oid)) == NULL)
- die(_("Not a valid branch point: '%s'."), start_name);
+ die(_("not a valid branch point: '%s'"), start_name);
- oidcpy(&oid, &commit->object.oid);
+ if (out_real_ref)
+ *out_real_ref = real_ref ? xstrdup(real_ref) : NULL;
5: e22a177cb7 ! 2: c543c1412a branch: make create_branch() always create a branch
@@ Commit message
create_branch() was formerly used to set tracking without creating a
branch. Since the previous commit replaces this use case with
- setup_tracking(), we can simplify create_branch() so that it always
- creates a branch.
+ dwim_and_setup_tracking(), we can simplify create_branch() so that it
+ always creates a branch.
Do this simplification, in particular:
6: 8a895aa401 ! 3: dddd434d7a branch: add a dry_run parameter to create_branch()
@@ builtin/checkout.c: static void update_refs_for_switch(const struct checkout_opt
- opts->track);
+ opts->track,
+ 0);
- new_branch_info->name = opts->new_branch;
- setup_branch_path(new_branch_info);
- }
+ free(new_branch_info->name);
+ free(new_branch_info->refname);
+ new_branch_info->name = xstrdup(opts->new_branch);
7: 971c53ec85 = 4: 41cca3bd52 builtin/branch: clean up action-picking logic in cmd_branch()
8: cd88f3ad92 ! 5: 540eeab183 branch: add --recurse-submodules option for branch creation
@@ t/t3207-branch-submodule.sh (new)
+ test_must_fail git rev-parse branch-a &&
+
+ cat >expected <<-EOF &&
-+ submodule ${SQ}sub${SQ}: fatal: A branch named ${SQ}branch-a${SQ} already exists.
++ submodule ${SQ}sub${SQ}: fatal: a branch named ${SQ}branch-a${SQ} already exists
+ fatal: submodule ${SQ}sub${SQ}: cannot create branch ${SQ}branch-a${SQ}
+ EOF
+ test_cmp expected actual
base-commit: a1eb3ee8288c96c95d18fef027fc276b5cb3b17a
--
2.33.GIT
next prev parent reply other threads:[~2021-12-16 23:33 UTC|newest]
Thread overview: 110+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-22 22:32 [PATCH 0/4] implement branch --recurse-submodules Glen Choo
2021-11-22 22:32 ` [PATCH 1/4] submodule-config: add submodules_of_tree() helper Glen Choo
2021-11-23 2:12 ` Jonathan Tan
2021-11-23 19:48 ` Glen Choo
2021-11-23 10:53 ` Ævar Arnfjörð Bjarmason
2021-11-23 18:35 ` Glen Choo
2021-11-23 22:46 ` Junio C Hamano
2021-11-22 22:32 ` [PATCH 2/4] branch: refactor out branch validation from create_branch() Glen Choo
2021-11-22 22:32 ` [PATCH 3/4] branch: add --dry-run option to branch Glen Choo
2021-11-23 10:42 ` Ævar Arnfjörð Bjarmason
2021-11-23 18:42 ` Glen Choo
2021-11-23 23:10 ` Jonathan Tan
2021-11-24 0:52 ` Glen Choo
2021-11-22 22:32 ` [PATCH 4/4] branch: add --recurse-submodules option for branch creation Glen Choo
2021-11-23 10:45 ` Ævar Arnfjörð Bjarmason
2021-11-23 18:56 ` Glen Choo
2021-11-23 19:41 ` Philippe Blain
2021-11-23 23:43 ` Glen Choo
2021-11-24 1:31 ` Jonathan Tan
2021-11-24 18:18 ` Glen Choo
2021-11-29 21:01 ` Jonathan Tan
2021-12-06 21:55 ` [PATCH v2 0/3] implement branch --recurse-submodules Glen Choo
2021-12-06 21:55 ` [PATCH v2 1/3] branch: move --set-upstream-to behavior to setup_tracking() Glen Choo
2021-12-06 22:48 ` Junio C Hamano
2021-12-08 18:48 ` Glen Choo
2021-12-06 23:28 ` Junio C Hamano
2021-12-08 17:09 ` Glen Choo
2021-12-06 21:55 ` [PATCH v2 2/3] builtin/branch: clean up action-picking logic in cmd_branch() Glen Choo
2021-12-06 21:55 ` [PATCH v2 3/3] branch: add --recurse-submodules option for branch creation Glen Choo
2021-12-09 18:49 ` [PATCH v3 0/5] implement branch --recurse-submodules Glen Choo
2021-12-09 18:49 ` [PATCH v3 1/5] branch: move --set-upstream-to behavior to setup_tracking() Glen Choo
2021-12-09 21:19 ` Jonathan Tan
2021-12-09 22:16 ` Glen Choo
2021-12-09 18:49 ` [PATCH v3 2/5] branch: remove forward declaration of validate_branch_start() Glen Choo
2021-12-09 18:49 ` [PATCH v3 3/5] builtin/branch: clean up action-picking logic in cmd_branch() Glen Choo
2021-12-09 21:23 ` Jonathan Tan
2021-12-09 21:57 ` Glen Choo
2021-12-09 18:49 ` [PATCH v3 4/5] branch: add --recurse-submodules option for branch creation Glen Choo
2021-12-11 18:08 ` Philippe Blain
2021-12-14 20:08 ` Glen Choo
2021-12-09 18:49 ` [PATCH v3 5/5] branch.c: replace questionable exit() codes Glen Choo
2021-12-10 2:21 ` Ævar Arnfjörð Bjarmason
2021-12-10 17:43 ` Glen Choo
2021-12-13 9:02 ` Junio C Hamano
2021-12-13 9:19 ` Ævar Arnfjörð Bjarmason
2021-12-13 19:26 ` Junio C Hamano
2021-12-09 21:59 ` [PATCH v3 0/5] implement branch --recurse-submodules Jonathan Tan
2021-12-09 22:21 ` Glen Choo
2021-12-13 23:20 ` Jonathan Tan
2021-12-14 18:47 ` Glen Choo
2021-12-16 0:32 ` [PATCH v4 " Glen Choo
2021-12-16 0:32 ` [PATCH v4 1/5] branch: move --set-upstream-to behavior to dwim_and_setup_tracking() Glen Choo
2021-12-16 0:32 ` [PATCH v4 2/5] branch: make create_branch() always create a branch Glen Choo
2021-12-16 0:32 ` [PATCH v4 3/5] branch: add a dry_run parameter to create_branch() Glen Choo
2021-12-16 0:32 ` [PATCH v4 4/5] builtin/branch: clean up action-picking logic in cmd_branch() Glen Choo
2021-12-16 0:32 ` [PATCH v4 5/5] branch: add --recurse-submodules option for branch creation Glen Choo
2021-12-16 23:33 ` Glen Choo [this message]
2021-12-16 23:33 ` [PATCH v5 1/5] branch: move --set-upstream-to behavior to dwim_and_setup_tracking() Glen Choo
2021-12-16 23:33 ` [PATCH v5 2/5] branch: make create_branch() always create a branch Glen Choo
2021-12-16 23:33 ` [PATCH v5 3/5] branch: add a dry_run parameter to create_branch() Glen Choo
2021-12-16 23:33 ` [PATCH v5 4/5] builtin/branch: clean up action-picking logic in cmd_branch() Glen Choo
2021-12-16 23:33 ` [PATCH v5 5/5] branch: add --recurse-submodules option for branch creation Glen Choo
2021-12-17 0:34 ` [PATCH v5 0/5] implement branch --recurse-submodules Junio C Hamano
2021-12-17 0:45 ` Junio C Hamano
2021-12-20 19:09 ` Glen Choo
2021-12-20 19:50 ` Junio C Hamano
2021-12-20 20:25 ` Glen Choo
2021-12-20 23:34 ` [PATCH v6 " Glen Choo
2021-12-20 23:34 ` [PATCH v6 1/5] branch: move --set-upstream-to behavior to dwim_and_setup_tracking() Glen Choo
2022-01-11 2:09 ` Jonathan Tan
2022-01-11 17:29 ` Glen Choo
2022-01-11 20:03 ` Jonathan Tan
2021-12-20 23:34 ` [PATCH v6 2/5] branch: make create_branch() always create a branch Glen Choo
2022-01-11 2:19 ` Jonathan Tan
2022-01-11 17:51 ` Glen Choo
2021-12-20 23:34 ` [PATCH v6 3/5] branch: add a dry_run parameter to create_branch() Glen Choo
2021-12-20 23:34 ` [PATCH v6 4/5] builtin/branch: clean up action-picking logic in cmd_branch() Glen Choo
2021-12-20 23:34 ` [PATCH v6 5/5] branch: add --recurse-submodules option for branch creation Glen Choo
2021-12-26 4:09 ` Junio C Hamano
2022-01-11 3:28 ` Jonathan Tan
2022-01-11 18:11 ` Glen Choo
2022-01-11 20:15 ` Jonathan Tan
2022-01-11 23:22 ` Glen Choo
2021-12-20 23:36 ` [PATCH v6 0/5] implement branch --recurse-submodules Glen Choo
2021-12-21 1:07 ` Junio C Hamano
2021-12-21 17:51 ` Glen Choo
2022-01-24 20:44 ` [PATCH v7 0/6] " Glen Choo
2022-01-24 20:44 ` [PATCH v7 1/6] branch: move --set-upstream-to behavior to dwim_and_setup_tracking() Glen Choo
2022-01-24 20:44 ` [PATCH v7 2/6] branch: make create_branch() always create a branch Glen Choo
2022-01-24 20:44 ` [PATCH v7 3/6] branch: add a dry_run parameter to create_branch() Glen Choo
2022-01-24 20:44 ` [PATCH v7 4/6] builtin/branch: consolidate action-picking logic in cmd_branch() Glen Choo
2022-01-24 20:44 ` [PATCH v7 5/6] branch: add --recurse-submodules option for branch creation Glen Choo
2022-01-27 20:29 ` Jonathan Tan
2022-01-27 21:32 ` Glen Choo
2022-01-27 22:42 ` Glen Choo
2022-01-24 20:44 ` [PATCH v7 6/6] branch.c: use 'goto cleanup' in setup_tracking() to fix memory leaks Glen Choo
2022-01-27 22:15 ` Junio C Hamano
2022-01-28 19:44 ` Glen Choo
2022-01-29 0:04 ` [PATCH v8 0/6] implement branch --recurse-submodules Glen Choo
2022-01-29 0:04 ` [PATCH v8 1/6] branch: move --set-upstream-to behavior to dwim_and_setup_tracking() Glen Choo
2022-01-29 0:04 ` [PATCH v8 2/6] branch: make create_branch() always create a branch Glen Choo
2022-02-01 22:20 ` Junio C Hamano
2022-01-29 0:04 ` [PATCH v8 3/6] branch: add a dry_run parameter to create_branch() Glen Choo
2022-01-29 0:04 ` [PATCH v8 4/6] builtin/branch: consolidate action-picking logic in cmd_branch() Glen Choo
2022-01-29 0:04 ` [PATCH v8 5/6] branch: add --recurse-submodules option for branch creation Glen Choo
2022-02-04 1:10 ` Glen Choo
2022-02-04 16:15 ` Junio C Hamano
2022-02-04 18:10 ` Glen Choo
2022-01-29 0:04 ` [PATCH v8 6/6] branch.c: use 'goto cleanup' in setup_tracking() to fix memory leaks Glen Choo
2022-02-01 17:43 ` [PATCH v8 0/6] implement branch --recurse-submodules Jonathan Tan
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=20211216233324.65126-1-chooglen@google.com \
--to=chooglen@google.com \
--cc=avarab@gmail.com \
--cc=emilyshaffer@google.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jonathantanmy@google.com \
--cc=levraiphilippeblain@gmail.com \
--cc=steadmon@google.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.