mirror of
				https://git.proxmox.com/git/mirror_linux-firmware
				synced 2025-11-04 00:27:47 +00:00 
			
		
		
		
	Merge branch 'pr/misc-fixes' into 'main'
check_whence.py: use consistent naming See merge request kernel-firmware/linux-firmware!319
This commit is contained in:
		
						commit
						c410e4c9fa
					
				
							
								
								
									
										21
									
								
								.editorconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								.editorconfig
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,21 @@
 | 
			
		||||
# To use this config on you editor, follow the instructions at:
 | 
			
		||||
# http://editorconfig.org
 | 
			
		||||
 | 
			
		||||
root = true
 | 
			
		||||
 | 
			
		||||
[*]
 | 
			
		||||
charset = utf-8
 | 
			
		||||
insert_final_newline = true
 | 
			
		||||
tab_width = 8
 | 
			
		||||
max_line_length = 90
 | 
			
		||||
 | 
			
		||||
[Makefile]
 | 
			
		||||
indent_style = tab
 | 
			
		||||
 | 
			
		||||
[*.{sh,py}]
 | 
			
		||||
indent_style = space
 | 
			
		||||
indent_size = 4
 | 
			
		||||
 | 
			
		||||
[*.{yml,yaml}]
 | 
			
		||||
indent_style = space
 | 
			
		||||
indent_size = 2
 | 
			
		||||
@ -11,7 +11,7 @@ check-commits:
 | 
			
		||||
  stage: test
 | 
			
		||||
  image: registry.gitlab.com/kernel-firmware/linux-firmware
 | 
			
		||||
  rules:
 | 
			
		||||
   - if: $CI_MERGE_REQUEST_ID
 | 
			
		||||
    - if: $CI_MERGE_REQUEST_ID
 | 
			
		||||
  script:
 | 
			
		||||
    - ci-fairy check-commits --signed-off-by --textwidth=0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,30 +1,30 @@
 | 
			
		||||
default_stages: [commit]
 | 
			
		||||
repos:
 | 
			
		||||
-   repo: https://github.com/pre-commit/pre-commit-hooks
 | 
			
		||||
  - repo: https://github.com/pre-commit/pre-commit-hooks
 | 
			
		||||
    rev: v4.0.1
 | 
			
		||||
    hooks:
 | 
			
		||||
    -   id: check-executables-have-shebangs
 | 
			
		||||
    -   id: forbid-new-submodules
 | 
			
		||||
    -   id: check-yaml
 | 
			
		||||
    -   id: check-symlinks
 | 
			
		||||
    -   id: destroyed-symlinks
 | 
			
		||||
-   repo: https://github.com/shellcheck-py/shellcheck-py
 | 
			
		||||
      - id: check-executables-have-shebangs
 | 
			
		||||
      - id: forbid-new-submodules
 | 
			
		||||
      - id: check-yaml
 | 
			
		||||
      - id: check-symlinks
 | 
			
		||||
      - id: destroyed-symlinks
 | 
			
		||||
  - repo: https://github.com/shellcheck-py/shellcheck-py
 | 
			
		||||
    rev: v0.9.0.5
 | 
			
		||||
    hooks:
 | 
			
		||||
    -   id: shellcheck
 | 
			
		||||
-   repo: https://github.com/ambv/black
 | 
			
		||||
      - id: shellcheck
 | 
			
		||||
  - repo: https://github.com/ambv/black
 | 
			
		||||
    rev: 22.6.0
 | 
			
		||||
    hooks:
 | 
			
		||||
    - id: black
 | 
			
		||||
-   repo: https://github.com/igorshubovych/markdownlint-cli
 | 
			
		||||
      - id: black
 | 
			
		||||
  - repo: https://github.com/igorshubovych/markdownlint-cli
 | 
			
		||||
    rev: v0.33.0
 | 
			
		||||
    hooks:
 | 
			
		||||
    - id: markdownlint
 | 
			
		||||
      args: ['--fix']
 | 
			
		||||
-   repo: local
 | 
			
		||||
      - id: markdownlint
 | 
			
		||||
        args: ['--fix']
 | 
			
		||||
  - repo: local
 | 
			
		||||
    hooks:
 | 
			
		||||
    - id: check-whence
 | 
			
		||||
      name: Check whence
 | 
			
		||||
      files: 'WHENCE'
 | 
			
		||||
      language: script
 | 
			
		||||
      entry: ./check_whence.py
 | 
			
		||||
      - id: check-whence
 | 
			
		||||
        name: Check whence
 | 
			
		||||
        files: 'WHENCE'
 | 
			
		||||
        language: script
 | 
			
		||||
        entry: ./check_whence.py
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										9
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								Makefile
									
									
									
									
									
								
							@ -26,21 +26,22 @@ deb:
 | 
			
		||||
