Add an API for getting the branch identifier from a Git or SVN checkout.
authormatthew_hanson@apple.com <matthew_hanson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 23 Sep 2016 01:14:59 +0000 (01:14 +0000)
committermatthew_hanson@apple.com <matthew_hanson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 23 Sep 2016 01:14:59 +0000 (01:14 +0000)
https://bugs.webkit.org/show_bug.cgi?id=151570
rdar://problem/17959831

Reviewed by David Kilzer.

This patch adds a function called svnIdentifierForPath. This function returns either "trunk",
the name of the tag, or the name of the branch, as appropriate. This function is necessary for
a VCSUtils client that is not checked in to the WebKit project.

This patch also breaks up pathRelativeToSVNRepositoryRootForPath into four functions:
- pathRelativeToSVNRepositoryRootForPath
- svnInfoForPath
- svnURLForPath
- svnRepositoryRootForPath

This allows us to reuse logic from pathRelativeToSVNRepositoryRootForPath in svnIdentifierForPath and
allows clients of VCSUtils to extract what arbitrary information from the `svn info` command regardless
of SCM.

* Scripts/VCSUtils.pm:
(svnInfoForPath):
Copied logic that previously lived in pathRelativeToSVNRepositoryRootForPath.
Make code safe to use for a path, and not just for the CWD.

(svnURLForPath):
Calls svnInfoForPath and extracts the URL.

(svnRepositoryRootForPath):
Calls svnInfoForPath and extracts the Repository Root.

(svnIdentifierForPath):
Calls pathRelativeToSVNRepositoryRootForPath and extracts the repository identifier.

(pathRelativeToSVNRepositoryRootForPath):
Now uses svnURLForPath and svnRepositoryRootForPath instead of being responsible for
determining both values.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@206283 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Tools/ChangeLog
Tools/Scripts/VCSUtils.pm

index c4d92b948ce1632730c7a7b4a2269fdf2cce4738..23c6442cb555fad26e07691075c550ff3770e44c 100644 (file)
@@ -1,3 +1,43 @@
+2016-09-22  Matthew Hanson  <matthew_hanson@apple.com>
+
+        Add an API for getting the branch identifier from a Git or SVN checkout.
+        https://bugs.webkit.org/show_bug.cgi?id=151570
+        rdar://problem/17959831
+
+        Reviewed by David Kilzer.
+
+        This patch adds a function called svnIdentifierForPath. This function returns either "trunk",
+        the name of the tag, or the name of the branch, as appropriate. This function is necessary for
+        a VCSUtils client that is not checked in to the WebKit project.
+
+        This patch also breaks up pathRelativeToSVNRepositoryRootForPath into four functions:
+        - pathRelativeToSVNRepositoryRootForPath
+        - svnInfoForPath
+        - svnURLForPath
+        - svnRepositoryRootForPath
+
+        This allows us to reuse logic from pathRelativeToSVNRepositoryRootForPath in svnIdentifierForPath and
+        allows clients of VCSUtils to extract what arbitrary information from the `svn info` command regardless
+        of SCM.
+
+        * Scripts/VCSUtils.pm:
+        (svnInfoForPath):
+        Copied logic that previously lived in pathRelativeToSVNRepositoryRootForPath.
+        Make code safe to use for a path, and not just for the CWD.
+
+        (svnURLForPath):
+        Calls svnInfoForPath and extracts the URL.
+
+        (svnRepositoryRootForPath):
+        Calls svnInfoForPath and extracts the Repository Root.
+
+        (svnIdentifierForPath):
+        Calls pathRelativeToSVNRepositoryRootForPath and extracts the repository identifier.
+
+        (pathRelativeToSVNRepositoryRootForPath):
+        Now uses svnURLForPath and svnRepositoryRootForPath instead of being responsible for
+        determining both values.
+
 2016-09-22  Megan Gardner  <megan_gardner@apple.com>
 
         Add long press selection test
index ee7c717ece36d82f0395de3d5ffe26ae61eaf785..0a9d34e23ecdfc9eb6063c5de2eb061e7b3eded2 100644 (file)
@@ -87,8 +87,12 @@ BEGIN {
         &scmMoveOrRenameFile
         &scmToggleExecutableBit
         &setChangeLogDateAndReviewer
+        &svnIdentifierForPath
+        &svnInfoForPath
+        &svnRepositoryRootForPath
         &svnRevisionForDirectory
         &svnStatus
+        &svnURLForPath
         &toWindowsLineEndings
         &gitCommitForSVNRevision
         &listOfChangedFilesBetweenRevisions
@@ -444,33 +448,64 @@ sub svnRevisionForDirectory($)
     return $revision;
 }
 
-sub pathRelativeToSVNRepositoryRootForPath($)
+sub svnInfoForPath($)
 {
     my ($file) = @_;
     my $relativePath = File::Spec->abs2rel($file);
 
     my $svnInfo;
-    if (isSVN()) {
+    if (isSVNDirectory($file)) {
         my $escapedRelativePath = escapeSubversionPath($relativePath);
         my $command = "svn info $escapedRelativePath";
         $command = "LC_ALL=C $command" if !isWindows();
         $svnInfo = `$command`;
-    } elsif (isGit()) {
-        my $command = "git svn info $relativePath";
+    } elsif (isGitDirectory($file)) {
+        my $command = "git svn info";
         $command = "LC_ALL=C $command" if !isWindows();
-        $svnInfo = `$command`;
+        $svnInfo = `cd $relativePath && $command`;
     }
 
+    return $svnInfo;
+}
+
+sub svnURLForPath($)
+{
+    my ($file) = @_;
+    my $svnInfo = svnInfoForPath($file);
+
     $svnInfo =~ /.*^URL: (.*?)$/m;
-    my $svnURL = $1;
+    return $1;
+}
+
+sub svnRepositoryRootForPath($)
+{
+    my ($file) = @_;
+    my $svnInfo = svnInfoForPath($file);
 
     $svnInfo =~ /.*^Repository Root: (.*?)$/m;
-    my $repositoryRoot = $1;
+    return $1;
+}
+
+sub pathRelativeToSVNRepositoryRootForPath($)
+{
+    my ($file) = @_;
 
-    $svnURL =~ s/$repositoryRoot\///;
+    my $svnURL = svnURLForPath($file);
+    my $svnRepositoryRoot = svnRepositoryRootForPath($file);
+
+    $svnURL =~ s/$svnRepositoryRoot\///;
     return $svnURL;
 }
 
+sub svnIdentifierForPath($)
+{
+    my ($file) = @_;
+    my $path = pathRelativeToSVNRepositoryRootForPath($file);
+
+    $path =~ /^(trunk)|tags\/([\w\.\-]*)|branches\/([\w\.\-]*).*$/m;
+    return $1 || $2 || $3;
+}
+
 sub makeFilePathRelative($)
 {
     my ($path) = @_;