~emersion/hut-dev

export: print service name outside of Export function v1 APPLIED

Simon Ser: 4
 export: print service name outside of Export function
 export: drop Exporter.Name
 export: drop Exporter.BaseURL
 export: return cobra.Command directly

 24 files changed, 54 insertions(+), 116 deletions(-)
Pushed the whole series. Thanks!
Export patchset (mbox)
How do I use this?

Copy & paste the following snippet into your terminal to import this patchset into git:

curl -s https://lists.sr.ht/~emersion/hut-dev/patches/43254/mbox | git am -3
Learn more about email & git

[PATCH 1/4] export: print service name outside of Export function Export this patch

Deduplicate the logic a bit. No functional change.
---
 export.go        | 2 ++
 export/builds.go | 1 -
 export/git.go    | 2 --
 export/hg.go     | 2 --
 export/lists.go  | 1 -
 export/meta.go   | 2 --
 export/paste.go  | 1 -
 7 files changed, 2 insertions(+), 9 deletions(-)

diff --git a/export.go b/export.go
index 1c29b28f3aa7..cd3417c2d017 100644
--- a/export.go
+++ b/export.go
@@ -57,6 +57,8 @@ func newExportCommand() *cobra.Command {
		log.Println("Exporting account data...")

		for _, ex := range exporters {
			log.Println(ex.Name())

			base := path.Join(args[0], ex.Name())
			if err := os.MkdirAll(base, 0o755); err != nil {
				log.Fatalf("Failed to create export directory: %s", err.Error())
diff --git a/export/builds.go b/export/builds.go
index 0444752fdfcd..0e751e97d7e0 100644
--- a/export/builds.go
+++ b/export/builds.go
@@ -51,7 +51,6 @@ type JobInfo struct {
}

func (ex *BuildsExporter) Export(ctx context.Context, dir string) error {
	log.Println("builds.sr.ht")
	var cursor *buildssrht.Cursor
	var ret error

diff --git a/export/git.go b/export/git.go
index 9915f37bfddb..47744fc9272a 100644
--- a/export/git.go
+++ b/export/git.go
@@ -41,8 +41,6 @@ type GitRepoInfo struct {
}

func (ex *GitExporter) Export(ctx context.Context, dir string) error {
	log.Println("git.sr.ht")

	settings, err := gitsrht.SshSettings(ex.client, ctx)
	if err != nil {
		return err
diff --git a/export/hg.go b/export/hg.go
index 6dd27b46a94c..64091c86d296 100644
--- a/export/hg.go
+++ b/export/hg.go
@@ -41,8 +41,6 @@ type HgRepoInfo struct {
}

func (ex *HgExporter) Export(ctx context.Context, dir string) error {
	log.Println("hg.sr.ht")

	baseURL, err := url.Parse(ex.BaseURL())
	if err != nil {
		panic(err)
diff --git a/export/lists.go b/export/lists.go
index cb9f431ab606..58286e262475 100644
--- a/export/lists.go
+++ b/export/lists.go
@@ -57,7 +57,6 @@ type MailingListInfo struct {
}

func (ex *ListsExporter) Export(ctx context.Context, dir string) error {
	log.Println("lists.sr.ht")
	var cursor *listssrht.Cursor
	var ret error

diff --git a/export/meta.go b/export/meta.go
index 83e11e89ca76..48aa8963832f 100644
--- a/export/meta.go
+++ b/export/meta.go
@@ -4,7 +4,6 @@ import (
	"context"
	"encoding/json"
	"fmt"
	"log"
	"os"
	"path"

@@ -31,7 +30,6 @@ func (ex *MetaExporter) BaseURL() string {
}

func (ex *MetaExporter) Export(ctx context.Context, dir string) error {
	log.Println("meta.sr.ht")
	profileFile, err := os.Create(path.Join(dir, "profile.json"))
	if err != nil {
		return err
diff --git a/export/paste.go b/export/paste.go
index f24f67c920aa..daae8f242558 100644
--- a/export/paste.go
+++ b/export/paste.go
@@ -48,7 +48,6 @@ type PasteInfo struct {
}

func (ex *PasteExporter) Export(ctx context.Context, dir string) error {
	log.Println("paste.sr.ht")
	var cursor *pastesrht.Cursor
	var ret error

-- 
2.41.0

[PATCH 2/4] export: drop Exporter.Name Export this patch

No need for this to be part of the interface.

No functional change.
---
 export.go        | 32 ++++++++++++++++++--------------
 export/builds.go |  4 ----
 export/git.go    |  4 ----
 export/hg.go     |  4 ----
 export/iface.go  |  1 -
 export/lists.go  |  4 ----
 export/meta.go   |  4 ----
 export/paste.go  |  4 ----
 8 files changed, 18 insertions(+), 39 deletions(-)

diff --git a/export.go b/export.go
index cd3417c2d017..7c030f1ba6c3 100644
--- a/export.go
+++ b/export.go
@@ -18,35 +18,40 @@ type ExportInfo struct {
	Date     time.Time `json:"date"`
}

type exporter struct {
	export.Exporter
	Name string
}

func newExportCommand() *cobra.Command {
	run := func(cmd *cobra.Command, args []string) {
		var exporters []export.Exporter
		var exporters []exporter

		// TODO: Allow exporting a subset of all services (maybe meta should
		// provide a list of services configured for that instance?)
		mc := createClient("meta", cmd)
		meta := export.NewMetaExporter(mc.Client, mc.BaseURL)
		exporters = append(exporters, meta)
		exporters = append(exporters, exporter{meta, "meta.sr.ht"})

		gc := createClient("git", cmd)
		git := export.NewGitExporter(gc.Client, gc.BaseURL)
		exporters = append(exporters, git)
		exporters = append(exporters, exporter{git, "git.sr.ht"})

		hc := createClient("hg", cmd)
		hg := export.NewHgExporter(hc.Client, hc.BaseURL)
		exporters = append(exporters, hg)
		exporters = append(exporters, exporter{hg, "hg.sr.ht"})

		bc := createClient("builds", cmd)
		builds := export.NewBuildsExporter(bc.Client, bc.BaseURL, bc.HTTP)
		exporters = append(exporters, builds)
		exporters = append(exporters, exporter{builds, "builds.sr.ht"})

		pc := createClient("paste", cmd)
		paste := export.NewPasteExporter(pc.Client, pc.BaseURL, pc.HTTP)
		exporters = append(exporters, paste)
		exporters = append(exporters, exporter{paste, "paste.sr.ht"})

		lc := createClient("lists", cmd)
		lists := export.NewListsExporter(lc.Client, lc.BaseURL, lc.HTTP)
		exporters = append(exporters, lists)
		exporters = append(exporters, exporter{lists, "lists.sr.ht"})

		if _, ok := os.LookupEnv("SSH_AUTH_SOCK"); !ok {
			log.Println("Warning! SSH_AUTH_SOCK is not set in your environment.")
@@ -57,32 +62,31 @@ func newExportCommand() *cobra.Command {
		log.Println("Exporting account data...")

		for _, ex := range exporters {
			log.Println(ex.Name())
			log.Println(ex.Name)

			base := path.Join(args[0], ex.Name())
			base := path.Join(args[0], ex.Name)
			if err := os.MkdirAll(base, 0o755); err != nil {
				log.Fatalf("Failed to create export directory: %s", err.Error())
			}

			stamp := path.Join(base, "export-stamp.json")
			if _, err := os.Stat(stamp); err == nil {
				log.Printf("Skipping %s (already exported)", ex.Name())
				log.Printf("Skipping %s (already exported)", ex.Name)
				continue
			}

			if err := ex.Export(ctx, base); err != nil {
				log.Printf("Error exporting %s: %s", ex.Name(), err.Error())
				log.Printf("Error exporting %s: %s", ex.Name, err.Error())
				continue
			}

			info := ExportInfo{
				Instance: ex.BaseURL(),
				Service:  ex.Name(),
				Service:  ex.Name,
				Date:     time.Now().UTC(),
			}
			if err := writeExportStamp(stamp, &info); err != nil {
				log.Printf("Error writing stamp for %s: %s",
					ex.Name(), err.Error())
				log.Printf("Error writing stamp for %s: %s", ex.Name, err.Error())
			}
		}
		log.Println("Export complete.")
diff --git a/export/builds.go b/export/builds.go
index 0e751e97d7e0..ed8b8f05b3c2 100644
--- a/export/builds.go
+++ b/export/builds.go
@@ -34,10 +34,6 @@ func NewBuildsExporter(client *gqlclient.Client, baseURL string, http *http.Clie
	}
}

func (ex *BuildsExporter) Name() string {
	return "builds.sr.ht"
}

func (ex *BuildsExporter) BaseURL() string {
	return ex.baseURL
}
diff --git a/export/git.go b/export/git.go
index 47744fc9272a..9849ffe52c96 100644
--- a/export/git.go
+++ b/export/git.go
@@ -24,10 +24,6 @@ func NewGitExporter(client *gqlclient.Client, baseURL string) *GitExporter {
	return &GitExporter{client, baseURL}
}

func (ex *GitExporter) Name() string {
	return "git.sr.ht"
}

func (ex *GitExporter) BaseURL() string {
	return ex.baseURL
}
diff --git a/export/hg.go b/export/hg.go
index 64091c86d296..a417972bd46a 100644
--- a/export/hg.go
+++ b/export/hg.go
@@ -24,10 +24,6 @@ func NewHgExporter(client *gqlclient.Client, baseURL string) *HgExporter {
	return &HgExporter{client, baseURL}
}

func (ex *HgExporter) Name() string {
	return "hg.sr.ht"
}

func (ex *HgExporter) BaseURL() string {
	return ex.baseURL
}
diff --git a/export/iface.go b/export/iface.go
index 42e9edd7f0a7..0f889530c44f 100644
--- a/export/iface.go
+++ b/export/iface.go
@@ -3,7 +3,6 @@ package export
import "context"

type Exporter interface {
	Name() string
	BaseURL() string
	Export(ctx context.Context, dir string) error
}
diff --git a/export/lists.go b/export/lists.go
index 58286e262475..5bf04b56cedd 100644
--- a/export/lists.go
+++ b/export/lists.go
@@ -39,10 +39,6 @@ func NewListsExporter(client *gqlclient.Client, baseURL string,
	}
}

func (ex *ListsExporter) Name() string {
	return "lists.sr.ht"
}

func (ex *ListsExporter) BaseURL() string {
	return ex.baseURL
}
diff --git a/export/meta.go b/export/meta.go
index 48aa8963832f..a14a2814fb10 100644
--- a/export/meta.go
+++ b/export/meta.go
@@ -21,10 +21,6 @@ func NewMetaExporter(client *gqlclient.Client, baseURL string) *MetaExporter {
	return &MetaExporter{client, baseURL}
}

func (ex *MetaExporter) Name() string {
	return "meta.sr.ht"
}

func (ex *MetaExporter) BaseURL() string {
	return ex.baseURL
}
diff --git a/export/paste.go b/export/paste.go
index daae8f242558..b8d567a056c3 100644
--- a/export/paste.go
+++ b/export/paste.go
@@ -35,10 +35,6 @@ func NewPasteExporter(client *gqlclient.Client, baseURL string,
	}
}

func (ex *PasteExporter) Name() string {
	return "paste.sr.ht"
}

func (ex *PasteExporter) BaseURL() string {
	return ex.baseURL
}
-- 
2.41.0

[PATCH 3/4] export: drop Exporter.BaseURL Export this patch

No need for this to be part of the interface.

No functional change.
---
 export.go        | 25 +++++++++++++------------
 export/builds.go | 16 +++++-----------
 export/git.go    |  6 +-----
 export/hg.go     |  6 +-----
 export/iface.go  |  1 -
 export/lists.go  | 17 +++++------------
 export/meta.go   | 11 +++--------
 export/paste.go  | 17 +++++------------
 8 files changed, 33 insertions(+), 66 deletions(-)

diff --git a/export.go b/export.go
index 7c030f1ba6c3..61c9fc6ac1e7 100644
--- a/export.go
+++ b/export.go
@@ -20,7 +20,8 @@ type ExportInfo struct {

type exporter struct {
	export.Exporter
	Name string
	Name    string
	BaseURL string
}

func newExportCommand() *cobra.Command {
@@ -30,28 +31,28 @@ func newExportCommand() *cobra.Command {
		// TODO: Allow exporting a subset of all services (maybe meta should
		// provide a list of services configured for that instance?)
		mc := createClient("meta", cmd)
		meta := export.NewMetaExporter(mc.Client, mc.BaseURL)
		exporters = append(exporters, exporter{meta, "meta.sr.ht"})
		meta := export.NewMetaExporter(mc.Client)
		exporters = append(exporters, exporter{meta, "meta.sr.ht", mc.BaseURL})

		gc := createClient("git", cmd)
		git := export.NewGitExporter(gc.Client, gc.BaseURL)
		exporters = append(exporters, exporter{git, "git.sr.ht"})
		exporters = append(exporters, exporter{git, "git.sr.ht", gc.BaseURL})

		hc := createClient("hg", cmd)
		hg := export.NewHgExporter(hc.Client, hc.BaseURL)
		exporters = append(exporters, exporter{hg, "hg.sr.ht"})
		exporters = append(exporters, exporter{hg, "hg.sr.ht", hc.BaseURL})

		bc := createClient("builds", cmd)
		builds := export.NewBuildsExporter(bc.Client, bc.BaseURL, bc.HTTP)
		exporters = append(exporters, exporter{builds, "builds.sr.ht"})
		builds := export.NewBuildsExporter(bc.Client, bc.HTTP)
		exporters = append(exporters, exporter{builds, "builds.sr.ht", bc.BaseURL})

		pc := createClient("paste", cmd)
		paste := export.NewPasteExporter(pc.Client, pc.BaseURL, pc.HTTP)
		exporters = append(exporters, exporter{paste, "paste.sr.ht"})
		paste := export.NewPasteExporter(pc.Client, pc.HTTP)
		exporters = append(exporters, exporter{paste, "paste.sr.ht", pc.BaseURL})

		lc := createClient("lists", cmd)
		lists := export.NewListsExporter(lc.Client, lc.BaseURL, lc.HTTP)
		exporters = append(exporters, exporter{lists, "lists.sr.ht"})
		lists := export.NewListsExporter(lc.Client, lc.HTTP)
		exporters = append(exporters, exporter{lists, "lists.sr.ht", lc.BaseURL})

		if _, ok := os.LookupEnv("SSH_AUTH_SOCK"); !ok {
			log.Println("Warning! SSH_AUTH_SOCK is not set in your environment.")
@@ -81,7 +82,7 @@ func newExportCommand() *cobra.Command {
			}

			info := ExportInfo{
				Instance: ex.BaseURL(),
				Instance: ex.BaseURL,
				Service:  ex.Name,
				Date:     time.Now().UTC(),
			}
diff --git a/export/builds.go b/export/builds.go
index ed8b8f05b3c2..f5c6e1ac0ef6 100644
--- a/export/builds.go
+++ b/export/builds.go
@@ -19,25 +19,19 @@ import (
)

type BuildsExporter struct {
	client  *gqlclient.Client
	http    *http.Client
	baseURL string
	client *gqlclient.Client
	http   *http.Client
}

func NewBuildsExporter(client *gqlclient.Client, baseURL string, http *http.Client) *BuildsExporter {
func NewBuildsExporter(client *gqlclient.Client, http *http.Client) *BuildsExporter {
	newHttp := *http
	newHttp.Timeout = 10 * time.Minute // XXX: Sane default?
	return &BuildsExporter{
		client:  client,
		baseURL: baseURL,
		http:    &newHttp,
		client: client,
		http:   &newHttp,
	}
}

func (ex *BuildsExporter) BaseURL() string {
	return ex.baseURL
}

type JobInfo struct {
	Id         int32                 `json:"id"`
	Status     string                `json:"status"`
diff --git a/export/git.go b/export/git.go
index 9849ffe52c96..495e1909df5a 100644
--- a/export/git.go
+++ b/export/git.go
@@ -24,10 +24,6 @@ func NewGitExporter(client *gqlclient.Client, baseURL string) *GitExporter {
	return &GitExporter{client, baseURL}
}

func (ex *GitExporter) BaseURL() string {
	return ex.baseURL
}

// A subset of gitsrht.Repository which only contains the fields we want to
// export (i.e. the ones filled in by the GraphQL query)
type GitRepoInfo struct {
@@ -43,7 +39,7 @@ func (ex *GitExporter) Export(ctx context.Context, dir string) error {
	}
	sshUser := settings.Settings.SshUser

	baseURL, err := url.Parse(ex.BaseURL())
	baseURL, err := url.Parse(ex.baseURL)
	if err != nil {
		panic(err)
	}
diff --git a/export/hg.go b/export/hg.go
index a417972bd46a..0658235f9f70 100644
--- a/export/hg.go
+++ b/export/hg.go
@@ -24,10 +24,6 @@ func NewHgExporter(client *gqlclient.Client, baseURL string) *HgExporter {
	return &HgExporter{client, baseURL}
}

func (ex *HgExporter) BaseURL() string {
	return ex.baseURL
}

// A subset of hgsrht.Repository which only contains the fields we want to
// export (i.e. the ones filled in by the GraphQL query)
type HgRepoInfo struct {
@@ -37,7 +33,7 @@ type HgRepoInfo struct {
}

func (ex *HgExporter) Export(ctx context.Context, dir string) error {
	baseURL, err := url.Parse(ex.BaseURL())
	baseURL, err := url.Parse(ex.baseURL)
	if err != nil {
		panic(err)
	}
diff --git a/export/iface.go b/export/iface.go
index 0f889530c44f..b8f9557f4d98 100644
--- a/export/iface.go
+++ b/export/iface.go
@@ -3,7 +3,6 @@ package export
import "context"

type Exporter interface {
	BaseURL() string
	Export(ctx context.Context, dir string) error
}

diff --git a/export/lists.go b/export/lists.go
index 5bf04b56cedd..684d93048b11 100644
--- a/export/lists.go
+++ b/export/lists.go
@@ -18,13 +18,11 @@ import (
)

type ListsExporter struct {
	client  *gqlclient.Client
	http    *http.Client
	baseURL string
	client *gqlclient.Client
	http   *http.Client
}

func NewListsExporter(client *gqlclient.Client, baseURL string,
	http *http.Client) *ListsExporter {
func NewListsExporter(client *gqlclient.Client, http *http.Client) *ListsExporter {
	newHttp := *http
	// XXX: Is this a sane default? Maybe large lists or slow
	// connections could require more. Would be nice to ensure a
@@ -33,16 +31,11 @@ func NewListsExporter(client *gqlclient.Client, baseURL string,
	// headers to be able to resume this on failure or interruption.
	newHttp.Timeout = 10 * time.Minute
	return &ListsExporter{
		client:  client,
		http:    &newHttp,
		baseURL: baseURL,
		client: client,
		http:   &newHttp,
	}
}

func (ex *ListsExporter) BaseURL() string {
	return ex.baseURL
}

// A subset of listssrht.MailingList which only contains the fields we want to
// export (i.e. the ones filled in by the GraphQL query)
type MailingListInfo struct {
diff --git a/export/meta.go b/export/meta.go
index a14a2814fb10..2b5291ffda19 100644
--- a/export/meta.go
+++ b/export/meta.go
@@ -13,16 +13,11 @@ import (
)

type MetaExporter struct {
	client  *gqlclient.Client
	baseURL string
	client *gqlclient.Client
}

func NewMetaExporter(client *gqlclient.Client, baseURL string) *MetaExporter {
	return &MetaExporter{client, baseURL}
}

func (ex *MetaExporter) BaseURL() string {
	return ex.baseURL
func NewMetaExporter(client *gqlclient.Client) *MetaExporter {
	return &MetaExporter{client}
}

func (ex *MetaExporter) Export(ctx context.Context, dir string) error {
diff --git a/export/paste.go b/export/paste.go
index b8d567a056c3..2a7552edb6db 100644
--- a/export/paste.go
+++ b/export/paste.go
@@ -18,27 +18,20 @@ import (
)

type PasteExporter struct {
	client  *gqlclient.Client
	http    *http.Client
	baseURL string
	client *gqlclient.Client
	http   *http.Client
}

func NewPasteExporter(client *gqlclient.Client, baseURL string,
	http *http.Client) *PasteExporter {
func NewPasteExporter(client *gqlclient.Client, http *http.Client) *PasteExporter {
	// XXX: Is this a sane default?
	newHttp := *http
	newHttp.Timeout = 10 * time.Minute
	return &PasteExporter{
		client:  client,
		http:    &newHttp,
		baseURL: baseURL,
		client: client,
		http:   &newHttp,
	}
}

func (ex *PasteExporter) BaseURL() string {
	return ex.baseURL
}

type PasteInfo struct {
	Visibility pastesrht.Visibility `json:"visibility"`
}
-- 
2.41.0

[PATCH 4/4] export: return cobra.Command directly Export this patch

No need for an intermediate variable here.
---
 export.go | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/export.go b/export.go
index 61c9fc6ac1e7..2acfd7e35ba8 100644
--- a/export.go
+++ b/export.go
@@ -92,7 +92,7 @@ func newExportCommand() *cobra.Command {
		}
		log.Println("Export complete.")
	}
	cmd := &cobra.Command{
	return &cobra.Command{
		Use:   "export <directory>",
		Short: "Exports your account data",
		Args:  cobra.ExactArgs(1),
@@ -101,7 +101,6 @@ func newExportCommand() *cobra.Command {
		},
		Run: run,
	}
	return cmd
}

func writeExportStamp(path string, info *ExportInfo) error {
-- 
2.41.0
Pushed the whole series. Thanks!