rpm:
 | 
			
		||||
	./build_packages.py --rpm
 | 
			
		||||
 | 
			
		||||
install:
 | 
			
		||||
	install -d $(DESTDIR)$(FIRMWAREDIR)
 | 
			
		||||
	./copy-firmware.sh $(COPYOPTS) $(DESTDIR)$(FIRMWAREDIR)
 | 
			
		||||
install: install-nodedup
 | 
			
		||||
	./dedup-firmware.sh $(DESTDIR)$(FIRMWAREDIR)
 | 
			
		||||
 | 
			
		||||
install-nodedup:
 | 
			
		||||
	install -d $(DESTDIR)$(FIRMWAREDIR)
 | 
			
		||||
	./copy-firmware.sh --ignore-duplicates $(DESTDIR)$(FIRMWAREDIR)
 | 
			
		||||
	./copy-firmware.sh $(DESTDIR)$(FIRMWAREDIR)
 | 
			
		||||
 | 
			
		||||
install-xz:
 | 
			
		||||
	install -d $(DESTDIR)$(FIRMWAREDIR)
 | 
			
		||||
	./copy-firmware.sh --xz $(DESTDIR)$(FIRMWAREDIR)
 | 
			
		||||
	./dedup-firmware.sh $(DESTDIR)$(FIRMWAREDIR)
 | 
			
		||||
 | 
			
		||||
install-zst:
 | 
			
		||||
	install -d $(DESTDIR)$(FIRMWAREDIR)
 | 
			
		||||
	./copy-firmware.sh --zstd $(DESTDIR)$(FIRMWAREDIR)
 | 
			
		||||
	./dedup-firmware.sh $(DESTDIR)$(FIRMWAREDIR)
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	rm -rf release dist
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										14
									
								
								WHENCE
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								WHENCE
									
									
									
									
									
								
							@ -3699,7 +3699,7 @@ File: ath10k/WCN3990/hw1.0/qcm2290/wlanmdsp.mbn
 | 
			
		||||
Version: WLAN.HL.3.3.7.c2-00931-QCAHLSWMTPLZ-1
 | 
			
		||||
Link: ath10k/WCN3990/hw1.0/qrb4210/wlanmdsp.mbn -> ../qcm2290/wlanmdsp.mbn
 | 
			
		||||
Link: qcom/qcm2290/wlanmdsp.mbn -> ../../ath10k/WCN3990/hw1.0/qcm2290/wlanmdsp.mbn
 | 
			
		||||
Link: qcom/qrb4210/wlanmdsp.mbn -> ../../ath10k/WCN3990/hw1.0/qrb4210/wlanmdsp.mbn
 | 
			
		||||
Link: qcom/qrb4210/wlanmdsp.mbn -> ../../ath10k/WCN3990/hw1.0/qcm2290/wlanmdsp.mbn
 | 
			
		||||
File: ath10k/WCN3990/hw1.0/qcm2290/firmware-5.bin
 | 
			
		||||
Link: ath10k/WCN3990/hw1.0/qrb4210/firmware-5.bin -> ../qcm2290/firmware-5.bin
 | 
			
		||||
 | 
			
		||||
@ -5227,11 +5227,11 @@ Link: nvidia/gp104/acr/bl.bin -> ../../gp102/acr/bl.bin
 | 
			
		||||
Link: nvidia/gp104/acr/ucode_load.bin -> ../../gp102/acr/ucode_load.bin
 | 
			
		||||
Link: nvidia/gp104/acr/ucode_unload.bin -> ../../gp102/acr/ucode_unload.bin
 | 
			
		||||
Link: nvidia/gp104/acr/unload_bl.bin -> ../../gp102/acr/unload_bl.bin
 | 
			
		||||
Link: nvidia/gp104/gr/fecs_bl.bin -> ../../gp102/gr/fecs_bl.bin
 | 
			
		||||
Link: nvidia/gp104/gr/fecs_bl.bin -> ../../gm200/gr/fecs_bl.bin
 | 
			
		||||
