188 lines
6.4 KiB
EmacsLisp
188 lines
6.4 KiB
EmacsLisp
|
;;; magit-fetch.el --- download objects and refs -*- lexical-binding: t -*-
|
||
|
|
||
|
;; Copyright (C) 2008-2020 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.
|
||
|
|
||
|
;; Author: Jonas Bernoulli <jonas@bernoul.li>
|
||
|
;; Maintainer: Jonas Bernoulli <jonas@bernoul.li>
|
||
|
|
||
|
;; 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)
|
||
|
;; any later version.
|
||
|
;;
|
||
|
;; Magit is distributed in the hope that it will be useful, but WITHOUT
|
||
|
;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||
|
;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||
|
;; License for more details.
|
||
|
;;
|
||
|
;; You should have received a copy of the GNU General Public License
|
||
|
;; along with Magit. If not, see http://www.gnu.org/licenses.
|
||
|
|
||
|
;;; Commentary:
|
||
|
|
||
|
;; This library implements fetch commands.
|
||
|
|
||
|
;;; Code:
|
||
|
|
||
|
(require 'magit)
|
||
|
|
||
|
;;; Options
|
||
|
|
||
|
(defcustom magit-fetch-modules-jobs 4
|
||
|
"Number of submodules to fetch in parallel.
|
||
|
Ignored for Git versions before v2.8.0."
|
||
|
:package-version '(magit . "2.12.0")
|
||
|
:group 'magit-commands
|
||
|
:type '(choice (const :tag "one at a time" nil) number))
|
||
|
|
||
|
;;; Commands
|
||
|
|
||
|
;;;###autoload (autoload 'magit-fetch "magit-fetch" nil t)
|
||
|
(transient-define-prefix magit-fetch ()
|
||
|
"Fetch from another repository."
|
||
|
:man-page "git-fetch"
|
||
|
["Arguments"
|
||
|
("-p" "Prune deleted branches" ("-p" "--prune"))
|
||
|
("-t" "Fetch all tags" ("-t" "--tags"))
|
||
|
(7 "-u" "Fetch full history" "--unshallow")]
|
||
|
["Fetch from"
|
||
|
("p" magit-fetch-from-pushremote)
|
||
|
("u" magit-fetch-from-upstream)
|
||
|
("e" "elsewhere" magit-fetch-other)
|
||
|
("a" "all remotes" magit-fetch-all)]
|
||
|
["Fetch"
|
||
|
("o" "another branch" magit-fetch-branch)
|
||
|
("r" "explicit refspec" magit-fetch-refspec)
|
||
|
("m" "submodules" magit-fetch-modules)]
|
||
|
["Configure"
|
||
|
("C" "variables..." magit-branch-configure)])
|
||
|
|
||
|
(defun magit-fetch-arguments ()
|
||
|
(transient-args 'magit-fetch))
|
||
|
|
||
|
(defun magit-git-fetch (remote args)
|
||
|
(run-hooks 'magit-credential-hook)
|
||
|
(magit-run-git-async "fetch" remote args))
|
||
|
|
||
|
;;;###autoload (autoload 'magit-fetch-from-pushremote "magit-fetch" nil t)
|
||
|
(transient-define-suffix magit-fetch-from-pushremote (args)
|
||
|
"Fetch from the current push-remote.
|
||
|
|
||
|
With a prefix argument or when the push-remote is either not
|
||
|
configured or unusable, then let the user first configure the
|
||
|
push-remote."
|
||
|
:description 'magit-fetch--pushremote-description
|
||
|
(interactive (list (magit-fetch-arguments)))
|
||
|
(let ((remote (magit-get-push-remote)))
|
||
|
(when (or current-prefix-arg
|
||
|
(not (member remote (magit-list-remotes))))
|
||
|
(let ((var (magit--push-remote-variable)))
|
||
|
(setq remote
|
||
|
(magit-read-remote (format "Set %s and fetch from there" var)))
|
||
|
(magit-set remote var)))
|
||
|
(magit-git-fetch remote args)))
|
||
|
|
||
|
(defun magit-fetch--pushremote-description ()
|
||
|
(let* ((branch (magit-get-current-branch))
|
||
|
(remote (magit-get-push-remote branch))
|
||
|
(v (magit--push-remote-variable branch t)))
|
||
|
(cond
|
||
|
((member remote (magit-list-remotes)) remote)
|
||
|
(remote
|
||
|
(format "%s, replacing invalid" v))
|
||
|
(t
|
||
|
(format "%s, setting that" v)))))
|
||
|
|
||
|
;;;###autoload (autoload 'magit-fetch-from-upstream "magit-fetch" nil t)
|
||
|
(transient-define-suffix magit-fetch-from-upstream (remote args)
|
||
|
"Fetch from the \"current\" remote, usually the upstream.
|
||
|
|
||
|
If the upstream is configured for the current branch and names
|
||
|
an existing remote, then use that. Otherwise try to use another
|
||
|
remote: If only a single remote is configured, then use that.
|
||
|
Otherwise if a remote named \"origin\" exists, then use that.
|
||
|
|
||
|
If no remote can be determined, then this command is not available
|
||
|
from the `magit-fetch' transient prefix and invoking it directly
|
||
|
results in an error."
|
||
|
:if (lambda () (magit-get-current-remote t))
|
||
|
:description (lambda () (magit-get-current-remote t))
|
||
|
(interactive (list (magit-get-current-remote t)
|
||
|
(magit-fetch-arguments)))
|
||
|
(unless remote
|
||
|
(error "The \"current\" remote could not be determined"))
|
||
|
(magit-git-fetch remote args))
|
||
|
|
||
|
;;;###autoload
|
||
|
(defun magit-fetch-other (remote args)
|
||
|
"Fetch from another repository."
|
||
|
(interactive (list (magit-read-remote "Fetch remote")
|
||
|
(magit-fetch-arguments)))
|
||
|
(magit-git-fetch remote args))
|
||
|
|
||
|
;;;###autoload
|
||
|
(defun magit-fetch-branch (remote branch args)
|
||
|
"Fetch a BRANCH from a REMOTE."
|
||
|
(interactive
|
||
|
(let ((remote (magit-read-remote-or-url "Fetch from remote or url")))
|
||
|
(list remote
|
||
|
(magit-read-remote-branch "Fetch branch" remote)
|
||
|
(magit-fetch-arguments))))
|
||
|
(magit-git-fetch remote (cons branch args)))
|
||
|
|
||
|
;;;###autoload
|
||
|
(defun magit-fetch-refspec (remote refspec args)
|
||
|
"Fetch a REFSPEC from a REMOTE."
|
||
|
(interactive
|
||
|
(let ((remote (magit-read-remote-or-url "Fetch from remote or url")))
|
||
|
(list remote
|
||
|
(magit-read-refspec "Fetch using refspec" remote)
|
||
|
(magit-fetch-arguments))))
|
||
|
(magit-git-fetch remote (cons refspec args)))
|
||
|
|
||
|
;;;###autoload
|
||
|
(defun magit-fetch-all (args)
|
||
|
"Fetch from all remotes."
|
||
|
(interactive (list (magit-fetch-arguments)))
|
||
|
(magit-git-fetch nil (cons "--all" args)))
|
||
|
|
||
|
;;;###autoload
|
||
|
(defun magit-fetch-all-prune ()
|
||
|
"Fetch from all remotes, and prune.
|
||
|
Prune remote tracking branches for branches that have been
|
||
|
removed on the respective remote."
|
||
|
(interactive)
|
||
|
(run-hooks 'magit-credential-hook)
|
||
|
(magit-run-git-async "remote" "update" "--prune"))
|
||
|
|
||
|
;;;###autoload
|
||
|
(defun magit-fetch-all-no-prune ()
|
||
|
"Fetch from all remotes."
|
||
|
(interactive)
|
||
|
(run-hooks 'magit-credential-hook)
|
||
|
(magit-run-git-async "remote" "update"))
|
||
|
|
||
|
;;;###autoload
|
||
|
(defun magit-fetch-modules (&optional all)
|
||
|
"Fetch all submodules.
|
||
|
|
||
|
Option `magit-fetch-modules-jobs' controls how many submodules
|
||
|
are being fetched in parallel. Also fetch the super-repository,
|
||
|
because `git-fetch' does not support not doing that. With a
|
||
|
prefix argument fetch all remotes."
|
||
|
(interactive "P")
|
||
|
(magit-with-toplevel
|
||
|
(magit-run-git-async
|
||
|
"fetch" "--verbose" "--recurse-submodules"
|
||
|
(and magit-fetch-modules-jobs
|
||
|
(version<= "2.8.0" (magit-git-version))
|
||
|
(list "-j" (number-to-string magit-fetch-modules-jobs)))
|
||
|
(and all "--all"))))
|
||
|
|
||
|
;;; _
|
||
|
(provide 'magit-fetch)
|
||
|
;;; magit-fetch.el ends here
|