Skip to content

Commit 9deed03

Browse files
committed
Merge pull request #117 from Memorion/master
Add --init mode as proposed in SR-353
2 parents 9db76ab + ff3ae03 commit 9deed03

File tree

4 files changed

+85
-0
lines changed

4 files changed

+85
-0
lines changed

Sources/swift-build/initPackage.swift

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*
2+
This source file is part of the Swift.org open source project
3+
4+
Copyright 2016 Apple Inc. and the Swift project authors
5+
Licensed under Apache License v2.0 with Runtime Library Exception
6+
7+
See http://swift.org/LICENSE.txt for license information
8+
See http://swift.org/CONTRIBUTORS.txt for Swift project authors
9+
*/
10+
11+
import POSIX
12+
import struct dep.Manifest
13+
import struct sys.Path
14+
import func libc.fclose
15+
16+
func initPackage() throws {
17+
let rootd = try POSIX.getcwd()
18+
let pkgname = rootd.basename
19+
let manifest = Path.join(rootd, Manifest.filename)
20+
let gitignore = Path.join(rootd, ".gitignore")
21+
let sources = Path.join(rootd, "Sources")
22+
let tests = Path.join(rootd, "Tests")
23+
let main = Path.join(sources, "main.swift")
24+
25+
guard !manifest.exists else {
26+
throw Error.ManifestAlreadyExists
27+
}
28+
29+
let packageFP = try fopen(manifest, mode: .Write)
30+
defer {
31+
fclose(packageFP)
32+
}
33+
34+
print("Creating \(Manifest.filename)")
35+
// print the manifest file
36+
try fputs("import PackageDescription\n", packageFP)
37+
try fputs("\n", packageFP)
38+
try fputs("let package = Package(\n", packageFP)
39+
try fputs(" name: \"\(pkgname)\"\n", packageFP)
40+
try fputs(")\n", packageFP)
41+
42+
if !gitignore.exists {
43+
let gitignoreFP = try fopen(gitignore, mode: .Write)
44+
defer {
45+
fclose(gitignoreFP)
46+
}
47+
48+
print("Creating .gitignore")
49+
// print the .gitignore
50+
try fputs(".DS_Store\n", gitignoreFP)
51+
try fputs("/.build\n", gitignoreFP)
52+
try fputs("/Packages\n", gitignoreFP)
53+
}
54+
55+
if !sources.exists {
56+
print("Creating Sources/")
57+
try mkdir(sources)
58+
59+
let mainFP = try fopen(main, mode: .Write)
60+
defer {
61+
fclose(mainFP)
62+
}
63+
print("Creating Sources/main.swift")
64+
try fputs("print(\"Hello, world!\")\n", mainFP)
65+
}
66+
67+
if !tests.exists {
68+
print("Creating Tests/")
69+
try mkdir(tests)
70+
}
71+
}

Sources/swift-build/main.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ do {
101101
throw POSIX.Error.ExitStatus(foo)
102102
}
103103

104+
case .Init:
105+
try initPackage()
104106

105107
case .Version:
106108
print("Apple Swift Package Manager 0.1")

Sources/swift-build/misc.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,16 @@ import struct sys.Path
1313
import struct dep.Manifest
1414

1515
enum Error: ErrorType {
16+
case ManifestAlreadyExists
1617
case NoManifestFound
1718
case NoTargetsFound
1819
}
1920

2021
extension Error: CustomStringConvertible {
2122
var description: String {
2223
switch self {
24+
case .ManifestAlreadyExists:
25+
return "\(Manifest.filename) already exists"
2326
case .NoManifestFound:
2427
return "no \(Manifest.filename) file found"
2528
case .NoTargetsFound:

Sources/swift-build/usage.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ func usage(print: (String) -> Void = { print($0) }) {
2323
print(" build - Build intermediaries and products")
2424
print(" dist - All of 'build' plus downloaded packages")
2525
print(" If no mode is given, 'build' is the default.")
26+
print(" --init Creates a new Swift project")
2627
print("")
2728
print("OPTIONS:")
2829
print(" --chdir <value> Change working directory before any other operation [-C]")
@@ -39,6 +40,7 @@ enum CleanMode: String {
3940
enum Mode {
4041
case Build(BuildParameters.Configuration)
4142
case Clean(CleanMode)
43+
case Init
4244
case Usage
4345
case Version
4446
}
@@ -119,6 +121,8 @@ func parse(commandLineArguments args: [String]) throws -> (Mode, Options) {
119121
}
120122
case (nil, .Usage):
121123
mode = .Usage
124+
case (nil, .Init):
125+
mode = .Init
122126
case (nil, .Clean):
123127
mode = .Clean(.Build)
124128
switch try cruncher.peek() {
@@ -173,6 +177,7 @@ extension Mode: CustomStringConvertible {
173177
switch self {
174178
case .Build(let conf): return "--build \(conf)"
175179
case .Clean(let cleanMode): return "--clean=\(cleanMode)"
180+
case .Init: return "--init"
176181
case .Usage: return "--help"
177182
case .Version: return "--version"
178183
}
@@ -185,6 +190,7 @@ private struct Cruncher {
185190
enum TheMode: String {
186191
case Build = "--configuration"
187192
case Clean = "--clean"
193+
case Init = "--init"
188194
case Usage = "--help"
189195
case Version = "--version"
190196

@@ -194,6 +200,8 @@ private struct Cruncher {
194200
self = .Build
195201
case Clean.rawValue, "-k":
196202
self = .Clean
203+
case Init.rawValue:
204+
self = .Init
197205
case Usage.rawValue:
198206
self = .Usage
199207
case Version.rawValue:
@@ -277,6 +285,7 @@ private func ==(lhs: Mode, rhs: Cruncher.Crunch.TheMode) -> Bool {
277285
switch lhs {
278286
case .Build: return rhs == .Build
279287
case .Clean: return rhs == .Clean
288+
case .Init: return rhs == .Init
280289
case .Version: return rhs == .Version
281290
case .Usage: return rhs == .Usage
282291
}

0 commit comments

Comments
 (0)