Skip to content
go-libfossil Artifact [510bfed1fa]
Login

Artifact [510bfed1fa]

Artifact 510bfed1fab03fc40bca575c5c086f97217e3686ea9424269623d4db482d6702:


package cli

import (
	"fmt"
	"os"
	"path/filepath"

	libfossil "github.com/danmestas/libfossil"
)

// RepoOpenCmd opens a checkout in a directory, creating the .fslckout database.
type RepoOpenCmd struct {
	Dir string `arg:"" optional:"" help:"Checkout directory (default: current dir)" default:"."`
}

func (c *RepoOpenCmd) Run(g *Globals) error {
	if g.Repo == "" {
		return fmt.Errorf("repository required (use -R <path>)")
	}

	absRepo, err := filepath.Abs(g.Repo)
	if err != nil {
		return err
	}

	ckoutPath := filepath.Join(c.Dir, ".fslckout")
	if _, err := os.Stat(ckoutPath); err == nil {
		return fmt.Errorf("checkout already exists: %s", ckoutPath)
	}

	g.Repo = absRepo
	r, err := g.OpenRepo()
	if err != nil {
		return err
	}
	defer r.Close()

	co, err := r.CreateCheckout(c.Dir, libfossil.CheckoutCreateOpts{})
	if err != nil {
		os.Remove(ckoutPath)
		return err
	}
	defer co.Close()

	tipRid, tipHash, err := co.Version()
	if err != nil {
		os.Remove(ckoutPath)
		return err
	}

	fmt.Printf("opened checkout in %s (repo: %s)\n", c.Dir, absRepo)
	if tipRid > 0 {
		fmt.Printf("checked out version %s\n", tipHash[:10])
	} else {
		fmt.Println("empty repository -- no checkins yet")
	}
	return nil
}