File: nvidia/gp104/gr/fecs_data.bin
 | 
			
		||||
File: nvidia/gp104/gr/fecs_inst.bin
 | 
			
		||||
File: nvidia/gp104/gr/fecs_sig.bin
 | 
			
		||||
Link: nvidia/gp104/gr/gpccs_bl.bin -> ../../gp102/gr/gpccs_bl.bin
 | 
			
		||||
Link: nvidia/gp104/gr/gpccs_bl.bin -> ../../gm200/gr/gpccs_bl.bin
 | 
			
		||||
File: nvidia/gp104/gr/gpccs_data.bin
 | 
			
		||||
File: nvidia/gp104/gr/gpccs_inst.bin
 | 
			
		||||
File: nvidia/gp104/gr/gpccs_sig.bin
 | 
			
		||||
@ -5250,11 +5250,11 @@ Link: nvidia/gp106/acr/bl.bin -> ../../gp102/acr/bl.bin
 | 
			
		||||
Link: nvidia/gp106/acr/ucode_load.bin -> ../../gp102/acr/ucode_load.bin
 | 
			
		||||
Link: nvidia/gp106/acr/ucode_unload.bin -> ../../gp102/acr/ucode_unload.bin
 | 
			
		||||
Link: nvidia/gp106/acr/unload_bl.bin -> ../../gp102/acr/unload_bl.bin
 | 
			
		||||
Link: nvidia/gp106/gr/fecs_bl.bin -> ../../gp102/gr/fecs_bl.bin
 | 
			
		||||
Link: nvidia/gp106/gr/fecs_bl.bin -> ../../gm200/gr/fecs_bl.bin
 | 
			
		||||
File: nvidia/gp106/gr/fecs_data.bin
 | 
			
		||||
Link: nvidia/gp106/gr/fecs_inst.bin -> ../../gp102/gr/fecs_inst.bin
 | 
			
		||||
File: nvidia/gp106/gr/fecs_sig.bin
 | 
			
		||||
Link: nvidia/gp106/gr/gpccs_bl.bin -> ../../gp102/gr/gpccs_bl.bin
 | 
			
		||||
Link: nvidia/gp106/gr/gpccs_bl.bin -> ../../gm200/gr/gpccs_bl.bin
 | 
			
		||||
File: nvidia/gp106/gr/gpccs_data.bin
 | 
			
		||||
Link: nvidia/gp106/gr/gpccs_inst.bin -> ../../gp102/gr/gpccs_inst.bin
 | 
			
		||||
File: nvidia/gp106/gr/gpccs_sig.bin
 | 
			
		||||
@ -5998,10 +5998,10 @@ File: netronome/flower/nic_AMDA0096.nffw
 | 
			
		||||
File: netronome/flower/nic_AMDA0097.nffw
 | 
			
		||||
File: netronome/flower/nic_AMDA0058.nffw
 | 
			
		||||
Link: netronome/flower/nic_AMDA0081.nffw -> nic_AMDA0097.nffw
 | 
			
		||||
Link: netronome/flower/nic_AMDA0081-0001_1x40.nffw -> nic_AMDA0081.nffw
 | 
			
		||||
Link: netronome/flower/nic_AMDA0081-0001_1x40.nffw -> nic_AMDA0097.nffw
 | 
			
		||||
Link: netronome/flower/nic_AMDA0097-0001_2x40.nffw -> nic_AMDA0097.nffw
 | 
			
		||||
Link: netronome/flower/nic_AMDA0099-0001_2x10.nffw -> nic_AMDA0099.nffw
 | 
			
		||||
Link: netronome/flower/nic_AMDA0081-0001_4x10.nffw -> nic_AMDA0081.nffw
 | 
			
		||||
Link: netronome/flower/nic_AMDA0081-0001_4x10.nffw -> nic_AMDA0097.nffw
 | 
			
		||||
Link: netronome/flower/nic_AMDA0097-0001_4x10_1x40.nffw -> nic_AMDA0097.nffw
 | 
			
		||||
Link: netronome/flower/nic_AMDA0099-0001_2x25.nffw -> nic_AMDA0099.nffw
 | 
			
		||||
Link: netronome/flower/nic_AMDA0096-0001_2x10.nffw -> nic_AMDA0096.nffw
 | 
			
		||||
 | 
			
		||||
