mirror of
https://github.com/safing/portbase
synced 2025-09-02 10:40:39 +00:00
Merge pull request #109 from safing/fix/binary-name-fetching
Fix binary name getter on Windows
This commit is contained in:
commit
ef2fc829e0
4 changed files with 32 additions and 39 deletions
|
@ -9,7 +9,8 @@ import (
|
||||||
var (
|
var (
|
||||||
segmentsSplitter = regexp.MustCompile("[^A-Za-z0-9]*[A-Z]?[a-z0-9]*")
|
segmentsSplitter = regexp.MustCompile("[^A-Za-z0-9]*[A-Z]?[a-z0-9]*")
|
||||||
nameOnly = regexp.MustCompile("^[A-Za-z0-9]+$")
|
nameOnly = regexp.MustCompile("^[A-Za-z0-9]+$")
|
||||||
delimiters = regexp.MustCompile("^[^A-Za-z0-9]+")
|
delimitersAtStart = regexp.MustCompile("^[^A-Za-z0-9]+")
|
||||||
|
delimitersOnly = regexp.MustCompile("^[^A-Za-z0-9]+$")
|
||||||
)
|
)
|
||||||
|
|
||||||
// GenerateBinaryNameFromPath generates a more human readable binary name from
|
// GenerateBinaryNameFromPath generates a more human readable binary name from
|
||||||
|
@ -52,7 +53,7 @@ func GenerateBinaryNameFromPath(path string) string {
|
||||||
// Post-process name parts
|
// Post-process name parts
|
||||||
for i := range nameParts {
|
for i := range nameParts {
|
||||||
// Remove any leading delimiters.
|
// Remove any leading delimiters.
|
||||||
nameParts[i] = delimiters.ReplaceAllString(nameParts[i], "")
|
nameParts[i] = delimitersAtStart.ReplaceAllString(nameParts[i], "")
|
||||||
|
|
||||||
// Title-case name-only parts.
|
// Title-case name-only parts.
|
||||||
if nameOnly.MatchString(nameParts[i]) {
|
if nameOnly.MatchString(nameParts[i]) {
|
||||||
|
@ -63,7 +64,9 @@ func GenerateBinaryNameFromPath(path string) string {
|
||||||
return strings.Join(nameParts, " ")
|
return strings.Join(nameParts, " ")
|
||||||
}
|
}
|
||||||
|
|
||||||
func cleanFileDescription(fields []string) string {
|
func cleanFileDescription(fileDescr string) string {
|
||||||
|
fields := strings.Fields(fileDescr)
|
||||||
|
|
||||||
// If there is a 1 or 2 character delimiter field, only use fields before it.
|
// If there is a 1 or 2 character delimiter field, only use fields before it.
|
||||||
endIndex := len(fields)
|
endIndex := len(fields)
|
||||||
for i, field := range fields {
|
for i, field := range fields {
|
||||||
|
@ -82,5 +85,10 @@ func cleanFileDescription(fields []string) string {
|
||||||
binName = strings.SplitN(binName, ". ", 2)[0]
|
binName = strings.SplitN(binName, ". ", 2)[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
return binName
|
// If does not have any characters or numbers, return an empty string.
|
||||||
|
if delimitersOnly.MatchString(binName) {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return strings.TrimSpace(binName)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package osdetail
|
package osdetail
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
@ -21,15 +20,19 @@ func TestGenerateBinaryNameFromPath(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCleanFileDescription(t *testing.T) {
|
func TestCleanFileDescription(t *testing.T) {
|
||||||
assert.Equal(t, "Product Name", cleanFileDescription(strings.Fields("Product Name. Does this and that.")))
|
assert.Equal(t, "Product Name", cleanFileDescription("Product Name. Does this and that."))
|
||||||
assert.Equal(t, "Product Name", cleanFileDescription(strings.Fields("Product Name - Does this and that.")))
|
assert.Equal(t, "Product Name", cleanFileDescription("Product Name - Does this and that."))
|
||||||
assert.Equal(t, "Product Name", cleanFileDescription(strings.Fields("Product Name / Does this and that.")))
|
assert.Equal(t, "Product Name", cleanFileDescription("Product Name / Does this and that."))
|
||||||
assert.Equal(t, "Product Name", cleanFileDescription(strings.Fields("Product Name :: Does this and that.")))
|
assert.Equal(t, "Product Name", cleanFileDescription("Product Name :: Does this and that."))
|
||||||
assert.Equal(t, "/ Product Name", cleanFileDescription(strings.Fields("/ Product Name")))
|
assert.Equal(t, "/ Product Name", cleanFileDescription("/ Product Name"))
|
||||||
assert.Equal(t, "Product", cleanFileDescription(strings.Fields("Product / Name")))
|
assert.Equal(t, "Product", cleanFileDescription("Product / Name"))
|
||||||
|
assert.Equal(t, "", cleanFileDescription(". / Name"))
|
||||||
|
assert.Equal(t, "", cleanFileDescription(". "))
|
||||||
|
assert.Equal(t, "", cleanFileDescription("."))
|
||||||
|
assert.Equal(t, "N/A", cleanFileDescription("N/A"))
|
||||||
|
|
||||||
assert.Equal(t,
|
assert.Equal(t,
|
||||||
"Product Name a Does this and that.",
|
"Product Name a Does this and that.",
|
||||||
cleanFileDescription(strings.Fields("Product Name a Does this and that.")),
|
cleanFileDescription("Product Name a Does this and that."),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,10 @@
|
||||||
package osdetail
|
package osdetail
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const powershellGetFileDescription = `Get-ItemProperty %q | Format-List`
|
const powershellGetFileDescription = `Get-ItemProperty %q | Select -ExpandProperty VersionInfo | Select -ExpandProperty FileDescription`
|
||||||
|
|
||||||
// GetBinaryNameFromSystem queries the operating system for a human readable
|
// GetBinaryNameFromSystem queries the operating system for a human readable
|
||||||
// name for the given binary path.
|
// name for the given binary path.
|
||||||
|
@ -18,25 +15,10 @@ func GetBinaryNameFromSystem(path string) (string, error) {
|
||||||
return "", fmt.Errorf("failed to get file properties of %s: %s", path, err)
|
return "", fmt.Errorf("failed to get file properties of %s: %s", path, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create scanner for the output.
|
// Clean name.
|
||||||
scanner := bufio.NewScanner(bytes.NewBufferString(output))
|
binName := cleanFileDescription(output)
|
||||||
scanner.Split(bufio.ScanLines)
|
if binName != "" {
|
||||||
|
return binName, nil
|
||||||
// Search for the FileDescription line.
|
|
||||||
for scanner.Scan() {
|
|
||||||
// Split line up into fields.
|
|
||||||
fields := strings.Fields(scanner.Text())
|
|
||||||
// Discard lines with less than two fields.
|
|
||||||
if len(fields) < 2 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
// Skip all lines that we aren't looking for.
|
|
||||||
if fields[0] != "FileDescription:" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clean and return.
|
|
||||||
return cleanFileDescription(fields[1:]), nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate a default name as default.
|
// Generate a default name as default.
|
||||||
|
|
|
@ -30,7 +30,7 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func printBinaryName(name, path string) {
|
func printBinaryName(name, path string) {
|
||||||
binName, err := osdetail.GetBinaryName(path)
|
binName, err := osdetail.GetBinaryNameFromSystem(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("%s: ERROR: %s\n", name, err)
|
fmt.Printf("%s: ERROR: %s\n", name, err)
|
||||||
} else {
|
} else {
|
||||||
|
@ -39,7 +39,7 @@ func printBinaryName(name, path string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func printBinaryIcon(name, path string) {
|
func printBinaryIcon(name, path string) {
|
||||||
binIcon, err := osdetail.GetBinaryIcon(path)
|
binIcon, err := osdetail.GetBinaryIconFromSystem(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("%s: ERROR: %s\n", name, err)
|
fmt.Printf("%s: ERROR: %s\n", name, err)
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Add table
Reference in a new issue