@@ -768,4 +768,142 @@ class GitRepositoryTests: XCTestCase {
768
768
XCTAssertNoThrow ( try checkoutRepo. getCurrentRevision ( ) )
769
769
}
770
770
}
771
+
772
+ func testValidDirectoryLocalRelativeOrigin( ) async throws {
773
+ try testWithTemporaryDirectory { tmpDir in
774
+ // Create a repository.
775
+ let packageDir = tmpDir. appending ( " SomePackage " )
776
+ try localFileSystem. createDirectory ( packageDir)
777
+
778
+ // Create a repository manager for it.
779
+ let repoProvider = GitRepositoryProvider ( )
780
+ let repositoryManager = RepositoryManager (
781
+ fileSystem: localFileSystem,
782
+ path: packageDir,
783
+ provider: repoProvider,
784
+ delegate: . none
785
+ )
786
+
787
+ let customRemote = " ../OriginOfSomePackage.git "
788
+
789
+ // Before initializing the directory with a git repo, it is never valid.
790
+ XCTAssertThrowsError ( try repositoryManager. isValidDirectory ( packageDir) )
791
+ XCTAssertThrowsError ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( packageDir. pathString) ) ) )
792
+ XCTAssertThrowsError ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( customRemote) ) ) )
793
+
794
+ initGitRepo ( packageDir)
795
+ // Set the remote.
796
+ try systemQuietly ( [ Git . tool, " -C " , packageDir. pathString, " remote " , " add " , " origin " , customRemote] )
797
+ XCTAssertTrue ( try repositoryManager. isValidDirectory ( packageDir) )
798
+
799
+ let customRemoteWithoutPathExtension = ( customRemote as NSString ) . deletingPathExtension
800
+ XCTAssertTrue ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( customRemote) ) ) )
801
+ // We consider the directory valid even if the remote does not have the same path extension - in this case we expected '.git'.
802
+ XCTAssertTrue ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( customRemoteWithoutPathExtension) ) ) )
803
+ // We consider the directory valid even if the remote does not have the same path extension - in this case we expected '.git'.
804
+ XCTAssertTrue ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( ( customRemote as NSString ) . deletingPathExtension + " / " ) ) ) )
805
+
806
+ // The following ensure that are actually checking the remote's origin.
807
+ XCTAssertFalse ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( path: AbsolutePath ( validating: " / " ) ) ) )
808
+ XCTAssertFalse ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( " / " ) ) ) )
809
+ XCTAssertFalse ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( path: packageDir) ) )
810
+ XCTAssertFalse ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( packageDir. pathString) ) ) )
811
+ XCTAssertFalse ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( path: packageDir. appending ( extension: " git " ) ) ) )
812
+ XCTAssertFalse ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( packageDir. pathString. appending ( " .git " ) ) ) ) )
813
+
814
+ XCTAssertFalse ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( " https://mycustomdomain/some-package.git " ) ) ) )
815
+ }
816
+ }
817
+
818
+ func testValidDirectoryLocalAbsoluteOrigin( ) async throws {
819
+ try testWithTemporaryDirectory { tmpDir in
820
+ // Create a repository.
821
+ let packageDir = tmpDir. appending ( " SomePackage " )
822
+ try localFileSystem. createDirectory ( packageDir)
823
+
824
+ // Create a repository manager for it.
825
+ let repoProvider = GitRepositoryProvider ( )
826
+ let repositoryManager = RepositoryManager (
827
+ fileSystem: localFileSystem,
828
+ path: packageDir,
829
+ provider: repoProvider,
830
+ delegate: . none
831
+ )
832
+
833
+ let customRemote = tmpDir. appending ( " OriginOfSomePackage.git " )
834
+
835
+ // Before initializing the directory with a git repo, it is never valid.
836
+ XCTAssertThrowsError ( try repositoryManager. isValidDirectory ( packageDir) )
837
+ XCTAssertThrowsError ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( packageDir. pathString) ) ) )
838
+ XCTAssertThrowsError ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( customRemote. pathString) ) ) )
839
+
840
+ initGitRepo ( packageDir)
841
+ // Set the remote.
842
+ try systemQuietly ( [ Git . tool, " -C " , packageDir. pathString, " remote " , " add " , " origin " , customRemote. pathString] )
843
+ XCTAssertTrue ( try repositoryManager. isValidDirectory ( packageDir) )
844
+
845
+ let customRemotePath = customRemote. pathString
846
+ let customRemotePathWithoutPathExtension = ( customRemotePath as NSString ) . deletingPathExtension
847
+ XCTAssertTrue ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( path: customRemote) ) )
848
+ XCTAssertTrue ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( customRemotePath) ) ) )
849
+ // We consider the directory valid even if the remote does not have the same path extension - in this case we expected '.git'.
850
+ XCTAssertTrue ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( path: try AbsolutePath ( validating: customRemotePathWithoutPathExtension) ) ) )
851
+ XCTAssertTrue ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( customRemotePathWithoutPathExtension) ) ) )
852
+ // We consider the directory valid even if the remote does not have the same path extension - in this case we expected '.git'.
853
+ XCTAssertTrue ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( path: try AbsolutePath ( validating: customRemotePathWithoutPathExtension + " / " ) ) ) )
854
+ XCTAssertTrue ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( ( customRemotePath as NSString ) . deletingPathExtension + " / " ) ) ) )
855
+
856
+ // The following ensure that are actually checking the remote's origin.
857
+ XCTAssertFalse ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( path: AbsolutePath ( validating: " / " ) ) ) )
858
+ XCTAssertFalse ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( " / " ) ) ) )
859
+ XCTAssertFalse ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( path: packageDir) ) )
860
+ XCTAssertFalse ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( packageDir. pathString) ) ) )
861
+ XCTAssertFalse ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( path: packageDir. appending ( extension: " git " ) ) ) )
862
+ XCTAssertFalse ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( packageDir. pathString. appending ( " .git " ) ) ) ) )
863
+
864
+ XCTAssertFalse ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( " https://mycustomdomain/some-package.git " ) ) ) )
865
+ }
866
+ }
867
+
868
+ func testValidDirectoryRemoteOrigin( ) async throws {
869
+ try testWithTemporaryDirectory { tmpDir in
870
+ // Create a repository.
871
+ let packageDir = tmpDir. appending ( " SomePackage " )
872
+ try localFileSystem. createDirectory ( packageDir)
873
+
874
+ // Create a repository manager for it.
875
+ let repoProvider = GitRepositoryProvider ( )
876
+ let repositoryManager = RepositoryManager (
877
+ fileSystem: localFileSystem,
878
+ path: packageDir,
879
+ provider: repoProvider,
880
+ delegate: . none
881
+ )
882
+
883
+ let customRemote = try XCTUnwrap ( URL ( string: " https://mycustomdomain/some-package.git " ) )
884
+
885
+ // Before initializing the directory with a git repo, it is never valid.
886
+ XCTAssertThrowsError ( try repositoryManager. isValidDirectory ( packageDir) )
887
+ XCTAssertThrowsError ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( customRemote) ) ) )
888
+
889
+ initGitRepo ( packageDir)
890
+ // Set the remote.
891
+ try systemQuietly ( [ Git . tool, " -C " , packageDir. pathString, " remote " , " add " , " origin " , customRemote. absoluteString] )
892
+ XCTAssertTrue ( try repositoryManager. isValidDirectory ( packageDir) )
893
+
894
+ XCTAssertTrue ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( customRemote) ) ) )
895
+ // We consider the directory valid even if the remote does not have the same path extension - in this case we expected '.git'.
896
+ XCTAssertTrue ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( " https://mycustomdomain/some-package " ) ) ) )
897
+ // We consider the directory valid even if the remote does not have the same path extension - in this case we expected '.git'.
898
+ XCTAssertTrue ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( " https://mycustomdomain/some-package/ " ) ) ) )
899
+
900
+ // The following ensure that are actually checking the remote's origin.
901
+ XCTAssertFalse ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( path: AbsolutePath ( validating: " / " ) ) ) )
902
+ XCTAssertFalse ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( " / " ) ) ) )
903
+ XCTAssertFalse ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( path: packageDir) ) )
904
+ XCTAssertFalse ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( packageDir. pathString) ) ) )
905
+ XCTAssertFalse ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( path: packageDir. appending ( extension: " git " ) ) ) )
906
+ XCTAssertFalse ( try repositoryManager. isValidDirectory ( packageDir, for: RepositorySpecifier ( url: SourceControlURL ( packageDir. pathString. appending ( " .git " ) ) ) ) )
907
+ }
908
+ }
771
909
}
0 commit comments