From 6012e0081e7212590e6929dcbcaad449ddf87a34 Mon Sep 17 00:00:00 2001 From: Daniele Rondina Date: Sat, 4 Jan 2020 00:31:11 +0100 Subject: [PATCH] Add support of incremental revision for repos * on repository creation now if the repository.yaml is already present, the current revision is used. * add --reset-revision option for force reset revision of a specific repository --- cmd/create-repo.go | 5 ++- pkg/installer/interface.go | 6 ++- pkg/installer/repository.go | 83 +++++++++++++++++++++++++++---------- 3 files changed, 71 insertions(+), 23 deletions(-) diff --git a/cmd/create-repo.go b/cmd/create-repo.go index d8273037..ae78df08 100644 --- a/cmd/create-repo.go +++ b/cmd/create-repo.go @@ -38,6 +38,7 @@ var createrepoCmd = &cobra.Command{ viper.BindPFlag("descr", cmd.Flags().Lookup("descr")) viper.BindPFlag("urls", cmd.Flags().Lookup("urls")) viper.BindPFlag("type", cmd.Flags().Lookup("type")) + viper.BindPFlag("reset-revision", cmd.Flags().Lookup("reset-revision")) }, Run: func(cmd *cobra.Command, args []string) { @@ -48,12 +49,13 @@ var createrepoCmd = &cobra.Command{ descr := viper.GetString("descr") urls := viper.GetStringSlice("urls") t := viper.GetString("type") + reset := viper.GetBool("reset-revision") repo, err := installer.GenerateRepository(name, descr, t, urls, 1, packages, tree, pkg.NewInMemoryDatabase(false)) if err != nil { Fatal("Error: " + err.Error()) } - err = repo.Write(dst) + err = repo.Write(dst, reset) if err != nil { Fatal("Error: " + err.Error()) } @@ -72,6 +74,7 @@ func init() { createrepoCmd.Flags().String("descr", "luet", "Repository description") createrepoCmd.Flags().StringSlice("urls", []string{}, "Repository URLs") createrepoCmd.Flags().String("type", "disk", "Repository type (disk)") + createrepoCmd.Flags().Bool("reset-revision", false, "Reset repository revision.") RootCmd.AddCommand(createrepoCmd) } diff --git a/pkg/installer/interface.go b/pkg/installer/interface.go index 424ae365..1196a607 100644 --- a/pkg/installer/interface.go +++ b/pkg/installer/interface.go @@ -47,11 +47,15 @@ type Repository interface { GetIndex() compiler.ArtifactIndex GetTree() tree.Builder SetTree(tree.Builder) - Write(path string) error + Write(path string, resetRevision bool) error Sync() (Repository, error) GetTreePath() string SetTreePath(string) GetType() string SetType(string) + GetRevision() int + IncrementRevision() + GetLastUpdate() string + SetLastUpdate(string) Client() Client } diff --git a/pkg/installer/repository.go b/pkg/installer/repository.go index f861e323..3e5bc7d9 100644 --- a/pkg/installer/repository.go +++ b/pkg/installer/repository.go @@ -16,6 +16,7 @@ package installer import ( + "fmt" "io/ioutil" "os" "path/filepath" @@ -37,6 +38,10 @@ import ( "github.com/pkg/errors" ) +const ( + REPOSITORY_SPECFILE = "repository.yaml" +) + type LuetSystemRepository struct { *config.LuetRepository @@ -188,21 +193,71 @@ func (r *LuetSystemRepository) GetIndex() compiler.ArtifactIndex { func (r *LuetSystemRepository) GetTree() tree.Builder { return r.Tree } -func (r *LuetSystemRepository) Write(dst string) error { +func (r *LuetSystemRepository) GetRevision() int { + return r.Revision +} +func (r *LuetSystemRepository) GetLastUpdate() string { + return r.LastUpdate +} +func (r *LuetSystemRepository) SetLastUpdate(u string) { + r.LastUpdate = u +} +func (r *LuetSystemRepository) IncrementRevision() { + r.Revision++ +} +func (r *LuetSystemRepository) ReadSpecFile(file string, removeFile bool) (Repository, error) { + dat, err := ioutil.ReadFile(file) + if err != nil { + return nil, errors.Wrap(err, "Error reading file "+file) + } + if removeFile { + defer os.Remove(file) + } + + var repo Repository + repo, err = NewLuetSystemRepositoryFromYaml(dat, pkg.NewInMemoryDatabase(false)) + if err != nil { + return nil, errors.Wrap(err, "Error reading repository from file "+file) + } + + return repo, err +} + +func (r *LuetSystemRepository) Write(dst string, resetRevision bool) error { err := os.MkdirAll(dst, os.ModePerm) if err != nil { return err } r.Index = r.Index.CleanPath() r.LastUpdate = strconv.FormatInt(time.Now().Unix(), 10) + + repospec := filepath.Join(dst, REPOSITORY_SPECFILE) + if resetRevision { + r.Revision = 0 + } else { + if _, err := os.Stat(repospec); !os.IsNotExist(err) { + // Read existing file for retrieve revision + spec, err := r.ReadSpecFile(repospec, false) + if err != nil { + return err + } + r.Revision = spec.GetRevision() + } + } r.Revision++ data, err := yaml.Marshal(r) if err != nil { return err } - err = ioutil.WriteFile(filepath.Join(dst, "repository.yaml"), data, os.ModePerm) + + Info(fmt.Sprintf( + "For repository %s creating revision %d and last update %s...", + r.Name, r.Revision, r.LastUpdate, + )) + + err = ioutil.WriteFile(repospec, data, os.ModePerm) if err != nil { return err } @@ -238,32 +293,18 @@ func (r *LuetSystemRepository) Sync() (Repository, error) { if c == nil { return nil, errors.New("No client could be generated from repository.") } - file, err := c.DownloadFile("repository.yaml") + file, err := c.DownloadFile(REPOSITORY_SPECFILE) if err != nil { - return nil, errors.Wrap(err, "While downloading repository.yaml") + return nil, errors.Wrap(err, "While downloading "+REPOSITORY_SPECFILE) } - dat, err := ioutil.ReadFile(file) + repo, err := r.ReadSpecFile(file, true) if err != nil { - return nil, errors.Wrap(err, "Error reading file "+file) - } - defer os.Remove(file) - - var repo Repository - // if config.LuetCfg.GetSystem().DatabaseEngine == "boltdb" { - // repo, err = NewLuetSystemRepositoryFromYaml(dat, - // pkg.NewBoltDatabase(filepath.Join(helpers.GetRepoDatabaseDirPath(r.Name), "luet.db")), - // ) - // } else { - repo, err = NewLuetSystemRepositoryFromYaml(dat, pkg.NewInMemoryDatabase(false)) - // } - if err != nil { - return nil, errors.Wrap(err, "Error reading repository from file "+file) - + return nil, err } archivetree, err := c.DownloadFile("tree.tar") if err != nil { - return nil, errors.Wrap(err, "While downloading repository.yaml") + return nil, errors.Wrap(err, "While downloading "+REPOSITORY_SPECFILE) } defer os.RemoveAll(archivetree) // clean up