func New(rootpath string, targetpath string) (RootFS, error) {
	rootfs, err := createRootFS(rootpath, targetpath)
	if err != nil {
		return nil, err
	}
	rootfs.userfs = map[string]UserFS{
		"git":  NewGitFS(),
		"file": NewFileFS(),
	}
	return rootfs, nil
}
New create new vfs VFS
package vfs
import (
	"errors"
	"fmt"
	"net/url"
	"os"
	"path/filepath"
	"regexp"
	"strings"
	"github.com/gsdocker/gserrors"
	"github.com/gsdocker/gslogger"
	"github.com/gsdocker/gsos/fs"
	"github.com/gsmake/gsmake/property"
)
var (
	ErrURL      = errors.New("error url")
	ErrFS       = errors.New("unknown fs")
	ErrNotFound = errors.New("vfs node not found")
)
func Exists(rootfs RootFS, target string) bool {
	_, _, err := rootfs.Open(target)
	return err == nil
}
func NotFound(err error) bool {
	for {
		if gserror, ok := err.(gserrors.GSError); ok {
			err = gserror.Origin()
			continue
		}
		break
	}
	if err == ErrNotFound {
		return true
	}
	return false
}
const (
	DomainTask     = "task"
	VersionDefault = "current"
	FSGSMake       = "gsmake"
	FSFile         = "file"
)
type Entry struct {
	*url.URL
	Mapping string  
	userfs  UserFS  
}
func (entry *Entry) String() string {
	val, _ := url.QueryUnescape(entry.URL.String())
	return val
}
func (entry *Entry) Domain() string {
	return entry.Query().Get("domain")
}
func (entry *Entry) Name() string {
	return fmt.Sprintf("%s%s", entry.Host, entry.Path)
}
type RootFS interface {
	gslogger.Log
	RootPath() string
	TargetPath() string
	Userspace() string
	Mounted(src string, target string) bool
	Mount(src, target string) error
	Dismount(target string) error
	List(f func(src *Entry, target *Entry) bool) error
	Open(url string) (src *Entry, target *Entry, err error)
	Update(src string, nocache bool) error
	UpdateAll(nocache bool) error
	UpdateCache(src string) error
	Clear() error
	CacheRoot(src *Entry) string
	Cached(src *Entry) error
	Protocol(host string) string
	TempDir(domain string) string
	DomainDir(domain string) string
	Redirect(from, to string, enable bool) error
}
type UserFS interface {
	fmt.Stringer
	Mount(rootfs RootFS, src *Entry, target *Entry) error
	Dismount(rootfs RootFS, src, target *Entry) error
	Update(rootfs RootFS, src *Entry, target *Entry, nocache bool) error
	UpdateCache(rootfs RootFS, cachepath string) error
}
type VFS struct {
	gslogger.Log                    
	userspace    string             
	rootpath     string             
	targetpath   string             
	meta         *Metadata          
	userfs       map[string]UserFS  
}