diff --git a/cmd/client/main.go b/cmd/client/main.go index 1530850..adf23d0 100644 --- a/cmd/client/main.go +++ b/cmd/client/main.go @@ -11,10 +11,11 @@ import ( "os" "time" - "github.com/inconshreveable/log15" - git "github.com/libgit2/git2go/v33" "github.com/omegaup/githttp/v2" - base "github.com/omegaup/go-base/v2" + "github.com/omegaup/go-base/logging/log15" + "github.com/omegaup/go-base/v3/logging" + + git "github.com/libgit2/git2go/v33" "golang.org/x/crypto/ssh" ) @@ -25,7 +26,7 @@ var ( remoteBranch = flag.String("branch", "master", "Target branch") commitHash = flag.String("commit", "", "Commit to push") sshPrivateKeyPath = flag.String("ssh-key", "omegaup-bot.key", "Private SSH key") - log log15.Logger + log logging.Logger ) func readPrivateKey(path string) (ssh.Signer, error) { @@ -107,10 +108,20 @@ func forcePushToBranch(remote *url.URL) error { pw := githttp.NewPktLineWriter(stdin) discovery, err := githttp.DiscoverReferences(stdout) if err != nil { - log.Error("Error discovering references", "err", err) + log.Error( + "Error discovering references", + map[string]interface{}{ + "err": err, + }, + ) return } - log.Debug("Remote", "discovery", discovery) + log.Debug( + "Remote", + map[string]interface{}{ + "discovery": discovery, + }, + ) refName := fmt.Sprintf("refs/heads/%s", *remoteBranch) var oldOid git.Oid if oid, ok := discovery.References[refName]; ok { @@ -123,7 +134,12 @@ func forcePushToBranch(remote *url.URL) error { // Not found is normal. We're doing a force-push anyways. descendant = false } else { - log.Error("Error getting descendantness", "err", err) + log.Error( + "Error getting descendantness", + map[string]interface{}{ + "err": err, + }, + ) pw.Flush() return } @@ -135,13 +151,30 @@ func forcePushToBranch(remote *url.URL) error { newOid.String(), refName, ) - log.Debug("Pushing", "oldOid", oldOid.String(), "newOid", newOid.String(), "line", line) + log.Debug( + "Pushing", + map[string]interface{}{ + "oldOid": oldOid.String(), + "newOid": newOid.String(), + "line": line, + }, + ) if err := pw.WritePktLine([]byte(line)); err != nil { - log.Error("Error sending pktline", "err", err) + log.Error( + "Error sending pktline", + map[string]interface{}{ + "err": err, + }, + ) return } if err := pw.Flush(); err != nil { - log.Error("Error flushing", "err", err) + log.Error( + "Error flushing", + map[string]interface{}{ + "err": err, + }, + ) return } @@ -154,16 +187,31 @@ func forcePushToBranch(remote *url.URL) error { if *current.Id() == oldOid { break } - log.Debug("Inserting commit", "commit", current.Id()) + log.Debug( + "Inserting commit", + map[string]interface{}{ + "commit": current.Id(), + }, + ) if err := pb.InsertCommit(current.Id()); err != nil { - log.Error("Error building pack", "err", err) + log.Error( + "Error building pack", + map[string]interface{}{ + "err": err, + }, + ) break } } } if err := pb.Write(stdin); err != nil { - log.Error("Error writing pack", "err", err) + log.Error( + "Error writing pack", + map[string]interface{}{ + "err": err, + }, + ) } pr := githttp.NewPktLineReader(stdout) @@ -172,15 +220,30 @@ func forcePushToBranch(remote *url.URL) error { if err == githttp.ErrFlush { break } else if err != nil { - log.Error("Error reading remote response", "err", err) + log.Error( + "Error reading remote response", + map[string]interface{}{ + "err": err, + }, + ) break } - log.Debug("Line", "line", string(line)) + log.Debug( + "Line", + map[string]interface{}{ + "line": string(line), + }, + ) } }() cmd := fmt.Sprintf("git-receive-pack '%s'", remote.Path) - log.Info("Sending command", "command", cmd) + log.Info( + "Sending command", + map[string]interface{}{ + "command": cmd, + }, + ) return session.Run(cmd) } @@ -201,7 +264,12 @@ func pushToSubdirectory(remote *url.URL) error { defer odb.Free() tmpDir, err := ioutil.TempDir("", "packfile") if err != nil { - log.Error("Could not create temporary directory for packfile", "err", err) + log.Error( + "Could not create temporary directory for packfile", + map[string]interface{}{ + "err": err, + }, + ) return err } defer os.RemoveAll(tmpDir) @@ -266,24 +334,54 @@ func pushToSubdirectory(remote *url.URL) error { pw := githttp.NewPktLineWriter(stdin) discovery, err := githttp.DiscoverReferences(stdout) if err != nil { - log.Error("Error discovering references", "err", err) + log.Error( + "Error discovering references", + map[string]interface{}{ + "err": err, + }, + ) return } - log.Debug("Remote", "discovery", discovery) + log.Debug( + "Remote", + map[string]interface{}{ + "discovery": discovery, + }, + ) refName := fmt.Sprintf("refs/heads/%s", *remoteBranch) if oid, ok := discovery.References[refName]; ok { line := fmt.Sprintf("want %s\x00agent=gohttp ofs-delta shallow\n", oid.String()) - log.Debug("Pulling", "line", line) + log.Debug( + "Pulling", + map[string]interface{}{ + "line": line, + }, + ) if err := pw.WritePktLine([]byte(line)); err != nil { - log.Error("Error sending pktline", "err", err) + log.Error( + "Error sending pktline", + map[string]interface{}{ + "err": err, + }, + ) return } if err := pw.WritePktLine([]byte("deepen 1")); err != nil { - log.Error("Error sending pktline", "err", err) + log.Error( + "Error sending pktline", + map[string]interface{}{ + "err": err, + }, + ) return } if err := pw.Flush(); err != nil { - log.Error("Error flushing", "err", err) + log.Error( + "Error flushing", + map[string]interface{}{ + "err": err, + }, + ) return } } @@ -294,58 +392,97 @@ func pushToSubdirectory(remote *url.URL) error { if err == githttp.ErrFlush { break } else if err != nil { - log.Error("Error reading shallow negotiation", "err", err) + log.Error( + "Error reading shallow negotiation", + map[string]interface{}{ + "err": err, + }, + ) break } - log.Debug("Line", "line", string(line)) + log.Debug( + "Line", + map[string]interface{}{ + "line": string(line), + }, + ) } if err := pw.WritePktLine([]byte("done\n")); err != nil { - log.Error("Error sending pktline", "err", err) + log.Error( + "Error sending pktline", + map[string]interface{}{ + "err": err, + }, + ) return } stdin.Close() line, err := pr.ReadPktLine() if err != nil { - log.Error("Error reading ACK/NAK response", "err", err) + log.Error( + "Error reading ACK/NAK response", + map[string]interface{}{ + "err": err, + }, + ) return } if string(line) != "NAK\n" { - log.Error("Server did not reply with NAK") + log.Error("Server did not reply with NAK", nil) return } - log.Debug("Reading packfile") + log.Debug("Reading packfile", nil) _, packPath, err := githttp.UnpackPackfile(odb, stdout, tmpDir, nil) if err != nil { - log.Error("Error reading packfile", "err", err) + log.Error( + "Error reading packfile", + map[string]interface{}{ + "err": err, + }, + ) return } - log.Info("Wrote packfile", "packPath", packPath) + log.Info( + "Wrote packfile", + map[string]interface{}{ + "packPath": packPath, + }, + ) }() cmd := fmt.Sprintf("git-upload-pack '%s'", remote.Path) - log.Info("Sending command", "command", cmd) + log.Info( + "Sending command", + map[string]interface{}{ + "command": cmd, + }, + ) if err := session.Run(cmd); err != nil { <-done <-done return err } - log.Info("Command finished running, waiting for packfile processing") + log.Info("Command finished running, waiting for packfile processing", nil) <-done <-done - log.Info("All done!") + log.Info("All done!", nil) return nil } func main() { flag.Parse() - log = base.StderrLog(false) + var err error + log, err = log15.New("info", false) + if err != nil { + panic(err) + } if *commitHash == "" { panic(errors.New("Must provide a -commit flag")) diff --git a/cmd/omegaup-gitserver/auth.go b/cmd/omegaup-gitserver/auth.go index 29aa7ad..d089a51 100644 --- a/cmd/omegaup-gitserver/auth.go +++ b/cmd/omegaup-gitserver/auth.go @@ -16,9 +16,9 @@ import ( "github.com/omegaup/githttp/v2" "github.com/omegaup/gitserver/request" + "github.com/omegaup/go-base/v3/logging" _ "github.com/go-sql-driver/mysql" - "github.com/inconshreveable/log15" _ "github.com/mattn/go-sqlite3" "github.com/newrelic/go-agent/v3/newrelic" "github.com/o1egl/paseto" @@ -41,7 +41,7 @@ const ( ) type omegaupAuthorization struct { - log log15.Logger + log logging.Logger db *sql.DB publicKey ed25519.PublicKey @@ -96,12 +96,22 @@ func (a *omegaupAuthorization) parseBearerToken(token string) (username, problem var jsonToken paseto.JSONToken var footer string if err := paseto.NewV2().Verify(token, a.publicKey, &jsonToken, &footer); err != nil { - a.log.Error("failed to verify token", "err", err) + a.log.Error( + "failed to verify token", + map[string]interface{}{ + "err": err, + }, + ) return } if err := jsonToken.Validate(paseto.IssuedBy("omegaUp frontend"), paseto.ValidAt(time.Now())); err != nil { - a.log.Error("failed to validate token", "err", err) + a.log.Error( + "failed to validate token", + map[string]interface{}{ + "err": err, + }, + ) return } @@ -134,7 +144,12 @@ func (a *omegaupAuthorization) parseUsernameAndPassword( if username == "omegaup:system" { // omegaup:system can only log in using the auth token or the secret token. - a.log.Error("user tried to login with restricted user", "username", username) + a.log.Error( + "user tried to login with restricted user", + map[string]interface{}{ + "username": username, + }, + ) return } @@ -153,18 +168,35 @@ func (a *omegaupAuthorization) parseUsernameAndPassword( &gitToken, ) if err != nil { - a.log.Error("failed to query user", "username", username, "err", err) + a.log.Error( + "failed to query user", + map[string]interface{}{ + "username": username, + "err": err, + }, + ) return } if !gitToken.Valid { - a.log.Error("user is missing a git token", "username", username) + a.log.Error( + "user is missing a git token", + map[string]interface{}{ + "username": username, + }, + ) return } ok, err = verifyArgon2idHash(password, gitToken.String) if err != nil { - a.log.Error("failed to verify user's git token", "username", username, "err", err) + a.log.Error( + "failed to verify user's git token", + map[string]interface{}{ + "username": username, + "err": err, + }, + ) return } @@ -172,7 +204,12 @@ func (a *omegaupAuthorization) parseUsernameAndPassword( username = basicAuthUsername problem = repositoryName } else { - a.log.Error("user provided the wrong git token", "username", username) + a.log.Error( + "user provided the wrong git token", + map[string]interface{}{ + "username": username, + }, + ) } return } @@ -295,9 +332,11 @@ func (a *omegaupAuthorization) authorize( ok = false a.log.Error( "Mismatched Basic authentication username", - "username", username, - "basic auth username", basicAuthUsername, - "repository", repositoryName, + map[string]interface{}{ + "username": username, + "basic auth username": basicAuthUsername, + "repository": repositoryName, + }, ) } if !ok { @@ -321,8 +360,10 @@ func (a *omegaupAuthorization) authorize( w.WriteHeader(http.StatusUnauthorized) a.log.Error( "Missing authentication", - "username", username, - "repository", repositoryName, + map[string]interface{}{ + "username": username, + "repository": repositoryName, + }, ) return githttp.AuthorizationDenied, "" } @@ -331,9 +372,11 @@ func (a *omegaupAuthorization) authorize( w.WriteHeader(http.StatusForbidden) a.log.Error( "Mismatched problem name", - "username", username, - "repository", repositoryName, - "problem", problem, + map[string]interface{}{ + "username": username, + "repository": repositoryName, + "problem": problem, + }, ) return githttp.AuthorizationDenied, "" } @@ -364,10 +407,12 @@ func (a *omegaupAuthorization) authorize( if err != nil { a.log.Error( "Auth", - "username", username, - "repository", repositoryName, - "operation", operation, - "err", err, + map[string]interface{}{ + "username": username, + "repository": repositoryName, + "operation": operation, + "err": err, + }, ) return githttp.AuthorizationDenied, username } @@ -378,21 +423,23 @@ func (a *omegaupAuthorization) authorize( } a.log.Info( "Auth", - "username", username, - "repository", repositoryName, - "operation", operation, + map[string]interface{}{ + "username": username, + "repository": repositoryName, + "operation": operation, + }, ) return githttp.AuthorizationAllowed, username } -func createAuthorizationCallback(config *Config, log log15.Logger) (githttp.AuthorizationCallback, error) { +func createAuthorizationCallback(config *Config, log logging.Logger) (githttp.AuthorizationCallback, error) { auth := omegaupAuthorization{ log: log, config: config, } if config.Gitserver.AllowSecretTokenAuthentication { - log.Warn("using insecure secret token authorization") + log.Warn("using insecure secret token authorization", nil) } if config.Gitserver.PublicKey != "" { keyBytes, err := base64.StdEncoding.DecodeString(config.Gitserver.PublicKey) diff --git a/cmd/omegaup-gitserver/auth_test.go b/cmd/omegaup-gitserver/auth_test.go index b9fd06b..156067b 100644 --- a/cmd/omegaup-gitserver/auth_test.go +++ b/cmd/omegaup-gitserver/auth_test.go @@ -2,9 +2,11 @@ package main import ( "encoding/base64" - base "github.com/omegaup/go-base/v2" - "golang.org/x/crypto/ed25519" "testing" + + "github.com/omegaup/go-base/logging/log15" + + "golang.org/x/crypto/ed25519" ) const ( @@ -25,7 +27,10 @@ func TestVerifyArgon2idHash(t *testing.T) { } func TestParseBearerAuth(t *testing.T) { - log := base.StderrLog(false) + log, err := log15.New("info", true) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } keyBytes, err := base64.StdEncoding.DecodeString(DefaultConfig().Gitserver.PublicKey) if err != nil { t.Fatalf("failed to parse shared key: %v", err) diff --git a/cmd/omegaup-gitserver/health_test.go b/cmd/omegaup-gitserver/health_test.go index ad98a04..fc73d22 100644 --- a/cmd/omegaup-gitserver/health_test.go +++ b/cmd/omegaup-gitserver/health_test.go @@ -14,7 +14,7 @@ import ( "github.com/omegaup/githttp/v2" "github.com/omegaup/gitserver" - base "github.com/omegaup/go-base/v2" + "github.com/omegaup/go-base/logging/log15" ) var ( @@ -35,7 +35,10 @@ func TestHealth(t *testing.T) { ctx := context.Background() - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } ts := httptest.NewUnstartedServer(nil) _, portString, err := net.SplitHostPort(ts.Listener.Addr().String()) if err != nil { diff --git a/cmd/omegaup-gitserver/main.go b/cmd/omegaup-gitserver/main.go index 54d2d39..919640d 100644 --- a/cmd/omegaup-gitserver/main.go +++ b/cmd/omegaup-gitserver/main.go @@ -13,16 +13,16 @@ import ( "syscall" "time" - git "github.com/libgit2/git2go/v33" "github.com/omegaup/githttp/v2" "github.com/omegaup/gitserver" "github.com/omegaup/gitserver/request" + "github.com/omegaup/go-base/logging/log15" nrtracing "github.com/omegaup/go-base/tracing/newrelic" - base "github.com/omegaup/go-base/v2" - "github.com/omegaup/go-base/v2/tracing" + "github.com/omegaup/go-base/v3/logging" + "github.com/omegaup/go-base/v3/tracing" "github.com/coreos/go-systemd/v22/daemon" - "github.com/inconshreveable/log15" + git "github.com/libgit2/git2go/v33" newrelic "github.com/newrelic/go-agent/v3/newrelic" ) @@ -38,7 +38,6 @@ var ( "grant all privileges to all users", ) version = flag.Bool("version", false, "Print the version and exit") - log log15.Logger // ProgramVersion is the version of the code from which the binary was built from. ProgramVersion string @@ -70,7 +69,7 @@ func referenceDiscovery( } type muxGitHandler struct { - log log15.Logger + log logging.Logger gitHandler http.Handler zipHandler http.Handler metricsHandler http.Handler @@ -82,7 +81,7 @@ func muxHandler( port uint16, rootPath string, protocol *githttp.GitProtocol, - log log15.Logger, + log logging.Logger, ) http.Handler { metrics, metricsHandler := gitserver.SetupMetrics(ProgramVersion) tracing := nrtracing.New(app) @@ -127,30 +126,6 @@ func (h *muxGitHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } } -type log15Logger struct { - log log15.Logger -} - -func (l *log15Logger) Error(msg string, context map[string]interface{}) { - l.log.Error(msg, log15.Ctx(context)) -} - -func (l *log15Logger) Warn(msg string, context map[string]interface{}) { - l.log.Warn(msg, log15.Ctx(context)) -} - -func (l *log15Logger) Info(msg string, context map[string]interface{}) { - l.log.Info(msg, log15.Ctx(context)) -} - -func (l *log15Logger) Debug(msg string, context map[string]interface{}) { - l.log.Debug(msg, log15.Ctx(context)) -} - -func (l *log15Logger) DebugEnabled() bool { - return true -} - func main() { defer git.Shutdown() @@ -171,24 +146,9 @@ func main() { } f.Close() - if config.Logging.File != "" { - var err error - log, err = base.RotatingLog( - config.Logging.File, - config.Logging.Level, - config.Logging.JSON, - ) - if err != nil { - panic(err) - } - } else if config.Logging.Level == "debug" { - log = base.StderrLog(config.Logging.JSON) - } else { - log = log15.New() - log.SetHandler(base.ErrorCallerStackHandler( - log15.LvlInfo, - base.StderrHandler(config.Logging.JSON), - )) + log, err := log15.New(config.Logging.Level, config.Logging.JSON) + if err != nil { + panic(err) } var app *newrelic.Application @@ -196,7 +156,7 @@ func main() { app, err = newrelic.NewApplication( newrelic.ConfigAppName(config.NewRelic.AppName), newrelic.ConfigLicense(config.NewRelic.License), - newrelic.ConfigLogger(&log15Logger{log: log}), + newrelic.ConfigLogger(log), newrelic.ConfigDistributedTracerEnabled(true), ) if err != nil { @@ -205,7 +165,7 @@ func main() { } if config.Gitserver.RootPath == "" { - log.Error("root path cannot be empty. Please specify one with -root") + log.Error("root path cannot be empty. Please specify one with -root", nil) os.Exit(1) } @@ -214,7 +174,12 @@ func main() { authCallback, err := createAuthorizationCallback(config, log) if err != nil { - log.Error("failed to create the authorization callback", "err", err) + log.Error( + "failed to create the authorization callback", + map[string]interface{}{ + "err": err, + }, + ) os.Exit(1) } @@ -249,13 +214,20 @@ func main() { go func() { defer wg.Done() if err := gitServer.ListenAndServe(); err != http.ErrServerClosed { - log.Error("gitServer ListenAndServe", "err", err) + log.Error( + "gitServer ListenAndServe", + map[string]interface{}{ + "err": err, + }, + ) } }() log.Info( "omegaUp gitserver ready", - "version", ProgramVersion, - "address", gitServer.Addr, + map[string]interface{}{ + "version": ProgramVersion, + "address": gitServer.Addr, + }, ) if config.Gitserver.PprofPort > 0 { @@ -274,12 +246,19 @@ func main() { go func() { defer wg.Done() if err := pprofServer.ListenAndServe(); err != http.ErrServerClosed { - log.Error("pprof ListenAndServe", "err", err) + log.Error( + "pprof ListenAndServe", + map[string]interface{}{ + "err": err, + }, + ) } }() log.Info( "pprof server ready", - "address", pprofServer.Addr, + map[string]interface{}{ + "address": pprofServer.Addr, + }, ) } daemon.SdNotify(false, "READY=1") @@ -287,7 +266,7 @@ func main() { <-stopChan daemon.SdNotify(false, "STOPPING=1") - log.Info("Shutting down server...") + log.Info("Shutting down server...", nil) ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) for _, server := range servers { server.Shutdown(ctx) @@ -296,5 +275,5 @@ func main() { cancel() wg.Wait() - log.Info("Server gracefully stopped.") + log.Info("Server gracefully stopped.", nil) } diff --git a/cmd/omegaup-translate-problem/main.go b/cmd/omegaup-translate-problem/main.go index a8b84f1..fc79e10 100644 --- a/cmd/omegaup-translate-problem/main.go +++ b/cmd/omegaup-translate-problem/main.go @@ -10,13 +10,16 @@ import ( "os" "path" "strings" + "time" - "github.com/inconshreveable/log15" - git "github.com/libgit2/git2go/v33" "github.com/omegaup/githttp/v2" "github.com/omegaup/gitserver" "github.com/omegaup/gitserver/request" - base "github.com/omegaup/go-base/v2" + "github.com/omegaup/go-base/logging/log15" + base "github.com/omegaup/go-base/v3" + "github.com/omegaup/go-base/v3/logging" + + git "github.com/libgit2/git2go/v33" "github.com/pkg/errors" ) @@ -31,6 +34,11 @@ var ( false, "ignore the committer and use the author instead", ) + ignoreTimeLimit = flag.Bool( + "ignore-time-limit", + false, + "ignore the hard wall time limit", + ) ) type unmergeResult struct { @@ -62,7 +70,7 @@ func createPackfileFromSplitCommit( sourceRepo, destRepo *git.Repository, commit *git.Commit, publishedID *git.Oid, - log log15.Logger, + log logging.Logger, ) error { // Create the new commit object and add it to a packfile builder. head, err := destRepo.Head() @@ -170,7 +178,7 @@ func createPackfileFromSplitCommit( return nil } -func mergeRepository(sourceRepositoryPath, destRepositoryPath string, log log15.Logger) error { +func mergeRepository(sourceRepositoryPath, destRepositoryPath string, log logging.Logger) error { sourceRepo, err := git.OpenRepository(sourceRepositoryPath) if err != nil { return errors.Wrapf( @@ -258,7 +266,13 @@ func mergeRepository(sourceRepositoryPath, destRepositoryPath string, log log15. } commits = append(commits, commit) - log.Info("commit", "id", commit.Id().String(), "parents", commit.ParentCount()) + log.Info( + "commit", + map[string]interface{}{ + "id": commit.Id().String(), + "parents": commit.ParentCount(), + }, + ) commit = commit.Parent(0) defer commit.Free() @@ -303,7 +317,7 @@ func createPackfileFromMergedCommit( sourceRepo, destRepo *git.Repository, commit *git.Commit, ignoreCommitter bool, - log log15.Logger, + log logging.Logger, ) ([]*unmergeResult, error) { // Create the new commit object and add it to a packfile builder. head, err := destRepo.Head() @@ -367,12 +381,17 @@ func createPackfileFromMergedCommit( lockfile := githttp.NewLockfile(destRepo.Path()) defer lockfile.Unlock() + overallWallTimeHardLimit := gitserver.OverallWallTimeHardLimit + if *ignoreTimeLimit { + overallWallTimeHardLimit = base.Duration(time.Duration(int64(^uint64(0) >> 1))) + } + protocol := gitserver.NewGitProtocol(gitserver.GitProtocolOpts{ GitProtocolOpts: githttp.GitProtocolOpts{ Log: log, }, AllowDirectPushToMaster: true, - HardOverallWallTimeLimit: gitserver.OverallWallTimeHardLimit, + HardOverallWallTimeLimit: overallWallTimeHardLimit, InteractiveSettingsCompiler: &gitserver.LibinteractiveCompiler{ LibinteractiveJarPath: "/usr/share/java/libinteractive.jar", Log: log, @@ -457,7 +476,7 @@ func unmergeRepository( sourceRepositoryPath, destRepositoryPath string, ignoreCommitter bool, - log log15.Logger, + log logging.Logger, ) (*unmergeReport, error) { sourceRepo, err := git.OpenRepository(sourceRepositoryPath) if err != nil { @@ -599,7 +618,10 @@ func main() { defer git.Shutdown() flag.Parse() - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + panic(err) + } args := flag.Args() if len(args) != 3 { @@ -614,9 +636,11 @@ func main() { if operation == "merge" { if err := mergeRepository(sourceRepositoryPath, destRepositoryPath, log); err != nil { - log.Crit( + log.Error( "failed to merge repository", - "err", err, + map[string]interface{}{ + "err": err, + }, ) os.Exit(1) } @@ -628,10 +652,12 @@ func main() { f, err := os.Create(*reportPath) if err != nil { - log.Crit( + log.Error( "failed to create report JSON file", - "path", *reportPath, - "err", err, + map[string]interface{}{ + "path": *reportPath, + "err": err, + }, ) os.Exit(1) } @@ -639,9 +665,11 @@ func main() { report, err := unmergeRepository(ctx, sourceRepositoryPath, destRepositoryPath, *ignoreCommitter, log) if err != nil { - log.Crit( + log.Error( "failed to unmerge repository", - "err", err, + map[string]interface{}{ + "err": err, + }, ) os.Exit(1) } @@ -649,17 +677,21 @@ func main() { encoder := json.NewEncoder(f) encoder.SetIndent("", " ") if err := encoder.Encode(report); err != nil { - log.Crit( + log.Error( "failed to marshal report", - "path", *reportPath, - "err", err, + map[string]interface{}{ + "path": *reportPath, + "err": err, + }, ) os.Exit(1) } } else { - log.Crit( + log.Error( "unrecognized operation", - "operation", operation, + map[string]interface{}{ + "operation": operation, + }, ) os.Exit(1) } diff --git a/cmd/omegaup-translate-problem/main_test.go b/cmd/omegaup-translate-problem/main_test.go index cc2303a..ee6f4d4 100644 --- a/cmd/omegaup-translate-problem/main_test.go +++ b/cmd/omegaup-translate-problem/main_test.go @@ -8,7 +8,7 @@ import ( "reflect" "testing" - base "github.com/omegaup/go-base/v2" + "github.com/omegaup/go-base/logging/log15" ) func TestRoundtrip(t *testing.T) { @@ -21,7 +21,10 @@ func TestRoundtrip(t *testing.T) { } ctx := context.Background() - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } mergedPath := path.Join(dirName, "merged") unmergedPath := path.Join(dirName, "unmerged") diff --git a/cmd/omegaup-update-problem/main.go b/cmd/omegaup-update-problem/main.go index 7c59e8c..5912355 100644 --- a/cmd/omegaup-update-problem/main.go +++ b/cmd/omegaup-update-problem/main.go @@ -14,13 +14,15 @@ import ( "path/filepath" "time" - "github.com/inconshreveable/log15" - git "github.com/libgit2/git2go/v33" "github.com/omegaup/githttp/v2" "github.com/omegaup/gitserver" "github.com/omegaup/gitserver/request" - base "github.com/omegaup/go-base/v2" + "github.com/omegaup/go-base/logging/log15" + base "github.com/omegaup/go-base/v3" + "github.com/omegaup/go-base/v3/logging" "github.com/omegaup/quark/common" + + git "github.com/libgit2/git2go/v33" "github.com/pkg/errors" ) @@ -63,7 +65,7 @@ func commitZipFile( zipMergeStrategy gitserver.ZipMergeStrategy, acceptsSubmissions bool, updatePublished bool, - log log15.Logger, + log logging.Logger, ) (*gitserver.UpdateResult, error) { ctx := request.NewContext(context.Background(), &base.NoOpMetrics{}) requestContext := request.FromContext(ctx) @@ -109,7 +111,7 @@ func convertBlobsToPackfile( author, committer *git.Signature, commitMessage string, w io.Writer, - log log15.Logger, + log logging.Logger, ) (*git.Oid, error) { headCommit, err := repo.LookupCommit(parent) if err != nil { @@ -257,11 +259,16 @@ func commitBlobs( authorUsername string, commitMessage string, contents map[string]io.Reader, - log log15.Logger, + log logging.Logger, ) (*gitserver.UpdateResult, error) { reference, err := repo.Head() if err != nil { - log.Error("Failed to get the repository's HEAD", "err", err) + log.Error( + "Failed to get the repository's HEAD", + map[string]interface{}{ + "err": err, + }, + ) return nil, err } defer reference.Free() @@ -322,17 +329,32 @@ func commitBlobs( &pack, ) if err != nil { - log.Error("Failed to push blobs", "err", err) + log.Error( + "Failed to push blobs", + map[string]interface{}{ + "err": err, + }, + ) return nil, err } if unpackErr != nil { - log.Error("Failed to unpack packfile", "err", unpackErr) + log.Error( + "Failed to unpack packfile", + map[string]interface{}{ + "err": unpackErr, + }, + ) return nil, err } updatedFiles, err := gitserver.GetUpdatedFiles(ctx, repo, updatedRefs) if err != nil { - log.Error("failed to get updated files", "err", err) + log.Error( + "failed to get updated files", + map[string]interface{}{ + "err": err, + }, + ) } return &gitserver.UpdateResult{ Status: "ok", @@ -343,18 +365,21 @@ func commitBlobs( func main() { flag.Parse() - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + panic(err) + } if *author == "" { - log.Crit("author cannot be empty. Please specify one with -author") + log.Error("author cannot be empty. Please specify one with -author", nil) os.Exit(1) } if *commitMessage == "" { - log.Crit("commit message cannot be empty. Please specify one with -commit-message") + log.Error("commit message cannot be empty. Please specify one with -commit-message", nil) os.Exit(1) } if *repositoryPath == "" { - log.Crit("repository path cannot be empty. Please specify one with -repository-path") + log.Error("repository path cannot be empty. Please specify one with -repository-path", nil) os.Exit(1) } @@ -364,19 +389,34 @@ func main() { if _, err := os.Stat(*repositoryPath); os.IsNotExist(err) { dir, err := ioutil.TempDir(filepath.Dir(*repositoryPath), "repository") if err != nil { - log.Crit("Failed to create temporary directory", "err", err) + log.Error( + "Failed to create temporary directory", + map[string]interface{}{ + "err": err, + }, + ) os.Exit(1) } defer os.RemoveAll(dir) if err := os.Chmod(dir, 0755); err != nil { - log.Crit("Failed to chmod temporary directory", "err", err) + log.Error( + "Failed to chmod temporary directory", + map[string]interface{}{ + "err": err, + }, + ) os.Exit(1) } repo, err = gitserver.InitRepository(ctx, dir) if err != nil { - log.Crit("Failed to init bare repository", "err", err) + log.Error( + "Failed to init bare repository", + map[string]interface{}{ + "err": err, + }, + ) os.Exit(1) } commitCallback = func() error { @@ -395,7 +435,12 @@ func main() { } repo, err = git.OpenRepository(*repositoryPath) if err != nil { - log.Crit("failed to open existing repository", "err", err) + log.Error( + "failed to open existing repository", + map[string]interface{}{ + "err": err, + }, + ) os.Exit(1) } } @@ -403,9 +448,19 @@ func main() { lockfile := githttp.NewLockfile(repo.Path()) if ok, err := lockfile.TryLock(); !ok { - log.Info("Waiting for the lockfile", "err", err) + log.Info( + "Waiting for the lockfile", + map[string]interface{}{ + "err": err, + }, + ) if err := lockfile.Lock(); err != nil { - log.Crit("Failed to acquire the lockfile", "err", err) + log.Error( + "Failed to acquire the lockfile", + map[string]interface{}{ + "err": err, + }, + ) os.Exit(1) } } @@ -415,7 +470,12 @@ func main() { if *problemSettingsJSON != "" { problemSettings = &common.ProblemSettings{} if err := json.Unmarshal([]byte(*problemSettingsJSON), problemSettings); err != nil { - log.Crit("Failed to parse -problem-settings", "err", err) + log.Error( + "Failed to parse -problem-settings", + map[string]interface{}{ + "err": err, + }, + ) os.Exit(1) } } @@ -424,13 +484,23 @@ func main() { if *zipPath != "" { zipMergeStrategy, err := gitserver.ParseZipMergeStrategy(*mergeStrategyName) if err != nil { - log.Crit("Invalid value for -merge-strategy: %q", *mergeStrategyName) + log.Error( + "Invalid value for -merge-strategy", + map[string]interface{}{ + "strategy": *mergeStrategyName, + }, + ) os.Exit(1) } zipReader, err := zip.OpenReader(*zipPath) if err != nil { - log.Crit("Failed to open the zip file", "err", err) + log.Error( + "Failed to open the zip file", + map[string]interface{}{ + "err": err, + }, + ) os.Exit(1) } defer zipReader.Close() @@ -448,13 +518,24 @@ func main() { log, ) if err != nil { - log.Error("Failed update the repository", "path", *repositoryPath, "err", err) + log.Error( + "Failed update the repository", + map[string]interface{}{ + "path": *repositoryPath, + "err": err, + }, + ) updateResult = &gitserver.UpdateResult{ Status: "error", Error: err.Error(), } } else if err := commitCallback(); err != nil { - log.Error("Failed to commit the write to the repository", "err", err) + log.Error( + "Failed to commit the write to the repository", + map[string]interface{}{ + "err": err, + }, + ) updateResult = &gitserver.UpdateResult{ Status: "error", Error: err.Error(), @@ -463,7 +544,12 @@ func main() { } else if *blobUpdateJSON != "" { var blobUpdates []BlobUpdate if err := json.Unmarshal([]byte(*blobUpdateJSON), &blobUpdates); err != nil { - log.Crit("Failed to parse -blob-update", "err", err) + log.Error( + "Failed to parse -blob-update", + map[string]interface{}{ + "err": err, + }, + ) os.Exit(1) } @@ -471,9 +557,12 @@ func main() { for _, blobUpdate := range blobUpdates { f, err := os.Open(blobUpdate.ContentsPath) if err != nil { - log.Crit("failed to open blob contents", - "contents path", blobUpdate.ContentsPath, - "path", blobUpdate.Path, + log.Error( + "failed to open blob contents", + map[string]interface{}{ + "contents path": blobUpdate.ContentsPath, + "path": blobUpdate.Path, + }, ) os.Exit(1) } @@ -491,7 +580,13 @@ func main() { log, ) if err != nil { - log.Error("Failed update the repository", "path", *repositoryPath, "err", err) + log.Error( + "Failed update the repository", + map[string]interface{}{ + "path": *repositoryPath, + "err": err, + }, + ) updateResult = &gitserver.UpdateResult{ Status: "error", Error: err.Error(), @@ -501,7 +596,12 @@ func main() { var err error zipReader, err := zip.NewReader(bytes.NewReader(emptyZipFile), int64(len(emptyZipFile))) if err != nil { - log.Crit("Failed to open the empty zip file", "err", err) + log.Error( + "Failed to open the empty zip file", + map[string]interface{}{ + "err": err, + }, + ) os.Exit(1) } @@ -518,14 +618,20 @@ func main() { log, ) if err != nil { - log.Error("Failed update the repository", "path", *repositoryPath, "err", err) + log.Error( + "Failed update the repository", + map[string]interface{}{ + "path": *repositoryPath, + "err": err, + }, + ) updateResult = &gitserver.UpdateResult{ Status: "error", Error: err.Error(), } } } else { - log.Error("-zip-path, -blob-update, and -problem-settings cannot be simultaneously empty.") + log.Error("-zip-path, -blob-update, and -problem-settings cannot be simultaneously empty.", nil) os.Exit(1) } diff --git a/cmd/omegaup-update-problem/main_test.go b/cmd/omegaup-update-problem/main_test.go index f64ae4a..5a0962f 100644 --- a/cmd/omegaup-update-problem/main_test.go +++ b/cmd/omegaup-update-problem/main_test.go @@ -11,16 +11,17 @@ import ( "strings" "testing" - "github.com/inconshreveable/log15" - git "github.com/libgit2/git2go/v33" "github.com/omegaup/githttp/v2" "github.com/omegaup/gitserver" "github.com/omegaup/gitserver/gitservertest" - base "github.com/omegaup/go-base/v2" + "github.com/omegaup/go-base/logging/log15" + "github.com/omegaup/go-base/v3/logging" "github.com/omegaup/quark/common" + + git "github.com/libgit2/git2go/v33" ) -func getTreeOid(t *testing.T, extraFileContents map[string]io.Reader, log log15.Logger) *git.Oid { +func getTreeOid(t *testing.T, extraFileContents map[string]io.Reader, log logging.Logger) *git.Oid { t.Helper() ctx := context.Background() tmpdir, err := ioutil.TempDir("", "gitrepo") @@ -86,13 +87,21 @@ func getTreeOid(t *testing.T, extraFileContents map[string]io.Reader, log log15. } defer commit.Free() - log.Info("Commit", "parents", commit.ParentCount()) + log.Info( + "Commit", + map[string]interface{}{ + "parents": commit.ParentCount(), + }, + ) return commit.TreeId() } func TestIdenticalTrees(t *testing.T) { - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } defaultSettingsTree := getTreeOid(t, map[string]io.Reader{}, log) @@ -196,7 +205,10 @@ func validateReferences( } func TestProblemUpdateZip(t *testing.T) { - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } tmpdir, err := ioutil.TempDir("", "gitrepo") if err != nil { @@ -330,7 +342,10 @@ func TestProblemUpdateZip(t *testing.T) { } func TestProblemUpdateBlobs(t *testing.T) { - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } tmpdir, err := ioutil.TempDir("", "gitrepo") if err != nil { diff --git a/cmd/packfileparser/main.go b/cmd/packfileparser/main.go index 739c8fc..6605d7e 100644 --- a/cmd/packfileparser/main.go +++ b/cmd/packfileparser/main.go @@ -7,16 +7,17 @@ import ( "os" "strings" - "github.com/inconshreveable/log15" + "github.com/omegaup/go-base/logging/log15" + "github.com/omegaup/go-base/v3/logging" + git "github.com/libgit2/git2go/v33" - base "github.com/omegaup/go-base/v2" ) var ( repositoryPath = flag.String("repository", "", "Repository path") commit = flag.Bool("commit", false, "Add packfiles to the repository") - log log15.Logger + log logging.Logger ) func processOnePackfile( @@ -30,7 +31,12 @@ func processOnePackfile( } indexer, err := git.NewIndexer(".", odb, func(stats git.TransferProgress) error { - log.Debug("Progress", "stats", stats) + log.Debug( + "Progress", + map[string]interface{}{ + "stats": stats, + }, + ) return nil }) if err != nil { @@ -46,7 +52,12 @@ func processOnePackfile( if err != nil { panic(err) } - log.Info("Done!", "hash", hash) + log.Info( + "Done!", + map[string]interface{}{ + "hash": hash, + }, + ) if *commit { f, err := os.Open(fmt.Sprintf("pack-%s.pack", hash)) @@ -119,13 +130,24 @@ func processObject(repository *git.Repository, oid *git.Oid, message string) err defer commit.Free() contents = commit.RawMessage() } - log.Debug("Exists now", "oid", oid, "type", obj.Type(), "contents", contents) + log.Debug( + "Exists now", + map[string]interface{}{ + "oid": oid, + "type": obj.Type(), + "contents": contents, + }, + ) return nil } func main() { flag.Parse() - log = base.StderrLog(false) + var err error + log, err = log15.New("info", false) + if err != nil { + panic(err) + } var repository *git.Repository var odb *git.Odb @@ -178,5 +200,11 @@ func main() { } return processObject(repository, oid, "Exists now") }) - log.Info("Done", "before", beforeObjectsCount, "after", afterObjects) + log.Info( + "Done", + map[string]interface{}{ + "before": beforeObjectsCount, + "after": afterObjects, + }, + ) } diff --git a/go.mod b/go.mod index b928a3e..30459fe 100644 --- a/go.mod +++ b/go.mod @@ -3,40 +3,42 @@ module github.com/omegaup/gitserver go 1.17 require ( - github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 // indirect github.com/coreos/go-systemd/v22 v22.1.0 github.com/go-sql-driver/mysql v1.5.0 - github.com/go-stack/stack v1.8.0 // indirect - github.com/inconshreveable/log15 v0.0.0-20201112154412-8562bdadbbac github.com/libgit2/git2go/v33 v33.0.4 - github.com/mattn/go-colorable v0.1.8 // indirect - github.com/mattn/go-isatty v0.0.12 // indirect github.com/mattn/go-sqlite3 v1.14.8 - github.com/newrelic/go-agent/v3 v3.15.1 + github.com/newrelic/go-agent/v3 v3.15.2 github.com/o1egl/paseto v1.0.0 - github.com/omegaup/githttp/v2 v2.2.1 - github.com/omegaup/go-base/tracing/newrelic v0.0.0-20211201150123-3ace5d86e12a - github.com/omegaup/go-base/v2 v2.3.0 - github.com/omegaup/quark v1.8.0 + github.com/omegaup/githttp/v2 v2.4.0 + github.com/omegaup/go-base/logging/log15 v0.0.0-20211211212159-014332e01547 + github.com/omegaup/go-base/tracing/newrelic v0.0.0-20211211212159-014332e01547 + github.com/omegaup/go-base/v3 v3.2.0 + github.com/omegaup/quark v1.9.1 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.8.0 github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9 - golang.org/x/sys v0.0.0-20201214095126-aec9a390925b // indirect golang.org/x/text v0.3.4 ) require ( github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect + github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 // indirect github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.1.1 // indirect + github.com/go-logfmt/logfmt v0.5.1 // indirect + github.com/go-stack/stack v1.8.1 // indirect github.com/golang/protobuf v1.4.3 // indirect + github.com/inconshreveable/log15 v0.0.0-20201112154412-8562bdadbbac // indirect + github.com/mattn/go-colorable v0.1.12 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/common v0.15.0 // indirect github.com/prometheus/procfs v0.2.0 // indirect golang.org/x/net v0.0.0-20201209123823-ac852fbbde11 // indirect + golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 // indirect google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 // indirect google.golang.org/grpc v1.27.0 // indirect google.golang.org/protobuf v1.25.0 // indirect diff --git a/go.sum b/go.sum index f69a8e4..e0ae2c2 100644 --- a/go.sum +++ b/go.sum @@ -73,12 +73,15 @@ github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgO github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= +github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -175,16 +178,12 @@ github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-b github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-sqlite3 v1.14.8 h1:gDp86IdQsN/xWjIEmr9MF6o9mpksUgh0fu+9ByFxzIU= github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= @@ -211,25 +210,25 @@ github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzE github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/newrelic/go-agent v3.15.1+incompatible h1:nwDldxhCgxr3yDnMZE4v0lbWnHJ08hVcU517HdxMDeU= -github.com/newrelic/go-agent v3.15.1+incompatible/go.mod h1:a8Fv1b/fYhFSReoTU6HDkTYIMZeSVNffmoS726Y0LzQ= -github.com/newrelic/go-agent/v3 v3.15.1 h1:0N1K7fTjRty69VHUHvz7fA3bApLUs2MjzsYM4GWHYL4= github.com/newrelic/go-agent/v3 v3.15.1/go.mod h1:1A1dssWBwzB7UemzRU6ZVaGDsI+cEn5/bNxI0wiYlIc= +github.com/newrelic/go-agent/v3 v3.15.2 h1:NEpksu2AhuZncbwkDqUg2IvUJst3JQ/TemYfK4WdS/Y= +github.com/newrelic/go-agent/v3 v3.15.2/go.mod h1:1A1dssWBwzB7UemzRU6ZVaGDsI+cEn5/bNxI0wiYlIc= github.com/o1egl/paseto v1.0.0 h1:bwpvPu2au176w4IBlhbyUv/S5VPptERIA99Oap5qUd0= github.com/o1egl/paseto v1.0.0/go.mod h1:5HxsZPmw/3RI2pAwGo1HhOOwSdvBpcuVzO7uDkm+CLU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/omegaup/githttp/v2 v2.2.0 h1:KehjPh4s0L9Oj3HG7bMykqa/tZ3hDATpNQ6q9ql9in8= -github.com/omegaup/githttp/v2 v2.2.0/go.mod h1:QOU20srNzkvDPsJpFbloR9yWrlwCcRW7Q2d9tIW3x/M= -github.com/omegaup/githttp/v2 v2.2.1 h1:dEpQDSQB7HOGDuX5oh93YqT/f3Be1QsnO+r03P6jopI= -github.com/omegaup/githttp/v2 v2.2.1/go.mod h1:QOU20srNzkvDPsJpFbloR9yWrlwCcRW7Q2d9tIW3x/M= -github.com/omegaup/go-base/tracing/newrelic v0.0.0-20211201150123-3ace5d86e12a h1:vORkEPKY98j2/dqacWsrj/4uEM3qecgLMjwPZgBGH04= -github.com/omegaup/go-base/tracing/newrelic v0.0.0-20211201150123-3ace5d86e12a/go.mod h1:oFTFEE0LxFk4ahZfZe+rV0aPdJbtSiDoTlvrGZXqTyY= -github.com/omegaup/go-base/v2 v2.3.0 h1:u5juOm0O96ZeuJu3xYSwvyGtstIkCEDT/F016gzSfow= -github.com/omegaup/go-base/v2 v2.3.0/go.mod h1:DotC1e60GE6S+iqe9RyusanekwK/eyU/YL3so86X3SA= -github.com/omegaup/quark v1.8.0 h1:6R94QZXRPSolV8hZPMP1XG7FsMli7i1R+16BmX6J/E4= -github.com/omegaup/quark v1.8.0/go.mod h1:BUIueJ/VdhRV153bByGGH1ngC9eLaBaJpXyJS+if4/4= +github.com/omegaup/githttp/v2 v2.4.0 h1:JzofX/w5GcSpT2WSJqQxZB1PwRwn0lguN1qjedM25Gg= +github.com/omegaup/githttp/v2 v2.4.0/go.mod h1:TQ9YAhkWccbhyLQ6HAYElCgO8qpYqhNlhCnCbOGCMP0= +github.com/omegaup/go-base/logging/log15 v0.0.0-20211211212159-014332e01547 h1:+SBWLdt2W+OwgpSmpa7AQyfUP7e/vMRtZpxINbYObaY= +github.com/omegaup/go-base/logging/log15 v0.0.0-20211211212159-014332e01547/go.mod h1:adWq3jVZVRlre+15uby0M/AQiAFdpQPYnXiKK90KD4Q= +github.com/omegaup/go-base/tracing/newrelic v0.0.0-20211211212159-014332e01547 h1:4xRiCayV7L85BMdfEIpW+jJJd6TvphVP/QVh+Mp6rUw= +github.com/omegaup/go-base/tracing/newrelic v0.0.0-20211211212159-014332e01547/go.mod h1:jy2f4HY7BrytmlL1KujXUVxK3+rXerZ4JdPmMa/bR54= +github.com/omegaup/go-base/v3 v3.0.0/go.mod h1:mJFH+bckd4aAXcpXDBFN6Et5p3sxYsHCxK8pUDp0YlM= +github.com/omegaup/go-base/v3 v3.2.0 h1:exzk5NudNpJVn8chvvznFpI5gDZh45+ZVJE1PaWnVWQ= +github.com/omegaup/go-base/v3 v3.2.0/go.mod h1:mJFH+bckd4aAXcpXDBFN6Et5p3sxYsHCxK8pUDp0YlM= +github.com/omegaup/quark v1.9.1 h1:13vhxWkLGuVgkkCdDXmU4vhKEZZAJghn60dzcuNpGHs= +github.com/omegaup/quark v1.9.1/go.mod h1:GuxbSrGKQXXE4SHNM9hJdNo03ybIoD/ZRPGGDySKQr4= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= @@ -385,27 +384,23 @@ golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191206220618-eeba5f6aabab/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201214095126-aec9a390925b h1:tv7/y4pd+sR8bcNb2D6o7BNU6zjWm0VjQLac+w7fNNM= -golang.org/x/sys v0.0.0-20201214095126-aec9a390925b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 h1:foEbQz/B0Oz6YIqu/69kfXPYeFQAuuMYFkjaqXzl5Wo= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= diff --git a/handler.go b/handler.go index 4731787..9f44648 100644 --- a/handler.go +++ b/handler.go @@ -20,11 +20,11 @@ import ( "github.com/omegaup/githttp/v2" "github.com/omegaup/gitserver/request" - base "github.com/omegaup/go-base/v2" - tracing "github.com/omegaup/go-base/v2/tracing" + base "github.com/omegaup/go-base/v3" + "github.com/omegaup/go-base/v3/logging" + "github.com/omegaup/go-base/v3/tracing" "github.com/omegaup/quark/common" - "github.com/inconshreveable/log15" git "github.com/libgit2/git2go/v33" "github.com/pkg/errors" ) @@ -208,7 +208,7 @@ type gitProtocol struct { allowDirectPushToMaster bool hardOverallWallTimeLimit base.Duration interactiveSettingsCompiler InteractiveSettingsCompiler - log log15.Logger + log logging.Logger } // GitProtocolOpts contains all the possible options to initialize the git protocol. @@ -223,9 +223,6 @@ type GitProtocolOpts struct { // NewGitProtocol creates a new GitProtocol with the provided authorization // callback. func NewGitProtocol(opts GitProtocolOpts) *githttp.GitProtocol { - if opts.Log == nil { - opts.Log = log15.New() - } protocol := &gitProtocol{ allowDirectPushToMaster: opts.AllowDirectPushToMaster, hardOverallWallTimeLimit: opts.HardOverallWallTimeLimit, @@ -519,7 +516,7 @@ func validateUpdateMaster( allowDirectPush bool, hardOverallWallTimeLimit base.Duration, interactiveSettingsCompiler InteractiveSettingsCompiler, - log log15.Logger, + log logging.Logger, ) error { defer tracing.FromContext(ctx).StartSegment("validateUpdateMaster").End() it, err := repo.NewReferenceIteratorGlob("refs/changes/*") @@ -1440,9 +1437,7 @@ func (p *gitProtocol) validateChange( err = newTree.Walk(func(name string, entry *git.TreeEntry) error { objectCount++ if objectCount > objectLimit { - p.log.Error( - "Tree exceeded object limit", - ) + p.log.Error("Tree exceeded object limit", nil) return ErrTooManyObjects } return nil @@ -1497,14 +1492,18 @@ func (p *gitProtocol) validateUpdate( p.log.Info( "Update", - "command", command, - "request", requestContext.Request, + map[string]interface{}{ + "command": command, + "request": requestContext.Request, + }, ) if command.IsDelete() { p.log.Error( "deleting references is disallowed", - "ref", command.ReferenceName, - "request", requestContext.Request, + map[string]interface{}{ + "ref": command.ReferenceName, + "request": requestContext.Request, + }, ) return githttp.ErrDeleteDisallowed } @@ -1515,8 +1514,10 @@ func (p *gitProtocol) validateUpdate( !githttp.ValidateFastForward(repo, newCommit, command.Reference) { p.log.Error( "non-fast-forward is not allowed for this branch", - "ref", command.ReferenceName, - "request", requestContext.Request, + map[string]interface{}{ + "ref": command.ReferenceName, + "request": requestContext.Request, + }, ) return githttp.ErrNonFastForward } @@ -1532,8 +1533,10 @@ func (p *gitProtocol) validateUpdate( !strings.HasPrefix(command.ReferenceName, "refs/changes/") { p.log.Error( "invalid reference", - "ref", command.ReferenceName, - "request", requestContext.Request, + map[string]interface{}{ + "ref": command.ReferenceName, + "request": requestContext.Request, + }, ) return githttp.ErrInvalidRef } @@ -1545,8 +1548,10 @@ func (p *gitProtocol) validateUpdate( command.ReferenceName == "refs/heads/private" { p.log.Error( "read-only reference", - "ref", command.ReferenceName, - "request", requestContext.Request, + map[string]interface{}{ + "ref": command.ReferenceName, + "request": requestContext.Request, + }, ) return githttp.ErrReadOnlyRef } @@ -1555,8 +1560,10 @@ func (p *gitProtocol) validateUpdate( if !requestContext.Request.CanEdit { p.log.Error( "cannot modify reference due to not having permissions", - "ref", command.ReferenceName, - "request", requestContext.Request, + map[string]interface{}{ + "ref": command.ReferenceName, + "request": requestContext.Request, + }, ) return githttp.ErrForbidden } @@ -1573,8 +1580,10 @@ func (p *gitProtocol) validateUpdate( if !requestContext.Request.CanEdit { p.log.Error( "cannot modify reference due to not having permissions", - "ref", command.ReferenceName, - "request", requestContext.Request, + map[string]interface{}{ + "ref": command.ReferenceName, + "request": requestContext.Request, + }, ) return githttp.ErrForbidden } @@ -1583,8 +1592,10 @@ func (p *gitProtocol) validateUpdate( if !requestContext.Request.IsAdmin { p.log.Error( "cannot modify reference due to being non-admin", - "ref", command.ReferenceName, - "request", requestContext.Request, + map[string]interface{}{ + "ref": command.ReferenceName, + "request": requestContext.Request, + }, ) return githttp.ErrForbidden } @@ -1593,8 +1604,10 @@ func (p *gitProtocol) validateUpdate( if !requestContext.Request.CanEdit && !requestContext.Request.HasSolved { p.log.Error( "cannot modify reference due to not having permissions", - "ref", command.ReferenceName, - "request", requestContext.Request, + map[string]interface{}{ + "ref": command.ReferenceName, + "request": requestContext.Request, + }, ) return githttp.ErrForbidden } @@ -1604,8 +1617,10 @@ func (p *gitProtocol) validateUpdate( if !requestContext.Request.CanEdit && !requestContext.Request.HasSolved { p.log.Error( "cannot modify reference due to not having permissions", - "ref", command.ReferenceName, - "request", requestContext.Request, + map[string]interface{}{ + "ref": command.ReferenceName, + "request": requestContext.Request, + }, ) return githttp.ErrForbidden } @@ -1701,7 +1716,14 @@ func (p *gitProtocol) preprocessMaster( } defer masterCommit.Free() } - p.log.Info("Updating ref", "ref", masterRef, "err", err, "masterCommit", masterCommit) + p.log.Info( + "Updating ref", + map[string]interface{}{ + "ref": masterRef, + "err": err, + "masterCommit": masterCommit, + }, + ) requestContext := request.FromContext(ctx) reviewRef := requestContext.Request.ReviewRef @@ -1747,7 +1769,12 @@ func (p *gitProtocol) preprocess( originalCommands []*githttp.GitCommand, ) (string, []*githttp.GitCommand, error) { defer tracing.FromContext(ctx).StartSegment("preprocess").End() - p.log.Info("Updating", "reference", originalCommands) + p.log.Info( + "Updating", + map[string]interface{}{ + "reference": originalCommands, + }, + ) if originalCommands[0].ReferenceName == "refs/heads/master" { return p.preprocessMaster(ctx, originalRepo, tmpDir, originalPackPath, originalCommands) } @@ -1759,7 +1786,7 @@ type GitHandlerOpts struct { RootPath string Protocol *githttp.GitProtocol Metrics base.Metrics - Log log15.Logger + Log logging.Logger Tracing tracing.Provider } diff --git a/handler_test.go b/handler_test.go index 99a81c4..c190498 100644 --- a/handler_test.go +++ b/handler_test.go @@ -22,10 +22,10 @@ import ( "github.com/omegaup/githttp/v2" "github.com/omegaup/gitserver/gitservertest" "github.com/omegaup/gitserver/request" - base "github.com/omegaup/go-base/v2" + "github.com/omegaup/go-base/logging/log15" + "github.com/omegaup/go-base/v3/logging" "github.com/omegaup/quark/common" - "github.com/inconshreveable/log15" git "github.com/libgit2/git2go/v33" ) @@ -159,7 +159,7 @@ func createCommit( oldOid *git.Oid, contents map[string]io.Reader, commitMessage string, - log log15.Logger, + log logging.Logger, ) (*git.Oid, []byte) { repo, err := git.OpenRepository(path.Join(tmpDir, problemAlias)) if err != nil { @@ -290,7 +290,10 @@ func TestInvalidRef(t *testing.T) { } ctx := context.Background() - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } ts := httptest.NewServer(NewGitHandler(GitHandlerOpts{ RootPath: tmpDir, Protocol: NewGitProtocol(GitProtocolOpts{ @@ -369,7 +372,10 @@ func TestDelete(t *testing.T) { } ctx := context.Background() - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } ts := httptest.NewServer(NewGitHandler(GitHandlerOpts{ RootPath: tmpDir, Protocol: NewGitProtocol(GitProtocolOpts{ @@ -451,7 +457,10 @@ func TestServerCreateReview(t *testing.T) { } ctx := context.Background() - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } ts := httptest.NewServer(NewGitHandler(GitHandlerOpts{ RootPath: tmpDir, Protocol: NewGitProtocol(GitProtocolOpts{ @@ -1247,7 +1256,10 @@ func TestPushGitbomb(t *testing.T) { } ctx := context.Background() - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } ts := httptest.NewServer(NewGitHandler(GitHandlerOpts{ RootPath: tmpDir, Protocol: NewGitProtocol(GitProtocolOpts{ @@ -1296,7 +1308,12 @@ func TestPushGitbomb(t *testing.T) { fileMode := git.Filemode(0100644) for i := 0; i < 24; i++ { - log.Debug("Creating gitbomb", "iteration", i) + log.Debug( + "Creating gitbomb", + map[string]interface{}{ + "iteration": i, + }, + ) treebuilder, err := repo.TreeBuilder() if err != nil { t.Fatalf("Failed to create TreeBuilder: %v", err) @@ -1320,7 +1337,7 @@ func TestPushGitbomb(t *testing.T) { t.Fatalf("Failed to lookup tree: %v", err) } - log.Debug("Tree looked up") + log.Debug("Tree looked up", nil) newCommitID, err := repo.CreateCommit( "", @@ -1371,7 +1388,10 @@ func TestConfig(t *testing.T) { } ctx := context.Background() - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } ts := httptest.NewServer(NewGitHandler(GitHandlerOpts{ RootPath: tmpDir, Protocol: NewGitProtocol(GitProtocolOpts{ @@ -1725,7 +1745,10 @@ func TestInteractive(t *testing.T) { } ctx := context.Background() - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } ts := httptest.NewServer(NewGitHandler(GitHandlerOpts{ RootPath: tmpDir, Protocol: NewGitProtocol(GitProtocolOpts{ @@ -1896,7 +1919,10 @@ func TestExampleCases(t *testing.T) { } ctx := context.Background() - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } ts := httptest.NewServer(NewGitHandler(GitHandlerOpts{ RootPath: tmpDir, Protocol: NewGitProtocol(GitProtocolOpts{ @@ -2229,7 +2255,10 @@ func TestStatements(t *testing.T) { } ctx := context.Background() - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } ts := httptest.NewServer(NewGitHandler(GitHandlerOpts{ RootPath: tmpDir, Protocol: NewGitProtocol(GitProtocolOpts{ @@ -2331,7 +2360,10 @@ func TestTests(t *testing.T) { } ctx := context.Background() - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } ts := httptest.NewServer(NewGitHandler(GitHandlerOpts{ RootPath: tmpDir, Protocol: NewGitProtocol(GitProtocolOpts{ diff --git a/libinteractive.go b/libinteractive.go index 818935e..4895b3c 100644 --- a/libinteractive.go +++ b/libinteractive.go @@ -6,8 +6,9 @@ import ( "io" "os/exec" - "github.com/inconshreveable/log15" + "github.com/omegaup/go-base/v3/logging" "github.com/omegaup/quark/common" + "github.com/pkg/errors" ) @@ -29,7 +30,7 @@ type InteractiveSettingsCompiler interface { type LibinteractiveCompiler struct { // A way to optionally override the path of libinteractive.jar. LibinteractiveJarPath string - Log log15.Logger + Log logging.Logger } // GetInteractiveSettings calls libinteractive.jar to produce the @@ -63,7 +64,13 @@ func (c *LibinteractiveCompiler) GetInteractiveSettings( go (func() { defer stdin.Close() if _, err := io.Copy(stdin, contents); err != nil { - c.Log.Error("Failed to write to libinteractive", "cmd", cmd, "err", err) + c.Log.Error( + "Failed to write to libinteractive", + map[string]interface{}{ + "cmd": cmd, + "err": err, + }, + ) stdinErrChan <- err } close(stdinErrChan) @@ -82,8 +89,10 @@ func (c *LibinteractiveCompiler) GetInteractiveSettings( if err := json.NewDecoder(stdout).Decode(&settings); err != nil { c.Log.Error( "Failed to read from libinteractive", - "cmd", cmd, - "err", err, + map[string]interface{}{ + "cmd": cmd, + "err": err, + }, ) settingsChan <- nil } else { @@ -103,7 +112,13 @@ func (c *LibinteractiveCompiler) GetInteractiveSettings( go (func() { var buffer bytes.Buffer if _, err := io.Copy(&buffer, stderr); err != nil { - c.Log.Error("Failed to copy libinteractive stderr", "cmd", cmd, "err", err) + c.Log.Error( + "Failed to copy libinteractive stderr", + map[string]interface{}{ + "cmd": cmd, + "err": err, + }, + ) } stderrChan <- &buffer close(stderrChan) @@ -113,9 +128,11 @@ func (c *LibinteractiveCompiler) GetInteractiveSettings( stderrError := errors.New((<-stderrChan).String()) c.Log.Error( "Failed to run command", - "cmd", cmd, - "err", err, - "stderr", stderrError, + map[string]interface{}{ + "cmd": cmd, + "err": err, + "stderr": stderrError, + }, ) return nil, errors.Wrap( stderrError, diff --git a/metrics.go b/metrics.go index 88028e8..401031b 100644 --- a/metrics.go +++ b/metrics.go @@ -4,7 +4,7 @@ import ( "net/http" "runtime" - base "github.com/omegaup/go-base/v2" + base "github.com/omegaup/go-base/v3" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" diff --git a/request/request.go b/request/request.go index 66d8a2d..0aa37f9 100644 --- a/request/request.go +++ b/request/request.go @@ -4,7 +4,7 @@ import ( "context" "io" - base "github.com/omegaup/go-base/v2" + base "github.com/omegaup/go-base/v3" ) type key int diff --git a/ziphandler.go b/ziphandler.go index c976ed7..13641db 100644 --- a/ziphandler.go +++ b/ziphandler.go @@ -21,11 +21,11 @@ import ( "github.com/omegaup/githttp/v2" "github.com/omegaup/gitserver/request" - base "github.com/omegaup/go-base/v2" - "github.com/omegaup/go-base/v2/tracing" + base "github.com/omegaup/go-base/v3" + "github.com/omegaup/go-base/v3/logging" + "github.com/omegaup/go-base/v3/tracing" "github.com/omegaup/quark/common" - "github.com/inconshreveable/log15" git "github.com/libgit2/git2go/v33" "github.com/pkg/errors" ) @@ -368,7 +368,7 @@ func CreatePackfile( author, committer *git.Signature, commitMessage string, w io.Writer, - log log15.Logger, + log logging.Logger, ) (*git.Oid, error) { defer tracing.FromContext(ctx).StartSegment("CreatePackfile").End() odb, err := repo.Odb() @@ -629,7 +629,13 @@ func CreatePackfile( defer treebuilder.Free() for topLevelComponent, files := range trees { - log.Debug("Building top-level tree", "name", topLevelComponent, "files", files) + log.Debug( + "Building top-level tree", + map[string]interface{}{ + "name": topLevelComponent, + "files": files, + }, + ) tree, err := githttp.BuildTree(repo, files, log) if err != nil { return nil, base.ErrorWithCategory( @@ -657,7 +663,13 @@ func CreatePackfile( } for topLevelComponent, oid := range topLevelEntries { - log.Debug("Adding top-level file", "name", topLevelComponent, "id", oid.String()) + log.Debug( + "Adding top-level file", + map[string]interface{}{ + "name": topLevelComponent, + "id": oid.String(), + }, + ) if err = treebuilder.Insert(topLevelComponent, oid, 0100644); err != nil { return nil, base.ErrorWithCategory( ErrInternalGit, @@ -772,7 +784,12 @@ func CreatePackfile( treeID = mergedTree.Id() } - log.Debug("Final tree created", "id", treeID.String()) + log.Debug( + "Final tree created", + map[string]interface{}{ + "id": treeID.String(), + }, + ) tree, err := repo.LookupTree(treeID) if err != nil { return nil, base.ErrorWithCategory( @@ -956,7 +973,7 @@ func ConvertZipToPackfile( commitMessage string, acceptsSubmissions bool, w io.Writer, - log log15.Logger, + log logging.Logger, ) (*git.Oid, error) { defer tracing.FromContext(ctx).StartSegment("ConvertZipToPackfile").End() contents := make(map[string]io.Reader) @@ -991,7 +1008,12 @@ func ConvertZipToPackfile( } if !isValidFile { - log.Info("Skipping file", "path", zipfilePath) + log.Info( + "Skipping file", + map[string]interface{}{ + "path": zipfilePath, + }, + ) } zipFile, err := problemFiles.Open(zipfilePath) @@ -1099,7 +1121,9 @@ func ConvertZipToPackfile( log.Info( "Zip is valid", - "Files", problemFiles.Files(), + map[string]interface{}{ + "Files": problemFiles.Files(), + }, ) return CreatePackfile( @@ -1133,7 +1157,7 @@ func PushZip( acceptsSubmissions bool, updatePublished bool, protocol *githttp.GitProtocol, - log log15.Logger, + log logging.Logger, ) (*UpdateResult, error) { defer tracing.FromContext(ctx).StartSegment("PushZip").End() oldOid := &git.Oid{} @@ -1246,7 +1270,7 @@ func PushZip( } } if masterNewOid.IsZero() { - log.Error("could not find the updated reference for master") + log.Error("could not find the updated reference for master", nil) } else { if publishedBranch, err := repo.LookupBranch("published", git.BranchLocal); err == nil { publishedUpdatedRef.From = publishedBranch.Target().String() @@ -1280,7 +1304,7 @@ type zipUploadHandler struct { rootPath string protocol *githttp.GitProtocol metrics base.Metrics - log log15.Logger + log logging.Logger tracing tracing.Provider } @@ -1288,6 +1312,7 @@ func (h *zipUploadHandler) handleGitUploadZip( w http.ResponseWriter, r *http.Request, repositoryName string, + log logging.Logger, ) { txn := tracing.FromContext(r.Context()) if r.Method != "POST" { @@ -1299,7 +1324,12 @@ func (h *zipUploadHandler) handleGitUploadZip( var paramValue func(string) string if strings.HasPrefix(r.Header.Get("Content-Type"), "multipart/form-data") { if err := r.ParseMultipartForm((32 * base.Mebibyte).Bytes()); err != nil { - h.log.Error("Unable to parse multipart form", "err", err) + log.Error( + "Unable to parse multipart form", + map[string]interface{}{ + "err": err, + }, + ) w.WriteHeader(http.StatusBadRequest) return } @@ -1310,7 +1340,12 @@ func (h *zipUploadHandler) handleGitUploadZip( var err error requestZip, requestZipHeader, err = r.FormFile("contents") if err != nil { - h.log.Error("Invalid contents", "err", err) + log.Error( + "Invalid contents", + map[string]interface{}{ + "err": err, + }, + ) w.WriteHeader(http.StatusBadRequest) return } @@ -1325,14 +1360,19 @@ func (h *zipUploadHandler) handleGitUploadZip( } requestZip = r.Body } else { - h.log.Error("Bad content type", "Content-Type", r.Header.Get("Content-Type")) + log.Error( + "Bad content type", + map[string]interface{}{ + "Content-Type": r.Header.Get("Content-Type"), + }, + ) w.WriteHeader(http.StatusUnsupportedMediaType) return } commitMessage := paramValue("message") if commitMessage == "" { - h.log.Error("Missing 'message' field") + log.Error("Missing 'message' field", nil) w.WriteHeader(http.StatusBadRequest) return } @@ -1340,7 +1380,12 @@ func (h *zipUploadHandler) handleGitUploadZip( if paramValue("settings") != "" { var unmarshaledSettings common.ProblemSettings if err := json.Unmarshal([]byte(paramValue("settings")), &unmarshaledSettings); err != nil { - h.log.Error("invalid settings", "err", err) + log.Error( + "invalid settings", + map[string]interface{}{ + "err": err, + }, + ) w.WriteHeader(http.StatusBadRequest) return } @@ -1352,7 +1397,12 @@ func (h *zipUploadHandler) handleGitUploadZip( paramValue("updatePublished") == "true") zipMergeStrategy, err := ParseZipMergeStrategy(paramValue("mergeStrategy")) if err != nil { - h.log.Error("invalid merge strategy", "mergeStrategy", paramValue("mergeStrategy")) + log.Error( + "invalid merge strategy", + map[string]interface{}{ + "mergeStrategy": paramValue("mergeStrategy"), + }, + ) w.WriteHeader(http.StatusBadRequest) return } @@ -1362,17 +1412,29 @@ func (h *zipUploadHandler) handleGitUploadZip( requestContext.Request.Create = r.URL.Query().Get("create") != "" repositoryPath := path.Join(h.rootPath, repositoryName) - h.log.Info( + log.Info( "git-upload-zip", - "path", repositoryPath, - "create", requestContext.Request.Create, + map[string]interface{}{ + "path": repositoryPath, + "create": requestContext.Request.Create, + }, ) if _, err := os.Stat(repositoryPath); os.IsNotExist(err) != requestContext.Request.Create { if requestContext.Request.Create { - h.log.Error("Creating on top of an existing directory", "path", repositoryPath) + log.Error( + "Creating on top of an existing directory", + map[string]interface{}{ + "path": repositoryPath, + }, + ) w.WriteHeader(http.StatusConflict) } else { - h.log.Error("Updating a missing directory", "path", repositoryPath) + log.Error( + "Updating a missing directory", + map[string]interface{}{ + "path": repositoryPath, + }, + ) w.WriteHeader(http.StatusNotFound) } return @@ -1392,7 +1454,13 @@ func (h *zipUploadHandler) handleGitUploadZip( zipSize, err := io.Copy(tempfile, &io.LimitedReader{R: requestZip, N: maxAllowedZipSize.Bytes()}) if err != nil { - h.log.Error("failed to copy zip", "err", err, "zipSize", zipSize) + log.Error( + "failed to copy zip", + map[string]interface{}{ + "err": err, + "zipSize": zipSize, + }, + ) w.WriteHeader(http.StatusInternalServerError) return } @@ -1402,7 +1470,12 @@ func (h *zipUploadHandler) handleGitUploadZip( } zipReader, err := zip.OpenReader(tempfile.Name()) if err != nil { - h.log.Error("failed to read zip", "err", err) + log.Error( + "failed to read zip", + map[string]interface{}{ + "err": err, + }, + ) w.WriteHeader(http.StatusBadRequest) return } @@ -1423,7 +1496,12 @@ func (h *zipUploadHandler) handleGitUploadZip( if requestContext.Request.Create { dir, err := ioutil.TempDir(filepath.Dir(repositoryPath), "repository") if err != nil { - h.log.Error("Failed to create temporary directory", "err", err) + log.Error( + "Failed to create temporary directory", + map[string]interface{}{ + "err": err, + }, + ) w.WriteHeader(http.StatusInternalServerError) openRepoSegment.End() return @@ -1431,7 +1509,12 @@ func (h *zipUploadHandler) handleGitUploadZip( defer os.RemoveAll(dir) if err := os.Chmod(dir, 0755); err != nil { - h.log.Error("Failed to chmod temporary directory", "err", err) + log.Error( + "Failed to chmod temporary directory", + map[string]interface{}{ + "err": err, + }, + ) w.WriteHeader(http.StatusInternalServerError) openRepoSegment.End() return @@ -1439,7 +1522,12 @@ func (h *zipUploadHandler) handleGitUploadZip( repo, err = InitRepository(ctx, dir) if err != nil { - h.log.Error("failed to init repository", "err", err) + log.Error( + "failed to init repository", + map[string]interface{}{ + "err": err, + }, + ) w.WriteHeader(http.StatusInternalServerError) openRepoSegment.End() return @@ -1450,7 +1538,12 @@ func (h *zipUploadHandler) handleGitUploadZip( } else { repo, err = git.OpenRepository(repositoryPath) if err != nil { - h.log.Error("failed to open repository", "err", err) + log.Error( + "failed to open repository", + map[string]interface{}{ + "err": err, + }, + ) w.WriteHeader(http.StatusInternalServerError) openRepoSegment.End() return @@ -1462,11 +1555,21 @@ func (h *zipUploadHandler) handleGitUploadZip( acquireLockSegment := txn.StartSegment("acquire lock") lockfile := githttp.NewLockfile(repo.Path()) if ok, err := lockfile.TryRLock(); !ok { - h.log.Info("Waiting for the lockfile", "err", err) + log.Info( + "Waiting for the lockfile", + map[string]interface{}{ + "err": err, + }, + ) err := lockfile.RLock() acquireLockSegment.End() if err != nil { - h.log.Crit("Failed to acquire the lockfile", "err", err) + log.Error( + "Failed to acquire the lockfile", + map[string]interface{}{ + "err": err, + }, + ) w.WriteHeader(http.StatusInternalServerError) return } @@ -1492,11 +1595,17 @@ func (h *zipUploadHandler) handleGitUploadZip( acceptsSubmissions, updatePublished, h.protocol, - h.log, + log, ) pushZipSegment.End() if err != nil { - h.log.Error("push failed", "path", repositoryPath, "err", err) + log.Error( + "push failed", + map[string]interface{}{ + "path": repositoryPath, + "err": err, + }, + ) cause := githttp.WriteHeader(w, err, false) updateResult = &UpdateResult{ @@ -1505,11 +1614,24 @@ func (h *zipUploadHandler) handleGitUploadZip( } } else { if err := commitCallback(); err != nil { - h.log.Info("push successful, but commit failed", "path", repositoryPath, "result", updateResult, "err", err) + log.Info( + "push successful, but commit failed", + map[string]interface{}{ + "path": repositoryPath, + "result": updateResult, + "err": err, + }, + ) w.WriteHeader(http.StatusInternalServerError) return } - h.log.Info("push successful", "path", repositoryPath, "result", updateResult) + log.Info( + "push successful", + map[string]interface{}{ + "path": repositoryPath, + "result": updateResult, + }, + ) w.WriteHeader(http.StatusOK) } @@ -1523,6 +1645,7 @@ func (h *zipUploadHandler) handleRenameRepository( r *http.Request, repositoryName string, targetRepositoryName string, + log logging.Logger, ) { if r.Method != "GET" { w.WriteHeader(http.StatusMethodNotAllowed) @@ -1533,26 +1656,35 @@ func (h *zipUploadHandler) handleRenameRepository( repositoryPath := path.Join(h.rootPath, repositoryName) targetRepositoryPath := path.Join(h.rootPath, targetRepositoryName) - h.log.Info( + log.Info( "rename-repository", - "path", repositoryPath, - "target path", targetRepositoryPath, + map[string]interface{}{ + "path": repositoryPath, + "target path": targetRepositoryPath, + }, ) level, _ := h.protocol.AuthCallback(ctx, w, r, repositoryName, githttp.OperationPush) requestContext := request.FromContext(ctx) if level != githttp.AuthorizationAllowed || !requestContext.Request.IsSystem { - h.log.Error( + log.Error( "not allowed to rename repository", - "authorization level", level, - "request context", requestContext.Request, + map[string]interface{}{ + "authorization level": level, + "request context": requestContext.Request, + }, ) w.WriteHeader(http.StatusForbidden) return } if err := os.Rename(repositoryPath, targetRepositoryPath); err != nil { - h.log.Error("failed to rename repository", "err", err) + log.Error( + "failed to rename repository", + map[string]interface{}{ + "err": err, + }, + ) if os.IsNotExist(err) { } else if os.IsExist(err) { w.WriteHeader(http.StatusNotFound) @@ -1564,15 +1696,18 @@ func (h *zipUploadHandler) handleRenameRepository( return } - h.log.Info( + log.Info( "rename successful", - "path", repositoryPath, - "target path", targetRepositoryPath, + map[string]interface{}{ + "path": repositoryPath, + "target path": targetRepositoryPath, + }, ) w.WriteHeader(http.StatusOK) } func (h *zipUploadHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + log := h.log.NewContext(r.Context()) splitPath := strings.Split(r.URL.Path[1:], "/") if len(splitPath) < 2 { w.WriteHeader(http.StatusNotFound) @@ -1589,7 +1724,7 @@ func (h *zipUploadHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotFound) return } - h.handleGitUploadZip(w, r, repositoryName) + h.handleGitUploadZip(w, r, repositoryName, log) return } if splitPath[1] == "rename-repository" { @@ -1597,10 +1732,15 @@ func (h *zipUploadHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotFound) return } - h.handleRenameRepository(w, r, repositoryName, splitPath[2]) + h.handleRenameRepository(w, r, repositoryName, splitPath[2], log) return } - h.log.Error("failed to rename repository", "split path", splitPath) + log.Error( + "failed to rename repository", + map[string]interface{}{ + "split path": splitPath, + }, + ) w.WriteHeader(http.StatusNotFound) } @@ -1609,7 +1749,7 @@ type ZipHandlerOpts struct { RootPath string Protocol *githttp.GitProtocol Metrics base.Metrics - Log log15.Logger + Log logging.Logger Tracing tracing.Provider } @@ -1618,9 +1758,6 @@ func NewZipHandler(opts ZipHandlerOpts) http.Handler { if opts.Metrics == nil { opts.Metrics = &base.NoOpMetrics{} } - if opts.Log == nil { - opts.Log = log15.New() - } if opts.Tracing == nil { opts.Tracing = tracing.NewNoOpProvider() } diff --git a/ziphandler_test.go b/ziphandler_test.go index 05a63ff..6155146 100644 --- a/ziphandler_test.go +++ b/ziphandler_test.go @@ -20,7 +20,8 @@ import ( "github.com/omegaup/githttp/v2" "github.com/omegaup/gitserver/gitservertest" - base "github.com/omegaup/go-base/v2" + "github.com/omegaup/go-base/logging/log15" + base "github.com/omegaup/go-base/v3" "github.com/omegaup/quark/common" git "github.com/libgit2/git2go/v33" @@ -155,7 +156,10 @@ func TestPushZip(t *testing.T) { defer os.RemoveAll(tmpDir) } - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } ts := httptest.NewServer(NewZipHandler(ZipHandlerOpts{ RootPath: tmpDir, Protocol: NewGitProtocol(GitProtocolOpts{ @@ -246,7 +250,10 @@ func TestConvertZip(t *testing.T) { } defer repo.Free() - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } fileContents := map[string]string{ ".gitignore": defaultGitfiles[".gitignore"], @@ -315,7 +322,10 @@ func TestZiphandlerCases(t *testing.T) { problemAlias := "sumas" - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } ts := httptest.NewServer(NewZipHandler(ZipHandlerOpts{ RootPath: tmpDir, @@ -403,7 +413,10 @@ func TestZiphandlerSolutions(t *testing.T) { problemAlias := "sumas" - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } ts := httptest.NewServer(NewZipHandler(ZipHandlerOpts{ RootPath: tmpDir, @@ -486,7 +499,10 @@ func TestZiphandlerStatements(t *testing.T) { } defer repo.Free() - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } for idx, testcase := range []struct { name string @@ -571,7 +587,10 @@ func TestTestplan(t *testing.T) { } defer repo.Free() - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } for testplanContents, expectedError := range map[string]string{ "0 0.0.0.0": "invalid-testplan: invalid weight '0.0.0.0': strconv.ParseFloat: parsing \"0.0.0.0\": invalid syntax", @@ -634,7 +653,10 @@ func TestUpdateProblemSettings(t *testing.T) { defer os.RemoveAll(tmpDir) } - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } ts := httptest.NewServer(NewZipHandler(ZipHandlerOpts{ RootPath: tmpDir, Protocol: NewGitProtocol(GitProtocolOpts{ @@ -779,7 +801,10 @@ func TestUpdateProblemSettingsWithCustomValidator(t *testing.T) { defer os.RemoveAll(tmpDir) } - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } ts := httptest.NewServer(NewZipHandler(ZipHandlerOpts{ RootPath: tmpDir, Protocol: NewGitProtocol(GitProtocolOpts{ @@ -1037,7 +1062,10 @@ func TestRenameProblem(t *testing.T) { defer os.RemoveAll(tmpDir) } - log := base.StderrLog(false) + log, err := log15.New("info", false) + if err != nil { + t.Fatalf("Failed to create log: %v", err) + } ts := httptest.NewServer(NewZipHandler(ZipHandlerOpts{ RootPath: tmpDir, Protocol: NewGitProtocol(GitProtocolOpts{