699699--- @return string llm_msg
700700function GitTool .generate_release_notes (from_tag , to_tag , format )
701701 format = format or " markdown"
702-
702+
703703 -- Get all tags sorted by version
704704 local success , tags_output = pcall (vim .fn .system , " git tag --sort=-version:refname" )
705705 if not success or vim .v .shell_error ~= 0 then
@@ -708,26 +708,26 @@ function GitTool.generate_release_notes(from_tag, to_tag, format)
708708 local llm_msg = " <gitReleaseNotes>fail: " .. msg .. " </gitReleaseNotes>"
709709 return false , msg , user_msg , llm_msg
710710 end
711-
711+
712712 local tags = {}
713713 for tag in tags_output :gmatch (" [^\r\n ]+" ) do
714714 if tag ~= " " then
715715 table.insert (tags , tag )
716716 end
717717 end
718-
718+
719719 if # tags < 1 then
720720 local msg = " No tags found in repository"
721721 local user_msg = msg
722722 local llm_msg = " <gitReleaseNotes>fail: " .. msg .. " </gitReleaseNotes>"
723723 return false , msg , user_msg , llm_msg
724724 end
725-
725+
726726 -- Determine tag range
727727 if not to_tag then
728728 to_tag = tags [1 ] -- Latest tag
729729 end
730-
730+
731731 if not from_tag then
732732 if # tags < 2 then
733733 local msg = " Cannot generate release notes: only one tag found. Please specify from_tag parameter."
@@ -737,19 +737,24 @@ function GitTool.generate_release_notes(from_tag, to_tag, format)
737737 end
738738 from_tag = tags [2 ] -- Second latest tag
739739 end
740-
740+
741741 -- Get commit range between tags
742742 local range = from_tag .. " .." .. to_tag
743743 local commit_cmd = " git log --pretty=format:'%h|%s|%an|%ad' --date=short " .. range
744744 local success_commits , commits_output = pcall (vim .fn .system , commit_cmd )
745-
745+
746746 if not success_commits or vim .v .shell_error ~= 0 then
747- local msg = " Failed to get commits between " .. from_tag .. " and " .. to_tag .. " : " .. (commits_output or " unknown error" )
747+ local msg = " Failed to get commits between "
748+ .. from_tag
749+ .. " and "
750+ .. to_tag
751+ .. " : "
752+ .. (commits_output or " unknown error" )
748753 local user_msg = msg
749754 local llm_msg = " <gitReleaseNotes>fail: " .. msg .. " </gitReleaseNotes>"
750755 return false , msg , user_msg , llm_msg
751756 end
752-
757+
753758 -- Parse commits
754759 local commits = {}
755760 for line in commits_output :gmatch (" [^\r\n ]+" ) do
@@ -759,32 +764,32 @@ function GitTool.generate_release_notes(from_tag, to_tag, format)
759764 hash = hash ,
760765 subject = subject ,
761766 author = author ,
762- date = date
767+ date = date ,
763768 })
764769 end
765770 end
766-
771+
767772 if # commits == 0 then
768773 local msg = " No commits found between " .. from_tag .. " and " .. to_tag
769774 local user_msg = msg
770775 local llm_msg = " <gitReleaseNotes>success: " .. msg .. " </gitReleaseNotes>"
771776 return true , msg , user_msg , llm_msg
772777 end
773-
778+
774779 -- Generate release notes based on format
775780 local release_notes = " "
776781 local user_msg = " "
777782 local llm_msg = " "
778-
783+
779784 if format == " markdown" then
780785 release_notes = " # Release Notes: " .. from_tag .. " → " .. to_tag .. " \n\n "
781786 release_notes = release_notes .. " ## Changes (" .. # commits .. " commits)\n\n "
782-
787+
783788 -- Group commits by type (conventional commits)
784789 local features = {}
785790 local fixes = {}
786791 local others = {}
787-
792+
788793 for _ , commit in ipairs (commits ) do
789794 local type_match = commit .subject :match (" ^(%w+):" )
790795 if type_match then
@@ -799,7 +804,7 @@ function GitTool.generate_release_notes(from_tag, to_tag, format)
799804 table.insert (others , commit )
800805 end
801806 end
802-
807+
803808 -- Add features
804809 if # features > 0 then
805810 release_notes = release_notes .. " ### ✨ New Features\n\n "
@@ -808,7 +813,7 @@ function GitTool.generate_release_notes(from_tag, to_tag, format)
808813 end
809814 release_notes = release_notes .. " \n "
810815 end
811-
816+
812817 -- Add fixes
813818 if # fixes > 0 then
814819 release_notes = release_notes .. " ### 🐛 Bug Fixes\n\n "
@@ -817,7 +822,7 @@ function GitTool.generate_release_notes(from_tag, to_tag, format)
817822 end
818823 release_notes = release_notes .. " \n "
819824 end
820-
825+
821826 -- Add other changes
822827 if # others > 0 then
823828 release_notes = release_notes .. " ### 📝 Other Changes\n\n "
@@ -826,7 +831,7 @@ function GitTool.generate_release_notes(from_tag, to_tag, format)
826831 end
827832 release_notes = release_notes .. " \n "
828833 end
829-
834+
830835 -- Add contributors
831836 local contributors = {}
832837 for _ , commit in ipairs (commits ) do
@@ -835,7 +840,7 @@ function GitTool.generate_release_notes(from_tag, to_tag, format)
835840 end
836841 contributors [commit .author ] = contributors [commit .author ] + 1
837842 end
838-
843+
839844 release_notes = release_notes .. " ### 👥 Contributors\n\n "
840845 local sorted_authors = {}
841846 for author in pairs (contributors ) do
@@ -850,34 +855,30 @@ function GitTool.generate_release_notes(from_tag, to_tag, format)
850855 for _ , author in ipairs (sorted_authors ) do
851856 release_notes = release_notes .. " - " .. author .. " (" .. contributors [author ] .. " commits)\n "
852857 end
853- end
854-
855858 elseif format == " plain" then
856859 release_notes = " Release Notes: " .. from_tag .. " → " .. to_tag .. " \n "
857860 release_notes = release_notes .. " Changes (" .. # commits .. " commits):\n\n "
858861 for _ , commit in ipairs (commits ) do
859862 release_notes = release_notes .. " - " .. commit .subject .. " (" .. commit .hash .. " by " .. commit .author .. " )\n "
860863 end
861-
862864 elseif format == " json" then
863865 local json_data = {
864866 from_tag = from_tag ,
865867 to_tag = to_tag ,
866868 total_commits = # commits ,
867- commits = commits
869+ commits = commits ,
868870 }
869871 release_notes = vim .fn .json_encode (json_data )
870-
871872 else
872873 local msg = " Unsupported format: " .. format .. " . Supported formats: markdown, plain, json"
873874 local user_msg = msg
874875 local llm_msg = " <gitReleaseNotes>fail: " .. msg .. " </gitReleaseNotes>"
875876 return false , msg , user_msg , llm_msg
876877 end
877-
878+
878879 user_msg = " Generated release notes for " .. from_tag .. " → " .. to_tag .. " (" .. # commits .. " commits)"
879880 llm_msg = " <gitReleaseNotes>success: " .. user_msg .. " \n\n " .. release_notes .. " </gitReleaseNotes>"
880-
881+
881882 return true , release_notes , user_msg , llm_msg
882883end
883884
0 commit comments