update packages
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
;;; magit-branch.el --- branch support -*- lexical-binding: t -*-
|
||||
|
||||
;; Copyright (C) 2010-2021 The Magit Project Contributors
|
||||
;; Copyright (C) 2010-2022 The Magit Project Contributors
|
||||
;;
|
||||
;; You should have received a copy of the AUTHORS.md file which
|
||||
;; lists all contributors. If not, see http://magit.vc/authors.
|
||||
@@ -8,6 +8,8 @@
|
||||
;; Author: Jonas Bernoulli <jonas@bernoul.li>
|
||||
;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
|
||||
|
||||
;; SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
;; Magit is free software; you can redistribute it and/or modify it
|
||||
;; under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation; either version 3, or (at your option)
|
||||
@@ -31,9 +33,6 @@
|
||||
|
||||
;;; Code:
|
||||
|
||||
(eval-when-compile
|
||||
(require 'subr-x))
|
||||
|
||||
(require 'magit)
|
||||
(require 'magit-reset)
|
||||
|
||||
@@ -115,7 +114,8 @@ should be used as the upstream.
|
||||
This option allows specifying the branch that should be used as
|
||||
the upstream when branching certain remote branches. The value
|
||||
is an alist of the form ((UPSTREAM . RULE)...). The first
|
||||
matching element is used, the following elements are ignored.
|
||||
element is used whose UPSTREAM exists and whose RULE matches
|
||||
the name of the new branch. Subsequent elements are ignored.
|
||||
|
||||
UPSTREAM is the branch to be used as the upstream for branches
|
||||
specified by RULE. It can be a local or a remote branch.
|
||||
@@ -129,7 +129,7 @@ part of the name of the branch that is being branched from.
|
||||
If you use a finite set of non-ephemeral branches across all your
|
||||
repositories, then you might use something like:
|
||||
|
||||
((\"origin/master\" \"master\" \"next\" \"maint\"))
|
||||
((\"origin/master\" . (\"master\" \"next\" \"maint\")))
|
||||
|
||||
Or if the names of all your ephemeral branches contain a slash,
|
||||
at least in some repositories, then a good value could be:
|
||||
@@ -141,6 +141,16 @@ Of course you can also fine-tune:
|
||||
((\"origin/maint\" . \"\\\\\\=`hotfix/\")
|
||||
(\"origin/master\" . \"\\\\\\=`feature/\"))
|
||||
|
||||
UPSTREAM can be a local branch:
|
||||
|
||||
((\"master\" . (\"master\" \"next\" \"maint\")))
|
||||
|
||||
Because the main branch is no longer almost always named \"master\"
|
||||
you should also account for other common names:
|
||||
|
||||
((\"main\" . (\"main\" \"master\" \"next\" \"maint\"))
|
||||
(\"master\" . (\"main\" \"master\" \"next\" \"maint\")))
|
||||
|
||||
If you use remote branches as UPSTREAM, then you might also want
|
||||
to set `magit-branch-prefer-remote-upstream' to a non-nil value.
|
||||
However, I recommend that you use local branches as UPSTREAM."
|
||||
@@ -204,6 +214,10 @@ has to be used to view and change branch related variables."
|
||||
(transient-define-prefix magit-branch (branch)
|
||||
"Add, configure or remove a branch."
|
||||
:man-page "git-branch"
|
||||
["Arguments"
|
||||
(7 "-r" "Recurse submodules when checking out an existing branch"
|
||||
"--recurse-submodules"
|
||||
:if (lambda () (version<= "2.13" (magit-git-version))))]
|
||||
["Variables"
|
||||
:if (lambda ()
|
||||
(and magit-branch-direct-configure
|
||||
@@ -235,18 +249,22 @@ has to be used to view and change branch related variables."
|
||||
(interactive (list (magit-get-current-branch)))
|
||||
(transient-setup 'magit-branch nil nil :scope branch))
|
||||
|
||||
(defun magit-branch-arguments ()
|
||||
(transient-args 'magit-branch))
|
||||
|
||||
;;;###autoload
|
||||
(defun magit-checkout (revision)
|
||||
(defun magit-checkout (revision &optional args)
|
||||
"Checkout REVISION, updating the index and the working tree.
|
||||
If REVISION is a local branch, then that becomes the current
|
||||
branch. If it is something else, then `HEAD' becomes detached.
|
||||
Checkout fails if the working tree or the staging area contain
|
||||
changes.
|
||||
\n(git checkout REVISION)."
|
||||
(interactive (list (magit-read-other-branch-or-commit "Checkout")))
|
||||
(interactive (list (magit-read-other-branch-or-commit "Checkout")
|
||||
(magit-branch-arguments)))
|
||||
(when (string-match "\\`heads/\\(.+\\)" revision)
|
||||
(setq revision (match-string 1 revision)))
|
||||
(magit-run-git "checkout" revision))
|
||||
(magit-run-git "checkout" args revision))
|
||||
|
||||
;;;###autoload
|
||||
(defun magit-branch-create (branch start-point)
|
||||
@@ -257,12 +275,13 @@ changes.
|
||||
(magit-refresh))
|
||||
|
||||
;;;###autoload
|
||||
(defun magit-branch-and-checkout (branch start-point)
|
||||
(defun magit-branch-and-checkout (branch start-point &optional args)
|
||||
"Create and checkout BRANCH at branch or revision START-POINT."
|
||||
(interactive (magit-branch-read-args "Create and checkout branch"))
|
||||
(interactive (append (magit-branch-read-args "Create and checkout branch")
|
||||
(list (magit-branch-arguments))))
|
||||
(if (string-match-p "^stash@{[0-9]+}$" start-point)
|
||||
(magit-run-git "stash" "branch" branch start-point)
|
||||
(magit-call-git "checkout" "-b" branch start-point)
|
||||
(magit-call-git "checkout" args "-b" branch start-point)
|
||||
(magit-branch-maybe-adjust-upstream branch start-point)
|
||||
(magit-refresh)))
|
||||
|
||||
@@ -339,16 +358,18 @@ when using `magit-branch-and-checkout'."
|
||||
(t
|
||||
(list choice (magit-read-starting-point "Create" choice))))))
|
||||
(if (not start-point)
|
||||
(magit-checkout branch)
|
||||
(magit-checkout branch (magit-branch-arguments))
|
||||
(when (magit-anything-modified-p t)
|
||||
(user-error "Cannot checkout when there are uncommitted changes"))
|
||||
(magit-branch-and-checkout branch start-point)
|
||||
(let ((magit-inhibit-refresh t))
|
||||
(magit-branch-and-checkout branch start-point))
|
||||
(when (magit-remote-branch-p start-point)
|
||||
(pcase-let ((`(,remote . ,remote-branch)
|
||||
(magit-split-branch-name start-point)))
|
||||
(when (and (equal branch remote-branch)
|
||||
(not (equal remote (magit-get "remote.pushDefault"))))
|
||||
(magit-set remote "branch" branch "pushRemote"))))))
|
||||
(magit-set remote "branch" branch "pushRemote"))))
|
||||
(magit-refresh)))
|
||||
|
||||
(defun magit-branch-maybe-adjust-upstream (branch start-point)
|
||||
(--when-let
|
||||
@@ -356,10 +377,13 @@ when using `magit-branch-and-checkout'."
|
||||
(magit-get-indirect-upstream-branch start-point))
|
||||
(and (magit-remote-branch-p start-point)
|
||||
(let ((name (cdr (magit-split-branch-name start-point))))
|
||||
(car (--first (if (listp (cdr it))
|
||||
(not (member name (cdr it)))
|
||||
(string-match-p (cdr it) name))
|
||||
magit-branch-adjust-remote-upstream-alist)))))
|
||||
(-some (pcase-lambda (`(,upstream . ,rule))
|
||||
(and (magit-branch-p upstream)
|
||||
(if (listp rule)
|
||||
(not (member name rule))
|
||||
(string-match-p rule name))
|
||||
upstream))
|
||||
magit-branch-adjust-remote-upstream-alist))))
|
||||
(magit-call-git "branch" (concat "--set-upstream-to=" it) branch)))
|
||||
|
||||
;;;###autoload
|
||||
@@ -498,7 +522,7 @@ that is being reset."
|
||||
(or (and (not (equal branch atpoint)) atpoint)
|
||||
(magit-get-upstream-branch branch)))
|
||||
current-prefix-arg)))
|
||||
(let ((inhibit-magit-refresh t))
|
||||
(let ((magit-inhibit-refresh t))
|
||||
(if (equal branch (magit-get-current-branch))
|
||||
(if (and (magit-anything-modified-p)
|
||||
(not (yes-or-no-p
|
||||
@@ -562,16 +586,32 @@ defaulting to the branch at point."
|
||||
((string-match "^refs/remotes/\\([^/]+\\)" (car refs))
|
||||
(let* ((remote (match-string 1 (car refs)))
|
||||
(offset (1+ (length remote))))
|
||||
;; Assume the branches actually still exists on the remote.
|
||||
(magit-run-git-async
|
||||
"push"
|
||||
(and (or force magit-branch-delete-never-verify) "--no-verify")
|
||||
remote
|
||||
(--map (concat ":" (substring it offset)) branches))
|
||||
;; If that is not the case, then this deletes the tracking branches.
|
||||
(set-process-sentinel
|
||||
magit-this-process
|
||||
(apply-partially 'magit-delete-remote-branch-sentinel remote refs))))
|
||||
(cond
|
||||
((magit-confirm 'delete-branch-on-remote
|
||||
"Delete %s on the remote (not just locally)"
|
||||
"Delete %i branches on the remote (not just locally)"
|
||||
'noabort branches)
|
||||
;; The ref may actually point at another rev on the remote,
|
||||
;; but this is better than nothing.
|
||||
(dolist (ref refs)
|
||||
(message "Delete %s (was %s)" ref
|
||||
(magit-rev-parse "--short" ref)))
|
||||
;; Assume the branches actually still exist on the remote.
|
||||
(magit-run-git-async
|
||||
"push"
|
||||
(and (or force magit-branch-delete-never-verify) "--no-verify")
|
||||
remote
|
||||
(--map (concat ":" (substring it offset)) branches))
|
||||
;; If that is not the case, then this deletes the tracking branches.
|
||||
(set-process-sentinel
|
||||
magit-this-process
|
||||
(apply-partially 'magit-delete-remote-branch-sentinel remote refs)))
|
||||
(t
|
||||
(dolist (ref refs)
|
||||
(message "Delete %s (was %s)" ref
|
||||
(magit-rev-parse "--short" ref))
|
||||
(magit-call-git "update-ref" "-d" ref))
|
||||
(magit-refresh)))))
|
||||
((> (length branches) 1)
|
||||
(setq branches (delete (magit-get-current-branch) branches))
|
||||
(mapc 'magit-branch-maybe-delete-pr-remote branches)
|
||||
@@ -579,17 +619,21 @@ defaulting to the branch at point."
|
||||
(magit-run-git "branch" (if force "-D" "-d") branches))
|
||||
(t ; And now for something completely different.
|
||||
(let* ((branch (car branches))
|
||||
(prompt (format "Branch %s is checked out. " branch)))
|
||||
(prompt (format "Branch %s is checked out. " branch))
|
||||
(target (magit-get-upstream-branch)))
|
||||
(when (equal branch (magit-get-current-branch))
|
||||
(pcase (if (or (equal branch "master")
|
||||
(not (magit-rev-verify "master")))
|
||||
(when (or (equal branch target)
|
||||
(not target))
|
||||
(setq target (magit-main-branch)))
|
||||
(pcase (if (or (equal branch target)
|
||||
(not target))
|
||||
(magit-read-char-case prompt nil
|
||||
(?d "[d]etach HEAD & delete" 'detach)
|
||||
(?a "[a]bort" 'abort))
|
||||
(magit-read-char-case prompt nil
|
||||
(?d "[d]etach HEAD & delete" 'detach)
|
||||
(?c "[c]heckout master & delete" 'master)
|
||||
(?a "[a]bort" 'abort)))
|
||||
(?d "[d]etach HEAD & delete" 'detach)
|
||||
(?c (format "[c]heckout %s & delete" target) 'target)
|
||||
(?a "[a]bort" 'abort)))
|
||||
(`detach (unless (or (equal force '(4))
|
||||
(member branch force)
|
||||
(magit-branch-merged-p branch t))
|
||||
@@ -597,13 +641,13 @@ defaulting to the branch at point."
|
||||
"Delete unmerged branch %s" ""
|
||||
nil (list branch)))
|
||||
(magit-call-git "checkout" "--detach"))
|
||||
(`master (unless (or (equal force '(4))
|
||||
(`target (unless (or (equal force '(4))
|
||||
(member branch force)
|
||||
(magit-branch-merged-p branch "master"))
|
||||
(magit-branch-merged-p branch target))
|
||||
(magit-confirm 'delete-unmerged-branch
|
||||
"Delete unmerged branch %s" ""
|
||||
nil (list branch)))
|
||||
(magit-call-git "checkout" "master"))
|
||||
(magit-call-git "checkout" target))
|
||||
(`abort (user-error "Abort")))
|
||||
(setq force t))
|
||||
(magit-branch-maybe-delete-pr-remote branch)
|
||||
@@ -686,15 +730,15 @@ the remote."
|
||||
(magit-call-git "branch" (if force "-M" "-m") old new)
|
||||
(when magit-branch-rename-push-target
|
||||
(let ((remote (magit-get-push-remote old))
|
||||
(old-specific (magit-get "branch" old "pushRemote"))
|
||||
(new-specific (magit-get "branch" new "pushRemote")))
|
||||
(when (and old-specific (or force (not new-specific)))
|
||||
;; Keep the target setting branch specific, even if that is
|
||||
(old-specified (magit-get "branch" old "pushRemote"))
|
||||
(new-specified (magit-get "branch" new "pushRemote")))
|
||||
(when (and old-specified (or force (not new-specified)))
|
||||
;; Keep the target setting branch specified, even if that is
|
||||
;; redundant. But if a branch by the same name existed before
|
||||
;; and the rename isn't forced, then do not change a leftover
|
||||
;; setting. Such a leftover setting may or may not conform to
|
||||
;; what we expect here...
|
||||
(magit-set old-specific "branch" new "pushRemote"))
|
||||
(magit-set old-specified "branch" new "pushRemote"))
|
||||
(when (and (equal (magit-get-push-remote new) remote)
|
||||
;; ...and if it does not, then we must abort.
|
||||
(not (eq magit-branch-rename-push-target 'local-only))
|
||||
|
||||
Reference in New Issue
Block a user