Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding --strict does not log or display linter violations as errors #268

Closed
tamarnachmany opened this issue Dec 14, 2015 · 46 comments
Closed
Labels

Comments

@tamarnachmany
Copy link

It seems that the purpose of the --strict flag in SwiftLint is to display or log linter violations as errors. I'd like to use that functionality but I am still seeing everything that has a .Warning level of severity displayed in Xcode or logged on the command line as a warning.

I have attempted to add this flag to a script which runs linting on certain project files, and also to linting on the command line.

In our build script I've tried:

  • swiftlint lint --config "${SRCROOT}/.swiftlint.yml" --path $file --strict
  • swiftlint lint --strict --config "${SRCROOT}/.swiftlint.yml" --path $file
  • swiftlint lint --config "${SRCROOT}/.swiftlint.yml" --path $file --strict 1
  • swiftlint lint --strict 1 --config "${SRCROOT}/.swiftlint.yml" --path $file

file is a variable in our build script.

On the command line I've tried the same thing, but without a reference to any particular file, and with different file path specification syntax, since I don't believe SRCROOT works correctly there.

The build script displays these violations as warnings and the command on the command line prints "warning........" for each violation.

Has anyone else seen this issue?

Thanks!

@jpsim
Copy link
Collaborator

jpsim commented Dec 14, 2015

The only thing that the --strict flag does is to change the exit status code. It's like Xcode's "treat warnings as errors" setting.

Warnings are still warnings, but unlike regular SwiftLint operation which exits 0 if only warnings were found, --strict will make the presence of warnings or errors exit with 1:

$ echo "let abc:Int = 0" | swiftlint lint --use-stdin
<nopath>:1:5: warning: Colon Violation: Colons should be next to the identifier when specifying a type. (colon)
Done linting! Found 1 violation, 0 serious in 1 file.
$ echo $?
0
$ echo "let abc:Int = 0" | swiftlint lint --use-stdin --strict
<nopath>:1:5: warning: Colon Violation: Colons should be next to the identifier when specifying a type. (colon)
Done linting! Found 1 violation, 0 serious in 1 file.
$  echo $?
1

@jpsim jpsim added the question label Dec 14, 2015
@tamarnachmany
Copy link
Author

In your view, what is the best way to display all violations as errors using SwiftLint?