@ -37,7 +37,7 @@ def list_whence_files():
 | 
			
		||||
        for line in whence:
 | 
			
		||||
            match = re.match(r"(?:RawFile|File):\s*(.*)", line)
 | 
			
		||||
            if match:
 | 
			
		||||
                yield match.group(1).replace("\ ", " ").replace('"', "")
 | 
			
		||||
                yield match.group(1).replace(r"\ ", " ").replace('"', "")
 | 
			
		||||
                continue
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -48,8 +48,8 @@ def list_links_list():
 | 
			
		||||
            if match:
 | 
			
		||||
                linkname, target = match.group(1).split("->")
 | 
			
		||||
 | 
			
		||||
                linkname = linkname.strip().replace("\ ", " ").replace('"', "")
 | 
			
		||||
                target = target.strip().replace("\ ", " ").replace('"', "")
 | 
			
		||||
                linkname = linkname.strip().replace(r"\ ", " ").replace('"', "")
 | 
			
		||||
                target = target.strip().replace(r"\ ", " ").replace('"', "")
 | 
			
		||||
 | 
			
		||||
                # Link target is relative to the link
 | 
			
		||||
                target = os.path.join(os.path.dirname(linkname), target)
 | 
			
		||||
@ -73,23 +73,25 @@ def main():
 | 
			
		||||
    whence_links = list(zip(*links_list))[0]
 | 
			
		||||
    known_files = set(name for name in whence_list if not name.endswith("/")) | set(
 | 
			
		||||
        [
 | 
			
		||||
            ".gitignore",
 | 
			
		||||
            ".codespell.cfg",
 | 
			
		||||
            ".editorconfig",
 | 
			
		||||
            ".gitignore",
 | 
			
		||||
            ".gitlab-ci.yml",
 | 
			
		||||
            ".pre-commit-config.yaml",
 | 
			
		||||
            "Dockerfile",
 | 
			
		||||
            "Makefile",
 | 
			
		||||
            "README.md",
 | 
			
		||||
            "WHENCE",
 | 
			
		||||
            "build_packages.py",
 | 
			
		||||
            "check_whence.py",
 | 
			
		||||
            "configure",
 | 
			
		||||
            "Makefile",
 | 
			
		||||
            "README.md",
 | 
			
		||||
            "copy-firmware.sh",
 | 
			
		||||
            "WHENCE",
 | 
			
		||||
            "Dockerfile",
 | 
			
		||||
            "contrib/process_linux_firmware.py",
 | 
			
		||||
            "contrib/templates/debian.changelog",
 | 
			
		||||
            "contrib/templates/debian.control",
 | 
			
		||||
            "contrib/templates/debian.copyright",
 | 
			
		||||
            "contrib/templates/rpm.spec",
 | 
			
		||||
            "contrib/process_linux_firmware.py",
 | 
			
		||||
            "copy-firmware.sh",
 | 
			
		||||
            "dedup-firmware.sh",
 | 
			
		||||
        ]
 | 
			
		||||
    )
 | 
			
		||||
    known_prefixes = set(name for name in whence_list if name.endswith("/"))
 | 
			
		||||
@ -99,7 +101,7 @@ def main():
 | 
			
		||||
        sys.stderr.write("E: %s listed in WHENCE as File, but is directory\n" % name)
 | 
			
		||||
        ret = 1
 | 
			
		||||
 | 
			
		||||
    for name in set(fw for fw in whence_files if whence_files.count(fw) > 1):
 | 
			
		||||
    for name in set(name for name in whence_files if whence_files.count(name) > 1):
 | 
			
		||||
        sys.stderr.write("E: %s listed in WHENCE twice\n" % name)
 | 
			
		||||
        ret = 1
 | 
			
		||||
 | 
			
		||||
@ -107,7 +109,7 @@ def main():
 | 
			
		||||
        sys.stderr.write("E: %s listed in WHENCE twice\n" % name)
 | 
			
		||||
        ret = 1
 | 
			
		||||
 | 
			
		||||
    for name in set(link for link in whence_files if os.path.islink(link)):
 | 
			
		||||
    for name in set(file for file in whence_files if os.path.islink(file)):
 | 
			
		||||
        sys.stderr.write("E: %s listed in WHENCE as File, but is a symlink\n" % name)
 | 
			
		||||
        ret = 1
 | 
			
		||||
 | 
			
		||||
