@@ -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,100 @@ 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
+ err = ioutil .WriteFile (untrackedPath , []byte ("foo" ), 0644 )
701
+ if err != nil {
702
+ t .Fatal (err )
703
+ }
704
+
705
+ mkSM ()
706
+ err = sm .SyncSourceFor (id )
707
+ if err != nil {
708
+ t .Fatalf ("choked after adding dummy file: %q" , err )
709
+ }
710
+
711
+ if _ , err := os .Stat (untrackedPath ); err == nil {
712
+ t .Fatal ("untracked file still existed after cleanup should've been triggered" )
713
+ }
714
+
715
+ // Remove a file that we know exists, which `git status` checks should catch.
716
+ readmePath := filepath .Join (repodir , "README.md" )
717
+ os .Remove (readmePath )
718
+
719
+ mkSM ()
720
+ err = sm .SyncSourceFor (id )
721
+ if err != nil {
722
+ t .Fatalf ("choked after removing known file: %q" , err )
723
+ }
724
+
725
+ if _ , err := os .Stat (readmePath ); err != nil {
726
+ t .Fatal ("README was still absent after cleanup should've been triggered" )
727
+ }
728
+
729
+ // Remove .git/objects directory, which should make git bite it.
730
+ err = os .RemoveAll (filepath .Join (repodir , ".git" , "objects" ))
731
+ if err != nil {
732
+ t .Fatal (err )
733
+ }
734
+
735
+ mkSM ()
736
+ err = sm .SyncSourceFor (id )
737
+ if err != nil {
738
+ t .Fatalf ("choked after removing .git/objects directory: %q" , err )
739
+ }
740
+
741
+ sm .Release ()
742
+ os .RemoveAll (cpath )
743
+ }
744
+
650
745
func Test_bzrSource_exportRevisionTo_removeVcsFiles (t * testing.T ) {
651
746
t .Parallel ()
652
747
0 commit comments