One thing I played around with was modifying the source code to add a 'severity' parameter to the style violation initializer of certain rules (the same way it's being done in the force casting rule implementation) and to pass in .Error to the severity param, which did not work.

@jpsim
Copy link
Collaborator

jpsim commented Dec 14, 2015

If you're building SwiftLint from source, you could hardcode error on this line of the Xcode reporter.

However, I'd love to know what your motivation for this is, so we can come up with a more generally applicable solution within SwiftLint so you don't have to build from source and maintain this patch.

@tamarnachmany
Copy link
Author

Of course!

The primary reason is cultural.

People do not take warnings as seriously as they should. Errors, obviously, have to be dealt with immediately. Warnings do not. This isn't because they do not believe in or write high quality code. There are lots of reasons why a project might have a few lingering warnings.

To me, the point of linting is introducing a passive tool that communicates a team's values and improves their code.

Introducing warnings into a project means that a linter becomes not actually a totally passive tool. Its usage then requires some policing by other team members -- not because people are lazy, but because they have to decide how to allocate their time, and sometimes resolving warnings can't be done in a certain time frame. Also, if an app already has a few warnings (see explanation for reasons why below) they can easily forget whether or not they added warnings until they merge a PR and see if the CI tool suggests that they introduced new warnings into the project.

There are lots of reasons why a code base might already have some warnings -- these include needing to integrate 3rd party code which introduces warnings -- sometimes unavoidable on large apps owned by mid sized or large companies -- and the fact that fast moving teams sometimes just need to leave errors in their code temporarily. Moreover, apps that have been in development for many years may have legacy code with warnings that people have not yet found time to fix. That's not the case on the app I work on, but I can absolutely see that happening on other teams. For that reason, having linter violations displayed as warnings does not have the kind of impact you would hope for.

In my view, linter violations are far more likely to be dealt with if SourceKit/the compiler provide errors rather than warnings in the IDE.

If you implement more fix-its in the SwiftLint project I think this point still stands -- I would like to see errors in my project where linter rules are not respected, and suggestions for changes, like what's built into Xcode using SourceKit.

Note: This whole comment is based on a model where the transition to a SwiftLinted project is first only performed on files that have a diff in a developer's current branch, using a build script, and then on the entire project potentially. This helps mitigate the fact that a project that only shows errors, not warnings after being linter, would require potentially tons of changes in order to build.

What do you think about this, JP? I'm really interested in your opinion, and in your reasoning for initially not introducing this functionality.

@jpsim
Copy link
Collaborator

jpsim commented Dec 14, 2015

So why don't you get all that from having --strict or setting "treat warnings as errors" in your Xcode project? Seems like the only thing that's different would be the color of the Xcode warning/error UI element (from yellow to red).

One thing we could do is have the --strict flag always set ViolationSeverity to .Error. I'm hesitant to do this because:

  1. I can't think of a straight-forward way to do this without introducing global state during the linting process
  2. This would lose the semantic information attached to violation severities

We could also introduce a 4th reporter (xcode-error/XcodeErrorReporter) that just hardcodes error in its output like what was mentioned earlier.

Keep in mind that the only difference in all this is the color of the Xcode UI element, which I'm not sure has the cultural impact you're looking for.

@tamarnachmany
Copy link
Author

So why don't you get all that from having --strict or setting "treat warnings as errors" in your Xcode project? Seems like the only thing that's different would be the color of the Xcode warning/error UI element (from yellow to red).

Just to clarify what I was trying to explain before, in a project that has unavoidable warnings that can't, for reasons mentioned above, be resolved immediately, you can't treat all warnings as errors, or you won't be able to compile before they're all resolved. I'm assuming 'treat warnings as errors' prevents compiling with warnings.

We could also introduce a 4th reporter (xcode-error/XcodeErrorReporter) that just hardcodes error in its output like what was mentioned earlier.

This seems like a good idea to me. When speaking with a bunch of people considering linting their Swift projects recently, it seemed that a handful - some Swift developers, some developers working in other languages who have used linters in those languages - were concerned about whether linters will be useful for their teams if they only treat violations as warnings.

@tamarnachmany
Copy link
Author

Oh, I now understand what you're saying -- strict prevents compilation but does not show errors.

@jpsim
Copy link
Collaborator

jpsim commented Dec 14, 2015

Oh, I now understand what you're saying -- strict prevents compilation but does not show errors.

Rather --strict returns an exit code of 1 if any warnings or errors were identified, and doesn't affect the rendering of these violations (in Xcode or command line).

... were concerned about whether linters will be useful for their teams if they only treat violations as warnings.

If linting is part of their CI, then if they use --strict, their builds will fail if they have any warnings. Really, the only thing to gain from having an XcodeErrorReporter is the color of UI annotations.

@tamarnachmany
Copy link
Author

Really, the only thing to gain from having an XcodeErrorReporter is the color of UI annotations.

I think that's very useful from a UI standpoint.

  1. It feels hacky to me that there are two kinds of 'warnings' that looks exactly the same but act differently -- one kind that can be compiled and one kind that can't.

  2. I think every person who comes to the code base I'm working on will essentially need that concept explained to them, rather than it being implied by the color of the linter errors, which relies on their existing knowledge of Xcode. Even if I specify that in a README about the code base, it has a higher chance of error/questions from team members than displaying linter violations in red/as warnings.

That said, I'm really happy this does return an exit code of 1.

@jpsim
Copy link
Collaborator

jpsim commented Dec 14, 2015

You might be right that the entire concept of graded violation severities is unnecessary. That a violation should be binary rather than graded.

My initial motivation for introducing it was to distinguish between something that was unequivocally an issue from something more debatably so (either false positives or matters of personal preference).

That being said, I don't gather usage metrics on SwiftLint so I don't know if this grading is actually useful in practice, or if it just complicates SwiftLint's conceptual model as you say. I'd like to know more about how people use SwiftLint before acting on that though.

We've reduced the number of violation severities before (#114), and I'm not opposed to abolishing it entirely if that's what active SwiftLint users suggest.

@Pearapps
Copy link

@jpsim In my opinion both have their place - an alternative would be to allow consumers of SwiftLint to choose their own violation level for each provided rule?

@paulrehkugler
Copy link

Yeah, I'd love support for violation levels for all rules, not just parameterized ones.

@tamarnachmany
Copy link
Author

In my opinion both have there place - an alternative would be to allow consumers of SwiftLint to choose their own violation level for each provided rule?

I agree. It's nice that people can configure it in a way that fits their usage. Maybe a person working on a one-person team likes warnings, and is confident they will take the time to fix them, for instance.

@tamarnachmany
Copy link
Author

Though personally, I would not want to use SwiftLint that way.

@jpsim
Copy link
Collaborator

jpsim commented Dec 14, 2015

In my opinion both have their place - an alternative would be to allow consumers of SwiftLint to choose their own violation level for each provided rule?

FWIW this can be done today but it's super ugly.

type_body_length:
  - 1000000000 # warning, never triggered
  - 400 # error

Thanks for sharing your thoughts on this.

@Pearapps
Copy link

FWIW this can be done today but it's super ugly.

Can you do something like this for binary rules like the force cast rule?

@jpsim
Copy link
Collaborator

jpsim commented Dec 14, 2015

No, because it doesn't conform to ParameterizedRule.

@Pearapps
Copy link

No, because it doesn't conform to ParameterizedRule.

Ah I see - interesting.

How would you feel about us building functionality to allow users to change violation levels on all rules?

@jpsim
Copy link
Collaborator

jpsim commented Dec 14, 2015

How would you feel about us building functionality to allow users to change violation levels on all rules?

I'd welcome that change, but I'd encourage you to propose a design for this first before implementing it because it'd be easy for such a change to introduce avoidable complexity.

@tamarnachmany
Copy link
Author

Thanks for your thoughts and quick responses, JP.
I'm going to think about this and come back with a few ideas.

@jpsim
Copy link
Collaborator

jpsim commented Dec 24, 2015

@tamarnachmany did you give this any further thought?

@tamarnachmany
Copy link
Author

I actually just completed my 'v1' integration of SwiftLint! Very excited. It took a little bit of maneuvering because I want to lint gradually. I can now start taking a look at this.

As far as this original issue I raised here, I'm not sure SwiftLint is working exactly as intended at the moment.
When I introduce an error, I get these things:

  • A red 'error' where the violation occurs.
  • An error that reads "Command /bin/sh emitted errors but did not return a nonzero exit code to indicate failure"
  • This error "Thread 12: signal SIGABRT"

So the branch will not compile (good) but doesn't return a nonzero exit code (bad) which introduces an associated error ("Command /bin/sh emitted errors but did not return a nonzero exit code to indicate failure").

As far as I understand, the --strict flag should be returning a nonzero exit code if violations exist. Am I right in thinking this suggests an issue with Commandant/SwiftLint in this case? I distantly remember this working correctly previously?

@jpsim
Copy link
Collaborator

jpsim commented Dec 29, 2015

A red 'error' where the violation occurs.

This is expected

An error that reads "Command /bin/sh emitted errors but did not return a nonzero exit code to indicate failure"
This error "Thread 12: signal SIGABRT"

These look like either bugs in SwiftLint, or an incomplete SwiftLint installation. The last message (SIGABRT) should be accompanied by a backtrace. Could you please share that here?

In any case, I don't think any of this relates to the intended behavior of SwiftLint but rather a bug or misconfiguration, so I'd encourage you to file a new issue describing that so we can keep this thread focused on evaluating different --strict behavior.

@tamarnachmany
Copy link
Author

Sure.

@tamarnachmany
Copy link
Author

Real quick before I repost this as a separate issue, is this what you're looking for?

Is this what you're looking for?

PhaseScriptExecution Lint\ Swift\ Files /Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/Project.build/Debug-iphoneos/Share.build/Script-32B957CD1C24634700560E0C.sh
    cd /Users/tamar/project
    export ACTION=build
    export AD_HOC_CODE_SIGNING_ALLOWED=NO
    export ALTERNATE_GROUP=staff
    export ALTERNATE_MODE=u+w,go-w,a+rX
    export ALTERNATE_OWNER=tamar
    export ALWAYS_SEARCH_USER_PATHS=NO
    export ALWAYS_USE_SEPARATE_HEADERMAPS=NO
    export APPLE_INTERNAL_DEVELOPER_DIR=/AppleInternal/Developer
    export APPLE_INTERNAL_DIR=/AppleInternal
    export APPLE_INTERNAL_DOCUMENTATION_DIR=/AppleInternal/Documentation
    export APPLE_INTERNAL_LIBRARY_DIR=/AppleInternal/Library
    export APPLE_INTERNAL_TOOLS=/AppleInternal/Developer/Tools
    export APPLICATION_EXTENSION_API_ONLY=YES
    export APPLY_RULES_IN_COPY_FILES=NO
    export ARCHS=arm64
    export ARCHS_STANDARD="armv7 arm64"
    export ARCHS_STANDARD_32_64_BIT="armv7 arm64"
    export ARCHS_STANDARD_32_BIT=armv7
    export ARCHS_STANDARD_64_BIT=arm64
    export ARCHS_STANDARD_INCLUDING_64_BIT="armv7 arm64"
    export ARCHS_UNIVERSAL_IPHONE_OS="armv7 arm64"
    export ASSETCATALOG_COMPILER_APPICON_NAME=ProjectIcon
    export AVAILABLE_PLATFORMS="watchos iphonesimulator macosx appletvsimulator watchsimulator appletvos iphoneos"
    export BITCODE_GENERATION_MODE=marker
    export BUILD_ACTIVE_RESOURCES_ONLY=YES
    export BUILD_COMPONENTS="headers build"
    export BUILD_DIR=/Users/tamar/Library/Developer/Xcode/DerivedData/Project-dhwfefmrpsepdncezpfhexxoddmo/Build/Products
    export BUILD_ROOT=/Users/tamar/Library/Developer/Xcode/DerivedData/Project-dhwfefmrpsepdncezpfhexxoddmo/Build/Products
    export BUILD_STYLE=
    export BUILD_VARIANTS=normal
    export BUILT_PRODUCTS_DIR=/Users/tamar/Library/Developer/Xcode/DerivedData/Project-dhwfefmrpsepdncezpfhexxoddmo/Build/Products/Debug-iphoneos
    export BUNDLE_IDENTIFIER=com.Project.Project.Share-With-Project
    export CACHE_ROOT=/var/folders/v4/03qmpx656_n9l3_z4j7s8zq80000gn/C/com.apple.DeveloperTools/7.2-7C68/Xcode
    export CCHROOT=/var/folders/v4/03qmpx656_n9l3_z4j7s8zq80000gn/C/com.apple.DeveloperTools/7.2-7C68/Xcode
    export CHMOD=/bin/chmod
    export CHOWN=/usr/sbin/chown
    export CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER=NO
    export CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND=YES
    export CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY=YES
    export CLANG_ENABLE_MODULES=YES
    export CLANG_ENABLE_OBJC_ARC=YES
    export CLANG_MODULES_BUILD_SESSION_FILE=/Users/tamar/Library/Developer/Xcode/DerivedData/ModuleCache/Session.modulevalidation
    export CLANG_WARN_BOOL_CONVERSION=YES
    export CLANG_WARN_CONSTANT_CONVERSION=YES
    export CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS=YES
    export CLANG_WARN_DIRECT_OBJC_ISA_USAGE=YES_ERROR
    export CLANG_WARN_EMPTY_BODY=YES
    export CLANG_WARN_ENUM_CONVERSION=YES
    export CLANG_WARN_INT_CONVERSION=YES
    export CLANG_WARN_OBJC_ROOT_CLASS=YES_ERROR
    export CLANG_WARN_UNREACHABLE_CODE=YES
    export CLANG_WARN__DUPLICATE_METHOD_MATCH=YES
    export CLASS_FILE_DIR=/Users/tamar/Library/Developer/Xcode/DerivedData/Project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/Project.build/Debug-iphoneos/Share.build/JavaClasses
    export CLEAN_PRECOMPS=YES
    export CLONE_HEADERS=NO
    export CODESIGNING_FOLDER_PATH=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Products/Debug-iphoneos/Share.appex
    export CODE_SIGNING_ALLOWED=YES
    export CODE_SIGNING_REQUIRED=YES
    export CODE_SIGN_CONTEXT_CLASS=XCiPhoneOSCodeSignContext
    export CODE_SIGN_ENTITLEMENTS="Resources/Entitlements/Share With project.entitlements"
    export CODE_SIGN_IDENTITY="iPhone Developer"
    export COLOR_DIAGNOSTICS=NO
    export COMBINE_HIDPI_IMAGES=NO
    export COMMAND_MODE=legacy
    export COMPOSITE_SDK_DIRS=/var/folders/v4/03qmpx656_n9l3_z4j7s8zq80000gn/C/com.apple.DeveloperTools/7.2-7C68/Xcode/CompositeSDKs
    export COMPRESS_PNG_FILES=YES
    export CONFIGURATION=Debug
    export CONFIGURATION_BUILD_DIR=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Products/Debug-iphoneos
    export CONFIGURATION_TEMP_DIR=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/project.build/Debug-iphoneos
    export CONTENTS_FOLDER_PATH=Share.appex
    export COPYING_PRESERVES_HFS_DATA=NO
    export COPY_HEADERS_RUN_UNIFDEF=NO
    export COPY_PHASE_STRIP=NO
    export COPY_RESOURCES_FROM_STATIC_FRAMEWORKS=YES
    export CORRESPONDING_SIMULATOR_PLATFORM_DIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform
    export CORRESPONDING_SIMULATOR_PLATFORM_NAME=iphonesimulator
    export CORRESPONDING_SIMULATOR_SDK_DIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator9.2.sdk
    export CORRESPONDING_SIMULATOR_SDK_NAME=iphonesimulator9.2
    export CP=/bin/cp
    export CREATE_INFOPLIST_SECTION_IN_BINARY=NO
    export CURRENT_ARCH=arm64
    export CURRENT_PROJECT_VERSION=436
    export CURRENT_VARIANT=normal
    export DEAD_CODE_STRIPPING=YES
    export DEBUGGING_SYMBOLS=YES
    export DEBUG_INFORMATION_FORMAT=dwarf
    export DEFAULT_COMPILER=com.apple.compilers.llvm.clang.1_0
    export DEFAULT_KEXT_INSTALL_PATH=/System/Library/Extensions
    export DEFINES_MODULE=YES
    export DEPLOYMENT_LOCATION=NO
    export DEPLOYMENT_POSTPROCESSING=NO
    export DEPLOYMENT_TARGET_CLANG_ENV_NAME=IPHONEOS_DEPLOYMENT_TARGET
    export DEPLOYMENT_TARGET_CLANG_FLAG_NAME=miphoneos-version-min
    export DEPLOYMENT_TARGET_CLANG_FLAG_PREFIX=-miphoneos-version-min=
    export DEPLOYMENT_TARGET_SETTING_NAME=IPHONEOS_DEPLOYMENT_TARGET
    export DEPLOYMENT_TARGET_SUGGESTED_VALUES="6.0 6.1 7.0 7.1 8.0 8.1 8.2 8.3 8.4 9.0 9.1 9.2"
    export DERIVED_FILES_DIR=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/project.build/Debug-iphoneos/Share.build/DerivedSources
    export DERIVED_FILE_DIR=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/project.build/Debug-iphoneos/Share.build/DerivedSources
    export DERIVED_SOURCES_DIR=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/project.build/Debug-iphoneos/Share.build/DerivedSources
    export DEVELOPER_APPLICATIONS_DIR=/Applications/Xcode.app/Contents/Developer/Applications
    export DEVELOPER_BIN_DIR=/Applications/Xcode.app/Contents/Developer/usr/bin
    export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
    export DEVELOPER_FRAMEWORKS_DIR=/Applications/Xcode.app/Contents/Developer/Library/Frameworks
    export DEVELOPER_FRAMEWORKS_DIR_QUOTED=/Applications/Xcode.app/Contents/Developer/Library/Frameworks
    export DEVELOPER_LIBRARY_DIR=/Applications/Xcode.app/Contents/Developer/Library
    export DEVELOPER_SDK_DIR=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs
    export DEVELOPER_TOOLS_DIR=/Applications/Xcode.app/Contents/Developer/Tools
    export DEVELOPER_USR_DIR=/Applications/Xcode.app/Contents/Developer/usr
    export DEVELOPMENT_LANGUAGE=English
    export DISPLAY_NAME=project
    export DOCUMENTATION_FOLDER_PATH=Share.appex/English.lproj/Documentation
    export DO_HEADER_SCANNING_IN_JAM=NO
    export DSTROOT=/tmp/project.dst
    export DT_TOOLCHAIN_DIR=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain
    export DWARF_DSYM_FILE_NAME=Share.appex.dSYM
    export DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT=NO
    export DWARF_DSYM_FOLDER_PATH=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Products/Debug-iphoneos
    export EFFECTIVE_PLATFORM_NAME=-iphoneos
    export EMBEDDED_CONTENT_CONTAINS_SWIFT=YES
    export EMBEDDED_PROFILE_NAME=embedded.mobileprovision
    export EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE=NO
    export ENABLE_BITCODE=NO
    export ENABLE_HEADER_DEPENDENCIES=YES
    export ENABLE_ON_DEMAND_RESOURCES=NO
    export ENABLE_STRICT_OBJC_MSGSEND=YES
    export ENABLE_TESTABILITY=YES
    export ENTITLEMENTS_REQUIRED=YES
    export EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS=".DS_Store .svn .git .hg CVS"
    export EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES="*.nib *.lproj *.framework *.gch *.xcode* *.xcassets (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj"
    export EXECUTABLES_FOLDER_PATH=Share.appex/Executables
    export EXECUTABLE_FOLDER_PATH=Share.appex
    export EXECUTABLE_NAME=Share
    export EXECUTABLE_PATH=Share.appex/Share
    export EXPANDED_CODE_SIGN_IDENTITY=0E55EAE299923C797E0ED97654EA32E3BEF5B22E
    export EXPANDED_CODE_SIGN_IDENTITY_NAME="iPhone Developer: Tamar Nachmany (VLWMYFF3BX)"
    export EXPANDED_PROVISIONING_PROFILE=e247065b-1342-4976-b6a3-ef2f33425114
    export FILE_LIST=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/project.build/Debug-iphoneos/Share.build/Objects/LinkFileList
    export FIXED_FILES_DIR=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/project.build/Debug-iphoneos/Share.build/FixedFiles
    export FRAMEWORKS_FOLDER_PATH=Share.appex/Frameworks
    export FRAMEWORK_FLAG_PREFIX=-framework
    export FRAMEWORK_SEARCH_PATHS="/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Products/Debug-iphoneos  \"/Users/tamar/core/project/Pods/GIFEncoder/iOS/Framework\""
    export FRAMEWORK_VERSION=A
    export FULL_PRODUCT_NAME=Share.appex
    export GCC3_VERSION=3.3
    export GCC_C_LANGUAGE_STANDARD=gnu99
    export GCC_DYNAMIC_NO_PIC=NO
    export GCC_INLINES_ARE_PRIVATE_EXTERN=YES
    export GCC_NO_COMMON_BLOCKS=YES
    export GCC_OPTIMIZATION_LEVEL=0
    export GCC_PFE_FILE_C_DIALECTS="c objective-c c++ objective-c++"
    export GCC_PRECOMPILE_PREFIX_HEADER=YES
    export GCC_PREFIX_HEADER=Resources/Prefix.pch
    export GCC_PREPROCESSOR_DEFINITIONS=" DEBUG=1 COCOAPODS=1 COCOAPODS=1 SHARE_EXTENSION=1"
    export GCC_SYMBOLS_PRIVATE_EXTERN=NO
    export GCC_THUMB_SUPPORT=YES
    export GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS=YES
    export GCC_TREAT_WARNINGS_AS_ERRORS=NO
    export GCC_VERSION=com.apple.compilers.llvm.clang.1_0
    export GCC_VERSION_IDENTIFIER=com_apple_compilers_llvm_clang_1_0
    export GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS=YES
    export GCC_WARN_ABOUT_MISSING_NEWLINE=YES
    export GCC_WARN_ABOUT_RETURN_TYPE=YES_ERROR
    export GCC_WARN_SHADOW=YES
    export GCC_WARN_UNDECLARED_SELECTOR=YES
    export GCC_WARN_UNINITIALIZED_AUTOS=YES_AGGRESSIVE
    export GCC_WARN_UNUSED_FUNCTION=YES
    export GCC_WARN_UNUSED_LABEL=YES
    export GCC_WARN_UNUSED_VARIABLE=YES
    export GENERATE_MASTER_OBJECT_FILE=NO
    export GENERATE_PKGINFO_FILE=NO
    export GENERATE_PROFILING_CODE=NO
    export GID=20
    export GROUP=staff
    export HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT=YES
    export HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES=YES
    export HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS=YES
    export HEADERMAP_INCLUDES_PROJECT_HEADERS=YES
    export HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES=YES
    export HEADERMAP_USES_VFS=YES
    export HEADER_SEARCH_PATHS="/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Products/Debug-iphoneos/include /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.2.sdk/usr/include/libxml2  \"/Users/tamar/core/project/Pods/Headers/Public\" \"/Users/tamar/core/project/Pods/Headers/Public/AppsFlyer-SDK\" \"/Users/tamar/core/project/Pods/Headers/Public/Fabric\" \"/Users/tamar/core/project/Pods/Headers/Public/GIFEncoder\" \"/Users/tamar/core/project/Pods/Headers/Public/GoogleAppIndexing\" \"/Users/tamar/core/project/Pods/Headers/Public/HockeySDK\" \"/Users/tamar/core/project/Pods/Headers/Public/Kahuna\" \"/Users/tamar/core/project/Pods/Headers/Public/Reveal-iOS-SDK\" \"/Users/tamar/core/project/Pods/Headers/Public/TwitterCore\" \"/Users/tamar/core/project/Pods/Headers/Public/TwitterKit\""
    export HIDE_BITCODE_SYMBOLS=YES
    export HOME=/Users/tamar
    export ICONV=/usr/bin/iconv
    export INFOPLIST_EXPAND_BUILD_SETTINGS=YES
    export INFOPLIST_FILE=Resources/Share-Info.plist
    export INFOPLIST_OUTPUT_FORMAT=binary
    export INFOPLIST_PATH=Share.appex/Info.plist
    export INFOPLIST_PREPROCESS=NO
    export INFOSTRINGS_PATH=Share.appex/English.lproj/InfoPlist.strings
    export INSTALL_DIR=/tmp/project.dst
    export INSTALL_GROUP=staff
    export INSTALL_MODE_FLAG=u+w,go-w,a+rX
    export INSTALL_OWNER=tamar
    export INSTALL_ROOT=/tmp/project.dst
    export IPHONEOS_DEPLOYMENT_TARGET=8.0
    export JAVAC_DEFAULT_FLAGS="-J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8"
    export JAVA_APP_STUB=/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub
    export JAVA_ARCHIVE_CLASSES=YES
    export JAVA_ARCHIVE_TYPE=JAR
    export JAVA_COMPILER=/usr/bin/javac
    export JAVA_FOLDER_PATH=Share.appex/Java
    export JAVA_FRAMEWORK_RESOURCES_DIRS=Resources
    export JAVA_JAR_FLAGS=cv
    export JAVA_SOURCE_SUBDIR=.
    export JAVA_USE_DEPENDENCIES=YES
    export JAVA_ZIP_FLAGS=-urg
    export JIKES_DEFAULT_FLAGS="+E +OLDCSO"
    export KEEP_PRIVATE_EXTERNS=NO
    export LD_DEPENDENCY_INFO_FILE=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/project.build/Debug-iphoneos/Share.build/Objects-normal/arm64/Share_dependency_info.dat
    export LD_GENERATE_MAP_FILE=NO
    export LD_MAP_FILE_PATH=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/project.build/Debug-iphoneos/Share.build/Share-LinkMap-normal-arm64.txt
    export LD_NO_PIE=NO
    export LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER=YES
    export LD_RUNPATH_SEARCH_PATHS=" '@executable_path/Frameworks' '@loader_path/Frameworks' @executable_path/Frameworks @executable_path/../../Frameworks"
    export LEGACY_DEVELOPER_DIR=/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer
    export LEX=lex
    export LIBRARY_FLAG_NOSPACE=YES
    export LIBRARY_FLAG_PREFIX=-l
    export LIBRARY_KEXT_INSTALL_PATH=/Library/Extensions
    export LIBRARY_SEARCH_PATHS="/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Products/Debug-iphoneos "
    export LINKER_DISPLAYS_MANGLED_NAMES=NO
    export LINK_FILE_LIST_normal_arm64=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/project.build/Debug-iphoneos/Share.build/Objects-normal/arm64/Share.LinkFileList
    export LINK_WITH_STANDARD_LIBRARIES=YES
    export LOCALIZABLE_CONTENT_DIR=
    export LOCALIZED_RESOURCES_FOLDER_PATH=Share.appex/English.lproj
    export LOCAL_ADMIN_APPS_DIR=/Applications/Utilities
    export LOCAL_APPS_DIR=/Applications
    export LOCAL_DEVELOPER_DIR=/Library/Developer
    export LOCAL_LIBRARY_DIR=/Library
    export LOCROOT=
    export LOCSYMROOT=
    export MACH_O_TYPE=mh_execute
    export MAC_OS_X_PRODUCT_BUILD_VERSION=15C50
    export MAC_OS_X_VERSION_ACTUAL=101102
    export MAC_OS_X_VERSION_MAJOR=101100
    export MAC_OS_X_VERSION_MINOR=1102
    export MODULE_CACHE_DIR=/Users/tamar/Library/Developer/Xcode/DerivedData/ModuleCache
    export MTL_ENABLE_DEBUG_INFO=YES
    export NATIVE_ARCH=armv7
    export NATIVE_ARCH_32_BIT=i386
    export NATIVE_ARCH_64_BIT=x86_64
    export NATIVE_ARCH_ACTUAL=x86_64
    export NO_COMMON=YES
    export OBJECT_FILE_DIR=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/project.build/Debug-iphoneos/Share.build/Objects
    export OBJECT_FILE_DIR_normal=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/project.build/Debug-iphoneos/Share.build/Objects-normal
    export OBJROOT=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates
    export ONLY_ACTIVE_ARCH=YES
    export OPTIMIZATION_LEVEL=0
    export OS=MACOS
    export OSAC=/usr/bin/osacompile
    export OTHER_CFLAGS=" (stuff i can't share on here)
    export OTHER_SWIFT_FLAGS=" \"-D\" \"COCOAPODS\""
    export PACKAGE_TYPE=com.apple.package-type.app-extension
    export PASCAL_STRINGS=YES
    export PATH="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Tools:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    export PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES="/usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Applications/Xcode.app/Contents/Developer/Headers /Applications/Xcode.app/Contents/Developer/SDKs /Applications/Xcode.app/Contents/Developer/Platforms"
    export PBDEVELOPMENTPLIST_PATH=Share.appex/pbdevelopment.plist
    export PFE_FILE_C_DIALECTS=objective-c
    export PKGINFO_FILE_PATH=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/project.build/Debug-iphoneos/Share.build/PkgInfo
    export PKGINFO_PATH=Share.appex/PkgInfo
    export PLATFORM_DEVELOPER_APPLICATIONS_DIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Applications
    export PLATFORM_DEVELOPER_BIN_DIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin
    export PLATFORM_DEVELOPER_LIBRARY_DIR=/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library
    export PLATFORM_DEVELOPER_SDK_DIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs
    export PLATFORM_DEVELOPER_TOOLS_DIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Tools
    export PLATFORM_DEVELOPER_USR_DIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr
    export PLATFORM_DIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
    export PLATFORM_DISPLAY_NAME=iOS
    export PLATFORM_NAME=iphoneos
    export PLATFORM_PREFERRED_ARCH=arm64
    export PLATFORM_PRODUCT_BUILD_VERSION=13C75
    export PLIST_FILE_OUTPUT_FORMAT=binary
    export PLUGINS_FOLDER_PATH=Share.appex/PlugIns
    export PODS_FRAMEWORK_BUILD_PATH=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Products/Debug-iphoneos/Pods-share_extension
    export PODS_ROOT=/Users/tamar/core/project/Pods
    export PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR=YES
    export PRECOMP_DESTINATION_DIR=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/project.build/Debug-iphoneos/Share.build/PrefixHeaders
    export PRESERVE_DEAD_CODE_INITS_AND_TERMS=NO
    export PRIVATE_HEADERS_FOLDER_PATH=Share.appex/PrivateHeaders
    export PRODUCT_BUNDLE_IDENTIFIER="bundle id"
    export PRODUCT_MODULE_NAME=Share
    export PRODUCT_NAME=Share
    export PRODUCT_SETTINGS_PATH=/Users/tamar/core/project/Resources/Share-Info.plist
    export PRODUCT_SPECIFIC_LDFLAGS="-e _NSExtensionMain"
    export PRODUCT_TYPE=com.apple.product-type.app-extension
    export PROFILING_CODE=NO
    export PROJECT=project
    export PROJECT_DERIVED_FILE_DIR=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/project.build/DerivedSources
    export PROJECT_DIR=/Users/tamar/core/project
    export PROJECT_FILE_PATH=/Users/tamar/core/project/project.xcodeproj
    export PROJECT_NAME=project
    export PROJECT_TEMP_DIR=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/project.build
    export PROJECT_TEMP_ROOT=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates
    export PUBLIC_HEADERS_FOLDER_PATH=Share.appex/Headers
    export RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS=YES
    export REMOVE_CVS_FROM_RESOURCES=YES
    export REMOVE_GIT_FROM_RESOURCES=YES
    export REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES=YES
    export REMOVE_HG_FROM_RESOURCES=YES
    export REMOVE_SVN_FROM_RESOURCES=YES
    export REZ_COLLECTOR_DIR=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/project.build/Debug-iphoneos/Share.build/ResourceManagerResources
    export REZ_OBJECTS_DIR=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/project.build/Debug-iphoneos/Share.build/ResourceManagerResources/Objects
    export REZ_SEARCH_PATHS="/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Products/Debug-iphoneos "
    export SCAN_ALL_SOURCE_FILES_FOR_INCLUDES=NO
    export SCRIPTS_FOLDER_PATH=Share.appex/Scripts
    export SCRIPT_INPUT_FILE_COUNT=0
    export SCRIPT_OUTPUT_FILE_COUNT=0
    export SDKROOT=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.2.sdk
    export SDK_DIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.2.sdk
    export SDK_DIR_iphoneos9_2=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.2.sdk
    export SDK_NAME=iphoneos9.2
    export SDK_NAMES=iphoneos9.2
    export SDK_PRODUCT_BUILD_VERSION=13C75
    export SDK_VERSION=9.2
    export SDK_VERSION_ACTUAL=90200
    export SDK_VERSION_MAJOR=90000
    export SDK_VERSION_MINOR=200
    export SED=/usr/bin/sed
    export SEPARATE_STRIP=NO
    export SEPARATE_SYMBOL_EDIT=NO
    export SET_DIR_MODE_OWNER_GROUP=YES
    export SET_FILE_MODE_OWNER_GROUP=NO
    export SHALLOW_BUNDLE=YES
    export SHARED_DERIVED_FILE_DIR=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Products/Debug-iphoneos/DerivedSources
    export SHARED_FRAMEWORKS_FOLDER_PATH=Share.appex/SharedFrameworks
    export SHARED_PRECOMPS_DIR=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/PrecompiledHeaders
    export SHARED_SUPPORT_FOLDER_PATH=Share.appex/SharedSupport
    export SKIP_INSTALL=YES
    export SOURCE_ROOT=/Users/tamar/core/project
    export SRCROOT=/Users/tamar/core/project
    export STRINGS_FILE_OUTPUT_ENCODING=binary
    export STRIP_BITCODE_FROM_COPIED_FILES=YES
    export STRIP_INSTALLED_PRODUCT=YES
    export STRIP_STYLE=non-global
    export SUPPORTED_DEVICE_FAMILIES=1,2
    export SUPPORTED_PLATFORMS="iphonesimulator iphoneos"
    export SUPPORTS_TEXT_BASED_API=NO
    export SWIFT_OPTIMIZATION_LEVEL=-Onone
    export SWIFT_PLATFORM_TARGET_PREFIX=ios
    export SYMROOT=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Products
    export SYSTEM_ADMIN_APPS_DIR=/Applications/Utilities
    export SYSTEM_APPS_DIR=/Applications
    export SYSTEM_CORE_SERVICES_DIR=/System/Library/CoreServices
    export SYSTEM_DEMOS_DIR=/Applications/Extras
    export SYSTEM_DEVELOPER_APPS_DIR=/Applications/Xcode.app/Contents/Developer/Applications
    export SYSTEM_DEVELOPER_BIN_DIR=/Applications/Xcode.app/Contents/Developer/usr/bin
    export SYSTEM_DEVELOPER_DEMOS_DIR="/Applications/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples"
    export SYSTEM_DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
    export SYSTEM_DEVELOPER_DOC_DIR="/Applications/Xcode.app/Contents/Developer/ADC Reference Library"
    export SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR="/Applications/Xcode.app/Contents/Developer/Applications/Graphics Tools"
    export SYSTEM_DEVELOPER_JAVA_TOOLS_DIR="/Applications/Xcode.app/Contents/Developer/Applications/Java Tools"
    export SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR="/Applications/Xcode.app/Contents/Developer/Applications/Performance Tools"
    export SYSTEM_DEVELOPER_RELEASENOTES_DIR="/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes"
    export SYSTEM_DEVELOPER_TOOLS=/Applications/Xcode.app/Contents/Developer/Tools
    export SYSTEM_DEVELOPER_TOOLS_DOC_DIR="/Applications/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools"
    export SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR="/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools"
    export SYSTEM_DEVELOPER_USR_DIR=/Applications/Xcode.app/Contents/Developer/usr
    export SYSTEM_DEVELOPER_UTILITIES_DIR=/Applications/Xcode.app/Contents/Developer/Applications/Utilities
    export SYSTEM_DOCUMENTATION_DIR=/Library/Documentation
    export SYSTEM_KEXT_INSTALL_PATH=/System/Library/Extensions
    export SYSTEM_LIBRARY_DIR=/System/Library
    export TARGETED_DEVICE_FAMILY=1,2
    export TARGETNAME=Share
    export TARGET_BUILD_DIR=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Products/Debug-iphoneos
    export TARGET_DEVICE_MODEL=iPhone8,1
    export TARGET_DEVICE_OS_VERSION=9.2
    export TARGET_NAME=Share
    export TARGET_TEMP_DIR=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/project.build/Debug-iphoneos/Share.build
    export TEMP_DIR=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/project.build/Debug-iphoneos/Share.build
    export TEMP_FILES_DIR=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/project.build/Debug-iphoneos/Share.build
    export TEMP_FILE_DIR=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/project.build/Debug-iphoneos/Share.build
    export TEMP_ROOT=/Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates
    export TOOLCHAINS=com.apple.dt.toolchain.XcodeDefault
    export TOOLCHAIN_DIR=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain
    export TREAT_MISSING_BASELINES_AS_TEST_FAILURES=NO
    export UID=501
    export UNLOCALIZED_RESOURCES_FOLDER_PATH=Share.appex
    export UNSTRIPPED_PRODUCT=NO
    export USER=tamar
    export USER_APPS_DIR=/Users/tamar/Applications
    export USER_LIBRARY_DIR=/Users/tamar/Library
    export USE_DYNAMIC_NO_PIC=YES
    export USE_HEADERMAP=YES
    export USE_HEADER_SYMLINKS=NO
    export VALIDATE_PRODUCT=NO
    export VALID_ARCHS="arm64 armv7 armv7s"
    export VERBOSE_PBXCP=NO
    export VERSIONING_SYSTEM=apple-generic
    export VERSIONPLIST_PATH=Share.appex/version.plist
    export VERSION_INFO_BUILDER=tamar
    export VERSION_INFO_FILE=Share_vers.c
    export VERSION_INFO_STRING="\"@(#)PROGRAM:Share  PROJECT:project-436\""
    export WRAPPER_EXTENSION=appex
    export WRAPPER_NAME=Share.appex
    export WRAPPER_SUFFIX=.appex
    export WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES=NO
    export XCODE_APP_SUPPORT_DIR=/Applications/Xcode.app/Contents/Developer/Library/Xcode
    export XCODE_PRODUCT_BUILD_VERSION=7C68
    export XCODE_VERSION_ACTUAL=0720
    export XCODE_VERSION_MAJOR=0700
    export XCODE_VERSION_MINOR=0720
    export XPCSERVICES_FOLDER_PATH=Share.appex/XPCServices
    export YACC=yacc
    export arch=arm64
    export variant=normal
    /bin/sh -c /Users/tamar/Library/Developer/Xcode/DerivedData/project-dhwfefmrpsepdncezpfhexxoddmo/Build/Intermediates/project.build/Debug-iphoneos/Share.build/Script-32B957CD1C24634700560E0C.sh

Loading configuration from '/Users/tamar/core/project/.swiftlint.yml'
Linting Swift files at path /Users/tamar/core/project/Classes/ClassName.swift
Linting 'ClassName.swift' (1/1)
Done linting! Found 1 violation, 1 serious in 1 file.

/Users/tamar/core/project/Classes/ClassName.swift:86:55: error: Force Cast Violation: Force casts should be avoided. (force_cast)
Command /bin/sh emitted errors but did not return a nonzero exit code to indicate failure

@jpsim
Copy link
Collaborator

jpsim commented Dec 29, 2015

Command /bin/sh emitted errors but did not return a nonzero exit code to indicate failure

This is being printed because the return status of swiftlint is being ignored by your run script build phase.

For example, if you had

swiftlint
exit 0 # <- ignores the exit status from the swiftlint call above

Can you please paste the output of your build phase? Using the script from the README shouldn't cause this problem.

@jpsim
Copy link
Collaborator

jpsim commented Dec 29, 2015

I don't see the SIGABRT failure in the command output you posted above. How is that issue triggered? Is a backtrace printed when it occurs?

@tamarnachmany
Copy link
Author

The build phase doesn't have any output (unless I'm misunderstanding what you mean by output?).
The only exit code I've added gets called if the developer does not have SwiftLint installed locally.
The script boils down to a diff check and if each file has a diff swiftlint lint --strict --config "${SRCROOT}/.swiftlint.yml" --path "$file" gets called.