@ -115,12 +117,20 @@ def main():
 | 
			
		||||
        sys.stderr.write("E: %s listed in WHENCE as Link, is in tree\n" % name)
 | 
			
		||||
        ret = 1
 | 
			
		||||
 | 
			
		||||
    invalid_targets = set(link[0] for link in links_list)
 | 
			
		||||
    for link, target in sorted(links_list):
 | 
			
		||||
        if target in invalid_targets:
 | 
			
		||||
            sys.stderr.write(
 | 
			
		||||
                "E: target %s of link %s is also a link\n" % (target, link)
 | 
			
		||||
            )
 | 
			
		||||
            ret = 1
 | 
			
		||||
 | 
			
		||||
    for name in sorted(list(known_files - git_files)):
 | 
			
		||||
        sys.stderr.write("E: %s listed in WHENCE does not exist\n" % name)
 | 
			
		||||
        ret = 1
 | 
			
		||||
 | 
			
		||||
    # A link can point to another link, or to a file...
 | 
			
		||||
    valid_targets = set(link[0] for link in links_list) | git_files
 | 
			
		||||
    # A link can point to a file...
 | 
			
		||||
    valid_targets = set(git_files)
 | 
			
		||||
 | 
			
		||||
    # ... or to a directory
 | 
			
		||||
    for target in set(valid_targets):
 | 
			
		||||
@ -131,10 +141,10 @@ def main():
 | 
			
		||||
                break
 | 
			
		||||
            valid_targets.add(dirname)
 | 
			
		||||
 | 
			
		||||
    for name, target in sorted(links_list):
 | 
			
		||||
    for link, target in sorted(links_list):
 | 
			
		||||
        if target not in valid_targets:
 | 
			
		||||
            sys.stderr.write(
 | 
			
		||||
                "E: target %s of link %s in WHENCE" " does not exist\n" % (target, name)
 | 
			
		||||
                "E: target %s of link %s in WHENCE" " does not exist\n" % (target, link)
 | 
			
		||||
            )
 | 
			
		||||
            ret = 1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										113
									
								
								copy-firmware.sh
									
									
									
									
									
								
							
							
						
						
									
										113
									
								
								copy-firmware.sh
									
									
									
									
									
								
							@ -5,11 +5,19 @@
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
verbose=:
 | 
			
		||||
prune=no
 | 
			
		||||
# shellcheck disable=SC2209
 | 
			
		||||
compress=cat
 | 
			
		||||
compext=
 | 
			
		||||
skip_dedup=0
 | 
			
		||||
destdir=
 | 
			
		||||
 | 
			
		||||
err() {
 | 
			
		||||
    printf "ERROR: %s\n" "$*"
 | 
			
		||||
    exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
warn() {
 | 
			
		||||
    printf "WARNING: %s\n" "$*"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
while test $# -gt 0; do
 | 
			
		||||
    case $1 in
 | 
			
		||||
@ -19,15 +27,9 @@ while test $# -gt 0; do
 | 
			
		||||
            shift
 | 
			
		||||
            ;;
 | 
			
		||||
 | 
			
		||||
        -P | --prune)
 | 
			
		||||
            prune=yes
 | 
			
		||||
            shift
 | 
			
		||||
            ;;
 | 
			
		||||
 | 
			
		||||
        --xz)
 | 
			
		||||
            if test "$compext" = ".zst"; then
 | 
			
		||||
                echo "ERROR: cannot mix XZ and ZSTD compression"
 | 
			
		||||
                exit 1
 | 
			
		||||
                err "cannot mix XZ and ZSTD compression"
 | 
			
		||||
            fi
 | 
			
		||||
            compress="xz --compress --quiet --stdout --check=crc32"
 | 
			
		||||
            compext=".xz"
 | 
			
		||||
@ -36,8 +38,7 @@ while test $# -gt 0; do
 | 
			
		||||
 | 
			
		||||
        --zstd)
 | 
			
		||||
            if test "$compext" = ".xz"; then
 | 
			
		||||
                echo "ERROR: cannot mix XZ and ZSTD compression"
 | 
			
		||||
                exit 1
 | 
			
		||||
                err "cannot mix XZ and ZSTD compression"
 | 
			
		||||
            fi
 | 
			
		||||
            # shellcheck disable=SC2209
 | 
			
		||||
            compress="zstd --compress --quiet --stdout"
 | 
			
		||||
