aboutsummaryrefslogtreecommitdiff
path: root/examples/6-licensediff/example_licensediff.go
diff options
context:
space:
mode:
authorSteve Winslow <steve@swinslow.net>2020-05-10 14:54:30 -0400
committerSteve Winslow <steve@swinslow.net>2020-05-10 14:54:30 -0400
commitd1a01f0c01c3d1095ff4a43088daacf3cf6edee2 (patch)
tree8cb8e346e7f351f5668458aee4212ecb83dfdb99 /examples/6-licensediff/example_licensediff.go
parent003280a3d97db9ecba61cfe6fad1a0a5f9e4529a (diff)
downloadspdx-tools-d1a01f0c01c3d1095ff4a43088daacf3cf6edee2.tar.gz
Refactor examples to handle element ID maps
Signed-off-by: Steve Winslow <steve@swinslow.net>
Diffstat (limited to 'examples/6-licensediff/example_licensediff.go')
-rw-r--r--examples/6-licensediff/example_licensediff.go95
1 files changed, 63 insertions, 32 deletions
diff --git a/examples/6-licensediff/example_licensediff.go b/examples/6-licensediff/example_licensediff.go
index 3a7b401..567c909 100644
--- a/examples/6-licensediff/example_licensediff.go
+++ b/examples/6-licensediff/example_licensediff.go
@@ -3,10 +3,11 @@
// Example for: *licensediff*, *tvloader*
// This example demonstrates loading two SPDX tag-value files from disk into
-// memory, and generating a diff of the concluded licenses for Files in the
-// first-listed Packages in each document.
+// memory, and generating a diff of the concluded licenses for Files in
+// Packages with matching IDs in each document.
// This is generally only useful when run with two SPDX documents that
-// describe licenses for subsequent versions of the same set of files.
+// describe licenses for subsequent versions of the same set of files, AND if
+// they have the same identifier in both documents.
package main
@@ -15,6 +16,7 @@ import (
"os"
"github.com/spdx/tools-golang/licensediff"
+ "github.com/spdx/tools-golang/spdxlib"
"github.com/spdx/tools-golang/tvloader"
)
@@ -44,9 +46,10 @@ func main() {
fmt.Printf("Error while parsing %v: %v", filenameFirst, err)
return
}
- // make sure it has at least one Package
- if len(docFirst.Packages) < 1 {
- fmt.Printf("Error, no packages found in SPDX file %s\n", filenameFirst)
+ // check whether the SPDX file has at least one package that it describes
+ pkgIDsFirst, err := spdxlib.GetDescribedPackageIDs2_1(docFirst)
+ if err != nil {
+ fmt.Printf("Unable to get describe packages from first SPDX document: %v\n", err)
return
}
@@ -68,39 +71,67 @@ func main() {
fmt.Printf("Error while parsing %v: %v", filenameSecond, err)
return
}
- // make sure it has at least one Package
- if len(docSecond.Packages) < 1 {
- fmt.Printf("Error, no packages found in SPDX file %s\n", filenameSecond)
+ // check whether the SPDX file has at least one package that it describes
+ pkgIDsSecond, err := spdxlib.GetDescribedPackageIDs2_1(docSecond)
+ if err != nil {
+ fmt.Printf("Unable to get describe packages from second SPDX document: %v\n", err)
return
}
// if we got here, the file is now loaded into memory.
fmt.Printf("Successfully loaded second SPDX file %s\n\n", filenameSecond)
- // extract the first-listed package from each Document.
- // (there could be more than one Package within a Document. For
- // purposes of this example, we'll just look at the first one.)
- // we've already confirmed above that each has at least one Package.
- p1 := docFirst.Packages[0]
- p2 := docSecond.Packages[0]
-
- // now, run a diff between the two
- pairs, err := licensediff.MakePairs(p1, p2)
- if err != nil {
- fmt.Printf("Error generating licensediff pairs: %v\n", err)
- return
+ // compare the described packages from each Document, by SPDX ID
+ // go through the first set first, report if they aren't in the second set
+ for _, pkgID := range pkgIDsFirst {
+ fmt.Printf("================================\n")
+ p1, okFirst := docFirst.Packages[pkgID]
+ if !okFirst {
+ fmt.Printf("Package %s has described relationship in first document but ID not found\n", string(pkgID))
+ continue
+ }
+ fmt.Printf("Package %s (%s)\n", string(pkgID), p1.PackageName)
+ p2, okSecond := docSecond.Packages[pkgID]
+ if !okSecond {
+ fmt.Printf(" Found in first document, not found in second\n")
+ continue
+ }
+
+ // now, run a diff between the two
+ pairs, err := licensediff.MakePairs(p1, p2)
+ if err != nil {
+ fmt.Printf(" Error generating licensediff pairs: %v\n", err)
+ continue
+ }
+
+ // take the pairs and turn them into a more structured results set
+ resultSet, err := licensediff.MakeResults(pairs)
+ if err != nil {
+ fmt.Printf(" Error generating licensediff results set: %v\n", err)
+ continue
+ }
+
+ // print some information about the results
+ fmt.Printf(" Files in first only: %d\n", len(resultSet.InFirstOnly))
+ fmt.Printf(" Files in second only: %d\n", len(resultSet.InSecondOnly))
+ fmt.Printf(" Files in both with different licenses: %d\n", len(resultSet.InBothChanged))
+ fmt.Printf(" Files in both with same licenses: %d\n", len(resultSet.InBothSame))
}
- // take the pairs and turn them into a more structured results set
- resultSet, err := licensediff.MakeResults(pairs)
- if err != nil {
- fmt.Printf("Error generating licensediff results set: %v\n", err)
- return
+ // now report if there are any package IDs in the second set that aren't
+ // in the first
+ for _, pkgID := range pkgIDsSecond {
+ p2, okSecond := docSecond.Packages[pkgID]
+ if !okSecond {
+ fmt.Printf("================================\n")
+ fmt.Printf("Package %s has described relationship in second document but ID not found\n", string(pkgID))
+ continue
+ }
+ _, okFirst := docFirst.Packages[pkgID]
+ if !okFirst {
+ fmt.Printf("================================\n")
+ fmt.Printf("Package %s (%s)\n", string(pkgID), p2.PackageName)
+ fmt.Printf(" Found in second document, not found in first\n")
+ }
}
-
- // print some information about the results
- fmt.Printf("Files in first only: %d\n", len(resultSet.InFirstOnly))
- fmt.Printf("Files in second only: %d\n", len(resultSet.InSecondOnly))
- fmt.Printf("Files in both with different licenses: %d\n", len(resultSet.InBothChanged))
- fmt.Printf("Files in both with same licenses: %d\n", len(resultSet.InBothSame))
}