hide archived project by default

prefix archived project name with a "." by default
so they appear hidden on the filesystem.
At the same time, added the configuration gitlab.archived_project_handling
to set how archived projects are handled
This commit is contained in:
Massaki Archambault 2024-07-18 00:25:13 -04:00
parent 6d0d3fdfc0
commit 2d0a62dc45
7 changed files with 90 additions and 42 deletions

View File

@ -27,6 +27,13 @@ gitlab:
# A list of the user ids to expose their personal projects in the filesystem. # A list of the user ids to expose their personal projects in the filesystem.
user_ids: [] user_ids: []
# Set how archived projects are handled.
# If set to "show", it will add them to the filesystem and treat them like any other repository
# If set to "hide", it will add them to the filesystem, but prefix the symlink with a "."
# If set to "ignore", it will make them absent from the filesystem
# Default to "hide"
archived_project_handling: hide
# If set to true, the user the api token belongs to will automatically be added to the list of users exposed by the filesystem. # If set to true, the user the api token belongs to will automatically be added to the list of users exposed by the filesystem.
include_current_user: true include_current_user: true

View File

@ -36,12 +36,13 @@ func LoadConfig(configPath string) (*Config, error) {
MountOptions: "nodev,nosuid", MountOptions: "nodev,nosuid",
}, },
Gitlab: gitlab.GitlabClientConfig{ Gitlab: gitlab.GitlabClientConfig{
URL: "https://gitlab.com", URL: "https://gitlab.com",
Token: "", Token: "",
PullMethod: "http", PullMethod: "http",
GroupIDs: []int{9970}, GroupIDs: []int{9970},
UserIDs: []int{}, UserIDs: []int{},
IncludeCurrentUser: true, ArchivedProjectHandling: "hide",
IncludeCurrentUser: true,
}, },
Git: git.GitClientParam{ Git: git.GitClientParam{
CloneLocation: defaultCloneLocation, CloneLocation: defaultCloneLocation,
@ -85,5 +86,10 @@ func MakeGitlabConfig(config *Config) (*gitlab.GitlabClientConfig, error) {
return nil, fmt.Errorf("pull_method must be either \"%v\" or \"%v\"", gitlab.PullMethodHTTP, gitlab.PullMethodSSH) return nil, fmt.Errorf("pull_method must be either \"%v\" or \"%v\"", gitlab.PullMethodHTTP, gitlab.PullMethodSSH)
} }
// parse archive_handing
if config.Gitlab.ArchivedProjectHandling != gitlab.ArchivedProjectShow && config.Gitlab.ArchivedProjectHandling != gitlab.ArchivedProjectHide && config.Gitlab.ArchivedProjectHandling != gitlab.ArchivedProjectIgnore {
return nil, fmt.Errorf("pull_method must be either \"%v\", \"%v\" or \"%v\"", gitlab.ArchivedProjectShow, gitlab.ArchivedProjectHide, gitlab.ArchivedProjectIgnore)
}
return &config.Gitlab, nil return &config.Gitlab, nil
} }

View File