@ -45,23 +46,9 @@ while test $# -gt 0; do
 | 
			
		||||
            shift
 | 
			
		||||
            ;;
 | 
			
		||||
 | 
			
		||||
        --ignore-duplicates)
 | 
			
		||||
            skip_dedup=1
 | 
			
		||||
            shift
 | 
			
		||||
            ;;
 | 
			
		||||
 | 
			
		||||
        -*)
 | 
			
		||||
            if test "$compress" = "cat"; then
 | 
			
		||||
                echo "ERROR: unknown command-line option: $1"
 | 
			
		||||
                exit 1
 | 
			
		||||
            fi
 | 
			
		||||
            compress="$compress $1"
 | 
			
		||||
            shift
 | 
			
		||||
            ;;
 | 
			
		||||
        *)
 | 
			
		||||
            if test "x$destdir" != "x"; then
 | 
			
		||||
                echo "ERROR: unknown command-line options: $*"
 | 
			
		||||
                exit 1
 | 
			
		||||
            if test -n "$destdir"; then
 | 
			
		||||
                err "unknown command-line options: $*"
 | 
			
		||||
            fi
 | 
			
		||||
 | 
			
		||||
            destdir="$1"
 | 
			
		||||
@ -70,21 +57,19 @@ while test $# -gt 0; do
 | 
			
		||||
    esac
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
if [ -z "$destdir" ]; then
 | 
			
		||||
	echo "ERROR: destination directory was not specified"
 | 
			
		||||
	exit 1
 | 
			
		||||
if test -z "$destdir"; then
 | 
			
		||||
    err "destination directory was not specified"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if ! command -v rdfind >/dev/null; then
 | 
			
		||||
	if [ "$skip_dedup" != 1 ]; then
 | 
			
		||||
    		echo "ERROR: rdfind is not installed.  Pass --ignore-duplicates to skip deduplication"
 | 
			
		||||
		exit 1
 | 
			
		||||
	fi
 | 
			
		||||
if test -d "$destdir"; then
 | 
			
		||||
    find "$destdir" -type d -empty >/dev/null || warn "destination folder is not empty."
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
$verbose "Checking that WHENCE file is formatted properly"
 | 
			
		||||
./check_whence.py || err "check_whence.py has detected errors."
 | 
			
		||||
 | 
			
		||||
# shellcheck disable=SC2162 # file/folder name can include escaped symbols
 | 
			
		||||
grep -E '^(RawFile|File):' WHENCE | sed -E -e 's/^(RawFile|File): */\1 /;s/"//g' | while read k f; do
 | 
			
		||||
    test -f "$f" || continue
 | 
			
		||||
    install -d "$destdir/$(dirname "$f")"
 | 
			
		||||
    $verbose "copying/compressing file $f$compext"
 | 
			
		||||
    if test "$compress" != "cat" && test "$k" = "RawFile"; then
 | 
			
		||||
@ -95,59 +80,23 @@ grep -E '^(RawFile|File):' WHENCE | sed -E -e 's/^(RawFile|File): */\1 /;s/"//g'
 | 
			
		||||
    fi
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
if [ "$skip_dedup" != 1 ] ; then
 | 
			
		||||
	$verbose "Finding duplicate files"
 | 
			
		||||
	rdfind -makesymlinks true -makeresultsfile false "$destdir" >/dev/null
 | 
			
		||||
	find "$destdir" -type l | while read -r l; do
 | 
			
		||||
		target="$(realpath "$l")"
 | 
			
		||||
		$verbose "Correcting path for $l"
 | 
			
		||||
		ln -fs "$(realpath --relative-to="$(dirname "$(realpath -s "$l")")" "$target")" "$l"
 | 
			
		||||
	done
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# shellcheck disable=SC2162 # file/folder name can include escaped symbols
 | 
			
		||||
grep -E '^Link:' WHENCE | sed -e 's/^Link: *//g;s/-> //g' | while read f d; do
 | 
			
		||||
    if test -L "$f$compext"; then
 | 
			
		||||
        test -f "$destdir/$f$compext" && continue
 | 
			
		||||
        $verbose "copying link $f$compext"
 | 
			
		||||
        install -d "$destdir/$(dirname "$f")"
 | 
			
		||||
        cp -d "$f$compext" "$destdir/$f$compext"
 | 
			
		||||
 | 
			
		||||
        if test "x$d" != "x"; then
 | 
			
		||||
            target="$(readlink "$f")"
 | 
			
		||||
 | 
			
		||||
            if test "x$target" != "x$d"; then
 | 
			
		||||
                $verbose "WARNING: inconsistent symlink target: $target != $d"
 | 
			
		||||
            else
 | 
			
		||||
                if test "x$prune" != "xyes"; then
 | 
			
		||||
                    $verbose "WARNING: unneeded symlink detected: $f"
 | 
			
		||||
                else
 | 
			
		||||
                    $verbose "WARNING: pruning unneeded symlink $f"
 | 
			
		||||
                    rm -f "$f$compext"
 | 
			
		||||
                fi
 | 
			
		||||
            fi
 | 
			
		||||
        else
 | 
			
		||||
            $verbose "WARNING: missing target for symlink $f"
 | 
			
		||||
        fi
 | 
			
		||||
