Merge branch 'main' into feat_config

This commit is contained in:
Theis
2025-06-03 20:03:17 +02:00
committed by GitHub
8 changed files with 313 additions and 45 deletions
+5 -7
View File
@@ -1,8 +1,6 @@
{lib, buildGoModule, fetchFromGitHub }: { lib, buildGoModule, fetchFromGitHub }:
buildGoModule rec { buildGoModule rec {
pname = "cocommit"; pname = "cocommit";
version = "1.3.0"; version = "1.3.0";
@@ -10,20 +8,20 @@ buildGoModule rec {
owner = "Slug-Boi"; owner = "Slug-Boi";
repo = pname; repo = pname;
rev = "v${version}"; rev = "v${version}";
sha256 = "sha256-oraadDCyek8qnXFZPj2yitXL3KPK+uW1/VZphrEa/MU="; sha256 = "sha256-mSu9IW14y4vgvV3/N4EG9oMvB5eTfcneF03kMmHMXIU=";
}; };
vendorHash = null; vendorHash = "sha256-GcRGae42KiqMhxc2Q7Ct+uJ4Wg2odUEwWyXffamOjWY=";
buildPhase = '' buildPhase = ''
make build-nix make build
''; '';
doCheck = false; doCheck = false;
installPhase = '' installPhase = ''
mkdir -p $out/bin mkdir -p $out/bin
cp "src_code/go_src/${pname}" "$out/bin/${pname}" cp "src/${pname}" "$out/bin/${pname}"
chmod +x $out/bin/${pname} chmod +x $out/bin/${pname}
''; '';
Generated
+61
View File
@@ -0,0 +1,61 @@
{
"nodes": {
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1745377448,
"narHash": "sha256-jhZDfXVKdD7TSEGgzFJQvEEZ2K65UMiqW5YJ2aIqxMA=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "507b63021ada5fee621b6ca371c4fca9ca46f52c",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
}
},
"root": "root",
"version": 7
}
+12 -14
View File
@@ -2,31 +2,29 @@
inputs = { inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
flake-utils.url = "github:numtide/flake-utils"; flake-utils.url = "github:numtide/flake-utils";
prog_src = {
flake = false;
url = "github:Slug-Boi/cocommit";
rev = "v1.3.0";
};
}; };
outputs = { self, nixpkgs, flake-utils, ... }@inputs: let outputs = { self, nixpkgs, flake-utils, ... }@inputs: let
forAllSys = flake-utils.lib.eachSystem flake-utils.lib.allSystems; forAllSys = flake-utils.lib.eachSystem flake-utils.lib.allSystems;
APPNAME = "cocommit"; APPNAME = "cocommit";
appOverlay = final: prev: { appOverlay = final: prev: {
# any pkgs overrides made here will be ${APPNAME} = final.callPackage ./default.nix {
# inherited in the arguments of default.nix # Pass inputs as an argument to your package
# because we used final.callPackage instead of prev.callPackage inherit (prev) lib fetchFromGitHub buildGoModule;
# i.e. # Or if you need all inputs:
# nodejs = prev.nodejs.overrideAttrs { name = "stinky"; }; # inherit inputs;
# would make it so that final.callPackage gives the altered nodejs };
${APPNAME} = final.callPackage ./. { inherit (inputs) prog_src; };
}; };
in { in {
overlays.default = appOverlay; overlays.default = appOverlay;
} // ( } // (
forAllSys (system: let forAllSys (system: let
pkgs = import nixpkgs { inherit system; overlays = [ appOverlay ]; }; pkgs = import nixpkgs {
in{ inherit system;
overlays = [ appOverlay ];
};
in {
packages = { packages = {
default = pkgs.${APPNAME}; default = pkgs.${APPNAME};
}; };
-3
View File
@@ -1,5 +1,2 @@
build: build:
go build -C src -o cocommit go build -C src -o cocommit
build-nix:
GOWORK=off go build -C src -o cocommit
+75
View File
@@ -0,0 +1,75 @@
/*
Copyright © 2025 NAME HERE <EMAIL ADDRESS>
*/
package cmd
import (
"os"
"strings"
"github.com/Slug-Boi/cocommit/src/cmd/tui"
"github.com/Slug-Boi/cocommit/src/cmd/utils"
"github.com/spf13/cobra"
)
// amendCmd represents the amend command
var amendCmd = &cobra.Command{
Use: "amend",
Short: "Amend a commit message",
Long: `Ammend an existing commit message and add co-authors to it.
If ran without any arguments, it will open the TUI to select co-authors.
If ran with arguments, it will add the co-authors to the commit message.`,
Run: func(cmd *cobra.Command, args []string) {
// check if the print flag is set
pflag, _ := cmd.Flags().GetBool("print-output")
tflag, _ := cmd.Flags().GetBool("test_print")
git_flags, _ := cmd.Flags().GetString("git-flags")
edit, _ := cmd.Flags().GetBool("edit")
hash, _ := cmd.Flags().GetString("hash")
if hash != "" {
println("Hash based commit amendment is not yet implemented please use rebase option manually in git and then use this command to add co-authors.")
hash = ""
return
}
if edit {
}
var authors string
if len(args) == 0 {
// open the TUI to select co-authors
list_authors := tui.Entry()
if list_authors == nil {
println("No authors selected, exiting.")
os.Exit(1)
}
authors = utils.Commit("", list_authors)
} else {
authors = utils.Commit("", args)
}
git_flags_split := []string{}
if git_flags != "" {
git_flags_split = strings.Split(git_flags, " ")
}
err, _ := utils.GitCommitAppender(authors, hash, git_flags_split, tflag, pflag)
if err != nil {
println("Error amending commit:", err.Error())
os.Exit(1)
}
},
}
func init() {
rootCmd.AddCommand(amendCmd)
amendCmd.Flags().StringP("git-flags", "g", "", "Git flags to add to the commit command")
amendCmd.Flags().BoolP("print-output", "p", false, "Print the commit message to stdout")
amendCmd.Flags().BoolP("test_print", "t", false, "Print the commit message to stdout without amending")
amendCmd.Flags().BoolP("edit", "e", false, "Edit the commit message in the editor")
amendCmd.Flags().StringP("hash", "s", "", "Hash of the commit to amend")
}
+7
View File
@@ -488,6 +488,13 @@ func Entry() []string {
} }
for i := range selected { for i := range selected {
short := dupProtect[i] short := dupProtect[i]
if short == "" {
split := strings.Split(i, " - ")
name := split[0]
email := split[1]
utils.TempAddUser(name, email)
short = name
}
if negation { if negation {
short = "^" + short short = "^" + short
} }
+70 -20
View File
@@ -31,30 +31,30 @@ func Commit(message string, authors []string) string {
return sb.String() return sb.String()
} }
// Loop that adds users // Loop that adds users
for _, committer := range authors { for _, committer := range authors {
if _, ok := Users[committer]; ok { if _, ok := Users[committer]; ok {
sb_author(committer, &sb) sb_author(committer, &sb)
} else if match := reg.MatchString(committer); match { } else if match := reg.MatchString(committer); match {
str := strings.Split(committer, ":") str := strings.Split(committer, ":")
sb.WriteString("\nCo-authored-by: ") sb.WriteString("\nCo-authored-by: ")
sb.WriteString(str[0]) sb.WriteString(str[0])
sb.WriteString(" <") sb.WriteString(" <")
sb.WriteString(str[1]) sb.WriteString(str[1])
sb.WriteRune('>') sb.WriteRune('>')
} else if committer[0] == '^' { // Negations } else if committer[0] == '^' { // Negations
excludeMode = append(excludeMode, Users[committer[1:]].Username) excludeMode = append(excludeMode, Users[committer[1:]].Username)
} else { } else {
println(committer, " was unknown. User either not defined or name typed wrong") println(committer, " was unknown. User either not defined or name typed wrong")
}
} }
}
// Add excluded users after processing all authors // Add excluded users after processing all authors
if len(excludeMode) > 0 { if len(excludeMode) > 0 {
add_x_users(excludeMode, &sb) add_x_users(excludeMode, &sb)
} }
return sb.String() return sb.String()
} }
@@ -128,3 +128,53 @@ func group_selection(group []User, excludeMode []string) []string {
return excludeMode return excludeMode
} }
func GitCommitAppender(authors string, hash string, flags []string, t,p bool) (error, string) {
// Get old commit message
var cmd *exec.Cmd
//TODO: Make the hash ammend work with rebase but its more complicated than orignally thought.
// git log --format=%B -n1
if hash == "" {
cmd = exec.Command("git", "log", "--format=%B", "-n1")
} else {
cmd = exec.Command("git", "log", "--format=%B", "-n1", hash)
}
out, err := cmd.Output()
if err != nil {
return fmt.Errorf("error: %s", err), ""
}
// Convert the output to a string
old_commit := string(out)
// commit shell command
// specify git command1
input := []string{"commit"}
input = append(input, flags...)
old_commit = strings.TrimSpace(old_commit)
input = append(input, "--amend", "-m", old_commit+"\n"+authors)
if p {
println(old_commit + "\n" + authors)
if t {
return nil, old_commit + "\n" + authors
}
}
// append the message to the flags
// concat the git command and the flags + message
cmd = exec.Command("git", input...)
// https://stackoverflow.com/questions/18159704/how-to-debug-exit-status-1-error-when-running-exec-command-in-golang
cmd_output, err := cmd.CombinedOutput()
if err != nil {
return fmt.Errorf("error: %s : %s", err, string(cmd_output)), ""
} else {
println(string(cmd_output))
}
return nil, old_commit + "\n" + authors
}
+82
View File
@@ -636,6 +636,88 @@ func Test_GitPush(t *testing.T) {
} }
} }
func Test_CommitAppender(t *testing.T) {
setup()
defer teardown()
utils.Define_users("author_file_test")
// Test CommitAppender with a single author
authors := []string{"te"}
cmd := exec.Command("git", "log", "--format=%B", "-n1")
out, err := cmd.Output()
if err != nil {
t.Fatalf("Failed to get git log: %v", err)
}
message := strings.TrimSpace(string(out))
commit := utils.Commit("", authors)
err, appendedMessage := utils.GitCommitAppender(commit, "", nil, true, true)
if err != nil {
t.Errorf("GitCommitAppender() returned error: %v", err)
}
expectedMessage := message+"\n\n\nCo-authored-by: TestUser <test@test.test>"
if appendedMessage != expectedMessage {
t.Errorf("CommitAppender() = %v;\nwant:\n%v", appendedMessage, expectedMessage)
}
// check inverted commit
authors = []string{"^te"}
commit = utils.Commit("", authors)
err, appendedMessage = utils.GitCommitAppender(commit, "", nil, true, true)
if err != nil {
t.Errorf("GitCommitAppender() returned error: %v", err)
}
expectedMessage = message+"\n\n\nCo-authored-by: UserName2 <testing@user.io>"
if appendedMessage != expectedMessage {
t.Errorf("CommitAppender() = %v;\nwant:\n%v", appendedMessage, expectedMessage)
}
// Test CommitAppender with multiple authors
authors = []string{"te", "testtest"}
commit = utils.Commit("", authors)
err, appendedMessage = utils.GitCommitAppender(commit, "", nil, true, true)
if err != nil {
t.Errorf("GitCommitAppender() returned error: %v", err)
}
expectedMessage = message+"\n\n\nCo-authored-by: TestUser <test@test.test>\nCo-authored-by: UserName2 <testing@user.io>"
if appendedMessage != expectedMessage {
t.Errorf("CommitAppender() = %v;\nwant:\n%v", appendedMessage, expectedMessage)
}
// Test CommitAppender with all authors
authors = []string{"all"}
commit = utils.Commit("", authors)
err, appendedMessage = utils.GitCommitAppender(commit, "", nil, true, true)
if err != nil {
t.Errorf("GitCommitAppender() returned error: %v", err)
}
expectedMessage = message+"\n\n\nCo-authored-by: TestUser <test@test.test>\nCo-authored-by: UserName2 <testing@user.io>"
expectedMessage2 := message+"\n\n\nCo-authored-by: UserName2 <testing@user.io>\nCo-authored-by: TestUser <test@test.test>"
if appendedMessage != expectedMessage && appendedMessage != expectedMessage2 {
t.Errorf("CommitAppender() = %v;\nwant:\n%v", appendedMessage, expectedMessage)
}
// Test CommitAppender with group authors
authors = []string{"gr1"}
commit = utils.Commit("", authors)
err, appendedMessage = utils.GitCommitAppender(commit, "", nil, true, true)
if err != nil {
t.Errorf("GitCommitAppender() returned error: %v", err)
}
expectedMessage = message+"\n\n\nCo-authored-by: UserName2 <testing@user.io>"
if appendedMessage != expectedMessage {
t.Errorf("CommitAppender() = %v;\nwant:\n%v", appendedMessage, expectedMessage)
}
message = ""
}
// Commit tests END // Commit tests END
// Github tests BEGIN // Github tests BEGIN