func open(repoPath string) (repo.Repo, error) { packageLock.Lock() defer packageLock.Unlock() r, err := newFSRepo(repoPath) if err != nil { return nil, err } // Check if its initialized if err := checkInitialized(r.path); err != nil { return nil, err } r.lockfile, err = lockfile.Lock(r.path) if err != nil { return nil, err } keepLocked := false defer func() { // unlock on error, leave it locked on success if !keepLocked { r.lockfile.Close() } }() // Check version, and error out if not matching ver, err := mfsr.RepoPath(r.path).Version() if err != nil { if os.IsNotExist(err) { return nil, ErrNoVersion } return nil, err } if ver != RepoVersion { return nil, fmt.Errorf(errIncorrectRepoFmt, ver, RepoVersion) } // check repo path, then check all constituent parts. if err := dir.Writable(r.path); err != nil { return nil, err } if err := r.openConfig(); err != nil { return nil, err } if err := r.openDatastore(); err != nil { return nil, err } // setup eventlogger configureEventLoggerAtRepoPath(r.config, r.path) keepLocked = true return r, nil }
// Init initializes a new FSRepo at the given path with the provided config. // TODO add support for custom datastores. func Init(repoPath string, conf *config.Config) error { // packageLock must be held to ensure that the repo is not initialized more // than once. packageLock.Lock() defer packageLock.Unlock() if isInitializedUnsynced(repoPath) { return nil } if err := initConfig(repoPath, conf); err != nil { return err } // The actual datastore contents are initialized lazily when Opened. // During Init, we merely check that the directory is writeable. leveldbPath := path.Join(repoPath, leveldbDirectory) if err := dir.Writable(leveldbPath); err != nil { return fmt.Errorf("datastore: %s", err) } flatfsPath := path.Join(repoPath, flatfsDirectory) if err := dir.Writable(flatfsPath); err != nil { return fmt.Errorf("datastore: %s", err) } if err := dir.Writable(path.Join(repoPath, "logs")); err != nil { return err } if err := mfsr.RepoPath(repoPath).WriteVersion(RepoVersion); err != nil { return err } return nil }