]> git.saurik.com Git - android/aapt.git/commitdiff
am 8748399f: am 61394501: Merge "Support a new ANDROID_AAPT_IGNORE env var."
authorRaphael Moll <ralf@android.com>
Fri, 18 May 2012 23:33:14 +0000 (16:33 -0700)
committerAndroid Git Automerger <android-git-automerger@android.com>
Fri, 18 May 2012 23:33:14 +0000 (16:33 -0700)
* commit '8748399f6f999d21eef9226baadb20f71dfb61ea':
  Support a new ANDROID_AAPT_IGNORE env var.

1  2 
AaptAssets.cpp
AaptAssets.h

diff --combined AaptAssets.cpp
index ec614039c8ae30740ae0f2c64fe06b369398831b,eba77c258acbf41367bb77dc8cadd674f3308027..73705ae54ba1fa2589494de8fa0f5c28abb3d8c3
@@@ -56,55 -56,92 +56,92 @@@ static bool validateFileName(const char
      return true;
  }
  
+ // The default to use if no other ignore pattern is defined.
+ const char * const gDefaultIgnoreAssets =
+     "!.svn:!.git:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*.scc:*~";
+ // The ignore pattern that can be passed via --ignore-assets in Main.cpp
+ const char * gUserIgnoreAssets = NULL;
  static bool isHidden(const char *root, const char *path)
  {
-     const char *ext  = NULL;
-     const char *type = NULL;
-     // Skip all hidden files.
-     if (path[0] == '.') {
-         // Skip ., .. and  .svn but don't chatter about it.
-         if (strcmp(path, ".") == 0
-             || strcmp(path, "..") == 0
-             || strcmp(path, ".svn") == 0) {
-             return true;
+     // Patterns syntax:
+     // - Delimiter is :
+     // - Entry can start with the flag ! to avoid printing a warning
+     //   about the file being ignored.
+     // - Entry can have the flag "<dir>" to match only directories
+     //   or <file> to match only files. Default is to match both.
+     // - Entry can be a simplified glob "<prefix>*" or "*<suffix>"
+     //   where prefix/suffix must have at least 1 character (so that
+     //   we don't match a '*' catch-all pattern.)
+     // - The special filenames "." and ".." are always ignored.
+     // - Otherwise the full string is matched.
+     // - match is not case-sensitive.
+     if (strcmp(path, ".") == 0 || strcmp(path, "..") == 0) {
+         return true;
+     }
+     const char *delim = ":";
+     const char *p = gUserIgnoreAssets;
+     if (!p || !p[0]) {
+         p = getenv("ANDROID_AAPT_IGNORE");
+     }
+     if (!p || !p[0]) {
+         p = gDefaultIgnoreAssets;
+     }
+     char *patterns = strdup(p);
+     bool ignore = false;
+     bool chatty = true;
+     char *matchedPattern = NULL;
+     String8 fullPath(root);
+     fullPath.appendPath(path);
+     FileType type = getFileType(fullPath);
+     int plen = strlen(path);
+     // Note: we don't have strtok_r under mingw.
+     for(char *token = strtok(patterns, delim);
+             !ignore && token != NULL;
+             token = strtok(NULL, delim)) {
+         chatty = token[0] != '!';
+         if (!chatty) token++; // skip !
+         if (strncasecmp(token, "<dir>" , 5) == 0) {
+             if (type != kFileTypeDirectory) continue;
+             token += 5;
          }
-         type = "hidden";
-     } else if (path[0] == '_') {
-         // skip directories starting with _ (don't chatter about it)
-         String8 subdirName(root);
-         subdirName.appendPath(path);
-         if (getFileType(subdirName.string()) == kFileTypeDirectory) {
-             return true;
+         if (strncasecmp(token, "<file>", 6) == 0) {
+             if (type != kFileTypeRegular) continue;
+             token += 6;
+         }
+         matchedPattern = token;
+         int n = strlen(token);
+         if (token[0] == '*') {
+             // Match *suffix
+             token++;
+             if (n <= plen) {
+                 ignore = strncasecmp(token, path + plen - n, n) == 0;
+             }
+         } else if (n > 1 && token[n - 1] == '*') {
+             // Match prefix*
+             ignore = strncasecmp(token, path, n - 1) == 0;
+         } else {
+             ignore = strcasecmp(token, path) == 0;
          }
-     } else if (strcmp(path, "CVS") == 0) {
-         // Skip CVS but don't chatter about it.
-         return true;
-     } else if (strcasecmp(path, "thumbs.db") == 0
-                || strcasecmp(path, "picasa.ini") == 0) {
-         // Skip suspected image indexes files.
-         type = "index";
-     } else if (path[strlen(path)-1] == '~') {
-         // Skip suspected emacs backup files.
-         type = "backup";
-     } else if ((ext = strrchr(path, '.')) != NULL && strcmp(ext, ".scc") == 0) {
-         // Skip VisualSourceSafe files and don't chatter about it
-         return true;
-     } else {
-         // Let everything else through.
-         return false;
      }
  
-     /* If we get this far, "type" should be set and the file
-      * should be skipped.
-      */
-     String8 subdirName(root);
-     subdirName.appendPath(path);
-     fprintf(stderr, "    (skipping %s %s '%s')\n", type,
-             getFileType(subdirName.string())==kFileTypeDirectory ? "dir":"file",
-             subdirName.string());
+     if (ignore && chatty) {
+         fprintf(stderr, "    (skipping %s '%s' due to ANDROID_AAPT_IGNORE pattern '%s')\n",
+                 type == kFileTypeDirectory ? "dir" : "file",
+                 path,
+                 matchedPattern ? matchedPattern : "");
+     }
  
-     return true;
+     free(patterns);
+     return ignore;
  }
  
  // =========================================================================
@@@ -1019,11 -1056,6 +1056,11 @@@ bool AaptGroupEntry::getUiModeTypeName(
                (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
                | ResTable_config::UI_MODE_TYPE_TELEVISION;
          return true;
 +    } else if (strcmp(name, "appliance") == 0) {
 +      if (out) out->uiMode =
 +              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
 +              | ResTable_config::UI_MODE_TYPE_APPLIANCE;
 +        return true;
      }
  
      return false;
@@@ -1084,17 -1116,12 +1121,17 @@@ bool AaptGroupEntry::getDensityName(con
          if (out) out->density = ResTable_config::DENSITY_HIGH;
          return true;
      }
 -    
 +
      if (strcmp(name, "xhdpi") == 0) {
 -        if (out) out->density = ResTable_config::DENSITY_MEDIUM*2;
 +        if (out) out->density = ResTable_config::DENSITY_XHIGH;
          return true;
      }
 -    
 +
 +    if (strcmp(name, "xxhdpi") == 0) {
 +        if (out) out->density = ResTable_config::DENSITY_XXHIGH;
 +        return true;
 +    }
 +
      char* c = (char*)name;
      while (*c >= '0' && *c <= '9') {
          c++;
@@@ -1837,49 -1864,6 +1874,49 @@@ String8 AaptDir::getPrintableSource() c
  // =========================================================================
  // =========================================================================
  
 +status_t AaptSymbols::applyJavaSymbols(const sp<AaptSymbols>& javaSymbols)
 +{
 +    status_t err = NO_ERROR;
 +    size_t N = javaSymbols->mSymbols.size();
 +    for (size_t i=0; i<N; i++) {
 +        const String8& name = javaSymbols->mSymbols.keyAt(i);
 +        const AaptSymbolEntry& entry = javaSymbols->mSymbols.valueAt(i);
 +        ssize_t pos = mSymbols.indexOfKey(name);
 +        if (pos < 0) {
 +            entry.sourcePos.error("Symbol '%s' declared with <java-symbol> not defined\n", name.string());
 +            err = UNKNOWN_ERROR;
 +            continue;
 +        }
 +        //printf("**** setting symbol #%d/%d %s to isJavaSymbol=%d\n",
 +        //        i, N, name.string(), entry.isJavaSymbol ? 1 : 0);
 +        mSymbols.editValueAt(pos).isJavaSymbol = entry.isJavaSymbol;
 +    }
 +
 +    N = javaSymbols->mNestedSymbols.size();
 +    for (size_t i=0; i<N; i++) {
 +        const String8& name = javaSymbols->mNestedSymbols.keyAt(i);
 +        const sp<AaptSymbols>& symbols = javaSymbols->mNestedSymbols.valueAt(i);
 +        ssize_t pos = mNestedSymbols.indexOfKey(name);
 +        if (pos < 0) {
 +            SourcePos pos;
 +            pos.error("Java symbol dir %s not defined\n", name.string());
 +            err = UNKNOWN_ERROR;
 +            continue;
 +        }
 +        //printf("**** applying java symbols in dir %s\n", name.string());
 +        status_t myerr = mNestedSymbols.valueAt(pos)->applyJavaSymbols(symbols);
 +        if (myerr != NO_ERROR) {
 +            err = myerr;
 +        }
 +    }
 +
 +    return err;
 +}
 +
 +// =========================================================================
 +// =========================================================================
 +// =========================================================================
 +
  AaptAssets::AaptAssets()
      : AaptDir(String8(), String8()),
        mChanged(false), mHaveIncludedAssets(false), mRes(NULL)
@@@ -2447,48 -2431,6 +2484,48 @@@ sp<AaptSymbols> AaptAssets::getSymbolsF
      return sym;
  }
  
 +sp<AaptSymbols> AaptAssets::getJavaSymbolsFor(const String8& name)
 +{
 +    sp<AaptSymbols> sym = mJavaSymbols.valueFor(name);
 +    if (sym == NULL) {
 +        sym = new AaptSymbols();
 +        mJavaSymbols.add(name, sym);
 +    }
 +    return sym;
 +}
 +
 +status_t AaptAssets::applyJavaSymbols()
 +{
 +    size_t N = mJavaSymbols.size();
 +    for (size_t i=0; i<N; i++) {
 +        const String8& name = mJavaSymbols.keyAt(i);
 +        const sp<AaptSymbols>& symbols = mJavaSymbols.valueAt(i);
 +        ssize_t pos = mSymbols.indexOfKey(name);
 +        if (pos < 0) {
 +            SourcePos pos;
 +            pos.error("Java symbol dir %s not defined\n", name.string());
 +            return UNKNOWN_ERROR;
 +        }
 +        //printf("**** applying java symbols in dir %s\n", name.string());
 +        status_t err = mSymbols.valueAt(pos)->applyJavaSymbols(symbols);
 +        if (err != NO_ERROR) {
 +            return err;
 +        }
 +    }
 +
 +    return NO_ERROR;
 +}
 +
 +bool AaptAssets::isJavaSymbol(const AaptSymbolEntry& sym, bool includePrivate) const {
 +    //printf("isJavaSymbol %s: public=%d, includePrivate=%d, isJavaSymbol=%d\n",
 +    //        sym.name.string(), sym.isPublic ? 1 : 0, includePrivate ? 1 : 0,
 +    //        sym.isJavaSymbol ? 1 : 0);
 +    if (!mHavePrivateSymbols) return true;
 +    if (sym.isPublic) return true;
 +    if (includePrivate && sym.isJavaSymbol) return true;
 +    return false;
 +}
 +
  status_t AaptAssets::buildIncludedResources(Bundle* bundle)
  {
      if (!mHaveIncludedAssets) {
diff --combined AaptAssets.h
index 59249529fbbab19d2d54b566c09dcd3b7a1643da,52751c755652bd499035faa0f9809d2743a172cf..d5f296cb523887e8d5781c144b6c6c3f5969231c
@@@ -7,14 -7,14 +7,14 @@@
  #define __AAPT_ASSETS_H
  
  #include <stdlib.h>
 -#include <utils/AssetManager.h>
 +#include <androidfw/AssetManager.h>
 +#include <androidfw/ResourceTypes.h>
  #include <utils/KeyedVector.h>
 -#include <utils/String8.h>
 -#include <utils/ResourceTypes.h>
 +#include <utils/RefBase.h>
  #include <utils/SortedVector.h>
  #include <utils/String8.h>
 +#include <utils/String8.h>
  #include <utils/Vector.h>
 -#include <utils/RefBase.h>
  #include "ZipFile.h"
  
  #include "Bundle.h"
  
  using namespace android;
  
+ extern const char * const gDefaultIgnoreAssets;
+ extern const char * gUserIgnoreAssets;
  bool valid_symbol_name(const String8& str);
  
  class AaptAssets;
@@@ -53,6 -57,17 +57,6 @@@ enum 
      AXIS_END = AXIS_VERSION,
  };
  
 -enum {
 -    SDK_CUPCAKE = 3,
 -    SDK_DONUT = 4,
 -    SDK_ECLAIR = 5,
 -    SDK_ECLAIR_0_1 = 6,
 -    SDK_MR1 = 7,
 -    SDK_FROYO = 8,
 -    SDK_HONEYCOMB_MR2 = 13,
 -    SDK_ICE_CREAM_SANDWICH = 14,
 -};
 -
  /**
   * This structure contains a specific variation of a single file out
   * of all the variations it can have that we can have.
@@@ -315,16 -330,16 +319,16 @@@ class AaptSymbolEntr
  {
  public:
      AaptSymbolEntry()
 -        : isPublic(false), typeCode(TYPE_UNKNOWN)
 +        : isPublic(false), isJavaSymbol(false), typeCode(TYPE_UNKNOWN)
      {
      }
      AaptSymbolEntry(const String8& _name)
 -        : name(_name), isPublic(false), typeCode(TYPE_UNKNOWN)
 +        : name(_name), isPublic(false), isJavaSymbol(false), typeCode(TYPE_UNKNOWN)
      {
      }
      AaptSymbolEntry(const AaptSymbolEntry& o)
          : name(o.name), sourcePos(o.sourcePos), isPublic(o.isPublic)
 -        , comment(o.comment), typeComment(o.typeComment)
 +        , isJavaSymbol(o.isJavaSymbol), comment(o.comment), typeComment(o.typeComment)
          , typeCode(o.typeCode), int32Val(o.int32Val), stringVal(o.stringVal)
      {
      }
      {
          sourcePos = o.sourcePos;
          isPublic = o.isPublic;
 +        isJavaSymbol = o.isJavaSymbol;
          comment = o.comment;
          typeComment = o.typeComment;
          typeCode = o.typeCode;
      
      SourcePos sourcePos;
      bool isPublic;
 +    bool isJavaSymbol;
      
      String16 comment;
      String16 typeComment;
@@@ -403,15 -416,6 +407,15 @@@ public
          return NO_ERROR;
      }
  
 +    status_t makeSymbolJavaSymbol(const String8& name, const SourcePos& pos) {
 +        if (!check_valid_symbol_name(name, pos, "symbol")) {
 +            return BAD_VALUE;
 +        }
 +        AaptSymbolEntry& sym = edit_symbol(name, &pos);
 +        sym.isJavaSymbol = true;
 +        return NO_ERROR;
 +    }
 +
      void appendComment(const String8& name, const String16& comment, const SourcePos& pos) {
          if (comment.size() <= 0) {
              return;
          return sym;
      }
  
 +    status_t applyJavaSymbols(const sp<AaptSymbols>& javaSymbols);
 +
      const KeyedVector<String8, AaptSymbolEntry>& getSymbols() const
          { return mSymbols; }
      const DefaultKeyedVector<String8, sp<AaptSymbols> >& getNestedSymbols() const
@@@ -522,11 -524,7 +526,11 @@@ public
      virtual ~AaptAssets() { delete mRes; }
  
      const String8& getPackage() const { return mPackage; }
 -    void setPackage(const String8& package) { mPackage = package; mSymbolsPrivatePackage = package; }
 +    void setPackage(const String8& package) {
 +        mPackage = package;
 +        mSymbolsPrivatePackage = package;
 +        mHavePrivateSymbols = false;
 +    }
  
      const SortedVector<AaptGroupEntry>& getGroupEntries() const;
  
  
      sp<AaptSymbols> getSymbolsFor(const String8& name);
  
 +    sp<AaptSymbols> getJavaSymbolsFor(const String8& name);
 +
 +    status_t applyJavaSymbols();
 +
      const DefaultKeyedVector<String8, sp<AaptSymbols> >& getSymbols() const { return mSymbols; }
  
      String8 getSymbolsPrivatePackage() const { return mSymbolsPrivatePackage; }
 -    void setSymbolsPrivatePackage(const String8& pkg) { mSymbolsPrivatePackage = pkg; }
 -    
 +    void setSymbolsPrivatePackage(const String8& pkg) {
 +        mSymbolsPrivatePackage = pkg;
 +        mHavePrivateSymbols = mSymbolsPrivatePackage != mPackage;
 +    }
 +
 +    bool havePrivateSymbols() const { return mHavePrivateSymbols; }
 +
 +    bool isJavaSymbol(const AaptSymbolEntry& sym, bool includePrivate) const;
 +
      status_t buildIncludedResources(Bundle* bundle);
      status_t addIncludedResources(const sp<AaptFile>& file);
      const ResTable& getIncludedResources() const;
@@@ -604,9 -591,7 +608,9 @@@ private
      String8 mPackage;
      SortedVector<AaptGroupEntry> mGroupEntries;
      DefaultKeyedVector<String8, sp<AaptSymbols> > mSymbols;
 +    DefaultKeyedVector<String8, sp<AaptSymbols> > mJavaSymbols;
      String8 mSymbolsPrivatePackage;
 +    bool mHavePrivateSymbols;
  
      Vector<sp<AaptDir> > mResDirs;