diff --git a/cmd/urls.go b/cmd/urls.go index 7d89f58..ca533ca 100644 --- a/cmd/urls.go +++ b/cmd/urls.go @@ -11,14 +11,25 @@ var ( Short: "get urls for repositories", Long: `get urls for repositories for each student or group in course for assignment. You can specify students or groups in order to get an url only for these.`, - Args: cobra.MinimumNArgs(2), //nolint:gomnd + Args: cobra.MinimumNArgs(1), //nolint:gomnd Run: func(cmd *cobra.Command, args []string) { - assignmentConfig := config.GetAssignmentConfig(args[0], args[1], args[2:]...) - assignmentConfig.Urls(len(args) == 2) + if len(args) == 1 { + config.GetCourseURL(args[0]) + } else { + assignmentConfig := config.GetAssignmentConfig(args[0], args[1], args[2:]...) + if startercode { + assignmentConfig.StartercodeURL() + } else { + assignmentConfig.Urls(len(args) == 2) + } + } }, } + startercode bool ) func init() { rootCmd.AddCommand(urlsCmd) + urlsCmd.Flags().BoolVarP(&startercode, "startercode", "s", false, "print url of startercode") + } diff --git a/config/assignment.go b/config/assignment.go index 7612c3e..8eb62fc 100644 --- a/config/assignment.go +++ b/config/assignment.go @@ -9,6 +9,10 @@ import ( "github.com/spf13/viper" ) +func GetCourseURL(course string) { + fmt.Printf("%s/%s\n", viper.GetString("gitlab.host"), coursePath(course)) +} + func GetAssignmentConfig(course, assignment string, onlyForStudentsOrGroups ...string) *AssignmentConfig { if !viper.IsSet(course) { log.Fatal(). @@ -147,12 +151,18 @@ func (cfg *AssignmentConfig) RepoNameForGroup(group *Group) string { return cfg.RepoNameWithSuffix(group.Name) } -func assignmentPath(course, assignment string) string { +func coursePath(course string) string { path := viper.GetString(course + ".coursepath") if semesterpath := viper.GetString(course + ".semesterpath"); len(semesterpath) > 0 { path += "/" + semesterpath } + return path +} + +func assignmentPath(course, assignment string) string { + path := coursePath(course) + assignmentpath := path if group := viper.GetString(course + "." + assignment + ".assignmentpath"); len(group) > 0 { assignmentpath += "/" + group diff --git a/config/urls.go b/config/urls.go index 2ade07d..dd95482 100644 --- a/config/urls.go +++ b/config/urls.go @@ -1,6 +1,48 @@ package config -import "fmt" +import ( + "fmt" + "strings" +) + +func (cfg *AssignmentConfig) StartercodeURL() { + url, err := cfg.gitURLToWebURL(cfg.Startercode.URL) + if err != nil { + fmt.Printf("error: %s\n", err) + return + } + fmt.Println(url) +} + +func (cfg *AssignmentConfig) gitURLToWebURL(raw string) (string, error) { + raw = strings.TrimSpace(raw) + + if raw == "" { + return "", fmt.Errorf("leere URL") + } + + // Bereits Web-URL -> direkt zurückgeben + if strings.HasPrefix(raw, "https://") || strings.HasPrefix(raw, "http://") { + return raw, nil + } + + // Git SSH Form: git@host:path.git + if strings.HasPrefix(raw, "git@") { + rest := strings.TrimPrefix(raw, "git@") + i := strings.Index(rest, ":") + if i < 0 { + return "", fmt.Errorf("ungültige SSH-URL: %q", raw) + } + + host := rest[:i] + path := rest[i+1:] + path = strings.TrimSuffix(path, ".git") + + return "https://" + host + "/" + path, nil + } + + return "", fmt.Errorf("nicht unterstütztes URL-Format: %q", raw) +} func (cfg *AssignmentConfig) Urls(assignment bool) { if assignment {