mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 08:57:36 -04:00 
			
		
		
		
	Macaron 1.5 (#12596)
* update macaron to v1.5 of fork * update macaron to v1.5 of fork * test gzip PR * add push method impl to context_tests * use proper gzip commit Co-authored-by: zeripath <art27@cantab.net> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
This commit is contained in:
		
							
								
								
									
										90
									
								
								vendor/github.com/klauspost/compress/zstd/encoder.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										90
									
								
								vendor/github.com/klauspost/compress/zstd/encoder.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -35,21 +35,22 @@ type encoder interface { | ||||
| 	AppendCRC([]byte) []byte | ||||
| 	WindowSize(size int) int32 | ||||
| 	UseBlock(*blockEnc) | ||||
| 	Reset() | ||||
| 	Reset(singleBlock bool) | ||||
| } | ||||
|  | ||||
| type encoderState struct { | ||||
| 	w             io.Writer | ||||
| 	filling       []byte | ||||
| 	current       []byte | ||||
| 	previous      []byte | ||||
| 	encoder       encoder | ||||
| 	writing       *blockEnc | ||||
| 	err           error | ||||
| 	writeErr      error | ||||
| 	nWritten      int64 | ||||
| 	headerWritten bool | ||||
| 	eofWritten    bool | ||||
| 	w                io.Writer | ||||
| 	filling          []byte | ||||
| 	current          []byte | ||||
| 	previous         []byte | ||||
| 	encoder          encoder | ||||
| 	writing          *blockEnc | ||||
| 	err              error | ||||
| 	writeErr         error | ||||
| 	nWritten         int64 | ||||
| 	headerWritten    bool | ||||
| 	eofWritten       bool | ||||
| 	fullFrameWritten bool | ||||
|  | ||||
| 	// This waitgroup indicates an encode is running. | ||||
| 	wg sync.WaitGroup | ||||
| @@ -71,27 +72,26 @@ func NewWriter(w io.Writer, opts ...EOption) (*Encoder, error) { | ||||
| 	} | ||||
| 	if w != nil { | ||||
| 		e.Reset(w) | ||||
| 	} else { | ||||
| 		e.init.Do(func() { | ||||
| 			e.initialize() | ||||
| 		}) | ||||
| 	} | ||||
| 	return &e, nil | ||||
| } | ||||
|  | ||||
| func (e *Encoder) initialize() { | ||||
| 	if e.o.concurrent == 0 { | ||||
| 		e.o.setDefault() | ||||
| 	} | ||||
| 	e.encoders = make(chan encoder, e.o.concurrent) | ||||
| 	for i := 0; i < e.o.concurrent; i++ { | ||||
| 		e.encoders <- e.o.encoder() | ||||
| 		enc := e.o.encoder() | ||||
| 		// If not single block, history will be allocated on first use. | ||||
| 		enc.Reset(true) | ||||
| 		e.encoders <- enc | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Reset will re-initialize the writer and new writes will encode to the supplied writer | ||||
| // as a new, independent stream. | ||||
| func (e *Encoder) Reset(w io.Writer) { | ||||
| 	e.init.Do(func() { | ||||
| 		e.initialize() | ||||
| 	}) | ||||
| 	s := &e.state | ||||
| 	s.wg.Wait() | ||||
| 	s.wWg.Wait() | ||||
| @@ -115,9 +115,10 @@ func (e *Encoder) Reset(w io.Writer) { | ||||
| 	s.filling = s.filling[:0] | ||||
| 	s.current = s.current[:0] | ||||
| 	s.previous = s.previous[:0] | ||||
| 	s.encoder.Reset() | ||||
| 	s.encoder.Reset(false) | ||||
| 	s.headerWritten = false | ||||
| 	s.eofWritten = false | ||||
| 	s.fullFrameWritten = false | ||||
| 	s.w = w | ||||
| 	s.err = nil | ||||
| 	s.nWritten = 0 | ||||
| @@ -176,6 +177,23 @@ func (e *Encoder) nextBlock(final bool) error { | ||||
| 		return fmt.Errorf("block > maxStoreBlockSize") | ||||
| 	} | ||||
| 	if !s.headerWritten { | ||||
| 		// If we have a single block encode, do a sync compression. | ||||
| 		if final && len(s.filling) > 0 { | ||||
| 			s.current = e.EncodeAll(s.filling, s.current[:0]) | ||||
| 			var n2 int | ||||
| 			n2, s.err = s.w.Write(s.current) | ||||
| 			if s.err != nil { | ||||
| 				return s.err | ||||
| 			} | ||||
| 			s.nWritten += int64(n2) | ||||
| 			s.current = s.current[:0] | ||||
| 			s.filling = s.filling[:0] | ||||
| 			s.headerWritten = true | ||||
| 			s.fullFrameWritten = true | ||||
| 			s.eofWritten = true | ||||
| 			return nil | ||||
| 		} | ||||
|  | ||||
| 		var tmp [maxHeaderSize]byte | ||||
| 		fh := frameHeader{ | ||||
| 			ContentSize:   0, | ||||
| @@ -263,7 +281,7 @@ func (e *Encoder) nextBlock(final bool) error { | ||||
| 			// If we got the exact same number of literals as input, | ||||
| 			// assume the literals cannot be compressed. | ||||
| 			if len(src) != len(blk.literals) || len(src) != e.o.blockSize { | ||||
| 				err = blk.encode(e.o.noEntropy) | ||||
| 				err = blk.encode(e.o.noEntropy, !e.o.allLitEntropy) | ||||
| 			} | ||||
| 			switch err { | ||||
| 			case errIncompressible: | ||||
| @@ -298,7 +316,9 @@ func (e *Encoder) ReadFrom(r io.Reader) (n int64, err error) { | ||||
| 	src := e.state.filling | ||||
| 	for { | ||||
| 		n2, err := r.Read(src) | ||||
| 		_, _ = e.state.encoder.CRC().Write(src[:n2]) | ||||
| 		if e.o.crc { | ||||
| 			_, _ = e.state.encoder.CRC().Write(src[:n2]) | ||||
| 		} | ||||
| 		// src is now the unfilled part... | ||||
| 		src = src[n2:] | ||||
| 		n += int64(n2) | ||||
| @@ -363,6 +383,9 @@ func (e *Encoder) Close() error { | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if e.state.fullFrameWritten { | ||||
| 		return s.err | ||||
| 	} | ||||
| 	s.wg.Wait() | ||||
| 	s.wWg.Wait() | ||||
|  | ||||
| @@ -422,18 +445,14 @@ func (e *Encoder) EncodeAll(src, dst []byte) []byte { | ||||
| 		} | ||||
| 		return dst | ||||
| 	} | ||||
| 	e.init.Do(func() { | ||||
| 		e.o.setDefault() | ||||
| 		e.initialize() | ||||
| 	}) | ||||
| 	e.init.Do(e.initialize) | ||||
| 	enc := <-e.encoders | ||||
| 	defer func() { | ||||
| 		// Release encoder reference to last block. | ||||
| 		enc.Reset() | ||||
| 		// If a non-single block is needed the encoder will reset again. | ||||
| 		enc.Reset(true) | ||||
| 		e.encoders <- enc | ||||
| 	}() | ||||
| 	enc.Reset() | ||||
| 	blk := enc.Block() | ||||
| 	// Use single segments when above minimum window and below 1MB. | ||||
| 	single := len(src) < 1<<20 && len(src) > MinWindowSize | ||||
| 	if e.o.single != nil { | ||||
| @@ -456,12 +475,13 @@ func (e *Encoder) EncodeAll(src, dst []byte) []byte { | ||||
| 		panic(err) | ||||
| 	} | ||||
|  | ||||
| 	if len(src) <= e.o.blockSize && len(src) <= maxBlockSize { | ||||
| 	// If we can do everything in one block, prefer that. | ||||
| 	if len(src) <= maxCompressedBlockSize { | ||||
| 		// Slightly faster with no history and everything in one block. | ||||
| 		if e.o.crc { | ||||
| 			_, _ = enc.CRC().Write(src) | ||||
| 		} | ||||
| 		blk.reset(nil) | ||||
| 		blk := enc.Block() | ||||
| 		blk.last = true | ||||
| 		enc.EncodeNoHist(blk, src) | ||||
|  | ||||
| @@ -472,7 +492,7 @@ func (e *Encoder) EncodeAll(src, dst []byte) []byte { | ||||
| 		if len(blk.literals) != len(src) || len(src) != e.o.blockSize { | ||||
| 			// Output directly to dst | ||||
| 			blk.output = dst | ||||
| 			err = blk.encode(e.o.noEntropy) | ||||
| 			err = blk.encode(e.o.noEntropy, !e.o.allLitEntropy) | ||||
| 		} | ||||
|  | ||||
| 		switch err { | ||||
| @@ -488,6 +508,8 @@ func (e *Encoder) EncodeAll(src, dst []byte) []byte { | ||||
| 		} | ||||
| 		blk.output = oldout | ||||
| 	} else { | ||||
| 		enc.Reset(false) | ||||
| 		blk := enc.Block() | ||||
| 		for len(src) > 0 { | ||||
| 			todo := src | ||||
| 			if len(todo) > e.o.blockSize { | ||||
| @@ -507,7 +529,7 @@ func (e *Encoder) EncodeAll(src, dst []byte) []byte { | ||||
| 			// If we got the exact same number of literals as input, | ||||
| 			// assume the literals cannot be compressed. | ||||
| 			if len(blk.literals) != len(todo) || len(todo) != e.o.blockSize { | ||||
| 				err = blk.encode(e.o.noEntropy) | ||||
| 				err = blk.encode(e.o.noEntropy, !e.o.allLitEntropy) | ||||
| 			} | ||||
|  | ||||
| 			switch err { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user