@jpsim
Copy link
Collaborator

jpsim commented Dec 29, 2015

The script boils down to a diff check and if each file has a diff swiftlint lint --strict --config "${SRCROOT}/.swiftlint.yml" --path "$file" gets called.

It sure sounds like you're not saving the exit code from each swiftlint invocation to then return with a non-zero code if an error was found.

If you share the entirety of your build phase, without paraphrasing, I can help you refactor it to make the script exit with a non-zero code if any swiftlint invocation did.

The build phase doesn't have any output (unless I'm misunderstanding what you mean by output?)

All build script phases generate some output, usually this is available in Xcode:

image

image

image

@tamarnachmany
Copy link
Author

It sure sounds like you're not saving the exit code from each swiftlint invocation to then return with a non-zero code if an error was found.

You're right! I'm not. I thought that is a built-in functionality that doesn't need to be handled by a script. Does a script that runs linting have to handle that exit code?

As far as output:
The output I see just reflects the errors I mentioned. This is a screenshot, minus specific class names and stuff -- I don't work on an open source app :-p

screen shot 2015-12-29 at 10 15 29 pm

I am using the following build script (I'm in the process of modifying it so it does not have the correct version hard coded):

REQUIRED_SWIFTLINT_VERSION="0.5.2"
REQUIRED_SWIFTLINT_DOWNLOAD_URL="https://github.com/realm/SwiftLint/releases/tag/${REQUIRED_SWIFTLINT_VERSION}"

which swiftlint &> /dev/null
NEEDS_SWIFTLINT="$?"
SWIFTLINT_MATCHES="0"

if [ "$NEEDS_SWIFTLINT" == "0" ]; then
    CURRENT_SWIFTLINT_VERSION=`swiftlint version`
    if [ "$CURRENT_SWIFTLINT_VERSION" == "$REQUIRED_SWIFTLINT_VERSION" ]; then
        SWIFTLINT_MATCHES="1"
    fi
fi

if [ "$SWIFTLINT_MATCHES" == "0" ]; then
    echo -e "error: SwiftLint $REQUIRED_SWIFTLINT_VERSION needs to be installed. Download it here: $REQUIRED_SWIFTLINT_DOWNLOAD_URL\n" 1>&2;
    open -g $REQUIRED_SWIFTLINT_DOWNLOAD_URL;
    exit 1;
fi

lint () {
    find "$1" -name "*.swift" -print0 | while read -d $'\0' file
    do
        git diff-index --quiet HEAD -- "$file"

        if [ $? -ne 0 ]; then
            swiftlint lint --strict --config "${SRCROOT}/.swiftlint.yml" --path "$file"
        fi
    done
}

@jpsim
Copy link
Collaborator

jpsim commented Dec 30, 2015

Does a script that runs linting have to handle that exit code?

Yes, although this is not specific to linting. This is how sh and bash work.

I'm away from my computer now, but it should be trivial to adapt your script to return a code based on the linting results.

@tamarnachmany
Copy link
Author

TIL!

I think I can take it from here.

@jpsim
Copy link
Collaborator

jpsim commented Jan 19, 2016

@tamarnachmany what's your take-away from this long thread?

@tamarnachmany
Copy link
Author

Hi.
What do you mean by take-away?

@jpsim
Copy link
Collaborator

jpsim commented Jan 19, 2016

I mean what would you like to see changed in how SwiftLint deals with the --strict flag based on our discussion here, if anything?

@scottrhoyt
Copy link
Contributor

To me it feels like the biggest question to tackle here is whether to support the configuration of violation severities at global scope, rule scope, or both.

At rule scope, we can create a new protocol, say WarningOrErrorRule, to provide standard conformance to ConfigurableRule, and allow people to add a flag to their .swiftlint.yml files to indicate violation severity.

At a global scope, @jpsim 's idea of a WarningsAsErrorsXcodeReporter, seems most reasonable.

But should we do both?? I'm not sure about that just because the potential ambiguities for end users creating or reading configurations.

@scottrhoyt
Copy link
Contributor

To me, doing rule-scope only seems the most practical. It will provide the desired behavior (though potentially more onerous configuration), it fits with what we are already doing with ViolationLevelRule, and it fits a wider spectrum of uses cases. For instance, I might want to make most things an error, but still allow developers to use TODOs and FIXMEs in their feature branches before they get merged back in.

@scottrhoyt
Copy link
Contributor

I also appreciate the current implementation of --strict because there is a clear delineation between that and .swiftlint.yml right now.

@tamarnachmany
Copy link
Author

I enthusiastically agree with everything you suggested, Scott.

To me, doing rule-scope only seems the most practical. It will provide the desired behavior (though potentially more onerous configuration), it fits with what we are already doing with ViolationLevelRule, and it fits a wider spectrum of uses cases.

&

At rule scope, we can create a new protocol, say WarningOrErrorRule, to provide standard conformance to ConfigurableRule, and allow people to add a flag to their .swiftlint.yml files to indicate violation severity.

I think that's the way to go. And I think a protocol, and perhaps a new section in the .yml file with 'error-level-violations' and 'warning-level-violations' might be a nice structure there. That's without me actually trying to implement this yet. But from my exploration of the library, that seems good.

As far as the --strict flag goes...hm...

In the interim (before changes are potentially made to the way rule violations can be configured and are displayed) I do think more documentation on how to exit a build when style rules are violated would be great, and is probably relevant to many teams using SwiftLint.

Looking at SwiftLint initially it seemed like maybe SwiftLint hooked back into some part of the Swift compilation process/ sent errors to SourceKit somewhere to report violations, rather than just printing them. Maybe a sentence in the readme, or a small sample script in the same way there is a sample .yml in this repo. I'm happy to contribute mine.

@scottrhoyt scottrhoyt mentioned this issue Jan 21, 2016
3 tasks
@scottrhoyt
Copy link
Contributor

@tamarnachmany , with the changes introduced in #391, you should now be able to configure the severity of any rule. Does this get you close enough to satisfy your use case?

@tamarnachmany
Copy link
Author

🙏 🙏 🙏
I believe so!

I will follow up with you/on the repo if I see any issues.

@jpsim
Copy link
Collaborator

jpsim commented Jul 25, 2016

I think it's fair time to close this. Let's reopen a new issue if anyone ever wants to revisit this. Thanks for spurring such a thorough conversation, @tamarnachmany!

@jpsim jpsim closed this as completed Jul 25, 2016
@acecilia
Copy link
Contributor

acecilia commented Jul 2, 2018

It is possible to treat all swiftlint warnings as errors by modifying the swiftlint output like this:

#!/bin/bash

# Make the script return a failure code if any of the commands executed in the middle fail (even if they are piped)
# For more info, see: https://stackoverflow.com/questions/821396/aborting-a-shell-script-if-any-command-returns-a-non-zero-value
set -e
set -o pipefail

swiftlint lint --strict | sed 's/warning:/error:/g'

Or in case you are using swiftlint from cocoapods:

${PODS_ROOT}/SwiftLint/swiftlint lint --strict | sed 's/warning:/error:/g'

@bjtitus
Copy link

bjtitus commented Mar 27, 2019

Don't these suggested commands swallow the exit code from swiftlint? At least, in my experience, this causes swiftlint to fail silently.

I'm no bash expert, but here's the script I ended up using:

OUTPUT=$("${PODS_ROOT}"/SwiftLint/swiftlint --strict)
CODE=$?
echo $OUTPUT | sed 's/warning:/error:/g'
exit $CODE

@acecilia
Copy link
Contributor

@bjtitus did you use set -e and set -o pipefail? Using them will make the script fail even if it is piped.

@bjtitus
Copy link

bjtitus commented Mar 27, 2019

@acecilia 🤦‍♂️ Thanks! Turns out I can't read.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

7 participants