@ -22,12 +22,13 @@ func TestLoadConfig(t *testing.T) {
MountOptions: "nodev", MountOptions: "nodev",
}, },
Gitlab: gitlab.GitlabClientConfig{ Gitlab: gitlab.GitlabClientConfig{
URL: "https://example.com", URL: "https://example.com",
Token: "12345", Token: "12345",
PullMethod: "ssh", PullMethod: "ssh",
GroupIDs: []int{123}, GroupIDs: []int{123},
UserIDs: []int{456}, UserIDs: []int{456},
IncludeCurrentUser: true, ArchivedProjectHandling: "hide",
IncludeCurrentUser: true,
}, },
Git: git.GitClientParam{ Git: git.GitClientParam{
CloneLocation: "/tmp/gitlabfs/test/clone", CloneLocation: "/tmp/gitlabfs/test/clone",
@ -118,32 +119,49 @@ func TestMakeGitlabConfig(t *testing.T) {
"ValidConfig": { "ValidConfig": {
input: &config.Config{ input: &config.Config{
Gitlab: gitlab.GitlabClientConfig{ Gitlab: gitlab.GitlabClientConfig{
URL: "https://gitlab.com", URL: "https://gitlab.com",
Token: "", PullMethod: "http",
GroupIDs: []int{9970}, Token: "",
UserIDs: []int{}, GroupIDs: []int{9970},
IncludeCurrentUser: true, UserIDs: []int{},
PullMethod: "http", ArchivedProjectHandling: "hide",
IncludeCurrentUser: true,
}, },
}, },
expected: &gitlab.GitlabClientConfig{ expected: &gitlab.GitlabClientConfig{
URL: "https://gitlab.com", URL: "https://gitlab.com",
Token: "", PullMethod: "http",
GroupIDs: []int{9970}, Token: "",
UserIDs: []int{}, GroupIDs: []int{9970},
IncludeCurrentUser: true, UserIDs: []int{},
PullMethod: "http", ArchivedProjectHandling: "hide",
IncludeCurrentUser: true,
}, },
}, },
"InvalidPullMethod": { "InvalidPullMethod": {
input: &config.Config{ input: &config.Config{
Gitlab: gitlab.GitlabClientConfig{ Gitlab: gitlab.GitlabClientConfig{
URL: "https://gitlab.com", URL: "https://gitlab.com",
Token: "", PullMethod: "invalid",
GroupIDs: []int{9970}, Token: "",
UserIDs: []int{}, GroupIDs: []int{9970},
IncludeCurrentUser: true, UserIDs: []int{},
PullMethod: "invalid", ArchivedProjectHandling: "hide",
IncludeCurrentUser: true,
},
},
expected: nil,
},
"InvalidArchiveHandling": {
input: &config.Config{
Gitlab: gitlab.GitlabClientConfig{
URL: "https://gitlab.com",
PullMethod: "http",
Token: "",
GroupIDs: []int{9970},
UserIDs: []int{},
IncludeCurrentUser: true,
ArchivedProjectHandling: "invalid",
}, },
}, },
expected: nil, expected: nil,

View File

@ -13,15 +13,20 @@ import (
const ( const (
PullMethodHTTP = "http" PullMethodHTTP = "http"
PullMethodSSH = "ssh" PullMethodSSH = "ssh"
ArchivedProjectShow = "show"
ArchivedProjectHide = "hide"
ArchivedProjectIgnore = "ignore"
) )
type GitlabClientConfig struct { type GitlabClientConfig struct {
URL string `yaml:"url,omitempty"` URL string `yaml:"url,omitempty"`
Token string `yaml:"token,omitempty"` Token string `yaml:"token,omitempty"`
GroupIDs []int `yaml:"group_ids,omitempty"` GroupIDs []int `yaml:"group_ids,omitempty"`
UserIDs []int `yaml:"user_ids,omitempty"` UserIDs []int `yaml:"user_ids,omitempty"`
IncludeCurrentUser bool `yaml:"include_current_user,omitempty"` ArchivedProjectHandling string `yaml:"archived_project_handling,omitempty"`
PullMethod string `yaml:"pull_method,omitempty"` IncludeCurrentUser bool `yaml:"include_current_user,omitempty"`
PullMethod string `yaml:"pull_method,omitempty"`
} }
type gitlabClient struct { type gitlabClient struct {

View File

@ -163,7 +163,9 @@ func (c *gitlabClient) fetchGroupContent(group *Group) (map[string]fstree.GroupS
} }
for _, gitlabProject := range gitlabProjects { for _, gitlabProject := range gitlabProjects {
project := c.newProjectFromGitlabProject(gitlabProject) project := c.newProjectFromGitlabProject(gitlabProject)
childProjects[project.Name] = &project if project != nil {
childProjects[project.Path] = project
}
} }
if response.CurrentPage >= response.TotalPages { if response.CurrentPage >= response.TotalPages {
break break

View File

@ -1,12 +1,14 @@
package gitlab package gitlab
import ( import (
"path"
"github.com/xanzy/go-gitlab" "github.com/xanzy/go-gitlab"
) )
type Project struct { type Project struct {
ID int ID int
Name string Path string
CloneURL string CloneURL string
DefaultBranch string DefaultBranch string
} }
@ -23,11 +25,14 @@ func (p *Project) GetDefaultBranch() string {
return p.DefaultBranch return p.DefaultBranch
} }
func (c *gitlabClient) newProjectFromGitlabProject(project *gitlab.Project) Project { func (c *gitlabClient) newProjectFromGitlabProject(project *gitlab.Project) *Project {
// https://godoc.org/github.com/xanzy/go-gitlab#Project // https://godoc.org/github.com/xanzy/go-gitlab#Project
if c.ArchivedProjectHandling == ArchivedProjectIgnore && project.Archived {
return nil
}
p := Project{ p := Project{
ID: project.ID, ID: project.ID,
Name: project.Path, Path: project.Path,
DefaultBranch: project.DefaultBranch, DefaultBranch: project.DefaultBranch,
} }
if p.DefaultBranch == "" { if p.DefaultBranch == "" {
@ -38,5 +43,8 @@ func (c *gitlabClient) newProjectFromGitlabProject(project *gitlab.Project) Proj
} else { } else {
p.CloneURL = project.HTTPURLToRepo p.CloneURL = project.HTTPURLToRepo
} }
return p if c.ArchivedProjectHandling == ArchivedProjectHide && project.Archived {
p.Path = path.Join(path.Dir(p.Path), "."+path.Base(p.Path))
}
return &p
} }

View File

@ -105,7 +105,9 @@ func (c *gitlabClient) fetchUserContent(user *User) (map[string]fstree.GroupSour
} }
for _, gitlabProject := range gitlabProjects { for _, gitlabProject := range gitlabProjects {
project := c.newProjectFromGitlabProject(gitlabProject) project := c.newProjectFromGitlabProject(gitlabProject)
childProjects[project.Name] = &project if project != nil {
childProjects[project.Path] = project
}
} }
if response.CurrentPage >= response.TotalPages { if response.CurrentPage >= response.TotalPages {
break break