Generate template URLs if wasn't found in HTML output and license URL generation.
This commit is contained in:
		| @@ -101,6 +101,16 @@ func (gp *golangParser) getDependenciesFromModules(pkgPath string) []*structs.De | |||||||
| 			dependency.Name = strings.Join(depName[:len(depName)-1], "/") | 			dependency.Name = strings.Join(depName[:len(depName)-1], "/") | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		// Version might contain "+incompatible", which might break | ||||||
|  | 		// license URL generation. | ||||||
|  | 		if strings.Contains(dependency.Version, "incompatible") { | ||||||
|  | 			dependency.Version = strings.Split(dependency.Version, "+incompat")[0] | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// As we're using specific version - we should assume it as | ||||||
|  | 		// branch name. | ||||||
|  | 		dependency.VCS.Branch = dependency.Version | ||||||
|  |  | ||||||
| 		deps = append(deps, dependency) | 		deps = append(deps, dependency) | ||||||
|  |  | ||||||
| 		// Mark dependency as processed. | 		// Mark dependency as processed. | ||||||
|   | |||||||
| @@ -83,6 +83,11 @@ func (p *Project) process() { | |||||||
|  |  | ||||||
| 	// Get licensing information for every dependency. | 	// Get licensing information for every dependency. | ||||||
| 	for _, dep := range p.deps { | 	for _, dep := range p.deps { | ||||||
|  | 		// Prepare dependency's things. For now - only check if | ||||||
|  | 		// file/directory templates defined and, if not, generate | ||||||
|  | 		// them. | ||||||
|  | 		dep.VCS.FormatSourcePaths() | ||||||
|  |  | ||||||
| 		depDir, err := filer.FromDirectory(dep.LocalPath) | 		depDir, err := filer.FromDirectory(dep.LocalPath) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			log.Println("Failed to prepare directory path for dependency license scan:", err.Error()) | 			log.Println("Failed to prepare directory path for dependency license scan:", err.Error()) | ||||||
| @@ -104,6 +109,7 @@ func (p *Project) process() { | |||||||
|  |  | ||||||
| 		// Get highest ranked license. | 		// Get highest ranked license. | ||||||
| 		var ( | 		var ( | ||||||
|  | 			licenseFile string | ||||||
| 			licenseName string | 			licenseName string | ||||||
| 			licenseRank float32 | 			licenseRank float32 | ||||||
| 		) | 		) | ||||||
| @@ -112,6 +118,13 @@ func (p *Project) process() { | |||||||
| 			if licenseRank < result.Confidence { | 			if licenseRank < result.Confidence { | ||||||
| 				licenseName = name | 				licenseName = name | ||||||
| 				licenseRank = result.Confidence | 				licenseRank = result.Confidence | ||||||
|  |  | ||||||
|  | 				for fileName, confidence := range result.Files { | ||||||
|  | 					if confidence == licenseRank { | ||||||
|  | 						licenseFile = fileName | ||||||
|  | 						break | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| @@ -123,5 +136,9 @@ func (p *Project) process() { | |||||||
| 		log.Printf("Got license for '%s': %s", dep.Name, licenseName) | 		log.Printf("Got license for '%s': %s", dep.Name, licenseName) | ||||||
|  |  | ||||||
| 		dep.License.Name = licenseName | 		dep.License.Name = licenseName | ||||||
|  |  | ||||||
|  | 		// Generate license path. | ||||||
|  | 		urlFormatter := strings.NewReplacer("{dir}", "", "{/dir}", "", "{file}", licenseFile, "{/file}", licenseFile, "#L{line}", "") | ||||||
|  | 		dep.License.URL = urlFormatter.Replace(dep.VCS.SourceURLFileTemplate) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,5 +1,10 @@ | |||||||
| package structs | package structs | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	// stdlib | ||||||
|  | 	"strings" | ||||||
|  | ) | ||||||
|  |  | ||||||
| // VCSData describes structure of go-import and go-source data. | // VCSData describes structure of go-import and go-source data. | ||||||
| type VCSData struct { | type VCSData struct { | ||||||
| 	// Branch is a VCS branch used. | 	// Branch is a VCS branch used. | ||||||
| @@ -17,3 +22,25 @@ type VCSData struct { | |||||||
| 	// VCSPath is a VCS repository path. | 	// VCSPath is a VCS repository path. | ||||||
| 	VCSPath string | 	VCSPath string | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // FormatSourcePaths tries to create templates which will be used for | ||||||
|  | // paths formatting. E.g. when generating path to license file. | ||||||
|  | // This is required because for some repositories github.com (and | ||||||
|  | // probably gitlab.com too) might not return go-source element in | ||||||
|  | // page's <head> tag. | ||||||
|  | func (vd *VCSData) FormatSourcePaths() { | ||||||
|  | 	// Do nothing if templates was filled (e.g. when parsing HTML page | ||||||
|  | 	// for repository with "?go-get=1" parameter). | ||||||
|  | 	if vd.SourceURLDirTemplate != "" && vd.SourceURLFileTemplate != "" { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// If no URL templates was provided by github and we know that | ||||||
|  | 	// dependency is using it as VCS storage - generate proper | ||||||
|  | 	// template URLs. | ||||||
|  | 	if vd.VCS == "git" && vd.VCSPath != "" && strings.Contains(vd.VCSPath, "github.com") { | ||||||
|  | 		repoPathSplitted := strings.Split(vd.VCSPath, ".") | ||||||
|  | 		vd.SourceURLDirTemplate = strings.Join(repoPathSplitted[:len(repoPathSplitted)-1], ".") + "/blob/" + vd.Branch + "{/dir}" | ||||||
|  | 		vd.SourceURLFileTemplate = strings.Join(repoPathSplitted[:len(repoPathSplitted)-1], ".") + "/blob/" + vd.Branch + "{/dir}/{file}#L{line}" | ||||||
|  | 	} | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user