Uploaded image for project: 'Gradle'
  1. Gradle
  2. GRADLE-2171

Add an option to avoid duplicate entries when creating a zip file

    Details

    • Type: Bug
    • Status: Resolved
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 1.7-rc-1
    • Gradle Forums topic Reference:

      Description

      Hi everyone,

      While working on another issue, I stumbled across this issue: when you create a Zip file with the Zip task, you might end up with multiple identical entries in the Zip, e.g. the exact same file more than once in the same directory within the Zip. This is the case when multiple "from"'s are given which end up creating the same Filename at the same location within the resulting zip.

      As the Zip spec doesn't forbid this case (I think), these Zip files are, in theory, okay. However, depending on how and where you try to extract them, you'll end up with a whole slue or problems and errors. This is why gradle should propose an option to ensure file uniqueness in Zip files.

      imho, zip entry uniqueness should even be the default behavior for a couple of reasons: First, it would make the zip task behave the same as the copy task (when it comes to filesystem copies), which also only keeps the last file copied in case of a conflict. Lastly, having multiple identical zip entries is clearly the corner case that 99,99% of users and use cases do NOT want, so in accordance with gradle's general philosophy, those who want the "special" behavior should be the ones having to customize the task.

      For the history, please see:
      [1]http://forums.gradle.org/gradle/topic...

      best regards,
      Mike
      ----------------------------------------------------------------------------------------
      [1] http://forums.gradle.org/gradle/topics/solution_for_copying_a_subdirectory_wihtin_a_zip_into_another_zip

        Issue Links

          Activity

          forums Gradle Forums created issue -
          Hide
          mbrand Michael Brand added a comment -

          Seems like Gradle Zip should provide the same options that Ant zip provides:

          duplicate: behavior when a duplicate file is found. Valid values are "add", "preserve", and "fail". The default value is "add".

          Show
          mbrand Michael Brand added a comment - Seems like Gradle Zip should provide the same options that Ant zip provides: duplicate: behavior when a duplicate file is found. Valid values are "add", "preserve", and "fail". The default value is "add".
          ldaley Luke Daley made changes -
          Field Original Value New Value
          Link This issue Duplicates GRADLE-1050 [ GRADLE-1050 ]
          Hide
          pniederw Peter Niederwieser added a comment -

          I have a tested fix that filters duplicates for Zips/Jars/Wars/Ears/Tars. Do we need to support other behaviors (e.g. fail fast)? Can we change the default? Seems like adding duplicate entries is almost never useful. Conversely, people regularly run into the problem that the same file gets added multiple times. For comparison, the JDK ZipOutputStream class fails hard when an attempt is made to add another entry with the same path.

          Show
          pniederw Peter Niederwieser added a comment - I have a tested fix that filters duplicates for Zips/Jars/Wars/Ears/Tars. Do we need to support other behaviors (e.g. fail fast)? Can we change the default? Seems like adding duplicate entries is almost never useful. Conversely, people regularly run into the problem that the same file gets added multiple times. For comparison, the JDK ZipOutputStream class fails hard when an attempt is made to add another entry with the same path.
          Hide
          dirkraft Jason D added a comment - - edited

          The solution to this may also apply to GRADLE-1050 . (Consider voting for that one too )

          Show
          dirkraft Jason D added a comment - - edited The solution to this may also apply to GRADLE-1050 . (Consider voting for that one too )
          ldaley Luke Daley made changes -
          Workflow jira with pivotal tracker [ 15358 ] jira with pivotal tracker (no resolved, only closed) [ 18725 ]
          ldaley Luke Daley made changes -
          Workflow jira with pivotal tracker (no resolved, only closed) [ 18725 ] Copy of jira with pivotal tracker (no closed, only resolved) [ 21322 ]
          Hide
          kylewm Kyle Mahan added a comment - - edited

          I agree that filtering duplicates would be a much friendlier (default?) behavior. Configuring with Ant's add/preserve/fail would also be satisfactory to me but feels a little un-Gradle-like.

          task zip(type: Zip) {
            from ...
            onDuplicate 'fail'
          }
          

          as opposed to something like

          task zip(type: Zip) {
            from ...
            onDuplicate { throw new RuntimeException("Duplicate: $it") }
          }
          

          I would be interested in helping to test Peter's patch or contributing code to this issue if it would help!

          Show
          kylewm Kyle Mahan added a comment - - edited I agree that filtering duplicates would be a much friendlier (default?) behavior. Configuring with Ant's add/preserve/fail would also be satisfactory to me but feels a little un-Gradle-like. task zip(type: Zip) { from ... onDuplicate 'fail' } as opposed to something like task zip(type: Zip) { from ... onDuplicate { throw new RuntimeException( "Duplicate: $it" ) } } I would be interested in helping to test Peter's patch or contributing code to this issue if it would help!
          adammurdoch Adam Murdoch made changes -
          Status Open [ 1 ] Resolved [ 5 ]
          Fix Version/s 1.7-rc-1 [ 10675 ]
          Resolution Fixed [ 1 ]

            People

            • Assignee:
              Unassigned
              Reporter:
              forums Gradle Forums
            • Votes:
              18 Vote for this issue
              Watchers:
              20 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Development