@@ -6,6 +6,7 @@ package cmd
6
6
import (
7
7
"bufio"
8
8
"bytes"
9
+ "context"
9
10
"fmt"
10
11
"io"
11
12
"net/http"
@@ -167,11 +168,11 @@ func runHookPreReceive(c *cli.Context) error {
167
168
ctx , cancel := installSignals ()
168
169
defer cancel ()
169
170
170
- setup ("hooks/pre-receive.log" , c .Bool ("debug" ))
171
+ setup (ctx , c .Bool ("debug" ))
171
172
172
173
if len (os .Getenv ("SSH_ORIGINAL_COMMAND" )) == 0 {
173
174
if setting .OnlyAllowPushIfGiteaEnvironmentSet {
174
- return fail (`Rejecting changes as Gitea environment not set.
175
+ return fail (ctx , `Rejecting changes as Gitea environment not set.
175
176
If you are pushing over SSH you must push with a key managed by
176
177
Gitea or set your environment appropriately.` , "" )
177
178
}
@@ -262,9 +263,9 @@ Gitea or set your environment appropriately.`, "")
262
263
case http .StatusOK :
263
264
// no-op
264
265
case http .StatusInternalServerError :
265
- return fail (" Internal Server Error" , msg )
266
+ return fail (ctx , "HookPreReceive: Internal Server Error (500) " , msg )
266
267
default :
267
- return fail (msg , "" )
268
+ return fail (ctx , fmt . Sprintf ( "HookPreReceive: %s" , msg ), msg )
268
269
}
269
270
count = 0
270
271
lastline = 0
@@ -288,9 +289,9 @@ Gitea or set your environment appropriately.`, "")
288
289
statusCode , msg := private .HookPreReceive (ctx , username , reponame , hookOptions )
289
290
switch statusCode {
290
291
case http .StatusInternalServerError :
291
- return fail ("Internal Server Error" , msg )
292
+ return fail (ctx , "Internal Server Error" , msg )
292
293
case http .StatusForbidden :
293
- return fail (msg , "" )
294
+ return fail (ctx , msg , "" )
294
295
}
295
296
} else if lastline > 0 {
296
297
fmt .Fprintf (out , "\n " )
@@ -309,7 +310,7 @@ func runHookPostReceive(c *cli.Context) error {
309
310
ctx , cancel := installSignals ()
310
311
defer cancel ()
311
312
312
- setup ("hooks/post-receive.log" , c .Bool ("debug" ))
313
+ setup (ctx , c .Bool ("debug" ))
313
314
314
315
// First of all run update-server-info no matter what
315
316
if _ , _ , err := git .NewCommand (ctx , "update-server-info" ).RunStdString (nil ); err != nil {
@@ -323,7 +324,7 @@ func runHookPostReceive(c *cli.Context) error {
323
324
324
325
if len (os .Getenv ("SSH_ORIGINAL_COMMAND" )) == 0 {
325
326
if setting .OnlyAllowPushIfGiteaEnvironmentSet {
326
- return fail (`Rejecting changes as Gitea environment not set.
327
+ return fail (ctx , `Rejecting changes as Gitea environment not set.
327
328
If you are pushing over SSH you must push with a key managed by
328
329
Gitea or set your environment appropriately.` , "" )
329
330
}
@@ -398,7 +399,7 @@ Gitea or set your environment appropriately.`, "")
398
399
if resp == nil {
399
400
_ = dWriter .Close ()
400
401
hookPrintResults (results )
401
- return fail ("Internal Server Error" , err )
402
+ return fail (ctx , "Internal Server Error" , err )
402
403
}
403
404
wasEmpty = wasEmpty || resp .RepoWasEmpty
404
405
results = append (results , resp .Results ... )
@@ -411,7 +412,7 @@ Gitea or set your environment appropriately.`, "")
411
412
// We need to tell the repo to reset the default branch to master
412
413
err := private .SetDefaultBranch (ctx , repoUser , repoName , "master" )
413
414
if err != nil {
414
- return fail ("Internal Server Error" , "SetDefaultBranch failed with Error: %v" , err )
415
+ return fail (ctx , "Internal Server Error" , "SetDefaultBranch failed with Error: %v" , err )
415
416
}
416
417
}
417
418
fmt .Fprintf (out , "Processed %d references in total\n " , total )
@@ -431,7 +432,7 @@ Gitea or set your environment appropriately.`, "")
431
432
if resp == nil {
432
433
_ = dWriter .Close ()
433
434
hookPrintResults (results )
434
- return fail ("Internal Server Error" , err )
435
+ return fail (ctx , "Internal Server Error" , err )
435
436
}
436
437
wasEmpty = wasEmpty || resp .RepoWasEmpty
437
438
results = append (results , resp .Results ... )
@@ -442,7 +443,7 @@ Gitea or set your environment appropriately.`, "")
442
443
// We need to tell the repo to reset the default branch to master
443
444
err := private .SetDefaultBranch (ctx , repoUser , repoName , "master" )
444
445
if err != nil {
445
- return fail ("Internal Server Error" , "SetDefaultBranch failed with Error: %v" , err )
446
+ return fail (ctx , "Internal Server Error" , "SetDefaultBranch failed with Error: %v" , err )
446
447
}
447
448
}
448
449
_ = dWriter .Close ()
@@ -485,22 +486,22 @@ func pushOptions() map[string]string {
485
486
}
486
487
487
488
func runHookProcReceive (c * cli.Context ) error {
488
- setup ("hooks/proc-receive.log" , c .Bool ("debug" ))
489
+ ctx , cancel := installSignals ()
490
+ defer cancel ()
491
+
492
+ setup (ctx , c .Bool ("debug" ))
489
493
490
494
if len (os .Getenv ("SSH_ORIGINAL_COMMAND" )) == 0 {
491
495
if setting .OnlyAllowPushIfGiteaEnvironmentSet {
492
- return fail (`Rejecting changes as Gitea environment not set.
496
+ return fail (ctx , `Rejecting changes as Gitea environment not set.
493
497
If you are pushing over SSH you must push with a key managed by
494
498
Gitea or set your environment appropriately.` , "" )
495
499
}
496
500
return nil
497
501
}
498
502
499
- ctx , cancel := installSignals ()
500
- defer cancel ()
501
-
502
503
if git .CheckGitVersionAtLeast ("2.29" ) != nil {
503
- return fail ("Internal Server Error" , "git not support proc-receive." )
504
+ return fail (ctx , "Internal Server Error" , "git not support proc-receive." )
504
505
}
505
506
506
507
reader := bufio .NewReader (os .Stdin )
@@ -515,7 +516,7 @@ Gitea or set your environment appropriately.`, "")
515
516
// H: PKT-LINE(version=1\0push-options...)
516
517
// H: flush-pkt
517
518
518
- rs , err := readPktLine (reader , pktLineTypeData )
519
+ rs , err := readPktLine (ctx , reader , pktLineTypeData )
519
520
if err != nil {
520
521
return err
521
522
}
@@ -530,19 +531,19 @@ Gitea or set your environment appropriately.`, "")
530
531
531
532
index := bytes .IndexByte (rs .Data , byte (0 ))
532
533
if index >= len (rs .Data ) {
533
- return fail ("Internal Server Error" , "pkt-line: format error " + fmt .Sprint (rs .Data ))
534
+ return fail (ctx , "Internal Server Error" , "pkt-line: format error " + fmt .Sprint (rs .Data ))
534
535
}
535
536
536
537
if index < 0 {
537
538
if len (rs .Data ) == 10 && rs .Data [9 ] == '\n' {
538
539
index = 9
539
540
} else {
540
- return fail ("Internal Server Error" , "pkt-line: format error " + fmt .Sprint (rs .Data ))
541
+ return fail (ctx , "Internal Server Error" , "pkt-line: format error " + fmt .Sprint (rs .Data ))
541
542
}
542
543
}
543
544
544
545
if string (rs .Data [0 :index ]) != VersionHead {
545
- return fail ("Internal Server Error" , "Received unsupported version: %s" , string (rs .Data [0 :index ]))
546
+ return fail (ctx , "Internal Server Error" , "Received unsupported version: %s" , string (rs .Data [0 :index ]))
546
547
}
547
548
requestOptions = strings .Split (string (rs .Data [index + 1 :]), " " )
548
549
@@ -555,17 +556,17 @@ Gitea or set your environment appropriately.`, "")
555
556
}
556
557
response = append (response , '\n' )
557
558
558
- _ , err = readPktLine (reader , pktLineTypeFlush )
559
+ _ , err = readPktLine (ctx , reader , pktLineTypeFlush )
559
560
if err != nil {
560
561
return err
561
562
}
562
563
563
- err = writeDataPktLine (os .Stdout , response )
564
+ err = writeDataPktLine (ctx , os .Stdout , response )
564
565
if err != nil {
565
566
return err
566
567
}
567
568
568
- err = writeFlushPktLine (os .Stdout )
569
+ err = writeFlushPktLine (ctx , os .Stdout )
569
570
if err != nil {
570
571
return err
571
572
}
@@ -588,7 +589,7 @@ Gitea or set your environment appropriately.`, "")
588
589
589
590
for {
590
591
// note: pktLineTypeUnknow means pktLineTypeFlush and pktLineTypeData all allowed
591
- rs , err = readPktLine (reader , pktLineTypeUnknow )
592
+ rs , err = readPktLine (ctx , reader , pktLineTypeUnknow )
592
593
if err != nil {
593
594
return err
594
595
}
@@ -609,7 +610,7 @@ Gitea or set your environment appropriately.`, "")
609
610
610
611
if hasPushOptions {
611
612
for {
612
- rs , err = readPktLine (reader , pktLineTypeUnknow )
613
+ rs , err = readPktLine (ctx , reader , pktLineTypeUnknow )
613
614
if err != nil {
614
615
return err
615
616
}
@@ -628,7 +629,7 @@ Gitea or set your environment appropriately.`, "")
628
629
// 3. run hook
629
630
resp , err := private .HookProcReceive (ctx , repoUser , repoName , hookOptions )
630
631
if err != nil {
631
- return fail ("Internal Server Error" , "run proc-receive hook failed :%v" , err )
632
+ return fail (ctx , "Internal Server Error" , "run proc-receive hook failed :%v" , err )
632
633
}
633
634
634
635
// 4. response result to service
@@ -649,51 +650,51 @@ Gitea or set your environment appropriately.`, "")
649
650
650
651
for _ , rs := range resp .Results {
651
652
if len (rs .Err ) > 0 {
652
- err = writeDataPktLine (os .Stdout , []byte ("ng " + rs .OriginalRef + " " + rs .Err ))
653
+ err = writeDataPktLine (ctx , os .Stdout , []byte ("ng " + rs .OriginalRef + " " + rs .Err ))
653
654
if err != nil {
654
655
return err
655
656
}
656
657
continue
657
658
}
658
659
659
660
if rs .IsNotMatched {
660
- err = writeDataPktLine (os .Stdout , []byte ("ok " + rs .OriginalRef ))
661
+ err = writeDataPktLine (ctx , os .Stdout , []byte ("ok " + rs .OriginalRef ))
661
662
if err != nil {
662
663
return err
663
664
}
664
- err = writeDataPktLine (os .Stdout , []byte ("option fall-through" ))
665
+ err = writeDataPktLine (ctx , os .Stdout , []byte ("option fall-through" ))
665
666
if err != nil {
666
667
return err
667
668
}
668
669
continue
669
670
}
670
671
671
- err = writeDataPktLine (os .Stdout , []byte ("ok " + rs .OriginalRef ))
672
+ err = writeDataPktLine (ctx , os .Stdout , []byte ("ok " + rs .OriginalRef ))
672
673
if err != nil {
673
674
return err
674
675
}
675
- err = writeDataPktLine (os .Stdout , []byte ("option refname " + rs .Ref ))
676
+ err = writeDataPktLine (ctx , os .Stdout , []byte ("option refname " + rs .Ref ))
676
677
if err != nil {
677
678
return err
678
679
}
679
680
if rs .OldOID != git .EmptySHA {
680
- err = writeDataPktLine (os .Stdout , []byte ("option old-oid " + rs .OldOID ))
681
+ err = writeDataPktLine (ctx , os .Stdout , []byte ("option old-oid " + rs .OldOID ))
681
682
if err != nil {
682
683
return err
683
684
}
684
685
}
685
- err = writeDataPktLine (os .Stdout , []byte ("option new-oid " + rs .NewOID ))
686
+ err = writeDataPktLine (ctx , os .Stdout , []byte ("option new-oid " + rs .NewOID ))
686
687
if err != nil {
687
688
return err
688
689
}
689
690
if rs .IsForcePush {
690
- err = writeDataPktLine (os .Stdout , []byte ("option forced-update" ))
691
+ err = writeDataPktLine (ctx , os .Stdout , []byte ("option forced-update" ))
691
692
if err != nil {
692
693
return err
693
694
}
694
695
}
695
696
}
696
- err = writeFlushPktLine (os .Stdout )
697
+ err = writeFlushPktLine (ctx , os .Stdout )
697
698
698
699
return err
699
700
}
@@ -718,7 +719,7 @@ type gitPktLine struct {
718
719
Data []byte
719
720
}
720
721
721
- func readPktLine (in * bufio.Reader , requestType pktLineType ) (* gitPktLine , error ) {
722
+ func readPktLine (ctx context. Context , in * bufio.Reader , requestType pktLineType ) (* gitPktLine , error ) {
722
723
var (
723
724
err error
724
725
r * gitPktLine
@@ -729,33 +730,33 @@ func readPktLine(in *bufio.Reader, requestType pktLineType) (*gitPktLine, error)
729
730
for i := 0 ; i < 4 ; i ++ {
730
731
lengthBytes [i ], err = in .ReadByte ()
731
732
if err != nil {
732
- return nil , fail ("Internal Server Error" , "Pkt-Line: read stdin failed : %v" , err )
733
+ return nil , fail (ctx , "Internal Server Error" , "Pkt-Line: read stdin failed : %v" , err )
733
734
}
734
735
}
735
736
736
737
r = new (gitPktLine )
737
738
r .Length , err = strconv .ParseUint (string (lengthBytes ), 16 , 32 )
738
739
if err != nil {
739
- return nil , fail ("Internal Server Error" , "Pkt-Line format is wrong :%v" , err )
740
+ return nil , fail (ctx , "Internal Server Error" , "Pkt-Line format is wrong :%v" , err )
740
741
}
741
742
742
743
if r .Length == 0 {
743
744
if requestType == pktLineTypeData {
744
- return nil , fail ("Internal Server Error" , "Pkt-Line format is wrong" )
745
+ return nil , fail (ctx , "Internal Server Error" , "Pkt-Line format is wrong" )
745
746
}
746
747
r .Type = pktLineTypeFlush
747
748
return r , nil
748
749
}
749
750
750
751
if r .Length <= 4 || r .Length > 65520 || requestType == pktLineTypeFlush {
751
- return nil , fail ("Internal Server Error" , "Pkt-Line format is wrong" )
752
+ return nil , fail (ctx , "Internal Server Error" , "Pkt-Line format is wrong" )
752
753
}
753
754
754
755
r .Data = make ([]byte , r .Length - 4 )
755
756
for i := range r .Data {
756
757
r .Data [i ], err = in .ReadByte ()
757
758
if err != nil {
758
- return nil , fail ("Internal Server Error" , "Pkt-Line: read stdin failed : %v" , err )
759
+ return nil , fail (ctx , "Internal Server Error" , "Pkt-Line: read stdin failed : %v" , err )
759
760
}
760
761
}
761
762
@@ -764,19 +765,19 @@ func readPktLine(in *bufio.Reader, requestType pktLineType) (*gitPktLine, error)
764
765
return r , nil
765
766
}
766
767
767
- func writeFlushPktLine (out io.Writer ) error {
768
+ func writeFlushPktLine (ctx context. Context , out io.Writer ) error {
768
769
l , err := out .Write ([]byte ("0000" ))
769
770
if err != nil {
770
- return fail ("Internal Server Error" , "Pkt-Line response failed: %v" , err )
771
+ return fail (ctx , "Internal Server Error" , "Pkt-Line response failed: %v" , err )
771
772
}
772
773
if l != 4 {
773
- return fail ("Internal Server Error" , "Pkt-Line response failed: %v" , err )
774
+ return fail (ctx , "Internal Server Error" , "Pkt-Line response failed: %v" , err )
774
775
}
775
776
776
777
return nil
777
778
}
778
779
779
- func writeDataPktLine (out io.Writer , data []byte ) error {
780
+ func writeDataPktLine (ctx context. Context , out io.Writer , data []byte ) error {
780
781
hexchar := []byte ("0123456789abcdef" )
781
782
hex := func (n uint64 ) byte {
782
783
return hexchar [(n )& 15 ]
@@ -791,18 +792,18 @@ func writeDataPktLine(out io.Writer, data []byte) error {
791
792
792
793
lr , err := out .Write (tmp )
793
794
if err != nil {
794
- return fail ("Internal Server Error" , "Pkt-Line response failed: %v" , err )
795
+ return fail (ctx , "Internal Server Error" , "Pkt-Line response failed: %v" , err )
795
796
}
796
797
if lr != 4 {
797
- return fail ("Internal Server Error" , "Pkt-Line response failed: %v" , err )
798
+ return fail (ctx , "Internal Server Error" , "Pkt-Line response failed: %v" , err )
798
799
}
799
800
800
801
lr , err = out .Write (data )
801
802
if err != nil {
802
- return fail ("Internal Server Error" , "Pkt-Line response failed: %v" , err )
803
+ return fail (ctx , "Internal Server Error" , "Pkt-Line response failed: %v" , err )
803
804
}
804
805
if int (length - 4 ) != lr {
805
- return fail ("Internal Server Error" , "Pkt-Line response failed: %v" , err )
806
+ return fail (ctx , "Internal Server Error" , "Pkt-Line response failed: %v" , err )
806
807
}
807
808
808
809
return nil
0 commit comments