diff --git a/cmd_mirror.go b/cmd_mirror.go new file mode 100644 index 00000000..ac05232d --- /dev/null +++ b/cmd_mirror.go @@ -0,0 +1,98 @@ +package main + +import ( + "fmt" + "github.com/gonuts/commander" + "github.com/gonuts/flag" + "github.com/smira/aptly/debian" + "log" + "strings" +) + +func aptlyMirrorList(cmd *commander.Command, args []string) { + fmt.Printf("MIRROR LIST\n") +} + +func aptlyMirrorCreate(cmd *commander.Command, args []string) { + if len(args) < 3 { + cmd.Usage() + return + } + + var architectures []string + archs := cmd.Flag.Lookup("architecture").Value.String() + if len(archs) > 0 { + architectures = strings.Split(archs, ",") + } + + repo, err := debian.NewRemoteRepo(args[0], args[1], args[2], args[3:], architectures) + if err != nil { + log.Fatalf("Unable to create mirror: %s", err) + } + + err = repo.Fetch(context.downloader) + if err != nil { + log.Fatalf("Unable to fetch mirror: %s", err) + } + + repoCollection := debian.NewRemoteRepoCollection(context.database) + + err = repoCollection.Add(repo) + if err != nil { + log.Fatalf("Unable to add mirror: %s", err) + } + + log.Printf("Mirror %s successfully added.\nYou can run 'aptly mirror update %s' to download repository contents.\n", repo, repo.Name) +} + +func makeCmdMirrorCreate() *commander.Command { + cmd := &commander.Command{ + Run: aptlyMirrorCreate, + UsageLine: "create", + Short: "create new mirror of Debian repository", + Long: ` +create only stores metadata about new mirror, and fetches Release files (it doesn't download packages) + +ex: + $ aptly mirror create [ ...] +`, + Flag: *flag.NewFlagSet("aptly-mirror-create", flag.ExitOnError), + } + cmd.Flag.String("architecture", "", "limit architectures to specified in the list, comma-delimited list") + + return cmd + +} + +func makeCmdMirrorList() *commander.Command { + cmd := &commander.Command{ + Run: aptlyMirrorList, + UsageLine: "list", + Short: "list mirrors of remote repositories", + Long: ` +list shows full list of remote repositories. + +ex: + $ aptly mirror list +`, + Flag: *flag.NewFlagSet("aptly-mirror-list", flag.ExitOnError), + } + cmd.Flag.Bool("v", false, "enable verbose output") + + return cmd +} + +func makeCmdMirror() *commander.Commander { + return &commander.Commander{ + Name: "mirror", + Short: "manage mirrors of remote repositories", + Commands: []*commander.Command{ + makeCmdMirrorCreate(), + makeCmdMirrorList(), + //makeCmdMirrorShow(), + //makeCmdMirrorDelete(), + //makeCmdMirrorUpdate(), + }, + Flag: flag.NewFlagSet("aptly-mirror", flag.ExitOnError), + } +} diff --git a/main.go b/main.go index a7cda3d6..25c02a7b 100644 --- a/main.go +++ b/main.go @@ -1,23 +1,56 @@ package main import ( - "fmt" + "github.com/gonuts/commander" + "github.com/gonuts/flag" "github.com/smira/aptly/database" "github.com/smira/aptly/debian" "github.com/smira/aptly/utils" + "log" + "os" ) -func main() { - downloader := utils.NewDownloader(2) - defer downloader.Shutdown() +var cmd *commander.Commander - database, _ := database.OpenDB("/tmp/aptlydb") - defer database.Close() - - repo, _ := debian.NewRemoteRepo("http://mirror.yandex.ru/debian/", "squeeze", []string{}, []string{}) - err := repo.Fetch(downloader) - fmt.Printf("Fetch(), err = %#v", err) - - err = repo.Download(downloader, database) - fmt.Printf("Download(), err = %#v", err) +func init() { + cmd = &commander.Commander{ + Name: os.Args[0], + Commands: []*commander.Command{}, + Flag: flag.NewFlagSet("aptly", flag.ExitOnError), + Commanders: []*commander.Commander{ + makeCmdMirror(), + }, + } +} + +var context struct { + downloader utils.Downloader + database database.Storage + packageRepository *debian.Repository +} + +func main() { + err := cmd.Flag.Parse(os.Args[1:]) + if err != nil { + log.Fatalf("%s", err) + } + + context.downloader = utils.NewDownloader(2) + defer context.downloader.Shutdown() + + // TODO: configure DB dir + context.database, err = database.OpenDB("/tmp/aptly/db") + if err != nil { + log.Fatalf("can't open database: %s", err) + } + defer context.database.Close() + + // TODO:configure pool dir + context.packageRepository = debian.NewRepository("/tmp/aptly") + + args := cmd.Flag.Args() + err = cmd.Run(args) + if err != nil { + log.Fatalf("%s", err) + } }