// LocalPath returns the local path of the source repository func (r *SourceRepository) LocalPath() (string, error) { if len(r.localDir) > 0 { return r.localDir, nil } switch { case r.url.Scheme == "file": r.localDir = filepath.Join(r.url.Path, r.contextDir) default: gitRepo := git.NewRepository() var err error if r.localDir, err = ioutil.TempDir("", "gen"); err != nil { return "", err } localUrl := r.url ref := localUrl.Fragment localUrl.Fragment = "" if err = gitRepo.Clone(r.localDir, localUrl.String()); err != nil { return "", fmt.Errorf("cannot clone repository %s: %v", localUrl.String(), err) } if len(ref) > 0 { if err = gitRepo.Checkout(r.localDir, ref); err != nil { return "", fmt.Errorf("cannot checkout ref %s of repository %s: %v", ref, localUrl.String(), err) } } r.localDir = filepath.Join(r.localDir, r.contextDir) } return r.localDir, nil }
// NewBuildStrategyRefGenerator creates a BuildStrategyRefGenerator func NewBuildStrategyRefGenerator(sourceDetectors source.Detectors) *BuildStrategyRefGenerator { return &BuildStrategyRefGenerator{ gitRepository: git.NewRepository(), dockerfileFinder: dockerfile.NewFinder(), dockerfileParser: dockerfile.NewParser(), sourceDetectors: sourceDetectors, imageRefGenerator: NewImageRefGenerator(), } }
// RemoteURL returns the remote URL of the source repository func (r *SourceRepository) RemoteURL() (*url.URL, error) { if r.remoteURL != nil { return r.remoteURL, nil } switch r.url.Scheme { case "file": gitRepo := git.NewRepository() remote, _, err := gitRepo.GetOriginURL(r.url.Path) if err != nil { return nil, err } ref := gitRepo.GetRef(r.url.Path) if len(ref) > 0 { remote = fmt.Sprintf("%s#%s", remote, ref) } if r.remoteURL, err = url.Parse(remote); err != nil { return nil, err } default: r.remoteURL = &r.url } return r.remoteURL, nil }
// NewSourceRefGenerator creates a new SourceRefGenerator func NewSourceRefGenerator() *SourceRefGenerator { return &SourceRefGenerator{ repository: git.NewRepository(), } }
// RunStartBuild contains all the necessary functionality for the OpenShift cli start-build command func RunStartBuild(f *clientcmd.Factory, out io.Writer, cmd *cobra.Command, args []string, webhooks util.StringFlag) error { webhook := cmdutil.GetFlagString(cmd, "from-webhook") buildName := cmdutil.GetFlagString(cmd, "from-build") follow := cmdutil.GetFlagBool(cmd, "follow") switch { case len(webhook) > 0: if len(args) > 0 || len(buildName) > 0 { return cmdutil.UsageError(cmd, "The '--from-webhook' flag is incompatible with arguments or '--from-build'") } path := cmdutil.GetFlagString(cmd, "git-repository") postReceivePath := cmdutil.GetFlagString(cmd, "git-post-receive") repo := git.NewRepository() return RunStartBuildWebHook(f, out, webhook, path, postReceivePath, repo) case len(args) != 1 && len(buildName) == 0: return cmdutil.UsageError(cmd, "Must pass a name of a BuildConfig or specify build name with '--from-build' flag") } name := buildName isBuild := true if len(name) == 0 { name = args[0] isBuild = false } if webhooks.Provided() { return RunListBuildWebHooks(f, out, cmd.Out(), name, isBuild, webhooks.String()) } client, _, err := f.Clients() if err != nil { return err } namespace, err := f.DefaultNamespace() if err != nil { return err } request := &buildapi.BuildRequest{ ObjectMeta: kapi.ObjectMeta{Name: name}, } var newBuild *buildapi.Build if isBuild { if newBuild, err = client.Builds(namespace).Clone(request); err != nil { return err } } else { if newBuild, err = client.BuildConfigs(namespace).Instantiate(request); err != nil { return err } } fmt.Fprintf(out, "%s\n", newBuild.Name) if follow { opts := buildapi.BuildLogOptions{ Follow: true, NoWait: false, } rd, err := client.BuildLogs(namespace).Get(newBuild.Name, opts).Stream() if err != nil { return fmt.Errorf("error getting logs: %v", err) } defer rd.Close() _, err = io.Copy(out, rd) if err != nil { return fmt.Errorf("error streaming logs: %v", err) } } return nil }