forked from go-gitea/gitea
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Variable expansion in repository templates (go-gitea#9163)
* Start expansion Signed-off-by: jolheiser <john.olheiser@gmail.com> * _template rather than .template Signed-off-by: jolheiser <john.olheiser@gmail.com> * Use ioutil Signed-off-by: jolheiser <john.olheiser@gmail.com> * Add descriptions to mapping * Start globbing Signed-off-by: jolheiser <john.olheiser@gmail.com> * Tune globbing Signed-off-by: jolheiser <john.olheiser@gmail.com> * Re-arrange imports Signed-off-by: jolheiser <john.olheiser@gmail.com> * Don't expand git hooks Signed-off-by: jolheiser <john.olheiser@gmail.com> * Add glob tests for .giteatemplate Signed-off-by: jolheiser <john.olheiser@gmail.com> * Parse globs separately so they can be tested more easily Signed-off-by: jolheiser <john.olheiser@gmail.com> * Change template location and add docs Signed-off-by: jolheiser <john.olheiser@gmail.com> * nit Signed-off-by: jolheiser <john.olheiser@gmail.com> * Update docs/content/doc/features/gitea-directory.md Co-Authored-By: guillep2k <18600385+guillep2k@users.noreply.github.com> * Update docs/content/doc/features/gitea-directory.md Co-Authored-By: guillep2k <18600385+guillep2k@users.noreply.github.com> * Add upper-lower case match Signed-off-by: jolheiser <john.olheiser@gmail.com> * Nits Signed-off-by: jolheiser <john.olheiser@gmail.com> * Update models/repo_generate.go Co-Authored-By: guillep2k <18600385+guillep2k@users.noreply.github.com>
- Loading branch information
1 parent
c9d50bc
commit 15a5c10
Showing
5 changed files
with
298 additions
and
51 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
--- | ||
date: "2019-11-28:00:00+02:00" | ||
title: "The .gitea Directory" | ||
slug: "gitea-directory" | ||
weight: 40 | ||
toc: true | ||
draft: false | ||
menu: | ||
sidebar: | ||
parent: "features" | ||
name: "The .gitea Directory" | ||
weight: 50 | ||
identifier: "gitea-directory" | ||
--- | ||
|
||
# The .gitea directory | ||
Gitea repositories can include a `.gitea` directory at their base which will store settings/configurations for certain features. | ||
|
||
## Templates | ||
Gitea includes template repositories, and one feature implemented with them is auto-expansion of specific variables within your template files. | ||
To tell Gitea which files to expand, you must include a `template` file inside the `.gitea` directory of the template repository. | ||
Gitea uses [gobwas/glob](https://github.com/gobwas/glob) for its glob syntax. It closely resembles a traditional `.gitignore`, however there may be slight differences. | ||
|
||
### Example `.gitea/template` file | ||
All paths are relative to the base of the repository | ||
```gitignore | ||
# All .go files, anywhere in the repository | ||
**.go | ||
# All text files in the text directory | ||
text/*.txt | ||
# A specific file | ||
a/b/c/d.json | ||
# Batch files in both upper or lower case can be matched | ||
**.[bB][aA][tT] | ||
``` | ||
**NOTE:** The `template` file will be removed from the `.gitea` directory when a repository is generated from the template. | ||
|
||
### Variable Expansion | ||
In any file matched by the above globs, certain variables will be expanded. | ||
All variables must be of the form `$VAR` or `${VAR}`. To escape an expansion, use a double `$$`, such as `$$VAR` or `$${VAR}` | ||
|
||
| Variable | Expands To | | ||
|----------------------|-----------------------------------------------------| | ||
| REPO_NAME | The name of the generated repository | | ||
| TEMPLATE_NAME | The name of the template repository | | ||
| REPO_DESCRIPTION | The description of the generated repository | | ||
| TEMPLATE_DESCRIPTION | The description of the template repository | | ||
| REPO_LINK | The URL to the generated repository | | ||
| TEMPLATE_LINK | The URL to the template repository | | ||
| REPO_HTTPS_URL | The HTTP(S) clone link for the generated repository | | ||
| TEMPLATE_HTTPS_URL | The HTTP(S) clone link for the template repository | | ||
| REPO_SSH_URL | The SSH clone link for the generated repository | | ||
| TEMPLATE_SSH_URL | The SSH clone link for the template repository | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
// Copyright 2019 The Gitea Authors. All rights reserved. | ||
// Use of this source code is governed by a MIT-style | ||
// license that can be found in the LICENSE file. | ||
|
||
package models | ||
|
||
import ( | ||
"testing" | ||
|
||
"github.com/stretchr/testify/assert" | ||
) | ||
|
||
var giteaTemplate = []byte(` | ||
# Header | ||
# All .go files | ||
**.go | ||
# All text files in /text/ | ||
text/*.txt | ||
# All files in modules folders | ||
**/modules/* | ||
`) | ||
|
||
func TestGiteaTemplate(t *testing.T) { | ||
gt := GiteaTemplate{Content: giteaTemplate} | ||
assert.Equal(t, len(gt.Globs()), 3) | ||
|
||
tt := []struct { | ||
Path string | ||
Match bool | ||
}{ | ||
{Path: "main.go", Match: true}, | ||
{Path: "a/b/c/d/e.go", Match: true}, | ||
{Path: "main.txt", Match: false}, | ||
{Path: "a/b.txt", Match: false}, | ||
{Path: "text/a.txt", Match: true}, | ||
{Path: "text/b.txt", Match: true}, | ||
{Path: "text/c.json", Match: false}, | ||
{Path: "a/b/c/modules/README.md", Match: true}, | ||
{Path: "a/b/c/modules/d/README.md", Match: false}, | ||
} | ||
|
||
for _, tc := range tt { | ||
t.Run(tc.Path, func(t *testing.T) { | ||
match := false | ||
for _, g := range gt.Globs() { | ||
if g.Match(tc.Path) { | ||
match = true | ||
break | ||
} | ||
} | ||
assert.Equal(t, tc.Match, match) | ||
}) | ||
} | ||
} |
Oops, something went wrong.