grep -E '^Link:' WHENCE | sed -e 's/^Link: *//g;s/-> //g' | while read l t; do
 | 
			
		||||
    directory="$destdir/$(dirname "$l")"
 | 
			
		||||
    install -d "$directory"
 | 
			
		||||
    target="$(cd "$directory" && realpath -m -s "$t")"
 | 
			
		||||
    if test -e "$target"; then
 | 
			
		||||
        $verbose "creating link $l -> $t"
 | 
			
		||||
        ln -s "$t" "$destdir/$l"
 | 
			
		||||
    else
 | 
			
		||||
        directory="$destdir/$(dirname "$f")"
 | 
			
		||||
        install -d "$directory"
 | 
			
		||||
        target="$(cd "$directory" && realpath -m -s "$d")"
 | 
			
		||||
        if test -e "$target"; then
 | 
			
		||||
            $verbose "creating link $f -> $d"
 | 
			
		||||
            ln -s "$d" "$destdir/$f"
 | 
			
		||||
        else
 | 
			
		||||
            $verbose "creating link $f$compext -> $d$compext"
 | 
			
		||||
            ln -s "$d$compext" "$destdir/$f$compext"
 | 
			
		||||
        fi
 | 
			
		||||
        $verbose "creating link $l$compext -> $t$compext"
 | 
			
		||||
        ln -s "$t$compext" "$destdir/$l$compext"
 | 
			
		||||
    fi
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
# Verify no broken symlinks
 | 
			
		||||
if test "$(find "$destdir" -xtype l | wc -l)" -ne 0 ; then
 | 
			
		||||
        echo "ERROR: Broken symlinks found:"
 | 
			
		||||
        find "$destdir" -xtype l
 | 
			
		||||
        exit 1
 | 
			
		||||
    err "Broken symlinks found:\\n$(find "$destdir" -xtype l)"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
exit 0
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										52
									
								
								dedup-firmware.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										52
									
								
								dedup-firmware.sh
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,52 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
# SPDX-License-Identifier: GPL-2.0
 | 
			
		||||
#
 | 
			
		||||
# Deduplicate files in a given destdir
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
err() {
 | 
			
		||||
    echo "ERROR: $*"
 | 
			
		||||
    exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
verbose=:
 | 
			
		||||
destdir=
 | 
			
		||||
while test $# -gt 0; do
 | 
			
		||||
    case $1 in
 | 
			
		||||
        -v | --verbose)
 | 
			
		||||
            # shellcheck disable=SC2209
 | 
			
		||||
            verbose=echo
 | 
			
		||||
            ;;
 | 
			
		||||
        *)
 | 
			
		||||
            if test -n "$destdir"; then
 | 
			
		||||
                err "unknown command-line options: $*"
 | 
			
		||||
            fi
 | 
			
		||||
 | 
			
		||||
            destdir="$1"
 | 
			
		||||
            shift
 | 
			
		||||
            ;;
 | 
			
		||||
    esac
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
if test -z "$destdir"; then
 | 
			
		||||
    err "destination directory was not specified."
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if ! test -d "$destdir"; then
 | 
			
		||||
    err "provided directory does not exit."
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if ! command -v rdfind >/dev/null; then
 | 
			
		||||
    err "rdfind is not installed."
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
$verbose "Finding duplicate files"
 | 
			
		||||
rdfind -makesymlinks true -makeresultsfile true "$destdir" >/dev/null
 | 
			
		||||
 | 
			
		||||
grep DUPTYPE_WITHIN_SAME_TREE results.txt | grep -o "$destdir.*" | while read -r l; do
 | 
			
		||||
    target="$(realpath "$l")"
 | 
			
		||||
    $verbose "Correcting path for $l"
 | 
			
		||||
    ln --force --symbolic --relative "$target" "$l"
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
rm results.txt
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user