Jordan Rupprecht 4a6b9f2316 [llvm-ar] Support N [count] modifier
Summary:
GNU ar supports the 'N' count modifier for the extract (x) and delete (d) operations. When an archive contains multiple members with the same name, this can be used to extract (or delete) them individually. For example:

```
$ llvm-ar t archive.a
foo
foo
$ llvm-ar x archive.a
-> Writes foo twice, overwriting it the second time :( :(
$ llvm-ar xN 1 archive.a foo && mv foo foo.1
$ llvm-ar xN 2 archive.a foo && mv foo foo.2
-> Write foo twice, renaming it in between invocations to preserve all versions
```

Reviewers: ruiu, MaskRay

Reviewed By: ruiu, MaskRay

Subscribers: jdoerfert, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D59503

llvm-svn: 356466
2019-03-19 16:09:54 +00:00

81 lines
2.9 KiB
Plaintext

# Test the 'N' count parameter.
# Get a temp clean cwd to extract into.
RUN: rm -rf %t && mkdir -p %t && cd %t
RUN: mkdir -p %t/x %t/y %t/z
RUN: echo hello > %t/x/foo.txt
RUN: echo cool > %t/y/foo.txt
RUN: echo world > %t/z/foo.txt
RUN: echo fizz > %t/x/bar.txt
RUN: echo buzz > %t/y/bar.txt
RUN: echo fizbuz > %t/z/bar.txt
RUN: llvm-ar rc %t/archive.a %t/x/foo.txt %t/y/foo.txt %t/z/foo.txt \
RUN: %t/x/bar.txt %t/y/bar.txt %t/z/bar.txt
RUN: llvm-ar t %t/archive.a | FileCheck %s --check-prefix=LIST-MEMBERS
# Make sure we set it up correctly.
LIST-MEMBERS: foo.txt
LIST-MEMBERS-NEXT: foo.txt
LIST-MEMBERS-NEXT: foo.txt
LIST-MEMBERS-NEXT: bar.txt
LIST-MEMBERS-NEXT: bar.txt
LIST-MEMBERS-NEXT: bar.txt
# Must be a number.
RUN: not llvm-ar xN abc %t/archive.a foo.txt 2>&1 | FileCheck %s --check-prefix=ERR-NOT-NUM
RUN: not llvm-ar xN 0x1 %t/archive.a foo.txt 2>&1 | FileCheck %s --check-prefix=ERR-NOT-NUM
# Only three members named foo, so 1 <= N <= 3.
RUN: not llvm-ar xN 0 %t/archive.a foo.txt 2>&1 | FileCheck %s --check-prefix=ERR-NOT-POS
RUN: not llvm-ar xN 4 %t/archive.a foo.txt 2>&1 | FileCheck %s --check-prefix=ERR-NOT-FOUND
# N only applies to x/d.
RUN: not llvm-ar rN 1 %t/archive.a foo.txt 2>&1 | FileCheck %s --check-prefix=ERR-BAD-OP
ERR-NOT-NUM: error: Value for [count] must be numeric
ERR-NOT-POS: error: Value for [count] must be positive
ERR-BAD-OP: error: The 'N' modifier can only be specified with the 'x' or 'd' operations
ERR-NOT-FOUND: error: 'foo.txt' was not found
# Extract individual items.
RUN: rm -f foo.txt bar.txt
RUN: llvm-ar xN 1 %t/archive.a foo.txt bar.txt
RUN: cat %t/foo.txt | FileCheck %s --check-prefix=FOO-1
RUN: cat %t/bar.txt | FileCheck %s --check-prefix=BAR-1
RUN: rm -f foo.txt bar.txt
RUN: llvm-ar xN 2 %t/archive.a foo.txt bar.txt
RUN: cat %t/foo.txt | FileCheck %s --check-prefix=FOO-2
RUN: cat %t/bar.txt | FileCheck %s --check-prefix=BAR-2
RUN: rm -f foo.txt bar.txt
RUN: llvm-ar xN 3 %t/archive.a foo.txt bar.txt
RUN: cat %t/foo.txt | FileCheck %s --check-prefix=FOO-3
RUN: cat %t/bar.txt | FileCheck %s --check-prefix=BAR-3
# Delete individual items.
# Deleting the second member named foo means the new second member of the
# archive is what used to be the third element.
RUN: rm -f foo.txt bar.txt
RUN: llvm-ar dN 2 %t/archive.a foo.txt
RUN: llvm-ar xN 2 %t/archive.a foo.txt bar.txt
RUN: cat %t/foo.txt | FileCheck %s --check-prefix=FOO-3
RUN: cat %t/bar.txt | FileCheck %s --check-prefix=BAR-2
# Deleting the first member from *both* archives means the new first member
# named foo is the what used to be the third member, and the new first member
# named bar is what used to be the second member.
RUN: rm -f foo.txt bar.txt
RUN: llvm-ar dN 1 %t/archive.a foo.txt bar.txt
RUN: llvm-ar xN 1 %t/archive.a foo.txt bar.txt
RUN: cat %t/foo.txt | FileCheck %s --check-prefix=FOO-3
RUN: cat %t/bar.txt | FileCheck %s --check-prefix=BAR-2
FOO-1: hello
FOO-2: cool
FOO-3: world
BAR-1: fizz
BAR-2: buzz
BAR-3: fizbuz