123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- // Copyright 2022 The Gitea Authors. All rights reserved.
- // SPDX-License-Identifier: MIT
-
- package actions
-
- import (
- "bytes"
- "encoding/binary"
- "encoding/hex"
- "errors"
- "fmt"
- "io"
- "time"
-
- auth_model "code.gitea.io/gitea/models/auth"
- "code.gitea.io/gitea/modules/timeutil"
- "code.gitea.io/gitea/modules/util"
- )
-
- func generateSaltedToken() (string, string, string, string, error) {
- salt, err := util.CryptoRandomString(10)
- if err != nil {
- return "", "", "", "", err
- }
- buf, err := util.CryptoRandomBytes(20)
- if err != nil {
- return "", "", "", "", err
- }
- token := hex.EncodeToString(buf)
- hash := auth_model.HashToken(token, salt)
- return token, salt, hash, token[len(token)-8:], nil
- }
-
- /*
- LogIndexes is the index for mapping log line number to buffer offset.
- Because it uses varint encoding, it is impossible to predict its size.
- But we can make a simple estimate with an assumption that each log line has 200 byte, then:
- | lines | file size | index size |
- |-----------|---------------------|--------------------|
- | 100 | 20 KiB(20000) | 258 B(258) |
- | 1000 | 195 KiB(200000) | 2.9 KiB(2958) |
- | 10000 | 1.9 MiB(2000000) | 34 KiB(34715) |
- | 100000 | 19 MiB(20000000) | 386 KiB(394715) |
- | 1000000 | 191 MiB(200000000) | 4.1 MiB(4323626) |
- | 10000000 | 1.9 GiB(2000000000) | 47 MiB(49323626) |
- | 100000000 | 19 GiB(20000000000) | 490 MiB(513424280) |
- */
- type LogIndexes []int64
-
- func (indexes *LogIndexes) FromDB(b []byte) error {
- reader := bytes.NewReader(b)
- for {
- v, err := binary.ReadVarint(reader)
- if err != nil {
- if errors.Is(err, io.EOF) {
- return nil
- }
- return fmt.Errorf("binary ReadVarint: %w", err)
- }
- *indexes = append(*indexes, v)
- }
- }
-
- func (indexes *LogIndexes) ToDB() ([]byte, error) {
- buf, i := make([]byte, binary.MaxVarintLen64*len(*indexes)), 0
- for _, v := range *indexes {
- n := binary.PutVarint(buf[i:], v)
- i += n
- }
- return buf[:i], nil
- }
-
- var timeSince = time.Since
-
- func calculateDuration(started, stopped timeutil.TimeStamp, status Status) time.Duration {
- if started == 0 {
- return 0
- }
- s := started.AsTime()
- if status.IsDone() {
- return stopped.AsTime().Sub(s)
- }
- return timeSince(s).Truncate(time.Second)
- }
|