]> source.dussan.org Git - gitea.git/commitdiff
enhancement: add signoff option in commit form (#14516)
authora1012112796 <1012112796@qq.com>
Fri, 29 Jan 2021 08:57:45 +0000 (16:57 +0800)
committerGitHub <noreply@github.com>
Fri, 29 Jan 2021 08:57:45 +0000 (16:57 +0800)
Signed-off-by: a1012112796 <1012112796@qq.com>
modules/forms/repo_form.go
modules/repofiles/delete.go
modules/repofiles/temp_repo.go
modules/repofiles/update.go
modules/repofiles/upload.go
modules/structs/repo_file.go
options/locale/locale_en-US.ini
routers/api/v1/repo/file.go
routers/repo/editor.go
templates/repo/editor/commit_form.tmpl
templates/swagger/v1_json.tmpl

index 4a478c7d35fa44ee5908bb54e00d29811168f82c..4d37ab072b15ed45cedcfc92da557a5a67d39e67 100644 (file)
@@ -698,6 +698,7 @@ type EditRepoFileForm struct {
        CommitChoice  string `binding:"Required;MaxSize(50)"`
        NewBranchName string `binding:"GitRefName;MaxSize(100)"`
        LastCommit    string
+       Signoff       bool
 }
 
 // Validate validates the fields
@@ -733,6 +734,7 @@ type UploadRepoFileForm struct {
        CommitChoice  string `binding:"Required;MaxSize(50)"`
        NewBranchName string `binding:"GitRefName;MaxSize(100)"`
        Files         []string
+       Signoff       bool
 }
 
 // Validate validates the fields
@@ -766,6 +768,7 @@ type DeleteRepoFileForm struct {
        CommitChoice  string `binding:"Required;MaxSize(50)"`
        NewBranchName string `binding:"GitRefName;MaxSize(100)"`
        LastCommit    string
+       Signoff       bool
 }
 
 // Validate validates the fields
index 8343776c4716cbb3403f16ae4558ded7cfa69a10..2b8ddf3cc266fdbcc394215363a2f1de2a2fc176 100644 (file)
@@ -25,6 +25,7 @@ type DeleteRepoFileOptions struct {
        Author       *IdentityOptions
        Committer    *IdentityOptions
        Dates        *CommitDateOptions
+       Signoff      bool
 }
 
 // DeleteRepoFile deletes a file in the given repository
@@ -199,9 +200,9 @@ func DeleteRepoFile(repo *models.Repository, doer *models.User, opts *DeleteRepo
        // Now commit the tree
        var commitHash string
        if opts.Dates != nil {
-               commitHash, err = t.CommitTreeWithDate(author, committer, treeHash, message, opts.Dates.Author, opts.Dates.Committer)
+               commitHash, err = t.CommitTreeWithDate(author, committer, treeHash, message, opts.Signoff, opts.Dates.Author, opts.Dates.Committer)
        } else {
-               commitHash, err = t.CommitTree(author, committer, treeHash, message)
+               commitHash, err = t.CommitTree(author, committer, treeHash, message, opts.Signoff)
        }
        if err != nil {
                return nil, err
index a02bba65e9ce2b5f9b13555807dfd358a2cb6dce..99c62a16c6af0294553603853ef6c02356e20368 100644 (file)
@@ -185,12 +185,12 @@ func (t *TemporaryUploadRepository) GetLastCommitByRef(ref string) (string, erro
 }
 
 // CommitTree creates a commit from a given tree for the user with provided message
-func (t *TemporaryUploadRepository) CommitTree(author, committer *models.User, treeHash string, message string) (string, error) {
-       return t.CommitTreeWithDate(author, committer, treeHash, message, time.Now(), time.Now())
+func (t *TemporaryUploadRepository) CommitTree(author, committer *models.User, treeHash string, message string, signoff bool) (string, error) {
+       return t.CommitTreeWithDate(author, committer, treeHash, message, signoff, time.Now(), time.Now())
 }
 
 // CommitTreeWithDate creates a commit from a given tree for the user with provided message
-func (t *TemporaryUploadRepository) CommitTreeWithDate(author, committer *models.User, treeHash string, message string, authorDate, committerDate time.Time) (string, error) {
+func (t *TemporaryUploadRepository) CommitTreeWithDate(author, committer *models.User, treeHash string, message string, signoff bool, authorDate, committerDate time.Time) (string, error) {
        authorSig := author.NewGitSig()
        committerSig := committer.NewGitSig()
 
@@ -236,6 +236,13 @@ func (t *TemporaryUploadRepository) CommitTreeWithDate(author, committer *models
                }
        }
 
+       if signoff {
+               // Signed-off-by
+               _, _ = messageBytes.WriteString("\n")
+               _, _ = messageBytes.WriteString("Signed-off-by: ")
+               _, _ = messageBytes.WriteString(committerSig.String())
+       }
+
        env = append(env,
                "GIT_COMMITTER_NAME="+committerSig.Name,
                "GIT_COMMITTER_EMAIL="+committerSig.Email,
index a1a9c624d7ff7d2ecb507dfc535aa4e4097e2ff6..0ee1ada34c1ca02da16b2ace8bbf3625784582b7 100644 (file)
@@ -51,6 +51,7 @@ type UpdateRepoFileOptions struct {
        Author       *IdentityOptions
        Committer    *IdentityOptions
        Dates        *CommitDateOptions
+       Signoff      bool
 }
 
 func detectEncodingAndBOM(entry *git.TreeEntry, repo *models.Repository) (string, bool) {
@@ -417,9 +418,9 @@ func CreateOrUpdateRepoFile(repo *models.Repository, doer *models.User, opts *Up
        // Now commit the tree
        var commitHash string
        if opts.Dates != nil {
-               commitHash, err = t.CommitTreeWithDate(author, committer, treeHash, message, opts.Dates.Author, opts.Dates.Committer)
+               commitHash, err = t.CommitTreeWithDate(author, committer, treeHash, message, opts.Signoff, opts.Dates.Author, opts.Dates.Committer)
        } else {
-               commitHash, err = t.CommitTree(author, committer, treeHash, message)
+               commitHash, err = t.CommitTree(author, committer, treeHash, message, opts.Signoff)
        }
        if err != nil {
                return nil, err
index e3ec48ec0f9e77b6d1b09e1aad1ee26ca79521ca..c261e188c123f93f7fdaa54db127bec37ede1385 100644 (file)
@@ -24,6 +24,7 @@ type UploadRepoFileOptions struct {
        TreePath     string
        Message      string
        Files        []string // In UUID format.
+       Signoff      bool
 }
 
 type uploadInfo struct {
@@ -143,7 +144,7 @@ func UploadRepoFiles(repo *models.Repository, doer *models.User, opts *UploadRep
        committer := doer
 
        // Now commit the tree
-       commitHash, err := t.CommitTree(author, committer, treeHash, opts.Message)
+       commitHash, err := t.CommitTree(author, committer, treeHash, opts.Message, opts.Signoff)
        if err != nil {
                return err
        }
index c34923e389dfcaf7b16a4758afadb17424715f0e..71733c90e704518f78ac201004fc9c8afcbab21a 100644 (file)
@@ -17,6 +17,8 @@ type FileOptions struct {
        Author    Identity          `json:"author"`
        Committer Identity          `json:"committer"`
        Dates     CommitDateOptions `json:"dates"`
+       // Add a Signed-off-by trailer by the committer at the end of the commit log message.
+       Signoff bool `json:"signoff"`
 }
 
 // CreateFileOptions options for creating files
index 362b09e2913419f11ea593a5e3c592d5efc85a4e..a7dae87cd892b5f809eac6a973ae120f11dad251 100644 (file)
@@ -874,6 +874,7 @@ editor.add = Add '%s'
 editor.update = Update '%s'
 editor.delete = Delete '%s'
 editor.commit_message_desc = Add an optional extended description…
+editor.signoff_desc = Add a Signed-off-by trailer by the committer at the end of the commit log message.
 editor.commit_directly_to_this_branch = Commit directly to the <strong class="branch-name">%s</strong> branch.
 editor.create_new_branch = Create a <strong>new branch</strong> for this commit and start a pull request.
 editor.create_new_branch_np = Create a <strong>new branch</strong> for this commit.
index 044d0fe565556fae61d4f049eebed92df0000525..2bd57f1460fe338d92248b5b57d5bbb6eb8c0940 100644 (file)
@@ -235,6 +235,7 @@ func CreateFile(ctx *context.APIContext) {
                        Author:    apiOpts.Dates.Author,
                        Committer: apiOpts.Dates.Committer,
                },
+               Signoff: apiOpts.Signoff,
        }
        if opts.Dates.Author.IsZero() {
                opts.Dates.Author = time.Now()
@@ -323,6 +324,7 @@ func UpdateFile(ctx *context.APIContext) {
                        Author:    apiOpts.Dates.Author,
                        Committer: apiOpts.Dates.Committer,
                },
+               Signoff: apiOpts.Signoff,
        }
        if opts.Dates.Author.IsZero() {
                opts.Dates.Author = time.Now()
@@ -449,6 +451,7 @@ func DeleteFile(ctx *context.APIContext) {
                        Author:    apiOpts.Dates.Author,
                        Committer: apiOpts.Dates.Committer,
                },
+               Signoff: apiOpts.Signoff,
        }
        if opts.Dates.Author.IsZero() {
                opts.Dates.Author = time.Now()
index 619912fef75b1e28e6c1f6116eacd2766f2a5d0b..344174828e255fd28727019e8868f584a043e050 100644 (file)
@@ -240,6 +240,7 @@ func editFilePost(ctx *context.Context, form auth.EditRepoFileForm, isNewFile bo
                Message:      message,
                Content:      strings.ReplaceAll(form.Content, "\r", ""),
                IsNewFile:    isNewFile,
+               Signoff:      form.Signoff,
        }); err != nil {
                // This is where we handle all the errors thrown by repofiles.CreateOrUpdateRepoFile
                if git.IsErrNotExist(err) {
@@ -442,6 +443,7 @@ func DeleteFilePost(ctx *context.Context) {
                NewBranch:    branchName,
                TreePath:     ctx.Repo.TreePath,
                Message:      message,
+               Signoff:      form.Signoff,
        }); err != nil {
                // This is where we handle all the errors thrown by repofiles.DeleteRepoFile
                if git.IsErrNotExist(err) || models.IsErrRepoFileDoesNotExist(err) {
@@ -650,6 +652,7 @@ func UploadFilePost(ctx *context.Context) {
                TreePath:     form.TreePath,
                Message:      message,
                Files:        form.Files,
+               Signoff:      form.Signoff,
        }); err != nil {
                if models.IsErrLFSFileLocked(err) {
                        ctx.Data["Err_TreePath"] = true
index 494a2113eebc0bcd138c42fdbb4eaebdb1e6da0c..cd417b427fbf3ea9f5130240679c7f876a9bcf38 100644 (file)
                <div class="field">
                        <textarea name="commit_message" placeholder="{{.i18n.Tr "repo.editor.commit_message_desc"}}" rows="5">{{.commit_message}}</textarea>
                </div>
+               <div class="inline field">
+                       <div class="ui checkbox">
+                               <input name="signoff" type="checkbox" tabindex="0" class="hidden">
+                               <label>{{.i18n.Tr "repo.editor.signoff_desc"}}</label>
+                       </div>
+               </div>
                <div class="quick-pull-choice js-quick-pull-choice">
                        <div class="field">
                                <div class="ui radio checkbox {{if not .CanCommitToBranch.CanCommitToBranch}}disabled{{end}}">
index 86f09e2bbb87715fbebe0bb78b0418a797cf230c..8c2b5948eadf67fab455030beeeed0aa314c4070 100644 (file)
           "description": "new_branch (optional) will make a new branch from `branch` before creating the file",
           "type": "string",
           "x-go-name": "NewBranchName"
+        },
+        "signoff": {
+          "description": "Add a Signed-off-by trailer by the committer at the end of the commit log message.",
+          "type": "boolean",
+          "x-go-name": "Signoff"
         }
       },
       "x-go-package": "code.gitea.io/gitea/modules/structs"
           "description": "sha is the SHA for the file that already exists",
           "type": "string",
           "x-go-name": "SHA"
+        },
+        "signoff": {
+          "description": "Add a Signed-off-by trailer by the committer at the end of the commit log message.",
+          "type": "boolean",
+          "x-go-name": "Signoff"
         }
       },
       "x-go-package": "code.gitea.io/gitea/modules/structs"
           "description": "sha is the SHA for the file that already exists",
           "type": "string",
           "x-go-name": "SHA"
+        },
+        "signoff": {
+          "description": "Add a Signed-off-by trailer by the committer at the end of the commit log message.",
+          "type": "boolean",
+          "x-go-name": "Signoff"
         }
       },
       "x-go-package": "code.gitea.io/gitea/modules/structs"