@@ -22,6 +22,7 @@ import (
22
22
"code.gitea.io/gitea/models/perm"
23
23
"code.gitea.io/gitea/modules/git"
24
24
"code.gitea.io/gitea/modules/json"
25
+ "code.gitea.io/gitea/modules/lfstransfer"
25
26
"code.gitea.io/gitea/modules/log"
26
27
"code.gitea.io/gitea/modules/pprof"
27
28
"code.gitea.io/gitea/modules/private"
@@ -40,6 +41,7 @@ const (
40
41
verbUploadArchive = "git-upload-archive"
41
42
verbReceivePack = "git-receive-pack"
42
43
verbLfsAuthenticate = "git-lfs-authenticate"
44
+ verbLfsTransfer = "git-lfs-transfer"
43
45
)
44
46
45
47
// CmdServ represents the available serv sub-command.
83
85
verbUploadArchive : true ,
84
86
verbReceivePack : true ,
85
87
verbLfsAuthenticate : true ,
88
+ verbLfsTransfer : true ,
86
89
}
87
90
allowedCommandsLfs = map [string ]bool {
88
91
verbLfsAuthenticate : true ,
92
+ verbLfsTransfer : true ,
89
93
}
90
94
alphaDashDotPattern = regexp .MustCompile (`[^\w-\.]` )
91
95
)
@@ -138,7 +142,7 @@ func getAccessMode(verb string, lfsVerb string) perm.AccessMode {
138
142
return perm .AccessModeRead
139
143
case verbReceivePack :
140
144
return perm .AccessModeWrite
141
- case verbLfsAuthenticate :
145
+ case verbLfsAuthenticate , verbLfsTransfer :
142
146
switch lfsVerb {
143
147
case "upload" :
144
148
return perm .AccessModeWrite
@@ -297,6 +301,15 @@ func runServ(c *cli.Context) error {
297
301
return fail (ctx , extra .UserMsg , "ServCommand failed: %s" , extra .Error )
298
302
}
299
303
304
+ // LFS SSH protocol
305
+ if verb == verbLfsTransfer {
306
+ token , err := getLFSAuthToken (ctx , lfsVerb , results )
307
+ if err != nil {
308
+ return err
309
+ }
310
+ return lfstransfer .Main (ctx , repoPath , lfsVerb , token )
311
+ }
312
+
300
313
// LFS token authentication
301
314
if verb == verbLfsAuthenticate {
302
315
url := fmt .Sprintf ("%s%s/%s.git/info/lfs" , setting .AppURL , url .PathEscape (results .OwnerName ), url .PathEscape (results .RepoName ))
0 commit comments