diff --git a/README.md b/README.md index 4c85cf7..0820f01 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,7 @@ Contents: coursepath: # if you want to generate directly in coursepath, do not define semesterpath semesterpath: + useCoursenameAsPrefix: # if true, repos start with -, default false students: # needs only to defined if generating per student groups: # if students are allowed to work in groups @@ -118,12 +119,22 @@ Contents: groups: ``` +Naming behavior: + +- `useCoursenameAsPrefix: false` (default) + - student repo: `-` (example: `blatt1-max_mustermann_at_hm.edu`) + - group repo: `-` (example: `blatt1-grp01`) +- `useCoursenameAsPrefix: true` + - student repo: `--` (example: `algdati-blatt1-max_mustermann_at_hm.edu`) + - group repo: `--` (example: `algdati-blatt1-grp01`) + Example: ```.yaml algdati: coursepath: algdati semesterpath: semester/ob-20ws + useCoursenameAsPrefix: true students: - 12334 # GitLab ID - ob@glabs.io # email address diff --git a/config/assignment.go b/config/assignment.go index d3e32c0..53074e5 100644 --- a/config/assignment.go +++ b/config/assignment.go @@ -48,20 +48,21 @@ func GetAssignmentConfig(course, assignment string, onlyForStudentsOrGroups ...s } assignmentConfig := &AssignmentConfig{ - Course: course, - Name: assignment, - Path: path, - URL: url, - Per: per, - Description: description(assignmentKey), - ContainerRegistry: containerRegistry, - AccessLevel: accessLevel(assignmentKey), - Students: students(per, course, assignment, onlyForStudentsOrGroups...), - Groups: groups(per, course, assignment, onlyForStudentsOrGroups...), - Startercode: startercode(assignmentKey), - Clone: clone(assignmentKey), - Release: release, - Seeder: seeder(assignmentKey), + Course: course, + Name: assignment, + UseCoursenameAsPrefix: viper.GetBool(course + ".useCoursenameAsPrefix"), + Path: path, + URL: url, + Per: per, + Description: description(assignmentKey), + ContainerRegistry: containerRegistry, + AccessLevel: accessLevel(assignmentKey), + Students: students(per, course, assignment, onlyForStudentsOrGroups...), + Groups: groups(per, course, assignment, onlyForStudentsOrGroups...), + Startercode: startercode(assignmentKey), + Clone: clone(assignmentKey), + Release: release, + Seeder: seeder(assignmentKey), } return assignmentConfig @@ -83,6 +84,26 @@ func (cfg *AssignmentConfig) RepoSuffix(student *Student) string { return "" } +func (cfg *AssignmentConfig) RepoBaseName() string { + if cfg.UseCoursenameAsPrefix { + return fmt.Sprintf("%s-%s", cfg.Course, cfg.Name) + } + + return cfg.Name +} + +func (cfg *AssignmentConfig) RepoNameWithSuffix(suffix string) string { + return fmt.Sprintf("%s-%s", cfg.RepoBaseName(), suffix) +} + +func (cfg *AssignmentConfig) RepoNameForStudent(student *Student) string { + return cfg.RepoNameWithSuffix(cfg.RepoSuffix(student)) +} + +func (cfg *AssignmentConfig) RepoNameForGroup(group *Group) string { + return cfg.RepoNameWithSuffix(group.Name) +} + func assignmentPath(course, assignment string) string { path := viper.GetString(course + ".coursepath") if semesterpath := viper.GetString(course + ".semesterpath"); len(semesterpath) > 0 { diff --git a/config/show.go b/config/show.go index d74fb94..7bab78d 100644 --- a/config/show.go +++ b/config/show.go @@ -135,6 +135,7 @@ func (cfg *AssignmentConfig) Show() { fmt.Print(aurora.Sprintf(aurora.Cyan(` Course: %s Assignment: %s +Coursename-Prefix: %t Per: %s Base-URL: %s Description: %s @@ -148,6 +149,7 @@ Release: %s `), aurora.Yellow(cfg.Course), aurora.Yellow(cfg.Name), + aurora.Yellow(cfg.UseCoursenameAsPrefix), aurora.Yellow(cfg.Per), aurora.Yellow(cfg.URL), aurora.Yellow(cfg.Description), diff --git a/config/types.go b/config/types.go index 2745c85..8ee7862 100644 --- a/config/types.go +++ b/config/types.go @@ -10,20 +10,21 @@ type Student struct { } type AssignmentConfig struct { - Course string - Name string - Path string - URL string - Per Per - Description string - ContainerRegistry bool - AccessLevel AccessLevel - Students []*Student - Groups []*Group - Startercode *Startercode - Clone *Clone - Release *Release - Seeder *Seeder + Course string + Name string + UseCoursenameAsPrefix bool + Path string + URL string + Per Per + Description string + ContainerRegistry bool + AccessLevel AccessLevel + Students []*Student + Groups []*Group + Startercode *Startercode + Clone *Clone + Release *Release + Seeder *Seeder } type Per string diff --git a/config/urls.go b/config/urls.go index 0967085..2ade07d 100644 --- a/config/urls.go +++ b/config/urls.go @@ -7,11 +7,11 @@ func (cfg *AssignmentConfig) Urls(assignment bool) { fmt.Println(cfg.URL) } else if cfg.Per == PerStudent { for _, stud := range cfg.Students { - fmt.Printf("%s/%s-%s\n", cfg.URL, cfg.Name, cfg.RepoSuffix(stud)) + fmt.Printf("%s/%s\n", cfg.URL, cfg.RepoNameForStudent(stud)) } } else { // PerGroup for _, group := range cfg.Groups { - fmt.Printf("%s/%s-%s\n", cfg.URL, cfg.Name, group.Name) + fmt.Printf("%s/%s\n", cfg.URL, cfg.RepoNameForGroup(group)) } } } diff --git a/git/clone.go b/git/clone.go index edd4d89..002d566 100644 --- a/git/clone.go +++ b/git/clone.go @@ -38,11 +38,11 @@ func Clone(cfg *config.AssignmentConfig, noSpinner bool) { func cloneurl(cfg *config.AssignmentConfig, suffix string) string { return fmt.Sprintf("%s/%s-%s", strings.Replace(strings.Replace(cfg.URL, "https://", "git@", 1), "/", ":", 1), - cfg.Name, suffix) + cfg.RepoBaseName(), suffix) } func localpath(cfg *config.AssignmentConfig, suffix string) string { - return fmt.Sprintf("%s/%s-%s", cfg.Clone.LocalPath, cfg.Name, suffix) + return fmt.Sprintf("%s/%s", cfg.Clone.LocalPath, cfg.RepoNameWithSuffix(suffix)) } func clone(localpath, branch, cloneurl string, auth ssh.AuthMethod, force bool, noSpinner bool) { diff --git a/gitlab/archive.go b/gitlab/archive.go index b424e93..95ce6f2 100644 --- a/gitlab/archive.go +++ b/gitlab/archive.go @@ -37,8 +37,7 @@ func (c *Client) archivePerStudent(assignmentCfg *config.AssignmentConfig, unarc } for _, student := range assignmentCfg.Students { - name := assignmentCfg.Name + "-" + assignmentCfg.RepoSuffix(student) - projectname := fmt.Sprintf("%s/%s", assignmentCfg.Path, name) + projectname := fmt.Sprintf("%s/%s", assignmentCfg.Path, assignmentCfg.RepoNameForStudent(student)) project, _, err := c.Projects.GetProject( projectname, &gitlab.GetProjectOptions{}, @@ -60,7 +59,7 @@ func (c *Client) archivePerGroup(assignmentCfg *config.AssignmentConfig, unarchi } for _, grp := range assignmentCfg.Groups { - projectname := fmt.Sprintf("%s/%s-%s", assignmentCfg.Path, assignmentCfg.Name, grp.Name) + projectname := fmt.Sprintf("%s/%s", assignmentCfg.Path, assignmentCfg.RepoNameForGroup(grp)) project, _, err := c.Projects.GetProject( projectname, &gitlab.GetProjectOptions{}, diff --git a/gitlab/delete.go b/gitlab/delete.go index da0f0a3..933b43a 100644 --- a/gitlab/delete.go +++ b/gitlab/delete.go @@ -34,8 +34,7 @@ func (c *Client) deletePerStudent(assignmentCfg *config.AssignmentConfig, assign } for _, student := range assignmentCfg.Students { - name := assignmentCfg.Name + "-" + assignmentCfg.RepoSuffix(student) - c.delete(assignmentGroupID, name) + c.delete(assignmentGroupID, assignmentCfg.RepoNameForStudent(student)) } } @@ -46,7 +45,7 @@ func (c *Client) deletePerGroup(assignmentCfg *config.AssignmentConfig, assignme } for _, grp := range assignmentCfg.Groups { - c.delete(assignmentGroupID, assignmentCfg.Name+"-"+grp.Name) + c.delete(assignmentGroupID, assignmentCfg.RepoNameForGroup(grp)) } } diff --git a/gitlab/generate.go b/gitlab/generate.go index f7bc7c3..74157e5 100644 --- a/gitlab/generate.go +++ b/gitlab/generate.go @@ -219,7 +219,7 @@ func (c *Client) generatePerStudent(assignmentCfg *config.AssignmentConfig, assi } for _, student := range assignmentCfg.Students { - name := assignmentCfg.Name + "-" + assignmentCfg.RepoSuffix(student) + name := assignmentCfg.RepoNameForStudent(student) c.generate(assignmentCfg, assignmentGroupID, name, []*config.Student{student}, starterrepo) } } @@ -232,6 +232,6 @@ func (c *Client) generatePerGroup(assignmentCfg *config.AssignmentConfig, assign } for _, grp := range assignmentCfg.Groups { - c.generate(assignmentCfg, assignmentGroupID, assignmentCfg.Name+"-"+grp.Name, grp.Members, starterrepo) + c.generate(assignmentCfg, assignmentGroupID, assignmentCfg.RepoNameForGroup(grp), grp.Members, starterrepo) } } diff --git a/gitlab/protect.go b/gitlab/protect.go index 9022b6b..f217387 100644 --- a/gitlab/protect.go +++ b/gitlab/protect.go @@ -118,8 +118,7 @@ func (c *Client) protectToBranchPerStudent(assignmentCfg *config.AssignmentConfi } for _, student := range assignmentCfg.Students { - name := assignmentCfg.Name + "-" + assignmentCfg.RepoSuffix(student) - projectname := fmt.Sprintf("%s/%s", assignmentCfg.Path, name) + projectname := fmt.Sprintf("%s/%s", assignmentCfg.Path, assignmentCfg.RepoNameForStudent(student)) project, _, err := c.Projects.GetProject( projectname, &gitlab.GetProjectOptions{}, @@ -141,7 +140,7 @@ func (c *Client) protectToBranchPerGroup(assignmentCfg *config.AssignmentConfig) } for _, grp := range assignmentCfg.Groups { - projectname := fmt.Sprintf("%s/%s-%s", assignmentCfg.Path, assignmentCfg.Name, grp.Name) + projectname := fmt.Sprintf("%s/%s", assignmentCfg.Path, assignmentCfg.RepoNameForGroup(grp)) project, _, err := c.Projects.GetProject( projectname, &gitlab.GetProjectOptions{}, diff --git a/gitlab/setaccess.go b/gitlab/setaccess.go index 9d23334..a9bc191 100644 --- a/gitlab/setaccess.go +++ b/gitlab/setaccess.go @@ -160,8 +160,7 @@ func (c *Client) setaccessPerStudent(assignmentCfg *config.AssignmentConfig) { } for _, student := range assignmentCfg.Students { - name := assignmentCfg.Name + "-" + assignmentCfg.RepoSuffix(student) - projectname := fmt.Sprintf("%s/%s", assignmentCfg.Path, name) + projectname := fmt.Sprintf("%s/%s", assignmentCfg.Path, assignmentCfg.RepoNameForStudent(student)) project, _, err := c.Projects.GetProject( projectname, &gitlab.GetProjectOptions{}, @@ -181,7 +180,7 @@ func (c *Client) setaccessPerGroup(assignmentCfg *config.AssignmentConfig) { } for _, grp := range assignmentCfg.Groups { - projectname := fmt.Sprintf("%s/%s-%s", assignmentCfg.Path, assignmentCfg.Name, grp.Name) + projectname := fmt.Sprintf("%s/%s", assignmentCfg.Path, assignmentCfg.RepoNameForGroup(grp)) project, _, err := c.Projects.GetProject( projectname, &gitlab.GetProjectOptions{}, diff --git a/gitlab/update.go b/gitlab/update.go index cd35702..c6beec2 100644 --- a/gitlab/update.go +++ b/gitlab/update.go @@ -96,8 +96,7 @@ func (c *Client) updatePerStudent(assignmentCfg *config.AssignmentConfig, starte } for _, student := range assignmentCfg.Students { - name := assignmentCfg.Name + "-" + assignmentCfg.RepoSuffix(student) - projectname := fmt.Sprintf("%s/%s", assignmentCfg.Path, name) + projectname := fmt.Sprintf("%s/%s", assignmentCfg.Path, assignmentCfg.RepoNameForStudent(student)) project, _, err := c.Projects.GetProject( projectname, &gitlab.GetProjectOptions{}, @@ -117,7 +116,7 @@ func (c *Client) updatePerGroup(assignmentCfg *config.AssignmentConfig, starterr } for _, grp := range assignmentCfg.Groups { - projectname := fmt.Sprintf("%s/%s-%s", assignmentCfg.Path, assignmentCfg.Name, grp.Name) + projectname := fmt.Sprintf("%s/%s", assignmentCfg.Path, assignmentCfg.RepoNameForGroup(grp)) project, _, err := c.Projects.GetProject( projectname, &gitlab.GetProjectOptions{},