func fetchCommand(cmd *cobra.Command, args []string) { requireInRepo() var refs []*git.Ref if len(args) > 0 { // Remote is first arg lfs.Config.CurrentRemote = args[0] } else { trackedRemote, err := git.CurrentRemote() if err == nil { lfs.Config.CurrentRemote = trackedRemote } // otherwise leave as default (origin) } if len(args) > 1 { for _, r := range args[1:] { ref, err := git.ResolveRef(r) if err != nil { Panic(err, "Invalid ref argument") } refs = append(refs, ref) } } else { ref, err := git.CurrentRef() if err != nil { Panic(err, "Could not fetch") } refs = []*git.Ref{ref} } if fetchAllArg { if fetchRecentArg || len(args) > 1 { Exit("Cannot combine --all with ref arguments or --recent") } if fetchIncludeArg != "" || fetchExcludeArg != "" { Exit("Cannot combine --all with --include or --exclude") } if len(lfs.Config.FetchIncludePaths()) > 0 || len(lfs.Config.FetchExcludePaths()) > 0 { Print("Ignoring global include / exclude paths to fulfil --all") } fetchAll() } else { // !all includePaths, excludePaths := determineIncludeExcludePaths(fetchIncludeArg, fetchExcludeArg) // Fetch refs sequentially per arg order; duplicates in later refs will be ignored for _, ref := range refs { Print("Fetching %v", ref.Name) fetchRef(ref.Sha, includePaths, excludePaths) } if fetchRecentArg || lfs.Config.FetchPruneConfig().FetchRecentAlways { fetchRecent(refs, includePaths, excludePaths) } } }
func fetchCommand(cmd *cobra.Command, args []string) { var refs []*git.Ref if len(args) > 0 { // Remote is first arg lfs.Config.CurrentRemote = args[0] } else { trackedRemote, err := git.CurrentRemote() if err == nil { lfs.Config.CurrentRemote = trackedRemote } // otherwise leave as default (origin) } if len(args) > 1 { for _, r := range args[1:] { ref, err := git.ResolveRef(r) if err != nil { Panic(err, "Invalid ref argument") } refs = append(refs, ref) } } else { ref, err := git.CurrentRef() if err != nil { Panic(err, "Could not fetch") } refs = []*git.Ref{ref} } includePaths, excludePaths := determineIncludeExcludePaths(fetchIncludeArg, fetchExcludeArg) // Fetch refs sequentially per arg order; duplicates in later refs will be ignored for _, ref := range refs { Print("Fetching %v", ref.Name) fetchRef(ref.Sha, includePaths, excludePaths) } if fetchRecentArg || lfs.Config.FetchPruneConfig().FetchRecentAlways { fetchRecent(refs, includePaths, excludePaths) } }
func fetchCommand(cmd *cobra.Command, args []string) { requireInRepo() var refs []*git.Ref if len(args) > 0 { // Remote is first arg if err := git.ValidateRemote(args[0]); err != nil { Exit("Invalid remote name %q", args[0]) } lfs.Config.CurrentRemote = args[0] } else { // Actively find the default remote, don't just assume origin defaultRemote, err := git.DefaultRemote() if err != nil { Exit("No default remote") } lfs.Config.CurrentRemote = defaultRemote } if len(args) > 1 { for _, r := range args[1:] { ref, err := git.ResolveRef(r) if err != nil { Panic(err, "Invalid ref argument") } refs = append(refs, ref) } } else { ref, err := git.CurrentRef() if err != nil { Panic(err, "Could not fetch") } refs = []*git.Ref{ref} } success := true if fetchAllArg { if fetchRecentArg || len(args) > 1 { Exit("Cannot combine --all with ref arguments or --recent") } if fetchIncludeArg != "" || fetchExcludeArg != "" { Exit("Cannot combine --all with --include or --exclude") } if len(lfs.Config.FetchIncludePaths()) > 0 || len(lfs.Config.FetchExcludePaths()) > 0 { Print("Ignoring global include / exclude paths to fulfil --all") } success = fetchAll() } else { // !all includePaths, excludePaths := determineIncludeExcludePaths(fetchIncludeArg, fetchExcludeArg) // Fetch refs sequentially per arg order; duplicates in later refs will be ignored for _, ref := range refs { Print("Fetching %v", ref.Name) s := fetchRef(ref.Sha, includePaths, excludePaths) success = success && s } if fetchRecentArg || lfs.Config.FetchPruneConfig().FetchRecentAlways { s := fetchRecent(refs, includePaths, excludePaths) success = success && s } } if fetchPruneArg { verify := lfs.Config.FetchPruneConfig().PruneVerifyRemoteAlways // no dry-run or verbose options in fetch, assume false prune(verify, false, false) } if !success { Exit("Warning: errors occurred") } }
func fetchCommand(cmd *cobra.Command, args []string) { var ref string var err error if len(args) == 1 { ref = args[0] } else { ref, err = git.CurrentRef() if err != nil { Panic(err, "Could not fetch") } } pointers, err := lfs.ScanRefs(ref, "") if err != nil { Panic(err, "Could not scan for Git LFS files") } q := lfs.NewDownloadQueue(lfs.Config.ConcurrentTransfers(), len(pointers)) for _, p := range pointers { q.Add(lfs.NewDownloadable(p)) } target, err := git.ResolveRef(ref) if err != nil { Panic(err, "Could not resolve git ref") } current, err := git.CurrentRef() if err != nil { Panic(err, "Could not fetch the current git ref") } if target == current { // We just downloaded the files for the current ref, we can copy them into // the working directory and update the git index. We're doing this in a // goroutine so they can be copied as they come in, for efficiency. watch := q.Watch() go func() { files := make(map[string]*lfs.WrappedPointer, len(pointers)) for _, pointer := range pointers { files[pointer.Oid] = pointer } // Fire up the update-index command cmd := exec.Command("git", "update-index", "-q", "--refresh", "--stdin") stdin, err := cmd.StdinPipe() if err != nil { Panic(err, "Could not update the index") } if err := cmd.Start(); err != nil { Panic(err, "Could not update the index") } // As files come in, write them to the wd and update the index for oid := range watch { pointer, ok := files[oid] if !ok { continue } file, err := os.Create(pointer.Name) if err != nil { Panic(err, "Could not create working directory file") } if err := lfs.PointerSmudge(file, pointer.Pointer, pointer.Name, nil); err != nil { Panic(err, "Could not write working directory file") } file.Close() stdin.Write([]byte(pointer.Name + "\n")) } stdin.Close() if err := cmd.Wait(); err != nil { Panic(err, "Error updating the git index") } }() processQueue := time.Now() q.Process() tracerx.PerformanceSince("process queue", processQueue) } }