You've already forked woodpecker
							
							
				mirror of
				https://github.com/woodpecker-ci/woodpecker.git
				synced 2025-10-30 23:27:39 +02:00 
			
		
		
		
	Refactor: move remote/ to server/remote/ (#344)
This commit is contained in:
		| @@ -36,10 +36,10 @@ import ( | ||||
| 	"github.com/woodpecker-ci/woodpecker/cncd/logging" | ||||
| 	"github.com/woodpecker-ci/woodpecker/cncd/pipeline/pipeline/rpc/proto" | ||||
| 	"github.com/woodpecker-ci/woodpecker/cncd/pubsub" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server" | ||||
| 	woodpeckerGrpcServer "github.com/woodpecker-ci/woodpecker/server/grpc" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/plugins/sender" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/router" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/router/middleware" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/store" | ||||
|   | ||||
| @@ -23,19 +23,19 @@ import ( | ||||
| 	"github.com/prometheus/client_golang/prometheus/promauto" | ||||
| 	"github.com/woodpecker-ci/woodpecker/cncd/queue" | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/bitbucket" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/bitbucketserver" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/coding" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/gitea" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/github" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/gitlab" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/gitlab3" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/gogs" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/plugins/environments" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/plugins/registry" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/plugins/secrets" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/bitbucket" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/bitbucketserver" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/coding" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/gitea" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/github" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/gitlab" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/gitlab3" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/gogs" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/store" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/store/datastore" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/web" | ||||
|   | ||||
| @@ -31,8 +31,8 @@ import ( | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"github.com/woodpecker-ci/woodpecker/cncd/queue" | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/router/middleware/session" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/shared" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/store" | ||||
|   | ||||
| @@ -32,7 +32,6 @@ import ( | ||||
|  | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/shared/token" | ||||
|  | ||||
| 	"github.com/woodpecker-ci/woodpecker/cncd/pipeline/pipeline/frontend/yaml" | ||||
| @@ -40,6 +39,7 @@ import ( | ||||
| 	"github.com/woodpecker-ci/woodpecker/cncd/pubsub" | ||||
| 	"github.com/woodpecker-ci/woodpecker/cncd/queue" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/shared" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/store" | ||||
| ) | ||||
|   | ||||
| @@ -21,8 +21,8 @@ import ( | ||||
|  | ||||
| 	"github.com/gorilla/securecookie" | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/store" | ||||
| 	"github.com/woodpecker-ci/woodpecker/shared/httputil" | ||||
| 	"github.com/woodpecker-ci/woodpecker/shared/token" | ||||
|   | ||||
| @@ -24,8 +24,8 @@ import ( | ||||
| 	"github.com/gorilla/securecookie" | ||||
|  | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/router/middleware/session" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/store" | ||||
| 	"github.com/woodpecker-ci/woodpecker/shared/token" | ||||
|   | ||||
| @@ -25,7 +25,7 @@ import ( | ||||
| 	"github.com/sirupsen/logrus" | ||||
|  | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/router/middleware/session" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/shared" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/store" | ||||
|   | ||||
| @@ -41,7 +41,7 @@ import ( | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/shared" | ||||
|  | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/store" | ||||
|  | ||||
| 	"github.com/woodpecker-ci/expr" | ||||
|   | ||||
| @@ -20,9 +20,9 @@ import ( | ||||
| 	"net/url" | ||||
| 
 | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/bitbucket/internal" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/bitbucket/internal" | ||||
| 
 | ||||
| 	"golang.org/x/oauth2" | ||||
| ) | ||||
| @@ -21,8 +21,8 @@ import ( | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/bitbucket/fixtures" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/bitbucket/internal" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/bitbucket/fixtures" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/bitbucket/internal" | ||||
| 
 | ||||
| 	"github.com/franela/goblin" | ||||
| 	"github.com/gin-gonic/gin" | ||||
| @@ -21,7 +21,7 @@ import ( | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/bitbucket/internal" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/bitbucket/internal" | ||||
| 
 | ||||
| 	"golang.org/x/oauth2" | ||||
| ) | ||||
| @@ -19,7 +19,7 @@ import ( | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/bitbucket/internal" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/bitbucket/internal" | ||||
| 
 | ||||
| 	"github.com/franela/goblin" | ||||
| 	"golang.org/x/oauth2" | ||||
| @@ -20,7 +20,7 @@ import ( | ||||
| 	"net/http" | ||||
| 
 | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/bitbucket/internal" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/bitbucket/internal" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| @@ -19,7 +19,7 @@ import ( | ||||
| 	"net/http" | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/bitbucket/fixtures" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/bitbucket/fixtures" | ||||
| 
 | ||||
| 	"github.com/franela/goblin" | ||||
| ) | ||||
| @@ -30,8 +30,8 @@ import ( | ||||
| 
 | ||||
| 	"github.com/mrjones/oauth" | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/bitbucketserver/internal" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/bitbucketserver/internal" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| @@ -24,7 +24,7 @@ import ( | ||||
| 
 | ||||
| 	"github.com/mrjones/oauth" | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/bitbucketserver/internal" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/bitbucketserver/internal" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| @@ -20,7 +20,7 @@ import ( | ||||
| 	"github.com/franela/goblin" | ||||
| 	"github.com/mrjones/oauth" | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/bitbucketserver/internal" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/bitbucketserver/internal" | ||||
| ) | ||||
| 
 | ||||
| func Test_helper(t *testing.T) { | ||||
| @@ -18,7 +18,7 @@ import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/bitbucketserver/internal" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/bitbucketserver/internal" | ||||
| 	"net/http" | ||||
| ) | ||||
| 
 | ||||
| @@ -21,9 +21,9 @@ import ( | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/coding/internal" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/coding/internal" | ||||
| 
 | ||||
| 	"golang.org/x/net/context" | ||||
| 	"golang.org/x/oauth2" | ||||
| @@ -21,7 +21,7 @@ import ( | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/coding/fixtures" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/coding/fixtures" | ||||
| 
 | ||||
| 	"github.com/franela/goblin" | ||||
| 	"github.com/gin-gonic/gin" | ||||
| @@ -21,7 +21,7 @@ import ( | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/coding/fixtures" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/coding/fixtures" | ||||
| 
 | ||||
| 	"github.com/franela/goblin" | ||||
| ) | ||||
| @@ -21,7 +21,7 @@ import ( | ||||
| 	"net/url" | ||||
| 
 | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote" | ||||
| ) | ||||
| 
 | ||||
| // IMPORTANT Gerrit support is not yet implemented. This file is a placeholder | ||||
| @@ -28,7 +28,7 @@ import ( | ||||
| 
 | ||||
| 	"code.gitea.io/sdk/gitea" | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote" | ||||
| ) | ||||
| 
 | ||||
| // Opts defines configuration options. | ||||
| @@ -28,8 +28,8 @@ import ( | ||||
| 
 | ||||
| 	"code.gitea.io/sdk/gitea" | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote" | ||||
| 
 | ||||
| 	"golang.org/x/oauth2" | ||||
| ) | ||||
| @@ -21,7 +21,7 @@ import ( | ||||
| 	"github.com/franela/goblin" | ||||
| 	"github.com/gin-gonic/gin" | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/gitea/fixtures" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/gitea/fixtures" | ||||
| ) | ||||
| 
 | ||||
| func Test_gitea(t *testing.T) { | ||||
| @@ -21,7 +21,7 @@ import ( | ||||
| 	"code.gitea.io/sdk/gitea" | ||||
| 	"github.com/franela/goblin" | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/gitea/fixtures" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/gitea/fixtures" | ||||
| ) | ||||
| 
 | ||||
| func Test_parse(t *testing.T) { | ||||
| @@ -21,7 +21,7 @@ import ( | ||||
| 
 | ||||
| 	"github.com/franela/goblin" | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/gitea/fixtures" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/gitea/fixtures" | ||||
| ) | ||||
| 
 | ||||
| func Test_parser(t *testing.T) { | ||||
| @@ -25,8 +25,8 @@ import ( | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote" | ||||
| 
 | ||||
| 	"github.com/google/go-github/github" | ||||
| 	"golang.org/x/net/context" | ||||
| @@ -19,7 +19,7 @@ import ( | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/github/fixtures" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/github/fixtures" | ||||
| 
 | ||||
| 	"github.com/franela/goblin" | ||||
| 	"github.com/gin-gonic/gin" | ||||
| @@ -21,7 +21,7 @@ import ( | ||||
| 
 | ||||
| 	"github.com/franela/goblin" | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/github/fixtures" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/github/fixtures" | ||||
| ) | ||||
| 
 | ||||
| func Test_parser(t *testing.T) { | ||||
| @@ -25,11 +25,11 @@ import ( | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/shared/oauth2" | ||||
| 
 | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/gitlab/client" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/gitlab/client" | ||||
| ) | ||||
| 
 | ||||
| const DefaultScope = "api" | ||||
| @@ -21,7 +21,7 @@ import ( | ||||
| 
 | ||||
| 	"github.com/franela/goblin" | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/gitlab/testdata" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/gitlab/testdata" | ||||
| ) | ||||
| 
 | ||||
| func Test_Gitlab(t *testing.T) { | ||||
| @@ -22,7 +22,7 @@ import ( | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/gitlab/client" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/gitlab/client" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| @@ -25,11 +25,11 @@ import ( | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/shared/oauth2" | ||||
| 
 | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/gitlab3/client" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/gitlab3/client" | ||||
| ) | ||||
| 
 | ||||
| const DefaultScope = "api" | ||||
| @@ -21,7 +21,7 @@ import ( | ||||
| 
 | ||||
| 	"github.com/franela/goblin" | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/gitlab3/testdata" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/gitlab3/testdata" | ||||
| ) | ||||
| 
 | ||||
| func Test_Gitlab(t *testing.T) { | ||||
| @@ -22,7 +22,7 @@ import ( | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/gitlab3/client" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/gitlab3/client" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| @@ -24,7 +24,7 @@ import ( | ||||
| 
 | ||||
| 	"github.com/gogits/go-gogs-client" | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote" | ||||
| ) | ||||
| 
 | ||||
| // Opts defines configuration options. | ||||
| @@ -19,7 +19,7 @@ import ( | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/gogs/fixtures" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/gogs/fixtures" | ||||
| 
 | ||||
| 	"github.com/franela/goblin" | ||||
| 	"github.com/gin-gonic/gin" | ||||
| @@ -19,7 +19,7 @@ import ( | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/woodpecker-ci/woodpecker/model" | ||||
| 	"github.com/woodpecker-ci/woodpecker/remote/gogs/fixtures" | ||||
| 	"github.com/woodpecker-ci/woodpecker/server/remote/gogs/fixtures" | ||||
| 
 | ||||
| 	"github.com/franela/goblin" | ||||
| 	"github.com/gogits/go-gogs-client" | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user