diff --git a/.attach_pid1994321 b/.attach_pid1994321 new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/.idea/go.imports.xml b/.idea/go.imports.xml new file mode 100644 index 0000000000000000000000000000000000000000..73135801851111686d379b615ac4a0d3a77c8da2 --- /dev/null +++ b/.idea/go.imports.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="GoImports"> + <option name="addUnambiguousImportsOnTheFly" value="false" /> + <option name="optimizeImportsOnTheFly" value="false" /> + </component> +</project> \ No newline at end of file diff --git a/.idea/libraries/fs.xml b/.idea/libraries/fs.xml new file mode 100644 index 0000000000000000000000000000000000000000..8b6d565e46c6323b2871bf88c06c0a867df3197a --- /dev/null +++ b/.idea/libraries/fs.xml @@ -0,0 +1,9 @@ +<component name="libraryTable"> + <library name="fs"> + <CLASSES> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/html/template/testdata/fs.zip!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES /> + </library> +</component> \ No newline at end of file diff --git a/.idea/libraries/testdata.xml b/.idea/libraries/testdata.xml new file mode 100644 index 0000000000000000000000000000000000000000..f02ec5752f230990f382929706be4d01d5740ebe --- /dev/null +++ b/.idea/libraries/testdata.xml @@ -0,0 +1,36 @@ +<component name="libraryTable"> + <library name="testdata"> + <CLASSES> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/symlink.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/test-prefix.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/utf8-7zip.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/zip64-2.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/winxp.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/time-22738.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/dupdir.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/utf8-infozip.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/time-win7.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/test-trailing-junk.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/time-osx.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/time-winrar.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/utf8-winrar.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/time-winzip.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/test-baddirsz.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/time-7zip.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/subdir.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/test.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/dd.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/utf8-winzip.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/crc32-not-streamed.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/readme.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/unix.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/utf8-osx.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/time-infozip.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/go-with-datadesc-sig.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/zip64.zip!/" /> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/src/archive/zip/testdata/time-go.zip!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES /> + </library> +</component> \ No newline at end of file diff --git a/.idea/libraries/zoneinfo.xml b/.idea/libraries/zoneinfo.xml new file mode 100644 index 0000000000000000000000000000000000000000..4d0d4c00e4b0718983f67870b84481ab5e7c1b49 --- /dev/null +++ b/.idea/libraries/zoneinfo.xml @@ -0,0 +1,9 @@ +<component name="libraryTable"> + <library name="zoneinfo"> + <CLASSES> + <root url="jar://$PROJECT_DIR$/.devenv/profile/share/go/lib/time/zoneinfo.zip!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES /> + </library> +</component> \ No newline at end of file diff --git a/.idea/markdown.xml b/.idea/markdown.xml new file mode 100644 index 0000000000000000000000000000000000000000..091f9820df8f2a4f86396c8263e916abdd75b44b --- /dev/null +++ b/.idea/markdown.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="MarkdownSettings"> + <enabledExtensions> + <entry key="MermaidLanguageExtension" value="false" /> + <entry key="PlantUMLLanguageExtension" value="true" /> + </enabledExtensions> + <option name="fontFamily" value="JetBrains Mono" /> + <option name="fontSize" value="15" /> + </component> +</project> \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index bb7ece6409c90b758e2afd1ddd99a2dc8cef315e..0ff8b3edb3bfce0eb481faf9ba746d50eee454b8 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,6 +3,9 @@ <component name="ComposerSettings"> <execution /> </component> + <component name="ProjectRootManager"> + <output url="file://$PROJECT_DIR$/out" /> + </component> <component name="accountSettings"> <option name="activeProfile" value="profile:default" /> <option name="activeRegion" value="eu-west-1" /> diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000000000000000000000000000000000000..19725177850d877f15c675f54f70f511dcb8f4d1 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectModuleManager"> + <modules> + <module fileurl="file://$PROJECT_DIR$/.idea/version.iml" filepath="$PROJECT_DIR$/.idea/version.iml" /> + </modules> + </component> +</project> \ No newline at end of file diff --git a/.idea/runConfigurations/version_auto___git.xml b/.idea/runConfigurations/version_auto___git.xml new file mode 100644 index 0000000000000000000000000000000000000000..45d55633786e4faee54a87323fe632077a34249a --- /dev/null +++ b/.idea/runConfigurations/version_auto___git.xml @@ -0,0 +1,16 @@ +<component name="ProjectRunConfigurationManager"> + <configuration default="false" name="version auto --git" type="GoApplicationRunConfiguration" factoryName="Go Application"> + <module name="version" /> + <working_directory value="$PROJECT_DIR$" /> + <parameters value="auto --git" /> + <EXTENSION ID="com.fapiko.jetbrains.plugins.better_direnv.runconfigs.GolandRunConfigurationExtension"> + <option name="DIRENV_ENABLED" value="false" /> + <option name="DIRENV_TRUSTED" value="false" /> + </EXTENSION> + <kind value="PACKAGE" /> + <package value="gitlab.schukai.com/oss/utilities/version" /> + <directory value="$PROJECT_DIR$" /> + <filePath value="$PROJECT_DIR$/main.go" /> + <method v="2" /> + </configuration> +</component> \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000000000000000000000000000000000..35eb1ddfbbc029bcab630581847471d7f238ec53 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="VcsDirectoryMappings"> + <mapping directory="" vcs="Git" /> + </component> +</project> \ No newline at end of file diff --git a/.idea/version.iml b/.idea/version.iml new file mode 100644 index 0000000000000000000000000000000000000000..25ed3f6e7b6e344b6ca91ebcc5d005f35357f9cf --- /dev/null +++ b/.idea/version.iml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module type="JAVA_MODULE" version="4"> + <component name="Go" enabled="true" /> + <component name="NewModuleRootManager" inherit-compiler-output="true"> + <exclude-output /> + <content url="file://$MODULE_DIR$" /> + <orderEntry type="inheritedJdk" /> + <orderEntry type="sourceFolder" forTests="false" /> + </component> +</module> \ No newline at end of file diff --git a/commandline.go b/commandline.go index 4232934c695840ba32e814cf1a51048c6f9c5640..364a74d58e0133391ab57ee1944fd6c4bc76d124 100644 --- a/commandline.go +++ b/commandline.go @@ -30,6 +30,8 @@ type commandLineOptions struct { } `command:"date" description:"print the current date and time in the format YYYYMMDDHHMMSS"` Auto struct { } `command:"auto" description:"check the git repository and increase the version if necessary. Implies --git"` + Print struct { + } `command:"print" description:"print the current version, you can combine this with --git to print the last tag"` } func increasePatch() (string, error) { @@ -104,6 +106,17 @@ func executeCommand() { } switch command { + case "print": + if arguments.Git { + version, err := getLatestSemanticTag(".") + if err != nil { + fmt.Println(err) + os.Exit(-1) + } + + fmt.Printf("%s", version) + os.Exit(0) + } case "date": currentTime := time.Now() build = currentTime.Format("20060102150405") diff --git a/git.go b/git.go index 50308f4241abb1e1485b576d2a8d7bacd09efee6..40488bed369d55b0876a470fee22d1bcc5eafe2f 100644 --- a/git.go +++ b/git.go @@ -4,6 +4,10 @@ import ( "fmt" "strings" + "regexp" + "sort" + "strconv" + "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing" "github.com/go-git/go-git/v5/plumbing/object" @@ -38,6 +42,67 @@ func GetCommitType(path string) (CommitType, error) { return commitType, nil } +func getLatestSemanticTag(path string) (string, error) { + + r, err := git.PlainOpen(path) + if err != nil { + return "", fmt.Errorf("failed to open repository: %v", err) + } + + tags, err := r.Tags() + if err != nil { + return "", fmt.Errorf("failed to get tags: %v", err) + } + + var tagList []string + err = tags.ForEach(func(tag *plumbing.Reference) error { + tagName := tag.Name().Short() + if isSemanticVersion(tagName) { + tagList = append(tagList, tagName) + } + return nil + }) + + if err != nil { + return "", fmt.Errorf("failed to iterate over tags: %v", err) + } + + if len(tagList) == 0 { + return "", fmt.Errorf("no semantic tags found") + } + + sort.Slice(tagList, func(i, j int) bool { + return compareSemanticVersions(tagList[i], tagList[j]) + }) + + return tagList[len(tagList)-1], nil +} + +func isSemanticVersion(tagName string) bool { + versionRegex := regexp.MustCompile(`^v?\d+\.\d+\.\d+.*$`) + return versionRegex.MatchString(tagName) +} + +func compareSemanticVersions(a, b string) bool { + // Remove leading "v" if present + a = strings.TrimPrefix(a, "v") + b = strings.TrimPrefix(b, "v") + + aParts := strings.Split(a, ".") + bParts := strings.Split(b, ".") + + for i := 0; i < len(aParts) && i < len(bParts); i++ { + aNum, _ := strconv.Atoi(aParts[i]) + bNum, _ := strconv.Atoi(bParts[i]) + + if aNum != bNum { + return aNum < bNum + } + } + + return len(aParts) < len(bParts) +} + func getLatestTagCommit(r *git.Repository) (*object.Commit, error) { tags, err := r.Tags() if err != nil {