@@ -7,6 +7,7 @@ package gps
7
7
import (
8
8
"context"
9
9
"io/ioutil"
10
+ "log"
10
11
"net/url"
11
12
"os"
12
13
"os/exec"
@@ -647,6 +648,101 @@ func TestGitSourceListVersionsNoDupes(t *testing.T) {
647
648
}
648
649
}
649
650
651
+ func TestGitSourceAdaptiveCleanup (t * testing.T ) {
652
+ t .Parallel ()
653
+
654
+ // This test is slowish, skip it on -short
655
+ if testing .Short () {
656
+ t .Skip ("Skipping git adaptive failure recovery test in short mode" )
657
+ }
658
+ requiresBins (t , "git" )
659
+
660
+ cpath , err := ioutil .TempDir ("" , "smcache" )
661
+ if err != nil {
662
+ t .Fatalf ("Failed to create temp dir: %s" , err )
663
+ }
664
+
665
+ var sm * SourceMgr
666
+ mkSM := func () {
667
+ // If sm is already set, make sure it's released, then create a new one.
668
+ if sm != nil {
669
+ sm .Release ()
670
+ }
671
+
672
+ var err error
673
+ sm , err = NewSourceManager (SourceManagerConfig {
674
+ Cachedir : cpath ,
675
+ Logger : log .New (test.Writer {TB : t }, "" , 0 ),
676
+ })
677
+ if err != nil {
678
+ t .Fatalf ("Unexpected error on SourceManager creation: %s" , err )
679
+ }
680
+ }
681
+
682
+ mkSM ()
683
+ id := mkPI ("github.com/sdboyer/gpkt" )
684
+ err = sm .SyncSourceFor (id )
685
+ if err != nil {
686
+ t .Fatal (err )
687
+ }
688
+
689
+ repodir := filepath .Join (sm .cachedir , "sources" , "https---github.lhy31512.workers.dev-sdboyer-gpkt" )
690
+ if _ , err := os .Stat (repodir ); err != nil {
691
+ if os .IsNotExist (err ) {
692
+ t .Fatalf ("expected location for repodir did not exist: %q" , repodir )
693
+ } else {
694
+ t .Fatal (err )
695
+ }
696
+ }
697
+
698
+ // Create a file that git will see as untracked.
699
+ untrackedPath := filepath .Join (repodir , "untrackedfile" )
700
+ f , err := os .Create (untrackedPath )
701
+ if err != nil {
702
+ t .Fatal (err )
703
+ }
704
+ f .Close ()
705
+
706
+ mkSM ()
707
+ err = sm .SyncSourceFor (id )
708
+ if err != nil {
709
+ t .Fatalf ("choked after adding dummy file: %q" , err )
710
+ }
711
+
712
+ if _ , err := os .Stat (untrackedPath ); err == nil {
713
+ t .Fatal ("untracked file still existed after cleanup should've been triggered" )
714
+ }
715
+
716
+ // Remove a file that we know exists, which `git status` checks should catch.
717
+ readmePath := filepath .Join (repodir , "README.md" )
718
+ os .Remove (readmePath )
719
+
720
+ mkSM ()
721
+ err = sm .SyncSourceFor (id )
722
+ if err != nil {
723
+ t .Fatalf ("choked after removing known file: %q" , err )
724
+ }
725
+
726
+ if _ , err := os .Stat (readmePath ); err != nil {
727
+ t .Fatal ("README was still absent after cleanup should've been triggered" )
728
+ }
729
+
730
+ // Remove .git/objects directory, which should make git bite it.
731
+ err = os .RemoveAll (filepath .Join (repodir , ".git" , "objects" ))
732
+ if err != nil {
733
+ t .Fatal (err )
734
+ }
735
+
736
+ mkSM ()
737
+ err = sm .SyncSourceFor (id )
738
+ if err != nil {
739
+ t .Fatalf ("choked after removing .git/objects directory: %q" , err )
740
+ }
741
+
742
+ sm .Release ()
743
+ os .RemoveAll (cpath )
744
+ }
745
+
650
746
func Test_bzrSource_exportRevisionTo_removeVcsFiles (t * testing.T ) {
651
747
t .Parallel ()
652
748
0 commit comments