Skip to content

Commit d8ca9ab

Browse files
authored
Separate local data (#57)
## Primary change Move local repositories to `.marmot/meta-repo-local.json`, since paths are machine-specific. ## Future work Remove unused portions of JSON data from each file, to avoid confusion. But this will lead to splitting up more code than I wanted to put in this one PR.
1 parent 4952313 commit d8ca9ab

12 files changed

+112
-58
lines changed

src/go/cmd/root/cli_config_parser.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,17 @@ func (parser rootConfigParser) Parse(
4444
config := &rootCliConfig{
4545
args: args,
4646
cmdFactory: use.NewCommandFactory().
47+
WithLocalRepositorySource(jsonMetaRepo).
4748
WithMetaDataAdmin(metaRepoAdmin).
48-
WithRepositorySource(jsonMetaRepo),
49+
WithRemoteRepositorySource(jsonMetaRepo),
4950
debug: debug,
5051
flagSet: flags,
5152
inputLines: make([]string, 0),
5253
metaRepoPath: metaRepoPath,
5354
queryFactory: use.NewQueryFactory().
55+
WithLocalRepositorySource(jsonMetaRepo).
5456
WithMetaDataAdmin(metaRepoAdmin).
55-
WithRepositorySource(jsonMetaRepo),
57+
WithRemoteRepositorySource(jsonMetaRepo),
5658
}
5759

5860
return config, nil
@@ -95,15 +97,17 @@ func (parser rootConfigParser) ParseR(
9597
config := &rootCliConfig{
9698
args: argsBeforeDash,
9799
cmdFactory: use.NewCommandFactory().
100+
WithLocalRepositorySource(jsonMetaRepo).
98101
WithMetaDataAdmin(metaRepoAdmin).
99-
WithRepositorySource(jsonMetaRepo),
102+
WithRemoteRepositorySource(jsonMetaRepo),
100103
debug: debug,
101104
flagSet: flags,
102105
inputLines: inputLines,
103106
metaRepoPath: metaRepoPath,
104107
queryFactory: use.NewQueryFactory().
108+
WithLocalRepositorySource(jsonMetaRepo).
105109
WithMetaDataAdmin(metaRepoAdmin).
106-
WithRepositorySource(jsonMetaRepo),
110+
WithRemoteRepositorySource(jsonMetaRepo),
107111
}
108112

109113
return config, nil

src/go/corerepository/repository_source.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,26 @@ package corerepository
22

33
import "net/url"
44

5-
// A source of Git repositories that a meta repo might care about.
5+
// A source of Git repositories on this machine that a meta repo might care about.
66
//
77
// Repository sources are responsible for these invariants:
88
// - Local repository paths are distinct, by string comparison. Clients decide whether to
99
// resolve relative paths or de-duplicate paths that resolve to the same filesystem entry.
10-
// - Remote repository URLs are distinct, comparing hrefs.
11-
type RepositorySource interface {
10+
type LocalRepositorySource interface {
1211
// Add repositories located at the specified paths, skipping known paths and exact duplicates.
1312
AddLocals(localPaths []string) error
1413

15-
// Add repositories hosted at the specified URLs, skipping known remotes and duplicates.
16-
AddRemotes(hostUrls []*url.URL) error
17-
1814
// List all known repositories on the local file system, including remotes cloned to known paths.
1915
ListLocal() (Repositories, error)
16+
}
17+
18+
// A source of Git repositories on other machines that a meta repo might care about.
19+
//
20+
// Repository sources are responsible for these invariants:
21+
// - Remote repository URLs are distinct, comparing hrefs.
22+
type RemoteRepositorySource interface {
23+
// Add repositories hosted at the specified URLs, skipping known remotes and duplicates.
24+
AddRemotes(hostUrls []*url.URL) error
2025

2126
// List all known repositories on remote hosts, including those that have not been cloned locally.
2227
ListRemote() (Repositories, error)

src/go/cukesupport/factory_helper.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ func ThatCommandFactory() (use.CommandFactory, error) {
1111
return nil, pathErr
1212
} else {
1313
jsonMetaRepo := svcfs.NewJsonMetaRepo(metaRepoPath)
14-
return use.NewCommandFactory().WithRepositorySource(jsonMetaRepo), nil
14+
return use.NewCommandFactory().
15+
WithLocalRepositorySource(jsonMetaRepo).
16+
WithRemoteRepositorySource(jsonMetaRepo),
17+
nil
1518
}
1619
}
1720

@@ -27,6 +30,8 @@ func ThatQueryFactory() (use.QueryFactory, error) {
2730
return nil, pathErr
2831
} else {
2932
jsonMetaRepo := svcfs.NewJsonMetaRepo(metaRepoPath)
30-
return use.NewQueryFactory().WithRepositorySource(jsonMetaRepo), nil
33+
return use.NewQueryFactory().
34+
WithLocalRepositorySource(jsonMetaRepo).
35+
WithRemoteRepositorySource(jsonMetaRepo), nil
3136
}
3237
}

src/go/svcfs/json_meta_repo.go

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,16 @@ import (
99
)
1010

1111
func NewJsonMetaRepo(repositoryPath string) *JsonMetaRepo {
12-
return &JsonMetaRepo{metaDataFile: metaDataFile(repositoryPath)}
12+
return &JsonMetaRepo{
13+
localDataFile: localDataFile(repositoryPath),
14+
metaDataFile: metaDataFile(repositoryPath),
15+
}
1316
}
1417

1518
// A meta repo that stores meta data in JSON files in the specified directory.
1619
type JsonMetaRepo struct {
17-
metaDataFile string
20+
localDataFile string
21+
metaDataFile string
1822
}
1923

2024
/* Local repositories */
@@ -39,14 +43,14 @@ func (repo *JsonMetaRepo) AddLocals(localPaths []string) error {
3943
}
4044

4145
func (repo *JsonMetaRepo) addLocal(localPath string) error {
42-
return repo.updateFile(func(rootObject *rootObjectData) {
46+
return updateFile(repo.localDataFile, func(rootObject *rootObjectData) {
4347
rootObject.MetaRepo.AppendLocalRepository(localRepositoryData{Path: localPath})
4448
})
4549
}
4650

4751
func (repo *JsonMetaRepo) ListLocal() (core.Repositories, error) {
4852
return queryFile(
49-
repo.metaDataFile,
53+
repo.localDataFile,
5054
core.NoRepositories(),
5155
func(rootObject *rootObjectData) (core.Repositories, error) {
5256
return rootObject.MetaRepo.MapLocalRepositories()
@@ -75,7 +79,7 @@ func (repo *JsonMetaRepo) AddRemotes(hostUrls []*url.URL) error {
7579
}
7680

7781
func (repo *JsonMetaRepo) addRemote(hostUrl *url.URL) error {
78-
return repo.updateFile(func(rootObject *rootObjectData) {
82+
return updateFile(repo.metaDataFile, func(rootObject *rootObjectData) {
7983
rootObject.MetaRepo.AppendRemoteRepository(remoteRepositoryData{Url: hostUrl.String()})
8084
})
8185
}
@@ -92,12 +96,12 @@ func (repo *JsonMetaRepo) ListRemote() (core.Repositories, error) {
9296
/* I/O */
9397

9498
func queryFile[V any](
95-
metaDataFile string,
99+
dataFile string,
96100
defaultValue V,
97101
queryData func(*rootObjectData) (V, error),
98102
) (V, error) {
99-
if rootObject, readErr := ReadMetaRepoFile(metaDataFile); readErr != nil {
100-
return defaultValue, fmt.Errorf("failed to read file %s; %w", metaDataFile, readErr)
103+
if rootObject, readErr := ReadMetaRepoFile(dataFile); readErr != nil {
104+
return defaultValue, fmt.Errorf("failed to read file %s; %w", dataFile, readErr)
101105
} else if result, queryErr := queryData(rootObject); queryErr != nil {
102106
return defaultValue, fmt.Errorf("failed to query data; %w", queryErr)
103107
} else {
@@ -107,16 +111,16 @@ func queryFile[V any](
107111

108112
type updateDataFn = func(*rootObjectData)
109113

110-
func (repo *JsonMetaRepo) updateFile(updateData updateDataFn) error {
114+
func updateFile(dataFile string, updateData updateDataFn) error {
111115
var rootObject *rootObjectData
112-
rootObject, readErr := ReadMetaRepoFile(repo.metaDataFile)
116+
rootObject, readErr := ReadMetaRepoFile(dataFile)
113117
if readErr != nil {
114-
return fmt.Errorf("failed to read file %s; %w", repo.metaDataFile, readErr)
118+
return fmt.Errorf("failed to read file %s; %w", dataFile, readErr)
115119
}
116120

117121
updateData(rootObject)
118-
if writeErr := rootObject.WriteTo(repo.metaDataFile); writeErr != nil {
119-
return fmt.Errorf("failed to write file %s; %w", repo.metaDataFile, writeErr)
122+
if writeErr := rootObject.WriteTo(dataFile); writeErr != nil {
123+
return fmt.Errorf("failed to write file %s; %w", dataFile, writeErr)
120124
} else {
121125
return nil
122126
}

src/go/svcfs/json_meta_repo_admin.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,19 @@ type JsonMetaRepoAdmin struct {
2121

2222
func (admin *JsonMetaRepoAdmin) Create(repositoryDir string) error {
2323
return initDirectory(
24+
localDataFile(repositoryDir),
2425
metaDataFile(repositoryDir),
2526
InitMetaRepoData(admin.version))
2627
}
2728

28-
func initDirectory(metaDataFile string, rootObject *rootObjectData) error {
29+
func initDirectory(localDataFile string, metaDataFile string, rootObject *rootObjectData) error {
2930
metaDataDir := path.Dir(metaDataFile)
3031
if dirErr := os.MkdirAll(metaDataDir, fs.ModePerm); dirErr != nil {
3132
return fmt.Errorf("failed to make directory %s; %w", metaDataDir, dirErr)
33+
} else if writeMetaDataErr := rootObject.WriteTo(metaDataFile); writeMetaDataErr != nil {
34+
return fmt.Errorf("failed to write shared meta data file %s; %w", metaDataFile, writeMetaDataErr)
3235
} else {
33-
return rootObject.WriteTo(metaDataFile)
36+
return rootObject.WriteTo(localDataFile)
3437
}
3538
}
3639

src/go/svcfs/paths.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,12 @@ func metaDataDir(metaRepoDir string) string {
77
return filepath.Join(metaRepoDir, ".marmot")
88
}
99

10-
// Path to the specific file where Marmot store its data.
10+
// Path to the specific file where Marmot stores machine-specific data.
11+
func localDataFile(metaRepoDir string) string {
12+
return filepath.Join(metaDataDir(metaRepoDir), "meta-repo-local.json")
13+
}
14+
15+
// Path to the specific file where Marmot stores shared data.
1116
func metaDataFile(metaRepoDir string) string {
1217
return filepath.Join(metaDataDir(metaRepoDir), "meta-repo.json")
1318
}

src/go/use/command_factory.go

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,39 @@ type CommandFactory interface {
2121
}
2222

2323
type cmdFactory struct {
24-
MetaDataAdmin coremetarepo.MetaDataAdmin
25-
RepositorySource corerepository.RepositorySource
24+
LocalRepositorySource corerepository.LocalRepositorySource
25+
MetaDataAdmin coremetarepo.MetaDataAdmin
26+
RemoteRepositorySource corerepository.RemoteRepositorySource
2627
}
2728

28-
func (factory *cmdFactory) WithMetaDataAdmin(metadataAdmin coremetarepo.MetaDataAdmin) *cmdFactory {
29-
factory.MetaDataAdmin = metadataAdmin
29+
func (factory *cmdFactory) WithLocalRepositorySource(source corerepository.LocalRepositorySource) *cmdFactory {
30+
factory.LocalRepositorySource = source
3031
return factory
3132
}
3233

33-
func (factory *cmdFactory) WithRepositorySource(repositorySource corerepository.RepositorySource) *cmdFactory {
34-
factory.RepositorySource = repositorySource
34+
func (factory *cmdFactory) WithMetaDataAdmin(admin coremetarepo.MetaDataAdmin) *cmdFactory {
35+
factory.MetaDataAdmin = admin
3536
return factory
3637
}
3738

38-
func (factory *cmdFactory) repositorySource() (corerepository.RepositorySource, error) {
39-
if factory.RepositorySource == nil {
40-
return nil, errors.New("missing RepositorySource")
39+
func (factory *cmdFactory) WithRemoteRepositorySource(source corerepository.RemoteRepositorySource) *cmdFactory {
40+
factory.RemoteRepositorySource = source
41+
return factory
42+
}
43+
44+
func (factory *cmdFactory) localRepositorySource() (corerepository.LocalRepositorySource, error) {
45+
if factory.LocalRepositorySource == nil {
46+
return nil, errors.New("missing LocalRepositorySource")
47+
} else {
48+
return factory.LocalRepositorySource, nil
49+
}
50+
}
51+
52+
func (factory *cmdFactory) remoteRepositorySource() (corerepository.RemoteRepositorySource, error) {
53+
if factory.RemoteRepositorySource == nil {
54+
return nil, errors.New("missing RemoteRepositorySource")
4155
} else {
42-
return factory.RepositorySource, nil
56+
return factory.RemoteRepositorySource, nil
4357
}
4458
}
4559

@@ -58,19 +72,19 @@ func (factory *cmdFactory) NewInitMetaRepo() (*metarepo.InitCommand, error) {
5872
func (factory *cmdFactory) NewRegisterLocalRepositories() (
5973
*repository.RegisterLocalRepositoriesCommand, error,
6074
) {
61-
if repositorySource, err := factory.repositorySource(); err != nil {
75+
if source, err := factory.localRepositorySource(); err != nil {
6276
return nil, err
6377
} else {
64-
return &repository.RegisterLocalRepositoriesCommand{Source: repositorySource}, nil
78+
return &repository.RegisterLocalRepositoriesCommand{Source: source}, nil
6579
}
6680
}
6781

6882
func (factory *cmdFactory) NewRegisterRemoteRepositories() (
6983
*repository.RegisterRemoteRepositoriesCommand, error,
7084
) {
71-
if repositorySource, err := factory.repositorySource(); err != nil {
85+
if source, err := factory.remoteRepositorySource(); err != nil {
7286
return nil, err
7387
} else {
74-
return &repository.RegisterRemoteRepositoriesCommand{Source: repositorySource}, nil
88+
return &repository.RegisterRemoteRepositoriesCommand{Source: source}, nil
7589
}
7690
}

src/go/use/query_factory.go

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,47 +14,61 @@ func NewQueryFactory() *queryFactory {
1414

1515
// Constructs application queries with configurable services.
1616
type QueryFactory interface {
17-
NewListLocalRepositories() (userepository.ListRemoteRepositoriesQuery, error)
17+
NewListLocalRepositories() (userepository.ListLocalRepositoriesQuery, error)
1818
NewListRemoteRepositories() (userepository.ListRemoteRepositoriesQuery, error)
1919
}
2020

2121
type queryFactory struct {
22-
MetaDataAdmin coremetarepo.MetaDataAdmin
23-
RepositorySource corerepository.RepositorySource
22+
LocalRepositorySource corerepository.LocalRepositorySource
23+
MetaDataAdmin coremetarepo.MetaDataAdmin
24+
RemoteRepositorySource corerepository.RemoteRepositorySource
25+
}
26+
27+
func (factory *queryFactory) WithLocalRepositorySource(source corerepository.LocalRepositorySource) *queryFactory {
28+
factory.LocalRepositorySource = source
29+
return factory
2430
}
2531

2632
func (factory *queryFactory) WithMetaDataAdmin(admin coremetarepo.MetaDataAdmin) *queryFactory {
2733
factory.MetaDataAdmin = admin
2834
return factory
2935
}
3036

31-
func (factory *queryFactory) WithRepositorySource(source corerepository.RepositorySource) *queryFactory {
32-
factory.RepositorySource = source
37+
func (factory *queryFactory) WithRemoteRepositorySource(source corerepository.RemoteRepositorySource) *queryFactory {
38+
factory.RemoteRepositorySource = source
3339
return factory
3440
}
3541

3642
/* Repositories */
3743

38-
func (factory *queryFactory) NewListLocalRepositories() (userepository.ListRemoteRepositoriesQuery, error) {
39-
if repositorySource, err := factory.repositorySource(); err != nil {
44+
func (factory *queryFactory) NewListLocalRepositories() (userepository.ListLocalRepositoriesQuery, error) {
45+
if repositorySource, err := factory.localRepositorySource(); err != nil {
4046
return nil, err
4147
} else {
4248
return repositorySource.ListLocal, nil
4349
}
4450
}
4551

4652
func (factory *queryFactory) NewListRemoteRepositories() (userepository.ListRemoteRepositoriesQuery, error) {
47-
if repositorySource, err := factory.repositorySource(); err != nil {
53+
if repositorySource, err := factory.remoteRepositorySource(); err != nil {
4854
return nil, err
4955
} else {
5056
return repositorySource.ListRemote, nil
5157
}
5258
}
5359

54-
func (factory *queryFactory) repositorySource() (corerepository.RepositorySource, error) {
55-
if factory.RepositorySource == nil {
56-
return nil, errors.New("missing RepositorySource")
60+
func (factory *queryFactory) localRepositorySource() (corerepository.LocalRepositorySource, error) {
61+
if factory.LocalRepositorySource == nil {
62+
return nil, errors.New("missing LocalRepositorySource")
63+
} else {
64+
return factory.LocalRepositorySource, nil
65+
}
66+
}
67+
68+
func (factory *queryFactory) remoteRepositorySource() (corerepository.RemoteRepositorySource, error) {
69+
if factory.RemoteRepositorySource == nil {
70+
return nil, errors.New("missing RemoteRepositorySource")
5771
} else {
58-
return factory.RepositorySource, nil
72+
return factory.RemoteRepositorySource, nil
5973
}
6074
}

src/go/userepository/register_local_repositories_command.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99

1010
// Registers Git repositories with the meta repo, based upon their paths on the local filesystem.
1111
type RegisterLocalRepositoriesCommand struct {
12-
Source core.RepositorySource
12+
Source core.LocalRepositorySource
1313
}
1414

1515
func (cmd *RegisterLocalRepositoriesCommand) Run(localPaths []string) error {

src/go/userepository/register_local_repositories_command_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ var _ = Describe("RegisterLocalRepositoriesCommand", func() {
3838
pathBuilder = expect.NoError(dirFixture.PathBuilder())
3939

4040
source = mock.NewRepositorySource()
41-
factory := use.NewCommandFactory().WithRepositorySource(source)
41+
factory := use.NewCommandFactory().WithLocalRepositorySource(source)
4242
subject = expect.NoError(factory.NewRegisterLocalRepositories())
4343
})
4444

0 commit comments

Comments
 (0)