// Download downloads the application source code from the GIT repository // and checkout the Ref specified in the config. func (c *Clone) Download(config *api.Config) (*api.SourceInfo, error) { targetSourceDir := filepath.Join(config.WorkingDir, api.Source) config.WorkingSourceDir = targetSourceDir var info *api.SourceInfo if c.ValidCloneSpec(config.Source) { if len(config.ContextDir) > 0 { targetSourceDir = filepath.Join(config.WorkingDir, api.ContextTmp) } glog.V(2).Infof("Cloning into %s", targetSourceDir) if err := c.Clone(config.Source, targetSourceDir); err != nil { glog.V(1).Infof("Git clone failed: %+v", err) return nil, err } if len(config.Ref) > 0 { if err := c.Checkout(targetSourceDir, config.Ref); err != nil { return nil, err } glog.V(1).Infof("Checked out %q", config.Ref) } if len(config.ContextDir) > 0 { originalTargetDir := filepath.Join(config.WorkingDir, api.Source) c.RemoveDirectory(originalTargetDir) // we want to copy entire dir contents, thus we need to use dir/. construct path := filepath.Join(targetSourceDir, config.ContextDir) + string(filepath.Separator) + "." err := c.Copy(path, originalTargetDir) if err != nil { return nil, err } info = c.GetInfo(targetSourceDir) c.RemoveDirectory(targetSourceDir) } else { info = c.GetInfo(targetSourceDir) } if len(config.ContextDir) > 0 { info.ContextDir = config.ContextDir } return info, nil } // we want to copy entire dir contents, thus we need to use dir/. construct path := filepath.Join(config.Source, config.ContextDir) + string(filepath.Separator) + "." if !c.Exists(path) { return nil, errors.NewSourcePathError(path) } if err := c.Copy(path, targetSourceDir); err != nil { return nil, err } // When building from a local directory (not using GIT clone spec scheme) we // skip gathering informations about the source as there is no guarantee that // the folder is a GIT repository or it requires context-dir to be set. if !config.Quiet { glog.Warning("You are using <source> location that is not valid GIT repository. The source code information will not be stored into the output image. Use this image only for local testing and development.") } return nil, nil }
func (f *File) Download(config *api.Config) (*api.SourceInfo, error) { targetSourceDir := filepath.Join(config.WorkingDir, api.Source) sourceDir := strings.TrimPrefix(config.Source, "file://") config.WorkingSourceDir = targetSourceDir if len(config.ContextDir) > 0 { targetSourceDir = filepath.Join(config.WorkingDir, api.ContextTmp) } glog.V(1).Infof("Copying sources from %q to %q", sourceDir, targetSourceDir) err := f.CopyContents(sourceDir, targetSourceDir) if err != nil { return nil, err } if len(config.ContextDir) > 0 { originalTargetDir := filepath.Join(config.WorkingDir, api.Source) f.RemoveDirectory(originalTargetDir) // we want to copy entire dir contents, thus we need to use dir/. construct path := filepath.Join(targetSourceDir, config.ContextDir) + string(filepath.Separator) + "." err := f.Copy(path, originalTargetDir) if err != nil { return nil, err } f.RemoveDirectory(targetSourceDir) } return &api.SourceInfo{ Location: sourceDir, ContextDir: config.ContextDir, }, nil }
func (f *File) Download(config *api.Config) (*api.SourceInfo, error) { targetSourceDir := filepath.Join(config.WorkingDir, api.Source) sourceDir := strings.TrimPrefix(config.Source, "file://") config.WorkingSourceDir = targetSourceDir if len(config.ContextDir) > 0 { targetSourceDir = filepath.Join(targetSourceDir, config.ContextDir, ".") } glog.V(1).Infof("Copying sources from %q to %q", sourceDir, targetSourceDir) err := f.Copy(sourceDir, targetSourceDir) if err != nil { return nil, err } return &api.SourceInfo{ Location: sourceDir, ContextDir: config.ContextDir, }, nil }
// Download copies sources from a local directory into the working directory func (f *File) Download(config *api.Config) (*api.SourceInfo, error) { config.WorkingSourceDir = filepath.Join(config.WorkingDir, api.Source) source := strings.TrimPrefix(config.Source, "file://") copySrc := source if len(config.ContextDir) > 0 { copySrc = filepath.Join(source, config.ContextDir) } glog.V(1).Infof("Copying sources from %q to %q", copySrc, config.WorkingSourceDir) err := f.CopyContents(copySrc, config.WorkingSourceDir) if err != nil { return nil, err } return &api.SourceInfo{ Location: source, ContextDir: config.ContextDir, }, nil }
// Download downloads the application source code from the Git repository // and checkout the Ref specified in the config. func (c *Clone) Download(config *api.Config) (*api.SourceInfo, error) { targetSourceDir := filepath.Join(config.WorkingDir, api.Source) config.WorkingSourceDir = targetSourceDir var info *api.SourceInfo hasRef := len(config.Ref) > 0 hasSubmodules := !config.DisableRecursive cloneConfig := api.CloneConfig{Quiet: true, Recursive: hasSubmodules && !hasRef} if c.ValidCloneSpec(config.Source) { if len(config.ContextDir) > 0 { targetSourceDir = filepath.Join(config.WorkingDir, api.ContextTmp) glog.V(1).Infof("Downloading %q (%q) ...", config.Source, config.ContextDir) } else { glog.V(1).Infof("Downloading %q ...", config.Source) } // If we have a specific checkout ref, use submodule update instead of recursive // Otherwise the versions will be incorrect. if hasRef && hasSubmodules { glog.V(2).Infof("Cloning sources (deferring submodule init) into %q", targetSourceDir) } else if cloneConfig.Recursive { glog.V(2).Infof("Cloning sources and all Git submodules into %q", targetSourceDir) } else { glog.V(2).Infof("Cloning sources into %q", targetSourceDir) } if err := c.Clone(config.Source, targetSourceDir, cloneConfig); err != nil { glog.V(1).Infof("Git clone failed: %+v", err) return nil, err } if hasRef { if err := c.Checkout(targetSourceDir, config.Ref); err != nil { return nil, err } glog.V(1).Infof("Checked out %q", config.Ref) if hasSubmodules { if err := c.SubmoduleUpdate(targetSourceDir, true, true); err != nil { return nil, err } glog.V(1).Infof("Updated submodules for %q", config.Ref) } } if len(config.ContextDir) > 0 { originalTargetDir := filepath.Join(config.WorkingDir, api.Source) c.RemoveDirectory(originalTargetDir) // we want to copy entire dir contents, thus we need to use dir/. construct path := filepath.Join(targetSourceDir, config.ContextDir) + string(filepath.Separator) + "." err := c.Copy(path, originalTargetDir) if err != nil { return nil, err } info = c.GetInfo(targetSourceDir) c.RemoveDirectory(targetSourceDir) } else { info = c.GetInfo(targetSourceDir) } if len(config.ContextDir) > 0 { info.ContextDir = config.ContextDir } return info, nil } // we want to copy entire dir contents, thus we need to use dir/. construct path := filepath.Join(config.Source, config.ContextDir) + string(filepath.Separator) + "." if !c.Exists(path) { return nil, errors.NewSourcePathError(path) } if err := c.Copy(path, targetSourceDir); err != nil { return nil, err } // When building from a local directory (not using Git clone spec scheme) we // skip gathering informations about the source as there is no guarantee that // the folder is a Git repository or it requires context-dir to be set. if !config.Quiet { glog.Warning("You are using <source> location that is not valid Git repository. The source code information will not be stored into the output image. Use this image only for local testing and development.") } return nil, nil }
// Download downloads the application source code from the Git repository // and checkout the Ref specified in the config. func (c *Clone) Download(config *api.Config) (*api.SourceInfo, error) { targetSourceDir := filepath.Join(config.WorkingDir, api.Source) config.WorkingSourceDir = targetSourceDir ok, err := c.ValidCloneSpec(config.Source) if err != nil { return nil, err } if !ok { glog.Errorf("Clone.Download was passed an invalid source %s", config.Source) return nil, fmt.Errorf("invalid source %s", config.Source) } ref := "HEAD" if config.Ref != "" { ref = config.Ref } if strings.HasPrefix(config.Source, "file://") { s := strings.TrimPrefix(config.Source, "file://") if util.UsingCygwinGit { var err error s, err = util.ToSlashCygwin(s) if err != nil { glog.V(0).Infof("error: Cygwin path conversion failed: %v", err) return nil, err } } config.Source = "file://" + s } if len(config.ContextDir) > 0 { targetSourceDir = filepath.Join(config.WorkingDir, api.ContextTmp) glog.V(1).Infof("Downloading %q (%q) ...", config.Source, config.ContextDir) } else { glog.V(1).Infof("Downloading %q ...", config.Source) } if !config.IgnoreSubmodules { glog.V(2).Infof("Cloning sources into %q", targetSourceDir) } else { glog.V(2).Infof("Cloning sources (ignoring submodules) into %q", targetSourceDir) } cloneConfig := api.CloneConfig{Quiet: true} err = c.Clone(config.Source, targetSourceDir, cloneConfig) if err != nil { glog.V(0).Infof("error: git clone failed: %v", err) return nil, err } err = c.Checkout(targetSourceDir, ref) if err != nil { return nil, err } glog.V(1).Infof("Checked out %q", ref) if !config.IgnoreSubmodules { err = c.SubmoduleUpdate(targetSourceDir, true, true) if err != nil { return nil, err } glog.V(1).Infof("Updated submodules for %q", ref) } // Record Git's knowledge about file permissions if runtime.GOOS == "windows" { filemodes, err := c.LsTree(filepath.Join(targetSourceDir, config.ContextDir), ref, true) if err != nil { return nil, err } for _, filemode := range filemodes { c.Chmod(filepath.Join(targetSourceDir, config.ContextDir, filemode.Name()), os.FileMode(filemode.Mode())&os.ModePerm) } } info := c.GetInfo(targetSourceDir) if len(config.ContextDir) > 0 { originalTargetDir := filepath.Join(config.WorkingDir, api.Source) c.RemoveDirectory(originalTargetDir) path := filepath.Join(targetSourceDir, config.ContextDir) err := c.CopyContents(path, originalTargetDir) if err != nil { return nil, err } c.RemoveDirectory(targetSourceDir) } if len(config.ContextDir) > 0 { info.ContextDir = config.ContextDir } return info, nil }