Skip to content

Commit 2ce8c28

Browse files
authored
feat(cmd): git pull (#325)
1 parent 395d40e commit 2ce8c28

File tree

1 file changed

+273
-0
lines changed

1 file changed

+273
-0
lines changed

libvcs/cmd/git.py

Lines changed: 273 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,3 +457,276 @@ def fetch(
457457
return self.run(
458458
["fetch", *local_flags, "--", *required_flags], check_returncode=False
459459
)
460+
461+
def pull(
462+
self,
463+
reftag: Optional[Any] = None,
464+
repository: Optional[str] = None,
465+
deepen: Optional[str] = None,
466+
depth: Optional[str] = None,
467+
branch: Optional[str] = None,
468+
origin: Optional[str] = None,
469+
upload_pack: Optional[str] = None,
470+
shallow_since: Optional[str] = None,
471+
shallow_exclude: Optional[str] = None,
472+
negotiation_tip: Optional[str] = None,
473+
jobs: Optional[str] = None,
474+
server_option: Optional[str] = None,
475+
recurse_submodules: Optional[
476+
Union[bool, Literal["yes", "on-demand", "no"]]
477+
] = None,
478+
recurse_submodules_default: Optional[
479+
Union[bool, Literal["yes", "on-demand"]]
480+
] = None,
481+
submodule_prefix: Optional[StrOrBytesPath] = None,
482+
#
483+
# Pull specific flags
484+
#
485+
# Options related to git pull
486+
# https://git-scm.com/docs/git-pull#_options_related_to_pull
487+
#
488+
cleanup: Optional[str] = None,
489+
rebase: Optional[Union[str, bool]] = None,
490+
no_rebase: Optional[bool] = None,
491+
strategy: Optional[Union[str, bool]] = None,
492+
strategy_option: Optional[str] = None,
493+
gpg_sign: Optional[Union[str, bool]] = None,
494+
no_gpg_sign: Optional[bool] = None,
495+
commit: Optional[bool] = None,
496+
no_commit: Optional[bool] = None,
497+
edit: Optional[bool] = None,
498+
no_edit: Optional[bool] = None,
499+
fast_forward_only: Optional[bool] = None,
500+
fast_forward: Optional[bool] = None,
501+
no_fast_forward: Optional[bool] = None,
502+
sign_off: Optional[bool] = None,
503+
no_sign_off: Optional[bool] = None,
504+
stat: Optional[bool] = None,
505+
no_stat: Optional[bool] = None,
506+
squash: Optional[bool] = None,
507+
no_squash: Optional[bool] = None,
508+
verify: Optional[bool] = None,
509+
no_verify: Optional[bool] = None,
510+
verify_signatures: Optional[bool] = None,
511+
no_verify_signatures: Optional[bool] = None,
512+
summary: Optional[bool] = None,
513+
no_summary: Optional[bool] = None,
514+
autostash: Optional[bool] = None,
515+
no_autostash: Optional[bool] = None,
516+
allow_unrelated_histories: Optional[bool] = None,
517+
#
518+
# Options related to git fetch
519+
# https://git-scm.com/docs/git-pull#_options_related_to_fetching
520+
#
521+
fetch: Optional[bool] = None,
522+
no_fetch: Optional[bool] = None,
523+
all: Optional[bool] = None,
524+
force: Optional[bool] = None,
525+
keep: Optional[bool] = None,
526+
multiple: Optional[bool] = None,
527+
dry_run: Optional[bool] = None,
528+
append: Optional[bool] = None,
529+
atomic: Optional[bool] = None,
530+
ipv4: Optional[bool] = None,
531+
ipv6: Optional[bool] = None,
532+
progress: Optional[bool] = None,
533+
quiet: Optional[bool] = None,
534+
verbose: Optional[bool] = None,
535+
unshallow: Optional[bool] = None,
536+
update_shallow: Optional[bool] = None,
537+
negotiate_tip: Optional[bool] = None,
538+
no_write_fetch_head: Optional[bool] = None,
539+
write_fetch_head: Optional[bool] = None,
540+
no_auto_maintenance: Optional[bool] = None,
541+
auto_maintenance: Optional[bool] = None,
542+
no_write_commit_graph: Optional[bool] = None,
543+
write_commit_graph: Optional[bool] = None,
544+
prefetch: Optional[bool] = None,
545+
prune: Optional[bool] = None,
546+
prune_tags: Optional[bool] = None,
547+
no_tags: Optional[bool] = None,
548+
tags: Optional[bool] = None,
549+
no_recurse_submodules: Optional[bool] = None,
550+
set_upstream: Optional[bool] = None,
551+
update_head_ok: Optional[bool] = None,
552+
show_forced_updates: Optional[bool] = None,
553+
no_show_forced_updates: Optional[bool] = None,
554+
negotiate_only: Optional[bool] = None,
555+
**kwargs,
556+
):
557+
"""Download from repo. Wraps `git pull <https://git-scm.com/docs/git-pull>`_.
558+
559+
Examples
560+
--------
561+
>>> git = Git(dir=git_local_clone.dir)
562+
>>> git_remote_repo = create_git_remote_repo()
563+
>>> git.pull()
564+
'Already up to date.'
565+
>>> git = Git(dir=git_local_clone.dir)
566+
>>> git_remote_repo = create_git_remote_repo()
567+
>>> git.pull(reftag=f'file://{git_remote_repo}')
568+
'Already up to date.'
569+
>>> git.dir.exists()
570+
True
571+
"""
572+
required_flags: list[str] = []
573+
if repository:
574+
required_flags.insert(0, repository)
575+
if reftag:
576+
required_flags.insert(0, reftag)
577+
local_flags: list[str] = []
578+
579+
#
580+
# Pull-related arguments
581+
#
582+
if rebase is not None:
583+
if isinstance(rebase, str):
584+
local_flags.append(f"--rebase={rebase}")
585+
else:
586+
local_flags.append("--rebase")
587+
if no_rebase:
588+
local_flags.append("--no-rebase")
589+
if strategy is not None:
590+
if isinstance(strategy, str):
591+
local_flags.append(f"--strategy={strategy}")
592+
else:
593+
local_flags.append("--strategy")
594+
if strategy_option is not None:
595+
local_flags.append(f"--strategy-option={strategy_option}")
596+
if gpg_sign is not None:
597+
if isinstance(gpg_sign, str):
598+
local_flags.append(f"--gpg-sign={gpg_sign}")
599+
else:
600+
local_flags.append("--gpg-sign")
601+
if no_gpg_sign:
602+
local_flags.append("--no-gpg-sign")
603+
if cleanup:
604+
local_flags.append("--cleanup")
605+
if commit:
606+
local_flags.append("--commit")
607+
if no_commit:
608+
local_flags.append("--no-commit")
609+
if fast_forward:
610+
local_flags.append("--fast-forward")
611+
if fast_forward_only:
612+
local_flags.append("--fast-forward-only")
613+
if no_fast_forward:
614+
local_flags.append("--no-fast-forward")
615+
if edit:
616+
local_flags.append("--edit")
617+
if no_edit:
618+
local_flags.append("--no-edit")
619+
if sign_off:
620+
local_flags.append("--sign_off")
621+
if no_sign_off:
622+
local_flags.append("--no-sign_off")
623+
if stat:
624+
local_flags.append("--stat")
625+
if no_stat:
626+
local_flags.append("--no-stat")
627+
if squash:
628+
local_flags.append("--squash")
629+
if no_squash:
630+
local_flags.append("--no-squash")
631+
if verify:
632+
local_flags.append("--verify")
633+
if no_verify:
634+
local_flags.append("--no-verify")
635+
if verify_signatures:
636+
local_flags.append("--verify-signatures")
637+
if no_verify_signatures:
638+
local_flags.append("--no-verify-signatures")
639+
if summary:
640+
local_flags.append("--summary")
641+
if no_summary:
642+
local_flags.append("--no-summary")
643+
if autostash:
644+
local_flags.append("--autostash")
645+
if no_autostash:
646+
local_flags.append("--no-autostash")
647+
if allow_unrelated_histories:
648+
local_flags.append("--allow-unrelated-histories")
649+
#
650+
# Fetch-related arguments
651+
#
652+
if submodule_prefix is not None:
653+
local_flags.append(f"--submodule-prefix={submodule_prefix}")
654+
if (filter := kwargs.pop("filter", None)) is not None:
655+
local_flags.append(f"--filter={filter}")
656+
if depth is not None:
657+
local_flags.append(f"--depth {depth}")
658+
if branch is not None:
659+
local_flags.append(f"--branch {branch}")
660+
if origin is not None:
661+
local_flags.append(f"--origin {origin}")
662+
if upload_pack is not None:
663+
local_flags.append(f"--upload-pack {upload_pack}")
664+
if shallow_since is not None:
665+
local_flags.append(f"--shallow-since={shallow_since}")
666+
if shallow_exclude is not None:
667+
local_flags.append(f"--shallow-exclude={shallow_exclude}")
668+
if server_option is not None:
669+
local_flags.append(f"--server-option={server_option}")
670+
if jobs is not None:
671+
local_flags.append(f"--jobs {jobs}")
672+
if keep:
673+
local_flags.append("--keep")
674+
if force:
675+
local_flags.append("--force")
676+
if multiple:
677+
local_flags.append("--multiple")
678+
if quiet:
679+
local_flags.append("--quiet")
680+
if progress:
681+
local_flags.append("--progress")
682+
if verbose:
683+
local_flags.append("--verbose")
684+
if all:
685+
local_flags.append("--all")
686+
if atomic:
687+
local_flags.append("--atomic")
688+
if unshallow:
689+
local_flags.append("--unshallow")
690+
if append:
691+
local_flags.append("--append")
692+
if update_shallow:
693+
local_flags.append("--update-shallow")
694+
if dry_run:
695+
local_flags.append("--dry-run")
696+
if no_write_fetch_head:
697+
local_flags.append("--no-write-fetch-head")
698+
if write_fetch_head:
699+
local_flags.append("--write-fetch-head")
700+
if auto_maintenance:
701+
local_flags.append("--auto-maintenance")
702+
if no_auto_maintenance:
703+
local_flags.append("--no-auto-maintenance")
704+
if write_commit_graph:
705+
local_flags.append("--write-commit-graph")
706+
if no_write_commit_graph:
707+
local_flags.append("--no-write-commit-graph")
708+
if prefetch:
709+
local_flags.append("--prefetch")
710+
if prune:
711+
local_flags.append("--prune")
712+
if prune_tags:
713+
local_flags.append("--prune-tags")
714+
if tags:
715+
local_flags.append("--tags")
716+
if no_tags:
717+
local_flags.append("--no-tags")
718+
if no_recurse_submodules:
719+
local_flags.append("--no-recurse-submodules")
720+
if set_upstream:
721+
local_flags.append("--set-upstream")
722+
if update_head_ok:
723+
local_flags.append("--update-head-ok")
724+
if show_forced_updates:
725+
local_flags.append("--show-forced-updates")
726+
if no_show_forced_updates:
727+
local_flags.append("--no-show-forced-updates")
728+
if negotiate_only:
729+
local_flags.append("--negotiate-only")
730+
return self.run(
731+
["pull", *local_flags, "--", *required_flags], check_returncode=False
732+
)

0 commit comments

Comments
 (0)