Skip to content

Commit 48c4bbd

Browse files
authored
Merge branch 'master' into fix-go-gitea#6946-pass-in-pr-into-hooks
2 parents 4feeb65 + 1e8a616 commit 48c4bbd

24 files changed

+242
-58
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ css:
395395
npx postcss --use autoprefixer --no-map --replace public/css/*
396396

397397
@diff=$$(git diff public/css/*); \
398-
if ([ ! -z "$CI" ] && [ -n "$$diff" ]); then \
398+
if ([ -n "$$CI" ] && [ -n "$$diff" ]); then \
399399
echo "Generated files in public/css have changed, please commit the result:"; \
400400
echo "$${diff}"; \
401401
exit 1; \

models/action.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ var (
6767
const issueRefRegexpStr = `(?:([0-9a-zA-Z-_\.]+)/([0-9a-zA-Z-_\.]+))?(#[0-9]+)+`
6868

6969
func assembleKeywordsPattern(words []string) string {
70-
return fmt.Sprintf(`(?i)(?:%s) %s`, strings.Join(words, "|"), issueRefRegexpStr)
70+
return fmt.Sprintf(`(?i)(?:%s)(?::?) %s`, strings.Join(words, "|"), issueRefRegexpStr)
7171
}
7272

7373
func init() {

models/action_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ func Test_getIssueFromRef(t *testing.T) {
166166
{"reopen #2", 2},
167167
{"user2/repo2#1", 4},
168168
{"fixes user2/repo2#1", 4},
169+
{"fixes: user2/repo2#1", 4},
169170
} {
170171
issue, err := getIssueFromRef(repo, test.Ref)
171172
assert.NoError(t, err)
@@ -260,6 +261,31 @@ func TestUpdateIssuesCommit(t *testing.T) {
260261
CheckConsistencyFor(t, &Action{})
261262
}
262263

264+
func TestUpdateIssuesCommit_Colon(t *testing.T) {
265+
assert.NoError(t, PrepareTestDatabase())
266+
pushCommits := []*PushCommit{
267+
{
268+
Sha1: "abcdef2",
269+
CommitterEmail: "[email protected]",
270+
CommitterName: "User Two",
271+
AuthorEmail: "[email protected]",
272+
AuthorName: "User Two",
273+
Message: "close: #2",
274+
},
275+
}
276+
277+
user := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
278+
repo := AssertExistsAndLoadBean(t, &Repository{ID: 1}).(*Repository)
279+
repo.Owner = user
280+
281+
issueBean := &Issue{RepoID: repo.ID, Index: 2}
282+
283+
AssertNotExistsBean(t, &Issue{RepoID: repo.ID, Index: 2}, "is_closed=1")
284+
assert.NoError(t, UpdateIssuesCommit(user, repo, pushCommits, repo.DefaultBranch))
285+
AssertExistsAndLoadBean(t, issueBean, "is_closed=1")
286+
CheckConsistencyFor(t, &Action{})
287+
}
288+
263289
func TestUpdateIssuesCommit_Issue5957(t *testing.T) {
264290
assert.NoError(t, PrepareTestDatabase())
265291
user := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)

models/admin.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func RemoveAllWithNotice(title, path string) {
6363
func removeAllWithNotice(e Engine, title, path string) {
6464
if err := os.RemoveAll(path); err != nil {
6565
desc := fmt.Sprintf("%s [%s]: %v", title, path, err)
66-
log.Warn(desc)
66+
log.Warn(title+" [%s]: %v", path, err)
6767
if err = createNotice(e, NoticeRepository, desc); err != nil {
6868
log.Error("CreateRepositoryNotice: %v", err)
6969
}

models/issue_label.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,10 @@ type Label struct {
7676
// APIFormat converts a Label to the api.Label format
7777
func (label *Label) APIFormat() *api.Label {
7878
return &api.Label{
79-
ID: label.ID,
80-
Name: label.Name,
81-
Color: strings.TrimLeft(label.Color, "#"),
79+
ID: label.ID,
80+
Name: label.Name,
81+
Color: strings.TrimLeft(label.Color, "#"),
82+
Description: label.Description,
8283
}
8384
}
8485

models/pull.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -863,7 +863,17 @@ func (pr *PullRequest) testPatch(e Engine) (err error) {
863863
line := scanner.Text()
864864

865865
if strings.HasPrefix(line, prefix) {
866-
pr.ConflictedFiles = append(pr.ConflictedFiles, strings.TrimSpace(strings.Split(line[len(prefix):], ":")[0]))
866+
var found bool
867+
var filepath = strings.TrimSpace(strings.Split(line[len(prefix):], ":")[0])
868+
for _, f := range pr.ConflictedFiles {
869+
if f == filepath {
870+
found = true
871+
break
872+
}
873+
}
874+
if !found {
875+
pr.ConflictedFiles = append(pr.ConflictedFiles, filepath)
876+
}
867877
}
868878
// only list 10 conflicted files
869879
if len(pr.ConflictedFiles) >= 10 {

models/repo.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1882,10 +1882,7 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
18821882
}
18831883

18841884
oidPath := filepath.Join(v.Oid[0:2], v.Oid[2:4], v.Oid[4:len(v.Oid)])
1885-
err = os.Remove(filepath.Join(setting.LFS.ContentPath, oidPath))
1886-
if err != nil {
1887-
return err
1888-
}
1885+
removeAllWithNotice(sess, "Delete orphaned LFS file", oidPath)
18891886
}
18901887

18911888
if _, err := sess.Delete(&LFSMetaObject{RepositoryID: repoID}); err != nil {

models/ssh_key.go

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// Copyright 2014 The Gogs Authors. All rights reserved.
2+
// Copyright 2019 The Gitea Authors. All rights reserved.
23
// Use of this source code is governed by a MIT-style
34
// license that can be found in the LICENSE file.
45

@@ -359,7 +360,7 @@ func checkKeyFingerprint(e Engine, fingerprint string) error {
359360
return nil
360361
}
361362

362-
func calcFingerprint(publicKeyContent string) (string, error) {
363+
func calcFingerprintSSHKeygen(publicKeyContent string) (string, error) {
363364
// Calculate fingerprint.
364365
tmpPath, err := writeTmpKeyFile(publicKeyContent)
365366
if err != nil {
@@ -375,6 +376,34 @@ func calcFingerprint(publicKeyContent string) (string, error) {
375376
return strings.Split(stdout, " ")[1], nil
376377
}
377378

379+
func calcFingerprintNative(publicKeyContent string) (string, error) {
380+
// Calculate fingerprint.
381+
pk, _, _, _, err := ssh.ParseAuthorizedKey([]byte(publicKeyContent))
382+
if err != nil {
383+
return "", err
384+
}
385+
return ssh.FingerprintSHA256(pk), nil
386+
}
387+
388+
func calcFingerprint(publicKeyContent string) (string, error) {
389+
//Call the method based on configuration
390+
var (
391+
fnName, fp string
392+
err error
393+
)
394+
if setting.SSH.StartBuiltinServer {
395+
fnName = "calcFingerprintNative"
396+
fp, err = calcFingerprintNative(publicKeyContent)
397+
} else {
398+
fnName = "calcFingerprintSSHKeygen"
399+
fp, err = calcFingerprintSSHKeygen(publicKeyContent)
400+
}
401+
if err != nil {
402+
return "", fmt.Errorf("%s: %v", fnName, err)
403+
}
404+
return fp, nil
405+
}
406+
378407
func addKey(e Engine, key *PublicKey) (err error) {
379408
if len(key.Fingerprint) == 0 {
380409
key.Fingerprint, err = calcFingerprint(key.Content)

models/ssh_key_test.go

Lines changed: 62 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// Copyright 2016 The Gogs Authors. All rights reserved.
2+
// Copyright 2019 The Gitea Authors. All rights reserved.
23
// Use of this source code is governed by a MIT-style
34
// license that can be found in the LICENSE file.
45

@@ -19,26 +20,67 @@ func init() {
1920
}
2021

2122
func Test_SSHParsePublicKey(t *testing.T) {
22-
test := func(name, keyType string, length int, content string) {
23-
keyTypeN, lengthN, err := SSHNativeParsePublicKey(content)
24-
assert.NoError(t, err)
25-
assert.Equal(t, keyType, keyTypeN)
26-
assert.EqualValues(t, length, lengthN)
27-
28-
keyTypeK, lengthK, err := SSHKeyGenParsePublicKey(content)
29-
if err != nil {
30-
// Some servers do not support ecdsa format.
31-
if !strings.Contains(err.Error(), "line 1 too long:") {
32-
assert.Fail(t, "%v", err)
33-
}
34-
}
35-
assert.Equal(t, keyType, keyTypeK)
36-
assert.EqualValues(t, length, lengthK)
23+
testCases := []struct {
24+
name string
25+
keyType string
26+
length int
27+
content string
28+
}{
29+
{"dsa-1024", "dsa", 1024, "ssh-dss AAAAB3NzaC1kc3MAAACBAOChCC7lf6Uo9n7BmZ6M8St19PZf4Tn59NriyboW2x/DZuYAz3ibZ2OkQ3S0SqDIa0HXSEJ1zaExQdmbO+Ux/wsytWZmCczWOVsaszBZSl90q8UnWlSH6P+/YA+RWJm5SFtuV9PtGIhyZgoNuz5kBQ7K139wuQsecdKktISwTakzAAAAFQCzKsO2JhNKlL+wwwLGOcLffoAmkwAAAIBpK7/3xvduajLBD/9vASqBQIHrgK2J+wiQnIb/Wzy0UsVmvfn8A+udRbBo+csM8xrSnlnlJnjkJS3qiM5g+eTwsLIV1IdKPEwmwB+VcP53Cw6lSyWyJcvhFb0N6s08NZysLzvj0N+ZC/FnhKTLzIyMtkHf/IrPCwlM+pV/M/96YgAAAIEAqQcGn9CKgzgPaguIZooTAOQdvBLMI5y0bQjOW6734XOpqQGf/Kra90wpoasLKZjSYKNPjE+FRUOrStLrxcNs4BeVKhy2PYTRnybfYVk1/dmKgH6P1YSRONsGKvTsH6c5IyCRG0ncCgYeF8tXppyd642982daopE7zQ/NPAnJfag= nocomment"},
30+
{"rsa-1024", "rsa", 1024, "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDAu7tvIvX6ZHrRXuZNfkR3XLHSsuCK9Zn3X58lxBcQzuo5xZgB6vRwwm/QtJuF+zZPtY5hsQILBLmF+BZ5WpKZp1jBeSjH2G7lxet9kbcH+kIVj0tPFEoyKI9wvWqIwC4prx/WVk2wLTJjzBAhyNxfEq7C9CeiX9pQEbEqJfkKCQ== nocomment\n"},
31+
{"rsa-2048", "rsa", 2048, "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMZXh+1OBUwSH9D45wTaxErQIN9IoC9xl7MKJkqvTvv6O5RR9YW/IK9FbfjXgXsppYGhsCZo1hFOOsXHMnfOORqu/xMDx4yPuyvKpw4LePEcg4TDipaDFuxbWOqc/BUZRZcXu41QAWfDLrInwsltWZHSeG7hjhpacl4FrVv9V1pS6Oc5Q1NxxEzTzuNLS/8diZrTm/YAQQ/+B+mzWI3zEtF4miZjjAljWd1LTBPvU23d29DcBmmFahcZ441XZsTeAwGxG/Q6j8NgNXj9WxMeWwxXV2jeAX/EBSpZrCVlCQ1yJswT6xCp8TuBnTiGWYMBNTbOZvPC4e0WI2/yZW/s5F nocomment"},
32+
{"ecdsa-256", "ecdsa", 256, "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFQacN3PrOll7PXmN5B/ZNVahiUIqI05nbBlZk1KXsO3d06ktAWqbNflv2vEmA38bTFTfJ2sbn2B5ksT52cDDbA= nocomment"},
33+
{"ecdsa-384", "ecdsa", 384, "ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBINmioV+XRX1Fm9Qk2ehHXJ2tfVxW30ypUWZw670Zyq5GQfBAH6xjygRsJ5wWsHXBsGYgFUXIHvMKVAG1tpw7s6ax9oA+dJOJ7tj+vhn8joFqT+sg3LYHgZkHrfqryRasQ== nocomment"},
3734
}
3835

39-
test("dsa-1024", "dsa", 1024, "ssh-dss AAAAB3NzaC1kc3MAAACBAOChCC7lf6Uo9n7BmZ6M8St19PZf4Tn59NriyboW2x/DZuYAz3ibZ2OkQ3S0SqDIa0HXSEJ1zaExQdmbO+Ux/wsytWZmCczWOVsaszBZSl90q8UnWlSH6P+/YA+RWJm5SFtuV9PtGIhyZgoNuz5kBQ7K139wuQsecdKktISwTakzAAAAFQCzKsO2JhNKlL+wwwLGOcLffoAmkwAAAIBpK7/3xvduajLBD/9vASqBQIHrgK2J+wiQnIb/Wzy0UsVmvfn8A+udRbBo+csM8xrSnlnlJnjkJS3qiM5g+eTwsLIV1IdKPEwmwB+VcP53Cw6lSyWyJcvhFb0N6s08NZysLzvj0N+ZC/FnhKTLzIyMtkHf/IrPCwlM+pV/M/96YgAAAIEAqQcGn9CKgzgPaguIZooTAOQdvBLMI5y0bQjOW6734XOpqQGf/Kra90wpoasLKZjSYKNPjE+FRUOrStLrxcNs4BeVKhy2PYTRnybfYVk1/dmKgH6P1YSRONsGKvTsH6c5IyCRG0ncCgYeF8tXppyd642982daopE7zQ/NPAnJfag= nocomment")
40-
test("rsa-1024", "rsa", 1024, "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDAu7tvIvX6ZHrRXuZNfkR3XLHSsuCK9Zn3X58lxBcQzuo5xZgB6vRwwm/QtJuF+zZPtY5hsQILBLmF+BZ5WpKZp1jBeSjH2G7lxet9kbcH+kIVj0tPFEoyKI9wvWqIwC4prx/WVk2wLTJjzBAhyNxfEq7C9CeiX9pQEbEqJfkKCQ== nocomment\n")
41-
test("rsa-2048", "rsa", 2048, "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMZXh+1OBUwSH9D45wTaxErQIN9IoC9xl7MKJkqvTvv6O5RR9YW/IK9FbfjXgXsppYGhsCZo1hFOOsXHMnfOORqu/xMDx4yPuyvKpw4LePEcg4TDipaDFuxbWOqc/BUZRZcXu41QAWfDLrInwsltWZHSeG7hjhpacl4FrVv9V1pS6Oc5Q1NxxEzTzuNLS/8diZrTm/YAQQ/+B+mzWI3zEtF4miZjjAljWd1LTBPvU23d29DcBmmFahcZ441XZsTeAwGxG/Q6j8NgNXj9WxMeWwxXV2jeAX/EBSpZrCVlCQ1yJswT6xCp8TuBnTiGWYMBNTbOZvPC4e0WI2/yZW/s5F nocomment")
42-
test("ecdsa-256", "ecdsa", 256, "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFQacN3PrOll7PXmN5B/ZNVahiUIqI05nbBlZk1KXsO3d06ktAWqbNflv2vEmA38bTFTfJ2sbn2B5ksT52cDDbA= nocomment")
43-
test("ecdsa-384", "ecdsa", 384, "ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBINmioV+XRX1Fm9Qk2ehHXJ2tfVxW30ypUWZw670Zyq5GQfBAH6xjygRsJ5wWsHXBsGYgFUXIHvMKVAG1tpw7s6ax9oA+dJOJ7tj+vhn8joFqT+sg3LYHgZkHrfqryRasQ== nocomment")
36+
for _, tc := range testCases {
37+
t.Run(tc.name, func(t *testing.T) {
38+
t.Run("Native", func(t *testing.T) {
39+
keyTypeN, lengthN, err := SSHNativeParsePublicKey(tc.content)
40+
assert.NoError(t, err)
41+
assert.Equal(t, tc.keyType, keyTypeN)
42+
assert.EqualValues(t, tc.length, lengthN)
43+
})
44+
t.Run("SSHKeygen", func(t *testing.T) {
45+
keyTypeK, lengthK, err := SSHKeyGenParsePublicKey(tc.content)
46+
if err != nil {
47+
// Some servers do not support ecdsa format.
48+
if !strings.Contains(err.Error(), "line 1 too long:") {
49+
assert.Fail(t, "%v", err)
50+
}
51+
}
52+
assert.Equal(t, tc.keyType, keyTypeK)
53+
assert.EqualValues(t, tc.length, lengthK)
54+
})
55+
})
56+
}
57+
}
58+
59+
func Test_calcFingerprint(t *testing.T) {
60+
testCases := []struct {
61+
name string
62+
fp string
63+
content string
64+
}{
65+
{"dsa-1024", "SHA256:fSIHQlpKMDsGPVAXI8BPYfRp+e2sfvSt1sMrPsFiXrc", "ssh-dss AAAAB3NzaC1kc3MAAACBAOChCC7lf6Uo9n7BmZ6M8St19PZf4Tn59NriyboW2x/DZuYAz3ibZ2OkQ3S0SqDIa0HXSEJ1zaExQdmbO+Ux/wsytWZmCczWOVsaszBZSl90q8UnWlSH6P+/YA+RWJm5SFtuV9PtGIhyZgoNuz5kBQ7K139wuQsecdKktISwTakzAAAAFQCzKsO2JhNKlL+wwwLGOcLffoAmkwAAAIBpK7/3xvduajLBD/9vASqBQIHrgK2J+wiQnIb/Wzy0UsVmvfn8A+udRbBo+csM8xrSnlnlJnjkJS3qiM5g+eTwsLIV1IdKPEwmwB+VcP53Cw6lSyWyJcvhFb0N6s08NZysLzvj0N+ZC/FnhKTLzIyMtkHf/IrPCwlM+pV/M/96YgAAAIEAqQcGn9CKgzgPaguIZooTAOQdvBLMI5y0bQjOW6734XOpqQGf/Kra90wpoasLKZjSYKNPjE+FRUOrStLrxcNs4BeVKhy2PYTRnybfYVk1/dmKgH6P1YSRONsGKvTsH6c5IyCRG0ncCgYeF8tXppyd642982daopE7zQ/NPAnJfag= nocomment"},
66+
{"rsa-1024", "SHA256:vSnDkvRh/xM6kMxPidLgrUhq3mCN7CDaronCEm2joyQ", "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDAu7tvIvX6ZHrRXuZNfkR3XLHSsuCK9Zn3X58lxBcQzuo5xZgB6vRwwm/QtJuF+zZPtY5hsQILBLmF+BZ5WpKZp1jBeSjH2G7lxet9kbcH+kIVj0tPFEoyKI9wvWqIwC4prx/WVk2wLTJjzBAhyNxfEq7C9CeiX9pQEbEqJfkKCQ== nocomment\n"},
67+
{"rsa-2048", "SHA256:ZHD//a1b9VuTq9XSunAeYjKeU1xDa2tBFZYrFr2Okkg", "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMZXh+1OBUwSH9D45wTaxErQIN9IoC9xl7MKJkqvTvv6O5RR9YW/IK9FbfjXgXsppYGhsCZo1hFOOsXHMnfOORqu/xMDx4yPuyvKpw4LePEcg4TDipaDFuxbWOqc/BUZRZcXu41QAWfDLrInwsltWZHSeG7hjhpacl4FrVv9V1pS6Oc5Q1NxxEzTzuNLS/8diZrTm/YAQQ/+B+mzWI3zEtF4miZjjAljWd1LTBPvU23d29DcBmmFahcZ441XZsTeAwGxG/Q6j8NgNXj9WxMeWwxXV2jeAX/EBSpZrCVlCQ1yJswT6xCp8TuBnTiGWYMBNTbOZvPC4e0WI2/yZW/s5F nocomment"},
68+
{"ecdsa-256", "SHA256:Bqx/xgWqRKLtkZ0Lr4iZpgb+5lYsFpSwXwVZbPwuTRw", "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFQacN3PrOll7PXmN5B/ZNVahiUIqI05nbBlZk1KXsO3d06ktAWqbNflv2vEmA38bTFTfJ2sbn2B5ksT52cDDbA= nocomment"},
69+
{"ecdsa-384", "SHA256:4qfJOgJDtUd8BrEjyVNdI8IgjiZKouztVde43aDhe1E", "ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBINmioV+XRX1Fm9Qk2ehHXJ2tfVxW30ypUWZw670Zyq5GQfBAH6xjygRsJ5wWsHXBsGYgFUXIHvMKVAG1tpw7s6ax9oA+dJOJ7tj+vhn8joFqT+sg3LYHgZkHrfqryRasQ== nocomment"},
70+
}
71+
72+
for _, tc := range testCases {
73+
t.Run(tc.name, func(t *testing.T) {
74+
t.Run("Native", func(t *testing.T) {
75+
fpN, err := calcFingerprintNative(tc.content)
76+
assert.NoError(t, err)
77+
assert.Equal(t, tc.fp, fpN)
78+
})
79+
t.Run("SSHKeygen", func(t *testing.T) {
80+
fpK, err := calcFingerprintSSHKeygen(tc.content)
81+
assert.NoError(t, err)
82+
assert.Equal(t, tc.fp, fpK)
83+
})
84+
})
85+
}
4486
}

models/user.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,8 @@ func (u *User) APIFormat() *api.User {
214214
AvatarURL: u.AvatarLink(),
215215
Language: u.Language,
216216
IsAdmin: u.IsAdmin,
217+
LastLogin: u.LastLoginUnix.AsTime(),
218+
Created: u.CreatedUnix.AsTime(),
217219
}
218220
}
219221

modules/setting/setting.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ func forcePathSeparator(path string) {
438438
// This check is ignored under Windows since SSH remote login is not the main
439439
// method to login on Windows.
440440
func IsRunUserMatchCurrentUser(runUser string) (string, bool) {
441-
if IsWindows {
441+
if IsWindows || SSH.StartBuiltinServer {
442442
return "", true
443443
}
444444

modules/structs/issue_label.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// Copyright 2016 The Gogs Authors. All rights reserved.
2+
// Copyright 2019 The Gitea Authors. All rights reserved.
23
// Use of this source code is governed by a MIT-style
34
// license that can be found in the LICENSE file.
45

@@ -10,8 +11,9 @@ type Label struct {
1011
ID int64 `json:"id"`
1112
Name string `json:"name"`
1213
// example: 00aabb
13-
Color string `json:"color"`
14-
URL string `json:"url"`
14+
Color string `json:"color"`
15+
Description string `json:"description"`
16+
URL string `json:"url"`
1517
}
1618

1719
// CreateLabelOption options for creating a label
@@ -20,13 +22,15 @@ type CreateLabelOption struct {
2022
Name string `json:"name" binding:"Required"`
2123
// required:true
2224
// example: #00aabb
23-
Color string `json:"color" binding:"Required;Size(7)"`
25+
Color string `json:"color" binding:"Required;Size(7)"`
26+
Description string `json:"description"`
2427
}
2528

2629
// EditLabelOption options for editing a label
2730
type EditLabelOption struct {
28-
Name *string `json:"name"`
29-
Color *string `json:"color"`
31+
Name *string `json:"name"`
32+
Color *string `json:"color"`
33+
Description *string `json:"description"`
3034
}
3135

3236
// IssueLabelsOption a collection of labels

modules/structs/user.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package structs
66

77
import (
88
"encoding/json"
9+
"time"
910
)
1011

1112
// User represents a user
@@ -25,6 +26,10 @@ type User struct {
2526
Language string `json:"language"`
2627
// Is the user an administrator
2728
IsAdmin bool `json:"is_admin"`
29+
// swagger:strfmt date-time
30+
LastLogin time.Time `json:"last_login,omitempty"`
31+
// swagger:strfmt date-time
32+
Created time.Time `json:"created,omitempty"`
2833
}
2934

3035
// MarshalJSON implements the json.Marshaler interface for User, adding field(s) for backward compatibility

options/locale/locale_en-US.ini

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1722,6 +1722,11 @@ config.ssh_keygen_path = Keygen ('ssh-keygen') Path
17221722
config.ssh_minimum_key_size_check = Minimum Key Size Check
17231723
config.ssh_minimum_key_sizes = Minimum Key Sizes
17241724
1725+
config.lfs_config = LFS Configuration
1726+
config.lfs_enabled = Enabled
1727+
config.lfs_content_path = LFS Content Path
1728+
config.lfs_http_auth_expiry = LFS HTTP Auth Expiry
1729+
17251730
config.db_config = Database Configuration
17261731
config.db_type = Type
17271732
config.db_host = Host

public/css/index.css

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -803,6 +803,8 @@ footer .ui.left,footer .ui.right{line-height:40px}
803803
.stats-table .table-cell{display:table-cell}
804804
.stats-table .table-cell.tiny{height:.5em}
805805
tbody.commit-list{vertical-align:baseline}
806+
.commit-list .message-wrapper{overflow:hidden;text-overflow:ellipsis;max-width:calc(100% - 24px);display:inline-block;vertical-align:middle}
807+
.commit-list .message-wrapper .commit-status-link{display:inline-block;vertical-align:middle}
806808
.commit-body{white-space:pre-wrap}
807809
.git-notes.top{text-align:left}
808810
.git-notes .commit-body{margin:0}

public/less/_repository.less

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2219,6 +2219,19 @@ tbody.commit-list {
22192219
vertical-align: baseline;
22202220
}
22212221

2222+
.commit-list .message-wrapper {
2223+
overflow: hidden;
2224+
text-overflow: ellipsis;
2225+
max-width: calc(100% - 24px);
2226+
display: inline-block;
2227+
vertical-align: middle;
2228+
}
2229+
2230+
.commit-list .message-wrapper .commit-status-link {
2231+
display: inline-block;
2232+
vertical-align: middle;
2233+
}
2234+
22222235
.commit-body {
22232236
white-space: pre-wrap;
22242237
}

routers/admin/admin.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ func Config(ctx *context.Context) {
225225
ctx.Data["ReverseProxyAuthEmail"] = setting.ReverseProxyAuthEmail
226226

227227
ctx.Data["SSH"] = setting.SSH
228+
ctx.Data["LFS"] = setting.LFS
228229

229230
ctx.Data["Service"] = setting.Service
230231
ctx.Data["DbCfg"] = models.DbCfg

routers/api/v1/convert/convert.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,8 @@ func ToUser(user *models.User, signed, admin bool) *api.User {
236236
AvatarURL: user.AvatarLink(),
237237
FullName: markup.Sanitize(user.FullName),
238238
IsAdmin: user.IsAdmin,
239+
LastLogin: user.LastLoginUnix.AsTime(),
240+
Created: user.CreatedUnix.AsTime(),
239241
}
240242
if signed && (!user.KeepEmailPrivate || admin) {
241243
result.Email = user.Email

0 commit comments

Comments
 (0)