update packages
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
;;; magit-branch.el --- Branch support -*- lexical-binding:t -*-
|
||||
|
||||
;; Copyright (C) 2008-2023 The Magit Project Contributors
|
||||
;; Copyright (C) 2008-2025 The Magit Project Contributors
|
||||
|
||||
;; Author: Jonas Bernoulli <jonas@bernoul.li>
|
||||
;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
|
||||
;; Author: Jonas Bernoulli <emacs.magit@jonas.bernoulli.dev>
|
||||
;; Maintainer: Jonas Bernoulli <emacs.magit@jonas.bernoulli.dev>
|
||||
|
||||
;; SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
@@ -38,8 +38,8 @@
|
||||
(defcustom magit-branch-read-upstream-first t
|
||||
"Whether to read upstream before name of new branch when creating a branch.
|
||||
|
||||
`nil' Read the branch name first.
|
||||
`t' Read the upstream first.
|
||||
nil Read the branch name first.
|
||||
t Read the upstream first.
|
||||
`fallback' Read the upstream first, but if it turns out that the chosen
|
||||
value is not a valid upstream (because it cannot be resolved
|
||||
as an existing revision), then treat it as the name of the
|
||||
@@ -177,7 +177,7 @@ When t, then rename the branch named OLD on the remote specified
|
||||
remote and unless NEW already exists on the remote.
|
||||
|
||||
When `forge-only' and the `forge' package is available, then
|
||||
behave like `t' if the remote points to a repository on a forge
|
||||
behave like t if the remote points to a repository on a forge
|
||||
(currently Github or Gitlab), otherwise like `local-only'."
|
||||
:package-version '(magit . "2.90.0")
|
||||
:group 'magit-commands
|
||||
@@ -208,18 +208,24 @@ 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 () (magit-git-version>= "2.13")))]
|
||||
["Variables"
|
||||
:if (lambda ()
|
||||
(and magit-branch-direct-configure
|
||||
(oref transient--prefix scope)))
|
||||
[:if (lambda () (and magit-branch-direct-configure (transient-scope)))
|
||||
:description
|
||||
(lambda ()
|
||||
(concat (propertize "Configure " 'face 'transient-heading)
|
||||
(propertize (transient-scope) 'face 'magit-branch-local)))
|
||||
("d" magit-branch.<branch>.description)
|
||||
("u" magit-branch.<branch>.merge/remote)
|
||||
("r" magit-branch.<branch>.rebase)
|
||||
("p" magit-branch.<branch>.pushRemote)]
|
||||
[:if-non-nil magit-branch-direct-configure
|
||||
:description "Configure repository defaults"
|
||||
("R" magit-pull.rebase)
|
||||
("P" magit-remote.pushDefault)
|
||||
("B" "Update default branch" magit-update-default-branch
|
||||
:inapt-if-not magit-get-some-remote)]
|
||||
["Arguments"
|
||||
(7 "-r" "Recurse submodules when checking out an existing branch"
|
||||
"--recurse-submodules")]
|
||||
[["Checkout"
|
||||
("b" "branch/revision" magit-checkout)
|
||||
("l" "local branch" magit-branch-checkout)
|
||||
@@ -349,10 +355,10 @@ when using `magit-branch-and-checkout'."
|
||||
(interactive
|
||||
(let* ((current (magit-get-current-branch))
|
||||
(local (magit-list-local-branch-names))
|
||||
(remote (--filter (and (string-match "[^/]+/" it)
|
||||
(not (member (substring it (match-end 0))
|
||||
(cons "HEAD" local))))
|
||||
(magit-list-remote-branch-names)))
|
||||
(remote (seq-filter (##and (string-match "[^/]+/" %)
|
||||
(not (member (substring % (match-end 0))
|
||||
(cons "HEAD" local))))
|
||||
(magit-list-remote-branch-names)))
|
||||
(choices (nconc (delete current local) remote))
|
||||
(atpoint (magit-branch-at-point))
|
||||
(choice (magit-completing-read
|
||||
@@ -418,22 +424,21 @@ when using `magit-branch-and-checkout'."
|
||||
(defun magit-branch-read-args (prompt &optional default-start)
|
||||
(if magit-branch-read-upstream-first
|
||||
(let ((choice (magit-read-starting-point prompt nil default-start)))
|
||||
(if (magit-rev-verify choice)
|
||||
(list (magit-read-string-ns
|
||||
(if magit-completing-read--silent-default
|
||||
(format "%s (starting at `%s')" prompt choice)
|
||||
"Name for new branch")
|
||||
(let ((def (mapconcat #'identity
|
||||
(cdr (split-string choice "/"))
|
||||
"/")))
|
||||
(and (member choice (magit-list-remote-branch-names))
|
||||
(not (member def (magit-list-local-branch-names)))
|
||||
def)))
|
||||
choice)
|
||||
(if (eq magit-branch-read-upstream-first 'fallback)
|
||||
(list choice
|
||||
(magit-read-starting-point prompt choice default-start))
|
||||
(user-error "Not a valid starting-point: %s" choice))))
|
||||
(cond
|
||||
((magit-rev-verify choice)
|
||||
(list (magit-read-string-ns
|
||||
(if magit-completing-read--silent-default
|
||||
(format "%s (starting at `%s')" prompt choice)
|
||||
"Name for new branch")
|
||||
(let ((def (string-join (cdr (split-string choice "/")) "/")))
|
||||
(and (member choice (magit-list-remote-branch-names))
|
||||
(not (member def (magit-list-local-branch-names)))
|
||||
def)))
|
||||
choice))
|
||||
((eq magit-branch-read-upstream-first 'fallback)
|
||||
(list choice
|
||||
(magit-read-starting-point prompt choice default-start)))
|
||||
((user-error "Not a valid starting-point: %s" choice))))
|
||||
(let ((branch (magit-read-string-ns (concat prompt " named"))))
|
||||
(if (magit-branch-p branch)
|
||||
(magit-branch-read-args
|
||||
@@ -540,15 +545,12 @@ When resetting to another branch and a prefix argument is used,
|
||||
then also set the target branch as the upstream of the branch
|
||||
that is being reset."
|
||||
(interactive
|
||||
(let* ((atpoint (magit-local-branch-at-point))
|
||||
(branch (magit-read-local-branch "Reset branch" atpoint))
|
||||
(minibuffer-default-add-function (magit--minibuf-default-add-commit)))
|
||||
(let ((branch (magit-read-local-branch "Reset branch"
|
||||
(magit-local-branch-at-point))))
|
||||
(list branch
|
||||
(magit-completing-read (format "Reset %s to" branch)
|
||||
(delete branch (magit-list-branch-names))
|
||||
nil nil nil 'magit-revision-history
|
||||
(or (and (not (equal branch atpoint)) atpoint)
|
||||
(magit-get-upstream-branch branch)))
|
||||
(magit-read-branch-or-commit (format "Reset %s to" branch)
|
||||
(magit-get-upstream-branch branch)
|
||||
branch)
|
||||
current-prefix-arg)))
|
||||
(let ((magit-inhibit-refresh t))
|
||||
(if (equal branch (magit-get-current-branch))
|
||||
@@ -594,22 +596,23 @@ prompt is confusing."
|
||||
(setq branches
|
||||
(list (magit-read-branch-prefer-other
|
||||
(if force "Force delete branch" "Delete branch")))))
|
||||
(unless force
|
||||
(when-let ((unmerged (seq-remove #'magit-branch-merged-p branches)))
|
||||
(if (magit-confirm 'delete-unmerged-branch
|
||||
"Delete unmerged branch %s"
|
||||
"Delete %d unmerged branches"
|
||||
'noabort unmerged)
|
||||
(setq force branches)
|
||||
(or (setq branches
|
||||
(cl-set-difference branches unmerged :test #'equal))
|
||||
(user-error "Abort")))))
|
||||
(when-let (((not force))
|
||||
(unmerged (seq-remove #'magit-branch-merged-p branches)))
|
||||
(if (magit-confirm 'delete-unmerged-branch
|
||||
"Delete unmerged branch %s"
|
||||
"Delete %d unmerged branches"
|
||||
'noabort unmerged)
|
||||
(setq force branches)
|
||||
(or (setq branches
|
||||
(cl-set-difference branches unmerged :test #'equal))
|
||||
(user-error "Abort"))))
|
||||
(list branches force)))
|
||||
(let* ((refs (mapcar #'magit-ref-fullname branches))
|
||||
(ambiguous (--remove it refs)))
|
||||
(when ambiguous
|
||||
(let ((refs (mapcar #'magit-ref-fullname branches)))
|
||||
;; If a member of refs is nil, that means that
|
||||
;; the respective branch name is ambiguous.
|
||||
(when-let ((ambiguous (seq-filter #'null refs)))
|
||||
(user-error
|
||||
"%s ambiguous. Please cleanup using git directly."
|
||||
"%s ambiguous; please cleanup using git directly"
|
||||
(let ((len (length ambiguous)))
|
||||
(cond
|
||||
((= len 1)
|
||||
@@ -624,12 +627,12 @@ prompt is confusing."
|
||||
(offset (1+ (length remote))))
|
||||
(cond
|
||||
((magit-confirm 'delete-branch-on-remote
|
||||
(format "Deleting local %s. Also delete on %s"
|
||||
(magit-ref-fullname (car branches))
|
||||
remote)
|
||||
(format "Deleting %d local refs. Also delete on %s"
|
||||
(length refs)
|
||||
remote)
|
||||
(list "Deleting local %s. Also delete on %s"
|
||||
(magit-ref-fullname (car branches))
|
||||
remote)
|
||||
(list "Deleting %d local refs. Also delete on %s"
|
||||
(length refs)
|
||||
remote)
|
||||
'noabort refs)
|
||||
;; The ref may actually point at another rev on the remote,
|
||||
;; but this is better than nothing.
|
||||
@@ -641,7 +644,7 @@ prompt is confusing."
|
||||
"push"
|
||||
(and (or force magit-branch-delete-never-verify) "--no-verify")
|
||||
remote
|
||||
(--map (concat ":" (substring it offset)) branches))
|
||||
(mapcar (##concat ":" (substring % offset)) branches))
|
||||
;; If that is not the case, then this deletes the tracking branches.
|
||||
(set-process-sentinel
|
||||
magit-this-process
|
||||
@@ -715,8 +718,8 @@ prompt is confusing."
|
||||
(when (member refspec refspecs)
|
||||
(if (and (length= refspecs 1)
|
||||
(magit-confirm 'delete-pr-remote
|
||||
(format "Also delete remote %s (%s)" remote
|
||||
"no pull-request branch remains")
|
||||
(list "Also delete remote %s (%s)" remote
|
||||
"no pull-request branch remains")
|
||||
nil t))
|
||||
(magit-call-git "remote" "rm" remote)
|
||||
(magit-call-git "config" "--unset-all" variable
|
||||
@@ -728,11 +731,11 @@ prompt is confusing."
|
||||
(defun magit-delete-remote-branch-sentinel (remote refs process event)
|
||||
(when (memq (process-status process) '(exit signal))
|
||||
(if (= (process-exit-status process) 1)
|
||||
(if-let ((on-remote (--map (concat "refs/remotes/" remote "/" it)
|
||||
(magit-remote-list-branches remote)))
|
||||
(rest (--filter (and (not (member it on-remote))
|
||||
(magit-ref-exists-p it))
|
||||
refs)))
|
||||
(if-let ((on-remote (mapcar (##concat "refs/remotes/" remote "/" %)
|
||||
(magit-remote-list-branches remote)))
|
||||
(rest (seq-filter (##and (not (member % on-remote))
|
||||
(magit-ref-exists-p %))
|
||||
refs)))
|
||||
(progn
|
||||
(process-put process 'inhibit-refresh t)
|
||||
(magit-process-sentinel process event)
|
||||
@@ -784,14 +787,16 @@ the remote."
|
||||
(not (eq magit-branch-rename-push-target 'local-only))
|
||||
(or (not (eq magit-branch-rename-push-target 'forge-only))
|
||||
(and (require (quote forge) nil t)
|
||||
(fboundp 'forge--forge-remote-p)
|
||||
(forge--forge-remote-p remote))))
|
||||
(fboundp 'forge--split-forge-url)
|
||||
(and-let* ((url (magit-git-string
|
||||
"remote" "get-url" remote)))
|
||||
(forge--split-forge-url url)))))
|
||||
(let ((old-target (magit-get-push-branch old t))
|
||||
(new-target (magit-get-push-branch new t))
|
||||
(remote (magit-get-push-remote new)))
|
||||
(when (and old-target
|
||||
(not new-target)
|
||||
(magit-y-or-n-p (format "Also rename %S to %S on \"%s\""
|
||||
(magit-y-or-n-p (format "Also rename %S to %S on \"%s\"?"
|
||||
old new remote)))
|
||||
;; Rename on (i.e., within) the remote, but only if the
|
||||
;; destination ref doesn't exist yet. If that ref already
|
||||
@@ -820,14 +825,14 @@ and also rename the respective reflog file."
|
||||
|
||||
;;;###autoload
|
||||
(defun magit-branch-unshelve (branch)
|
||||
"Unshelve a BRANCH
|
||||
"Unshelve a BRANCH.
|
||||
Rename \"refs/shelved/BRANCH\" to \"refs/heads/BRANCH\",
|
||||
and also rename the respective reflog file."
|
||||
(interactive
|
||||
(list (magit-completing-read
|
||||
"Unshelve branch"
|
||||
(--map (substring it 8)
|
||||
(magit-list-refnames "refs/shelved"))
|
||||
(mapcar (##substring % 8)
|
||||
(magit-list-refnames "refs/shelved"))
|
||||
nil t)))
|
||||
(let ((old (concat "refs/shelved/" branch))
|
||||
(new (concat "refs/heads/" branch)))
|
||||
@@ -851,17 +856,16 @@ and also rename the respective reflog file."
|
||||
:man-page "git-branch"
|
||||
[:description
|
||||
(lambda ()
|
||||
(concat
|
||||
(propertize "Configure " 'face 'transient-heading)
|
||||
(propertize (oref transient--prefix scope) 'face 'magit-branch-local)))
|
||||
("d" magit-branch.<branch>.description)
|
||||
("u" magit-branch.<branch>.merge/remote)
|
||||
("r" magit-branch.<branch>.rebase)
|
||||
("p" magit-branch.<branch>.pushRemote)]
|
||||
(concat (propertize "Configure " 'face 'transient-heading)
|
||||
(propertize (transient-scope) 'face 'magit-branch-local)))
|
||||
("d" magit-branch.<branch>.description)
|
||||
("u" magit-branch.<branch>.merge/remote)
|
||||
("r" magit-branch.<branch>.rebase)
|
||||
("p" magit-branch.<branch>.pushRemote)]
|
||||
["Configure repository defaults"
|
||||
("R" magit-pull.rebase)
|
||||
("P" magit-remote.pushDefault)
|
||||
("b" "Update default branch" magit-update-default-branch
|
||||
("B" "Update default branch" magit-update-default-branch
|
||||
:inapt-if-not magit-get-some-remote)]
|
||||
["Configure branch creation"
|
||||
("a m" magit-branch.autoSetupMerge)
|
||||
@@ -896,7 +900,7 @@ and also rename the respective reflog file."
|
||||
:class 'magit--git-branch:upstream)
|
||||
|
||||
(cl-defmethod transient-init-value ((obj magit--git-branch:upstream))
|
||||
(when-let* ((branch (oref transient--prefix scope))
|
||||
(when-let* ((branch (transient-scope))
|
||||
(remote (magit-get "branch" branch "remote"))
|
||||
(merge (magit-get "branch" branch "merge")))
|
||||
(oset obj value (list remote merge))))
|
||||
@@ -904,19 +908,19 @@ and also rename the respective reflog file."
|
||||
(cl-defmethod transient-infix-read ((obj magit--git-branch:upstream))
|
||||
(if (oref obj value)
|
||||
(oset obj value nil)
|
||||
(magit-read-upstream-branch (oref transient--prefix scope) "Upstream")))
|
||||
(magit-read-upstream-branch (transient-scope) "Upstream")))
|
||||
|
||||
(cl-defmethod transient-infix-set ((obj magit--git-branch:upstream) refname)
|
||||
(magit-set-upstream-branch (oref transient--prefix scope) refname)
|
||||
(magit-set-upstream-branch (transient-scope) refname)
|
||||
(oset obj value
|
||||
(and-let* ((branch (oref transient--prefix scope))
|
||||
(and-let* ((branch (transient-scope))
|
||||
(r (magit-get "branch" branch "remote"))
|
||||
(m (magit-get "branch" branch "merge")))
|
||||
(list r m)))
|
||||
(magit-refresh))
|
||||
|
||||
(cl-defmethod transient-format ((obj magit--git-branch:upstream))
|
||||
(let ((branch (oref transient--prefix scope)))
|
||||
(let ((branch (transient-scope)))
|
||||
(format-spec
|
||||
(oref obj format)
|
||||
`((?k . ,(transient-format-key obj))
|
||||
|
||||
Reference in New Issue
Block a user