mirror of
https://github.com/rocky-linux/srpmproc.git
synced 2024-12-04 18:36:26 +00:00
Merge pull request #8 from skip77/main
This commit is contained in:
commit
6e2ed2eb23
@ -855,9 +855,9 @@ func processRPMTagless(pd *data.ProcessData) (*srpmprocpb.ProcessResponse, error
|
|||||||
|
|
||||||
// get name-version-release of tagless repo, only if we're not a module repo:
|
// get name-version-release of tagless repo, only if we're not a module repo:
|
||||||
if !pd.ModuleMode {
|
if !pd.ModuleMode {
|
||||||
nvrString := getVersionFromSpec(md.Name, localPath, pd.Version)
|
nvrString, err := getVersionFromSpec(localPath, pd.Version)
|
||||||
if nvrString == "" {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Error using rpm or rpmbuild to build SRPM and determine version info! (tagless mode)")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set version and release fields we extracted (name|version|release are separated by pipes)
|
// Set version and release fields we extracted (name|version|release are separated by pipes)
|
||||||
@ -1176,112 +1176,47 @@ func convertMetaData(pkgName string, localRepo string) bool {
|
|||||||
// - create a "dummy" SRPM (using dummy sources files we use to populate tarballs from lookaside)
|
// - create a "dummy" SRPM (using dummy sources files we use to populate tarballs from lookaside)
|
||||||
// - extract RPM version info from that SRPM, and return it
|
// - extract RPM version info from that SRPM, and return it
|
||||||
// If we are in tagless mode, we need to get a package version somehow!
|
// If we are in tagless mode, we need to get a package version somehow!
|
||||||
func getVersionFromSpec(pkgName string, localRepo string, majorVersion int) string {
|
func getVersionFromSpec(localRepo string, majorVersion int) (string, error) {
|
||||||
// Make sure we have "rpm" and "rpmbuild" and "cp" available in our PATH. Otherwise, this won't work:
|
// Make sure we have "rpm" and "rpmbuild" and "cp" available in our PATH. Otherwise, this won't work:
|
||||||
_, err := exec.LookPath("rpm")
|
_, err := exec.LookPath("rpmspec")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ""
|
return "", fmt.Errorf("Could not find rpmspec program in PATH")
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = exec.LookPath("rpmbuild")
|
// Read the first file from SPECS/ to get our spec file
|
||||||
|
// (there should only be one file - we check that it ends in ".spec" just to be sure!)
|
||||||
|
lsTmp, err := ioutil.ReadDir(fmt.Sprintf("%s/SPECS/", localRepo))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ""
|
return "", err
|
||||||
|
}
|
||||||
|
specFile := lsTmp[0].Name()
|
||||||
|
|
||||||
|
if !strings.HasSuffix(specFile, ".spec") {
|
||||||
|
return "", fmt.Errorf("First file found in SPECS/ is not a .spec file! Check the SPECS/ directory in the repo?")
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = exec.LookPath("cp")
|
// Call the rpmspec binary to extract the version-release info out of it, and tack on ".el<VERSION>" at the end:
|
||||||
if err != nil {
|
cmdArgs := []string{
|
||||||
return ""
|
"--srpm",
|
||||||
|
fmt.Sprintf(`--define=dist .el%d`, majorVersion),
|
||||||
|
"-q",
|
||||||
|
"--queryformat",
|
||||||
|
`%{NAME}|%{VERSION}|%{RELEASE}\n`,
|
||||||
|
fmt.Sprintf("%s/SPECS/%s", localRepo, specFile),
|
||||||
}
|
}
|
||||||
|
cmd := exec.Command("rpmspec", cmdArgs...)
|
||||||
// create separate temp folder space to do our RPM work - we don't want to accidentally contaminate the main Git area:
|
|
||||||
rpmBuildPath := fmt.Sprintf("%s_rpm", localRepo)
|
|
||||||
os.Mkdir(rpmBuildPath, 0o755)
|
|
||||||
|
|
||||||
// Copy SOURCES/ and SPECS/ into the temp rpmbuild directory recursively
|
|
||||||
// Yes, we could create or import an elaborate Go-native way to do this, but damnit this is easier:
|
|
||||||
cmdArgs := strings.Fields(fmt.Sprintf("cp -rp %s/SOURCES %s/SPECS %s/", localRepo, localRepo, rpmBuildPath))
|
|
||||||
if err := exec.Command(cmdArgs[0], cmdArgs[1:]...).Run(); err != nil {
|
|
||||||
log.Println(err)
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// Loop through .<package>.metadata and get the file names we need to make our SRPM:
|
|
||||||
lookAside, err := os.Open(fmt.Sprintf("%s/.%s.metadata", localRepo, pkgName))
|
|
||||||
if err != nil {
|
|
||||||
log.Println(err)
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// Split file into lines and start processing:
|
|
||||||
scanner := bufio.NewScanner(lookAside)
|
|
||||||
scanner.Split(bufio.ScanLines)
|
|
||||||
|
|
||||||
// loop through each line, and:
|
|
||||||
// - isolate the SOURCES/filename entry
|
|
||||||
// - write out a dummy file of the same name to rpmBuildPath/SOURCES
|
|
||||||
for scanner.Scan() {
|
|
||||||
|
|
||||||
// lookaside source is always the 2nd part of the line (after the long SHA sum)
|
|
||||||
srcFile := strings.Fields(scanner.Text())[1]
|
|
||||||
|
|
||||||
// write a dummy file of the same name into the rpmbuild SOURCES/ directory:
|
|
||||||
dummyFile, err := os.OpenFile(fmt.Sprintf("%s/%s", rpmBuildPath, srcFile), os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644)
|
|
||||||
if err != nil {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
writer := bufio.NewWriter(dummyFile)
|
|
||||||
_, _ = writer.WriteString("This is a dummy lookaside file generated by srpmproc. It is only needed to get a working SRPM and extract version information. Please disregard\n")
|
|
||||||
writer.Flush()
|
|
||||||
dummyFile.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
lookAside.Close()
|
|
||||||
|
|
||||||
// Now, call rpmbuild to produce the dummy src file:
|
|
||||||
// Example: rpmbuild --define "_topdir /tmp/srpmproctmp_httpd1988142783_rpm" -bs /tmp/srpmproctmp_httpd1988142783_rpm/SPECS/*.spec
|
|
||||||
cmd := exec.Command("rpmbuild", fmt.Sprintf(`--define=_topdir %s`, rpmBuildPath), fmt.Sprintf(`--define=dist .el%d`, majorVersion), "-bs", fmt.Sprintf("%s/SPECS/%s.spec", rpmBuildPath, pkgName))
|
|
||||||
if err := cmd.Run(); err != nil {
|
|
||||||
log.Println(err)
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read the first file from the SRPMS/ folder in rpmBuildPath. It should be the SRPM that rpmbuild produced above
|
|
||||||
// (there should only be one file - we check that it ends in ".rpm" just to be sure!)
|
|
||||||
lsTmp, err := ioutil.ReadDir(fmt.Sprintf("%s/SRPMS/", rpmBuildPath))
|
|
||||||
if err != nil {
|
|
||||||
log.Println(err)
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
srpmFile := lsTmp[0].Name()
|
|
||||||
|
|
||||||
if !strings.HasSuffix(srpmFile, ".rpm") {
|
|
||||||
log.Println("Error, file found in dummy SRPMS directory did not have an .rpm extension! Perhaps rpmbuild didn't produce a proper source RPM?")
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// Call the rpm binary to extract the version-release info out of it, and tack on ".el<VERSION>" at the end:
|
|
||||||
cmd = exec.Command("rpm", "-qp", "--qf", `%{NAME}|%{VERSION}|%{RELEASE}\n`, fmt.Sprintf("%s/SRPMS/%s", rpmBuildPath, srpmFile))
|
|
||||||
nvrTmp, err := cmd.CombinedOutput()
|
nvrTmp, err := cmd.CombinedOutput()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("Error running rpm command to extract temporary SRPM name-version-release identifiers.")
|
return "", fmt.Errorf("Error running rpmspec command to determine RPM name-version-release identifier. \nCommand attempted: %s \nCommand output: %s", cmd.String(), string(nvrTmp))
|
||||||
log.Println("rpmbuild output: ", string(nvrTmp))
|
|
||||||
log.Println("rpmbuild command: ", cmd.String())
|
|
||||||
return ""
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pull first line of the rpm command's output to get the name-version-release number (there should only be 1 line)
|
// Pull first line of the version output to get the name-version-release number (there should only be 1 line)
|
||||||
nvr := string(nvrTmp)
|
nvr := string(nvrTmp)
|
||||||
nvr = strings.Fields(nvr)[0]
|
nvr = strings.Fields(nvr)[0]
|
||||||
|
|
||||||
// Clean up: delete the temporary directory
|
|
||||||
if err := os.RemoveAll(rpmBuildPath); err != nil {
|
|
||||||
log.Printf("Error cleaning up temporary RPM directory %s . Non-fatal, continuing anyway...\n", rpmBuildPath)
|
|
||||||
}
|
|
||||||
|
|
||||||
// return name-version-release string we derived:
|
// return name-version-release string we derived:
|
||||||
log.Printf("Derived NVR %s from tagless repo via temporary SRPM build\n", nvr)
|
log.Printf("Derived NVR %s from tagless repo via rpmspec command\n", nvr)
|
||||||
return nvr
|
return nvr, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// We need to loop through the lookaside blob files ("SourcesToIgnore"),
|
// We need to loop through the lookaside blob files ("SourcesToIgnore"),
|
||||||
|
Loading…
Reference in New Issue
Block a user