Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Z
Zip
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Jira
Jira
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
YongYue
Zip
Commits
167daeaa
Commit
167daeaa
authored
Jun 09, 2016
by
Jake
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'marmelroy/master'
parents
c898c506
2a3e908d
Changes
13
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
559 additions
and
59 deletions
+559
-59
README.md
README.md
+1
-1
Zip copy-Info.plist
Zip copy-Info.plist
+26
-0
Zip.podspec
Zip.podspec
+1
-1
Zip.xcodeproj/project.pbxproj
Zip.xcodeproj/project.pbxproj
+185
-8
Zip.xcodeproj/xcshareddata/xcschemes/Zip tvOS.xcscheme
Zip.xcodeproj/xcshareddata/xcschemes/Zip tvOS.xcscheme
+80
-0
Zip/Info-tvOS.plist
Zip/Info-tvOS.plist
+26
-0
Zip/Info.plist
Zip/Info.plist
+2
-2
Zip/QuickZip.swift
Zip/QuickZip.swift
+28
-22
Zip/Zip.swift
Zip/Zip.swift
+93
-19
ZipTests/Info.plist
ZipTests/Info.plist
+2
-2
ZipTests/ZipTests.swift
ZipTests/ZipTests.swift
+112
-3
build.sh
build.sh
+1
-1
examples/Sample/Podfile
examples/Sample/Podfile
+2
-0
No files found.
README.md
View file @
167daeaa
...
...
@@ -72,5 +72,5 @@ github "marmelroy/Zip"
### Setting up with [CocoaPods](http://cocoapods.org/?q=Zip)
```
ruby
source
'https://github.com/CocoaPods/Specs.git'
pod
'Zip'
,
'~> 0.
3
'
pod
'Zip'
,
'~> 0.
4
'
```
Zip copy-Info.plist
0 → 100644
View file @
167daeaa
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist
version=
"1.0"
>
<dict>
<key>
CFBundleDevelopmentRegion
</key>
<string>
en
</string>
<key>
CFBundleExecutable
</key>
<string>
$(EXECUTABLE_NAME)
</string>
<key>
CFBundleIdentifier
</key>
<string>
$(PRODUCT_BUNDLE_IDENTIFIER)
</string>
<key>
CFBundleInfoDictionaryVersion
</key>
<string>
6.0
</string>
<key>
CFBundleName
</key>
<string>
$(PRODUCT_NAME)
</string>
<key>
CFBundlePackageType
</key>
<string>
FMWK
</string>
<key>
CFBundleShortVersionString
</key>
<string>
0.4.1
</string>
<key>
CFBundleSignature
</key>
<string>
????
</string>
<key>
CFBundleVersion
</key>
<string>
6
</string>
<key>
NSPrincipalClass
</key>
<string></string>
</dict>
</plist>
Zip.podspec
View file @
167daeaa
...
...
@@ -8,7 +8,7 @@
Pod
::
Spec
.
new
do
|
s
|
s
.
name
=
"Zip"
s
.
version
=
"0.
3.4
"
s
.
version
=
"0.
4.1
"
s
.
summary
=
"Zip and unzip files in Swift."
# This description is used to generate tags and improve search results.
...
...
Zip.xcodeproj/project.pbxproj
View file @
167daeaa
This diff is collapsed.
Click to expand it.
Zip.xcodeproj/xcshareddata/xcschemes/Zip tvOS.xcscheme
0 → 100644
View file @
167daeaa
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion =
"0730"
version =
"1.3"
>
<BuildAction
parallelizeBuildables =
"YES"
buildImplicitDependencies =
"YES"
>
<BuildActionEntries>
<BuildActionEntry
buildForTesting =
"YES"
buildForRunning =
"YES"
buildForProfiling =
"YES"
buildForArchiving =
"YES"
buildForAnalyzing =
"YES"
>
<BuildableReference
BuildableIdentifier =
"primary"
BlueprintIdentifier =
"3425458C1CE525B200336074"
BuildableName =
"Zip.framework"
BlueprintName =
"Zip tvOS"
ReferencedContainer =
"container:Zip.xcodeproj"
>
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration =
"Debug"
selectedDebuggerIdentifier =
"Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier =
"Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv =
"YES"
>
<Testables>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration =
"Debug"
selectedDebuggerIdentifier =
"Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier =
"Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle =
"0"
useCustomWorkingDirectory =
"NO"
ignoresPersistentStateOnLaunch =
"NO"
debugDocumentVersioning =
"YES"
debugServiceExtension =
"internal"
allowLocationSimulation =
"YES"
>
<MacroExpansion>
<BuildableReference
BuildableIdentifier =
"primary"
BlueprintIdentifier =
"3425458C1CE525B200336074"
BuildableName =
"Zip.framework"
BlueprintName =
"Zip tvOS"
ReferencedContainer =
"container:Zip.xcodeproj"
>
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration =
"Release"
shouldUseLaunchSchemeArgsEnv =
"YES"
savedToolIdentifier =
""
useCustomWorkingDirectory =
"NO"
debugDocumentVersioning =
"YES"
>
<MacroExpansion>
<BuildableReference
BuildableIdentifier =
"primary"
BlueprintIdentifier =
"3425458C1CE525B200336074"
BuildableName =
"Zip.framework"
BlueprintName =
"Zip tvOS"
ReferencedContainer =
"container:Zip.xcodeproj"
>
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration =
"Debug"
>
</AnalyzeAction>
<ArchiveAction
buildConfiguration =
"Release"
revealArchiveInOrganizer =
"YES"
>
</ArchiveAction>
</Scheme>
Zip/Info-tvOS.plist
0 → 100644
View file @
167daeaa
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist
version=
"1.0"
>
<dict>
<key>
CFBundleDevelopmentRegion
</key>
<string>
en
</string>
<key>
CFBundleExecutable
</key>
<string>
$(EXECUTABLE_NAME)
</string>
<key>
CFBundleIdentifier
</key>
<string>
$(PRODUCT_BUNDLE_IDENTIFIER)
</string>
<key>
CFBundleInfoDictionaryVersion
</key>
<string>
6.0
</string>
<key>
CFBundleName
</key>
<string>
$(PRODUCT_NAME)
</string>
<key>
CFBundlePackageType
</key>
<string>
FMWK
</string>
<key>
CFBundleShortVersionString
</key>
<string>
0.4.1
</string>
<key>
CFBundleSignature
</key>
<string>
????
</string>
<key>
CFBundleVersion
</key>
<string>
6
</string>
<key>
NSPrincipalClass
</key>
<string></string>
</dict>
</plist>
Zip/Info.plist
View file @
167daeaa
...
...
@@ -15,11 +15,11 @@
<key>
CFBundlePackageType
</key>
<string>
FMWK
</string>
<key>
CFBundleShortVersionString
</key>
<string>
0.
3.4
</string>
<string>
0.
4.1
</string>
<key>
CFBundleSignature
</key>
<string>
????
</string>
<key>
CFBundleVersion
</key>
<string>
4
</string>
<string>
6
</string>
<key>
NSPrincipalClass
</key>
<string></string>
</dict>
...
...
Zip/QuickZip.swift
View file @
167daeaa
...
...
@@ -33,6 +33,8 @@ extension Zip {
- throws: Error if unzipping fails or if file is not found. Can be printed with a description variable.
- notes: Supports implicit progress composition
- returns: NSURL of the destination folder.
*/
public
class
func
quickUnzipFile
(
path
:
NSURL
,
progress
:
((
progress
:
Double
)
->
())?)
throws
->
NSURL
{
...
...
@@ -57,6 +59,8 @@ extension Zip {
- throws: Error if zipping fails.
- notes: Supports implicit progress composition
- returns: NSURL of the destination folder.
*/
public
class
func
quickZipFiles
(
paths
:
[
NSURL
],
fileName
:
String
)
throws
->
NSURL
{
...
...
@@ -72,6 +76,8 @@ extension Zip {
- throws: Error if zipping fails.
- notes: Supports implicit progress composition
- returns: NSURL of the destination folder.
*/
public
class
func
quickZipFiles
(
paths
:
[
NSURL
],
fileName
:
String
,
progress
:
((
progress
:
Double
)
->
())?)
throws
->
NSURL
{
...
...
Zip/Zip.swift
View file @
167daeaa
...
...
@@ -31,6 +31,11 @@ public enum ZipError: ErrorType {
/// Zip class
public
class
Zip
{
/**
Set of vaild file extensions
*/
internal
static
var
customFileExtensions
:
Set
<
String
>
=
[]
// MARK: Lifecycle
/**
...
...
@@ -53,6 +58,8 @@ public class Zip {
- parameter progress: A progress closure called after unzipping each file in the archive. Double value betweem 0 and 1.
- throws: Error if unzipping fails or if fail is not found. Can be printed with a description variable.
- notes: Supports implicit progress composition
*/
public
class
func
unzipFile
(
zipFilePath
:
NSURL
,
destination
:
NSURL
,
overwrite
:
Bool
,
password
:
String
?,
progress
:
((
progress
:
Double
)
->
())?)
throws
{
...
...
@@ -64,7 +71,7 @@ public class Zip {
guard
let
path
=
zipFilePath
.
path
where
destination
.
path
!=
nil
else
{
throw
ZipError
.
FileNotFound
}
if
fileManager
.
fileExistsAtPath
(
path
)
==
false
||
zipFilePath
.
pathExtension
!=
"zip"
{
if
fileManager
.
fileExistsAtPath
(
path
)
==
false
||
fileExtensionIsInvalid
(
zipFilePath
.
pathExtension
)
{
throw
ZipError
.
FileNotFound
}
...
...
@@ -82,8 +89,16 @@ public class Zip {
totalSize
+=
attributeFileSize
}
let
progressTracker
=
NSProgress
(
totalUnitCount
:
Int64
(
totalSize
))
progressTracker
.
cancellable
=
false
progressTracker
.
pausable
=
false
progressTracker
.
kind
=
NSProgressKindFile
// Begin unzipping
let
zip
=
unzOpen64
(
path
)
defer
{
unzClose
(
zip
)
}
if
unzGoToFirstFile
(
zip
)
!=
UNZ_OK
{
throw
ZipError
.
UnzipFail
}
...
...
@@ -165,6 +180,8 @@ public class Zip {
progressHandler
(
progress
:
(
currentPosition
/
totalSize
))
}
progressTracker
.
completedUnitCount
=
Int64
(
currentPosition
)
}
while
(
ret
==
UNZ_OK
&&
ret
!=
UNZ_END_OF_LIST_OF_FILE
)
// Completed. Update progress handler.
...
...
@@ -172,6 +189,8 @@ public class Zip {
progressHandler
(
progress
:
1.0
)
}
progressTracker
.
completedUnitCount
=
Int64
(
totalSize
)
}
// MARK: Zip
...
...
@@ -185,6 +204,8 @@ public class Zip {
- parameter progress: A progress closure called after unzipping each file in the archive. Double value betweem 0 and 1.
- throws: Error if zipping fails.
- notes: Supports implicit progress composition
*/
public
class
func
zipFiles
(
paths
:
[
NSURL
],
zipFilePath
:
NSURL
,
password
:
String
?,
progress
:
((
progress
:
Double
)
->
())?)
throws
{
...
...
@@ -218,6 +239,11 @@ public class Zip {
catch
{}
}
let
progressTracker
=
NSProgress
(
totalUnitCount
:
Int64
(
totalSize
))
progressTracker
.
cancellable
=
false
progressTracker
.
pausable
=
false
progressTracker
.
kind
=
NSProgressKindFile
// Begin Zipping
let
zip
=
zipOpen
(
destinationPath
,
APPEND_STATUS_CREATE
)
for
path
in
processedPaths
{
...
...
@@ -268,6 +294,8 @@ public class Zip {
progressHandler
(
progress
:
(
currentPosition
/
totalSize
))
}
progressTracker
.
completedUnitCount
=
Int64
(
currentPosition
)
zipCloseFileInZip
(
zip
)
free
(
buffer
)
fclose
(
input
)
...
...
@@ -279,8 +307,54 @@ public class Zip {
if
let
progressHandler
=
progress
{
progressHandler
(
progress
:
1.0
)
}
progressTracker
.
completedUnitCount
=
Int64
(
totalSize
)
}
/**
Check if file extension is invalid.
- parameter fileExtension: A file extension.
- returns: false if the extension is a valid file extension, otherwise true.
*/
internal
class
func
fileExtensionIsInvalid
(
fileExtension
:
String
?)
->
Bool
{
guard
let
fileExtension
=
fileExtension
else
{
return
true
}
return
!
isValidFileExtension
(
fileExtension
)
}
/**
Add a file extension to the set of custom file extensions
- parameter fileExtension: A file extension.
*/
public
class
func
addCustomFileExtension
(
fileExtension
:
String
)
{
customFileExtensions
.
insert
(
fileExtension
)
}
/**
Remove a file extension from the set of custom file extensions
- parameter fileExtension: A file extension.
*/
public
class
func
removeCustomFileExtension
(
fileExtension
:
String
)
{
customFileExtensions
.
remove
(
fileExtension
)
}
/**
Check if a specific file extension is valid
- parameter fileExtension: A file extension.
- returns: true if the extension valid, otherwise false.
*/
public
class
func
isValidFileExtension
(
fileExtension
:
String
)
->
Bool
{
let
validFileExtensions
:
Set
<
String
>
=
customFileExtensions
.
union
([
"zip"
,
"cbz"
])
return
validFileExtensions
.
contains
(
fileExtension
)
}
}
ZipTests/Info.plist
View file @
167daeaa
...
...
@@ -15,10 +15,10 @@
<key>
CFBundlePackageType
</key>
<string>
BNDL
</string>
<key>
CFBundleShortVersionString
</key>
<string>
0.
3.4
</string>
<string>
0.
4.1
</string>
<key>
CFBundleSignature
</key>
<string>
????
</string>
<key>
CFBundleVersion
</key>
<string>
4
</string>
<string>
6
</string>
</dict>
</plist>
ZipTests/ZipTests.swift
View file @
167daeaa
...
...
@@ -84,9 +84,11 @@ class ZipTests: XCTestCase {
do
{
let
filePath
=
NSBundle
(
forClass
:
ZipTests
.
self
)
.
URLForResource
(
"bb8"
,
withExtension
:
"zip"
)
!
let
documentsFolder
=
NSFileManager
.
defaultManager
()
.
URLsForDirectory
(
.
DocumentDirectory
,
inDomains
:
.
UserDomainMask
)[
0
]
as
NSURL
try
Zip
.
unzipFile
(
filePath
,
destination
:
documentsFolder
,
overwrite
:
true
,
password
:
"password"
,
progress
:
{
(
progress
)
->
()
in
print
(
progress
)
})
let
fileManager
=
NSFileManager
.
defaultManager
()
XCTAssertTrue
(
fileManager
.
fileExistsAtPath
(
documentsFolder
.
path
!
))
}
...
...
@@ -95,6 +97,48 @@ class ZipTests: XCTestCase {
}
}
func
testImplicitProgressUnzip
()
{
do
{
let
progress
=
NSProgress
()
progress
.
totalUnitCount
=
1
let
filePath
=
NSBundle
(
forClass
:
ZipTests
.
self
)
.
URLForResource
(
"bb8"
,
withExtension
:
"zip"
)
!
let
documentsFolder
=
NSFileManager
.
defaultManager
()
.
URLsForDirectory
(
.
DocumentDirectory
,
inDomains
:
.
UserDomainMask
)[
0
]
as
NSURL
progress
.
becomeCurrentWithPendingUnitCount
(
1
)
try
Zip
.
unzipFile
(
filePath
,
destination
:
documentsFolder
,
overwrite
:
true
,
password
:
"password"
,
progress
:
nil
)
progress
.
resignCurrent
()
XCTAssertTrue
(
progress
.
totalUnitCount
==
progress
.
completedUnitCount
)
}
catch
{
XCTFail
()
}
}
func
testImplicitProgressZip
()
{
do
{
let
progress
=
NSProgress
()
progress
.
totalUnitCount
=
1
let
imageURL1
=
NSBundle
(
forClass
:
ZipTests
.
self
)
.
URLForResource
(
"3crBXeO"
,
withExtension
:
"gif"
)
!
let
imageURL2
=
NSBundle
(
forClass
:
ZipTests
.
self
)
.
URLForResource
(
"kYkLkPf"
,
withExtension
:
"gif"
)
!
let
documentsFolder
=
NSFileManager
.
defaultManager
()
.
URLsForDirectory
(
.
DocumentDirectory
,
inDomains
:
.
UserDomainMask
)[
0
]
as
NSURL
let
zipFilePath
=
documentsFolder
.
URLByAppendingPathComponent
(
"archive.zip"
)
progress
.
becomeCurrentWithPendingUnitCount
(
1
)
try
Zip
.
zipFiles
([
imageURL1
,
imageURL2
],
zipFilePath
:
zipFilePath
,
password
:
nil
,
progress
:
nil
)
progress
.
resignCurrent
()
XCTAssertTrue
(
progress
.
totalUnitCount
==
progress
.
completedUnitCount
)
}
catch
{
XCTFail
()
}
}
func
testQuickZip
()
{
do
{
let
imageURL1
=
NSBundle
(
forClass
:
ZipTests
.
self
)
.
URLForResource
(
"3crBXeO"
,
withExtension
:
"gif"
)
!
...
...
@@ -148,6 +192,32 @@ class ZipTests: XCTestCase {
}
}
func
testZipUnzipPassword
()
{
do
{
let
imageURL1
=
NSBundle
(
forClass
:
ZipTests
.
self
)
.
URLForResource
(
"3crBXeO"
,
withExtension
:
"gif"
)
!
let
imageURL2
=
NSBundle
(
forClass
:
ZipTests
.
self
)
.
URLForResource
(
"kYkLkPf"
,
withExtension
:
"gif"
)
!
let
documentsFolder
=
NSFileManager
.
defaultManager
()
.
URLsForDirectory
(
.
DocumentDirectory
,
inDomains
:
.
UserDomainMask
)[
0
]
as
NSURL
let
zipFilePath
=
documentsFolder
.
URLByAppendingPathComponent
(
"archive.zip"
)
try
Zip
.
zipFiles
([
imageURL1
,
imageURL2
],
zipFilePath
:
zipFilePath
,
password
:
"password"
,
progress
:
{
(
progress
)
->
()
in
print
(
progress
)
})
let
fileManager
=
NSFileManager
.
defaultManager
()
XCTAssertTrue
(
fileManager
.
fileExistsAtPath
(
zipFilePath
.
path
!
))
guard
let
fileExtension
=
zipFilePath
.
pathExtension
,
let
fileName
=
zipFilePath
.
lastPathComponent
else
{
throw
ZipError
.
UnzipFail
}
let
directoryName
=
fileName
.
stringByReplacingOccurrencesOfString
(
".
\(
fileExtension
)
"
,
withString
:
""
)
let
documentsUrl
=
fileManager
.
URLsForDirectory
(
.
DocumentDirectory
,
inDomains
:
.
UserDomainMask
)[
0
]
as
NSURL
let
destinationUrl
=
documentsUrl
.
URLByAppendingPathComponent
(
directoryName
,
isDirectory
:
true
)
try
Zip
.
unzipFile
(
zipFilePath
,
destination
:
destinationUrl
,
overwrite
:
true
,
password
:
"password"
,
progress
:
nil
)
XCTAssertTrue
(
fileManager
.
fileExistsAtPath
(
destinationUrl
.
path
!
))
}
catch
{
XCTFail
()
}
}
func
testQuickUnzipSubDir
()
{
do
{
let
bookURL
=
NSBundle
(
forClass
:
ZipTests
.
self
)
.
URLForResource
(
"bb8"
,
withExtension
:
"zip"
)
!
...
...
@@ -165,5 +235,44 @@ class ZipTests: XCTestCase {
}
}
func
testFileExtensionIsNotInvalidForValidUrl
()
{
let
fileUrl
=
NSURL
(
string
:
"file.cbz"
)
let
result
=
Zip
.
fileExtensionIsInvalid
(
fileUrl
?
.
pathExtension
)
XCTAssertFalse
(
result
)
}
func
testFileExtensionIsInvalidForInvalidUrl
()
{
let
fileUrl
=
NSURL
(
string
:
"file.xyz"
)
let
result
=
Zip
.
fileExtensionIsInvalid
(
fileUrl
?
.
pathExtension
)
XCTAssertTrue
(
result
)
}
func
testAddedCustomFileExtensionIsValid
()
{
let
fileExtension
=
"cstm"
Zip
.
addCustomFileExtension
(
fileExtension
)
let
result
=
Zip
.
isValidFileExtension
(
fileExtension
)
XCTAssertTrue
(
result
)
Zip
.
removeCustomFileExtension
(
fileExtension
)
}
func
testRemovedCustomFileExtensionIsInvalid
()
{
let
fileExtension
=
"cstm"
Zip
.
addCustomFileExtension
(
fileExtension
)
Zip
.
removeCustomFileExtension
(
fileExtension
)
let
result
=
Zip
.
isValidFileExtension
(
fileExtension
)
XCTAssertFalse
(
result
)
}
func
testDefaultFileExtensionsIsValid
()
{
XCTAssertTrue
(
Zip
.
isValidFileExtension
(
"zip"
))
XCTAssertTrue
(
Zip
.
isValidFileExtension
(
"cbz"
))
}
func
testDefaultFileExtensionsIsNotRemoved
()
{
Zip
.
removeCustomFileExtension
(
"zip"
)
Zip
.
removeCustomFileExtension
(
"cbz"
)
XCTAssertTrue
(
Zip
.
isValidFileExtension
(
"zip"
))
XCTAssertTrue
(
Zip
.
isValidFileExtension
(
"cbz"
))
}
}
build.sh
View file @
167daeaa
...
...
@@ -40,7 +40,7 @@ if [ "$MODE" = "examples" ]; then
-scheme
Sample
\
-sdk
"
$SDK
"
\
-destination
"
$PLATFORM
"
\
build
test
build
done
trap
- EXIT
exit
0
...
...
examples/Sample/Podfile
View file @
167daeaa
...
...
@@ -2,4 +2,6 @@ source 'https://github.com/CocoaPods/Specs.git'
platform
:ios
,
"9.0"
use_frameworks!
target
‘
Sample
’
do
pod
'Zip'
,
:git
=>
'https://github.com/marmelroy/Zip.git'
,
:submodules
=>
true
end
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment