-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #67 from bitrise-io/ACI-3019
Add write gradle verification command
- Loading branch information
Showing
10 changed files
with
214 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,9 +1,11 @@ | ||
bin/ | ||
.DS_Store | ||
bitrise-build-cache-cli | ||
.bitrise.secrets.yml | ||
dist/ | ||
_tmp/ | ||
.idea/* | ||
!.idea/codeStyles | ||
.idea/codeStyles/* | ||
!.idea/codeStyles/Project.xml | ||
gradle_verification_sample/gradle/verification-metadata.xml |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,139 @@ | ||
package cmd | ||
|
||
import ( | ||
"bytes" | ||
_ "embed" | ||
"fmt" | ||
"io" | ||
"os" | ||
|
||
"github.com/beevik/etree" | ||
"github.com/bitrise-io/go-utils/v2/log" | ||
"github.com/bitrise-io/go-utils/v2/pathutil" | ||
"github.com/spf13/cobra" | ||
) | ||
|
||
//go:embed "asset/verification-metadata.xml" | ||
var referenceVerificationDepsContent string | ||
|
||
//nolint:gochecknoglobals | ||
var metadataPath string | ||
|
||
// gradleVerification ... | ||
var gradleVerification = &cobra.Command{ //nolint:gochecknoglobals | ||
Use: "gradle-verification", | ||
Short: "Bitrise build cache support for projects using Gradle verification", | ||
Long: `Bitrise build cache support for projects using Gradle verification | ||
See https://docs.gradle.org/current/userguide/dependency_verification.html for more information.`, | ||
SilenceUsage: true, | ||
RunE: func(_ *cobra.Command, _ []string) error { | ||
return nil | ||
}, | ||
} | ||
|
||
var writeGradleVerificationDeps = &cobra.Command{ //nolint:gochecknoglobals | ||
Use: "write", | ||
Short: "Add Bitrise build cache dependencies to verification-metadata.xml", | ||
Long: `Add Bitrise build cache dependencies to verification-metadata.xml | ||
Missing dependencies of Bitrise build cache are appended. | ||
`, | ||
SilenceUsage: true, | ||
RunE: func(_ *cobra.Command, _ []string) error { | ||
logger := log.NewLogger() | ||
|
||
logger.TInfof("Adding Gradle verification dependencies") | ||
|
||
projectMetadataPath, err := pathutil.NewPathModifier().AbsPath(metadataPath) | ||
if err != nil { | ||
return fmt.Errorf("expand metadata path (%s): %w", metadataPath, err) | ||
} | ||
|
||
if err := addGradleVerification(logger, projectMetadataPath, os.Getenv); err != nil { | ||
return fmt.Errorf("adding Gradle verification: %w", err) | ||
} | ||
|
||
logger.TInfof("✅ Updated verification-metadata.xml") | ||
|
||
return nil | ||
}, | ||
} | ||
|
||
func init() { | ||
rootCmd.AddCommand(gradleVerification) | ||
gradleVerification.AddCommand(writeGradleVerificationDeps) | ||
writeGradleVerificationDeps.Flags().StringVar(&metadataPath, "metadata-path", "", "Path of verification-metadata.xml") | ||
} | ||
|
||
func addGradleVerification(logger log.Logger, projectMetadataPath string, _ func(string) string) error { | ||
logger.Infof("(i) Checking parameters") | ||
logger.Infof("(i) Metadata path: %s", projectMetadataPath) | ||
|
||
referenceDepsReader := bytes.NewBufferString(referenceVerificationDepsContent) | ||
projectDepsReader, err := os.Open(projectMetadataPath) | ||
if err != nil { | ||
return fmt.Errorf("failed to open project verification-metadata.xml: %w", err) | ||
} | ||
|
||
resultProjectMetadata, err := writeVerificationDeps(logger, referenceDepsReader, projectDepsReader) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
if err = os.WriteFile(projectMetadataPath, []byte(resultProjectMetadata), os.ModeAppend); err != nil { | ||
return fmt.Errorf("failed to write project verification-metadata.xml: %w", err) | ||
} | ||
|
||
logger.Debugf("Updated contents: %s", resultProjectMetadata) | ||
|
||
return nil | ||
} | ||
|
||
func writeVerificationDeps(logger log.Logger, referenceDepsReader io.Reader, projectDepsReader io.Reader) (string, error) { | ||
referenceDeps := etree.NewDocument() | ||
if _, err := referenceDeps.ReadFrom(referenceDepsReader); err != nil { | ||
return "", fmt.Errorf("failed to parse reference verification-metadata.xml: %w", err) | ||
} | ||
|
||
projectDeps := etree.NewDocument() | ||
if _, err := projectDeps.ReadFrom(projectDepsReader); err != nil { | ||
return "", fmt.Errorf("failed to parse project verification-metadata.xml: %w", err) | ||
} | ||
|
||
projectRoot := projectDeps.SelectElement("verification-metadata") | ||
if projectRoot == nil { | ||
return "", fmt.Errorf("project metadata missing verification-metadata") | ||
} | ||
|
||
projectComponents := projectRoot.SelectElement("components") | ||
if projectComponents == nil { | ||
return "", fmt.Errorf("project metadata missing components") | ||
} | ||
|
||
referenceRoot := referenceDeps.SelectElement("verification-metadata") | ||
if referenceRoot == nil { | ||
return "", fmt.Errorf("reference metadata missing verification-metadata") | ||
} | ||
|
||
referenceComponents := referenceRoot.SelectElement("components") | ||
if referenceComponents == nil { | ||
return "", fmt.Errorf("reference metadata missing components") | ||
} | ||
|
||
referenceComponentList := referenceComponents.SelectElements("component") | ||
if referenceComponentList == nil { | ||
return "", fmt.Errorf("reference metadata has no components") | ||
} | ||
|
||
for _, e := range referenceComponentList { | ||
projectComponents.AddChild(e) | ||
} | ||
|
||
logger.Infof("Added %d dependecies to verification-metadata.xml", len(referenceComponentList)) | ||
|
||
result, err := projectDeps.WriteToString() | ||
if err != nil { | ||
return "", fmt.Errorf("failed to serialize updated verification-metadata.xml: %w", err) | ||
} | ||
|
||
return result, nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters