mirror of
https://github.com/Slug-Boi/cocommit.git
synced 2026-05-13 12:45:47 +00:00
Merge branch 'main' into feat_config
This commit is contained in:
+5
-7
@@ -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
@@ -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
|
||||||
|
}
|
||||||
@@ -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};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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
|
|
||||||
|
|||||||
@@ -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")
|
||||||
|
}
|
||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
+56
-6
@@ -31,8 +31,8 @@ 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 {
|
||||||
@@ -49,12 +49,12 @@ for _, committer := range authors {
|
|||||||
} 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
|
||||||
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user